diff options
| author | Carl Hetherington <cth@carlh.net> | 2014-07-10 09:40:56 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2014-07-10 09:40:56 +0100 |
| commit | 53a18f3564b6dcd431e44b01ab2a505be135d2b7 (patch) | |
| tree | 633b1afa240e71a5a329503be8fc6092d7ec3a0a /src/lib | |
| parent | 63f506966cc4e9c459b3bcb430a11481f9d3a24a (diff) | |
Basics of direct write of J2K data without encode/decode.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/dcp_decoder.cc | 2 | ||||
| -rw-r--r-- | src/lib/encoded_data.cc | 7 | ||||
| -rw-r--r-- | src/lib/encoded_data.h | 1 | ||||
| -rw-r--r-- | src/lib/encoder.cc | 2 | ||||
| -rw-r--r-- | src/lib/j2k_image_proxy.cc | 15 | ||||
| -rw-r--r-- | src/lib/j2k_image_proxy.h | 7 | ||||
| -rw-r--r-- | src/lib/player_video.cc | 25 | ||||
| -rw-r--r-- | src/lib/player_video.h | 4 |
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; } |
