summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-07-10 09:40:56 +0100
committerCarl Hetherington <cth@carlh.net>2014-07-10 09:40:56 +0100
commit53a18f3564b6dcd431e44b01ab2a505be135d2b7 (patch)
tree633b1afa240e71a5a329503be8fc6092d7ec3a0a /src
parent63f506966cc4e9c459b3bcb430a11481f9d3a24a (diff)
Basics of direct write of J2K data without encode/decode.
Diffstat (limited to 'src')
-rw-r--r--src/lib/dcp_decoder.cc2
-rw-r--r--src/lib/encoded_data.cc7
-rw-r--r--src/lib/encoded_data.h1
-rw-r--r--src/lib/encoder.cc2
-rw-r--r--src/lib/j2k_image_proxy.cc15
-rw-r--r--src/lib/j2k_image_proxy.h7
-rw-r--r--src/lib/player_video.cc25
-rw-r--r--src/lib/player_video.h4
8 files changed, 61 insertions, 2 deletions
diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc
index 6e59f6cde..e9c110108 100644
--- a/src/lib/dcp_decoder.cc
+++ b/src/lib/dcp_decoder.cc
@@ -85,7 +85,7 @@ DCPDecoder::pass ()
_next += ContentTime::from_frames (1, vfr);
if ((*_reel)->main_picture ()) {
- if ((*_reel)->main_picture()->duration() >= _next.frames (vfr)) {
+ if (_next.frames (vfr) >= (*_reel)->main_picture()->duration()) {
++_reel;
}
}
diff --git a/src/lib/encoded_data.cc b/src/lib/encoded_data.cc
index fffc4d91f..61d2644da 100644
--- a/src/lib/encoded_data.cc
+++ b/src/lib/encoded_data.cc
@@ -33,6 +33,13 @@ EncodedData::EncodedData (int s)
}
+EncodedData::EncodedData (uint8_t const * d, int s)
+ : _data (new uint8_t[s])
+ , _size (s)
+{
+ memcpy (_data, d, s);
+}
+
EncodedData::EncodedData (boost::filesystem::path file)
{
_size = boost::filesystem::file_size (file);
diff --git a/src/lib/encoded_data.h b/src/lib/encoded_data.h
index 9064cc929..232ed6e8a 100644
--- a/src/lib/encoded_data.h
+++ b/src/lib/encoded_data.h
@@ -33,6 +33,7 @@ class EncodedData : public boost::noncopyable
public:
/** @param s Size of data, in bytes */
EncodedData (int s);
+ EncodedData (uint8_t const * d, int s);
EncodedData (boost::filesystem::path);
diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc
index 7b21296a2..e8ab5452b 100644
--- a/src/lib/encoder.cc
+++ b/src/lib/encoder.cc
@@ -207,6 +207,8 @@ Encoder::enqueue (shared_ptr<PlayerVideo> pvf)
if (_writer->can_fake_write (_video_frames_out)) {
_writer->fake_write (_video_frames_out, pvf->eyes ());
frame_done ();
+ } else if (pvf->has_j2k ()) {
+ _writer->write (pvf->j2k(), _video_frames_out, pvf->eyes ());
} else {
/* Queue this new frame for encoding */
LOG_TIMING ("adding to queue of %1", _queue.size ());
diff --git a/src/lib/j2k_image_proxy.cc b/src/lib/j2k_image_proxy.cc
index db1a2b53f..6924fad79 100644
--- a/src/lib/j2k_image_proxy.cc
+++ b/src/lib/j2k_image_proxy.cc
@@ -24,6 +24,7 @@
#include "j2k_image_proxy.h"
#include "util.h"
#include "image.h"
+#include "encoded_data.h"
#include "i18n.h"
@@ -106,3 +107,17 @@ J2KImageProxy::send_binary (shared_ptr<Socket> socket) const
socket->write (_stereo->right_j2k_data(), _stereo->right_j2k_size ());
}
}
+
+shared_ptr<EncodedData>
+J2KImageProxy::j2k () const
+{
+ if (_mono) {
+ return shared_ptr<EncodedData> (new EncodedData (_mono->j2k_data(), _mono->j2k_size()));
+ } else {
+ if (_eye == dcp::EYE_LEFT) {
+ return shared_ptr<EncodedData> (new EncodedData (_stereo->left_j2k_data(), _stereo->left_j2k_size()));
+ } else {
+ return shared_ptr<EncodedData> (new EncodedData (_stereo->right_j2k_data(), _stereo->right_j2k_size()));
+ }
+ }
+}
diff --git a/src/lib/j2k_image_proxy.h b/src/lib/j2k_image_proxy.h
index 1c2831802..d7b5c83fc 100644
--- a/src/lib/j2k_image_proxy.h
+++ b/src/lib/j2k_image_proxy.h
@@ -20,6 +20,8 @@
#include <dcp/util.h>
#include "image_proxy.h"
+class EncodedData;
+
class J2KImageProxy : public ImageProxy
{
public:
@@ -31,6 +33,11 @@ public:
void add_metadata (xmlpp::Node *) const;
void send_binary (boost::shared_ptr<Socket>) const;
+ boost::shared_ptr<EncodedData> j2k () const;
+ dcp::Size size () const {
+ return _size;
+ }
+
private:
boost::shared_ptr<const dcp::MonoPictureFrame> _mono;
boost::shared_ptr<const dcp::StereoPictureFrame> _stereo;
diff --git a/src/lib/player_video.cc b/src/lib/player_video.cc
index d1b394933..a44264ced 100644
--- a/src/lib/player_video.cc
+++ b/src/lib/player_video.cc
@@ -21,12 +21,14 @@
#include "player_video.h"
#include "image.h"
#include "image_proxy.h"
+#include "j2k_image_proxy.h"
#include "scaler.h"
using std::string;
using std::cout;
-using boost::shared_ptr;
using dcp::raw_convert;
+using boost::shared_ptr;
+using boost::dynamic_pointer_cast;
PlayerVideo::PlayerVideo (
shared_ptr<const ImageProxy> in,
@@ -148,3 +150,24 @@ PlayerVideo::send_binary (shared_ptr<Socket> socket, bool send_subtitles) const
_subtitle.image->write_to_socket (socket);
}
}
+
+bool
+PlayerVideo::has_j2k () const
+{
+ /* XXX: burnt-in subtitle; maybe other things */
+
+ shared_ptr<const J2KImageProxy> j2k = dynamic_pointer_cast<const J2KImageProxy> (_in);
+ if (!j2k) {
+ return false;
+ }
+
+ return _crop == Crop () && _inter_size == j2k->size();
+}
+
+shared_ptr<EncodedData>
+PlayerVideo::j2k () const
+{
+ shared_ptr<const J2KImageProxy> j2k = dynamic_pointer_cast<const J2KImageProxy> (_in);
+ assert (j2k);
+ return j2k->j2k ();
+}
diff --git a/src/lib/player_video.h b/src/lib/player_video.h
index e06e5f45e..4fe8712d4 100644
--- a/src/lib/player_video.h
+++ b/src/lib/player_video.h
@@ -28,6 +28,7 @@ class ImageProxy;
class Scaler;
class Socket;
class Log;
+class EncodedData;
/** Everything needed to describe a video frame coming out of the player, but with the
* bits still their raw form. We may want to combine the bits on a remote machine,
@@ -46,6 +47,9 @@ public:
void add_metadata (xmlpp::Node* node, bool send_subtitles) const;
void send_binary (boost::shared_ptr<Socket> socket, bool send_subtitles) const;
+ bool has_j2k () const;
+ boost::shared_ptr<EncodedData> j2k () const;
+
DCPTime time () const {
return _time;
}