diff options
| author | Carl Hetherington <cth@carlh.net> | 2015-06-10 14:26:44 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2015-06-10 14:26:44 +0100 |
| commit | a97dffe585e8e185c57a3f1b025cffa6da9525d2 (patch) | |
| tree | ca367b6965afcda95a9c1ef86114c855ad3f0a88 /src/lib | |
| parent | 5c0a67869dbddb924c9f5ccb4126aa06d85b9b8b (diff) | |
Tidy up J2KImageProxy a bit.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/data.cc | 6 | ||||
| -rw-r--r-- | src/lib/data.h | 6 | ||||
| -rw-r--r-- | src/lib/dcp_video.cc | 10 | ||||
| -rw-r--r-- | src/lib/dcp_video.h | 4 | ||||
| -rw-r--r-- | src/lib/encoder.cc | 7 | ||||
| -rw-r--r-- | src/lib/j2k_image_proxy.cc | 73 | ||||
| -rw-r--r-- | src/lib/j2k_image_proxy.h | 9 | ||||
| -rw-r--r-- | src/lib/player_video.cc | 2 | ||||
| -rw-r--r-- | src/lib/player_video.h | 2 | ||||
| -rw-r--r-- | src/lib/server.cc | 6 | ||||
| -rw-r--r-- | src/lib/writer.cc | 4 | ||||
| -rw-r--r-- | src/lib/writer.h | 9 |
12 files changed, 67 insertions, 71 deletions
diff --git a/src/lib/data.cc b/src/lib/data.cc index e117199a1..92b0b19d5 100644 --- a/src/lib/data.cc +++ b/src/lib/data.cc @@ -25,6 +25,12 @@ using boost::shared_array; +Data::Data () + : _size (0) +{ + +} + Data::Data (int size) : _data (new uint8_t[size]) , _size (size) diff --git a/src/lib/data.h b/src/lib/data.h index 84ff6671a..14658ad4a 100644 --- a/src/lib/data.h +++ b/src/lib/data.h @@ -17,6 +17,9 @@ */ +#ifndef DCPOMATIC_DATA_H +#define DCPOMATIC_DATA_H + #include <boost/shared_array.hpp> #include <boost/filesystem.hpp> #include <stdint.h> @@ -24,6 +27,7 @@ class Data { public: + Data (); Data (int size); Data (uint8_t const * data, int size); Data (boost::filesystem::path file); @@ -45,3 +49,5 @@ private: boost::shared_array<uint8_t> _data; int _size; }; + +#endif diff --git a/src/lib/dcp_video.cc b/src/lib/dcp_video.cc index af614a10f..78cbe65bd 100644 --- a/src/lib/dcp_video.cc +++ b/src/lib/dcp_video.cc @@ -104,7 +104,7 @@ DCPVideo::DCPVideo (shared_ptr<const PlayerVideo> frame, shared_ptr<const cxml:: /** J2K-encode this frame on the local host. * @return Encoded data. */ -shared_ptr<Data> +Data DCPVideo::encode_locally (dcp::NoteHandler note) { shared_ptr<dcp::XYZImage> xyz; @@ -236,7 +236,7 @@ DCPVideo::encode_locally (dcp::NoteHandler note) break; } - shared_ptr<Data> enc (new Data (cio->buffer, cio_tell (cio))); + Data enc (cio->buffer, cio_tell (cio)); opj_cio_close (cio); free (parameters.cp_comment); @@ -249,7 +249,7 @@ DCPVideo::encode_locally (dcp::NoteHandler note) * @param serv Server to send to. * @return Encoded data. */ -shared_ptr<Data> +Data DCPVideo::encode_remotely (ServerDescription serv) { boost::asio::io_service io_service; @@ -280,8 +280,8 @@ DCPVideo::encode_remotely (ServerDescription serv) /* Read the response (JPEG2000-encoded data); this blocks until the data is ready and sent back. */ - shared_ptr<Data> e (new Data (socket->read_uint32 ())); - socket->read (e->data().get(), e->size()); + Data e (socket->read_uint32 ()); + socket->read (e.data().get(), e.size()); LOG_GENERAL (N_("Finished remotely-encoded frame %1"), _index); diff --git a/src/lib/dcp_video.h b/src/lib/dcp_video.h index 37d95826c..c1c48623d 100644 --- a/src/lib/dcp_video.h +++ b/src/lib/dcp_video.h @@ -49,8 +49,8 @@ public: DCPVideo (boost::shared_ptr<const PlayerVideo>, int, int, int, Resolution, bool b, boost::shared_ptr<Log>); DCPVideo (boost::shared_ptr<const PlayerVideo>, cxml::ConstNodePtr, boost::shared_ptr<Log>); - boost::shared_ptr<Data> encode_locally (dcp::NoteHandler note); - boost::shared_ptr<Data> encode_remotely (ServerDescription); + Data encode_locally (dcp::NoteHandler note); + Data encode_remotely (ServerDescription); int index () const { return _index; diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index c6cb8b9df..83baacd41 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -33,6 +33,7 @@ #include "server_finder.h" #include "player.h" #include "player_video.h" +#include "data.h" #include <libcxml/cxml.h> #include <boost/lambda/lambda.hpp> #include <iostream> @@ -279,7 +280,7 @@ try */ int remote_backoff = 0; shared_ptr<DCPVideo> last_dcp_video; - shared_ptr<Data> last_encoded; + optional<Data> last_encoded; while (true) { @@ -300,7 +301,7 @@ try lock.unlock (); - shared_ptr<Data> encoded; + optional<Data> encoded; if (last_dcp_video && vf->same (last_dcp_video)) { /* We already have encoded data for the same input as this one, so take a short-cut */ @@ -344,7 +345,7 @@ try last_encoded = encoded; if (encoded) { - _writer->write (encoded, vf->index (), vf->eyes ()); + _writer->write (encoded.get(), vf->index (), vf->eyes ()); frame_done (); } else { lock.lock (); diff --git a/src/lib/j2k_image_proxy.cc b/src/lib/j2k_image_proxy.cc index 3fc6ce9b2..a5d13b869 100644 --- a/src/lib/j2k_image_proxy.cc +++ b/src/lib/j2k_image_proxy.cc @@ -36,25 +36,33 @@ using boost::optional; /** Construct a J2KImageProxy from a JPEG2000 file */ J2KImageProxy::J2KImageProxy (boost::filesystem::path path, dcp::Size size) - : _mono (new dcp::MonoPictureFrame (path)) + : _data (path) , _size (size) { } J2KImageProxy::J2KImageProxy (shared_ptr<const dcp::MonoPictureFrame> frame, dcp::Size size) - : _mono (frame) + : _data (frame->j2k_size ()) , _size (size) { - + memcpy (_data.data().get(), frame->j2k_data(), _data.size ()); } J2KImageProxy::J2KImageProxy (shared_ptr<const dcp::StereoPictureFrame> frame, dcp::Size size, dcp::Eye eye) - : _stereo (frame) - , _size (size) + : _size (size) , _eye (eye) { - + switch (eye) { + case dcp::EYE_LEFT: + _data = Data (frame->left_j2k_size ()); + memcpy (_data.data().get(), frame->left_j2k_data(), _data.size ()); + break; + case dcp::EYE_RIGHT: + _data = Data (frame->right_j2k_size ()); + memcpy (_data.data().get(), frame->right_j2k_data(), _data.size ()); + break; + } } J2KImageProxy::J2KImageProxy (shared_ptr<cxml::Node> xml, shared_ptr<Socket> socket) @@ -62,18 +70,9 @@ J2KImageProxy::J2KImageProxy (shared_ptr<cxml::Node> xml, shared_ptr<Socket> soc _size = dcp::Size (xml->number_child<int> ("Width"), xml->number_child<int> ("Height")); if (xml->optional_number_child<int> ("Eye")) { _eye = static_cast<dcp::Eye> (xml->number_child<int> ("Eye")); - int const left_size = xml->number_child<int> ("LeftSize"); - int const right_size = xml->number_child<int> ("RightSize"); - shared_ptr<dcp::StereoPictureFrame> f (new dcp::StereoPictureFrame ()); - socket->read (f->left_j2k_data(), left_size); - socket->read (f->right_j2k_data(), right_size); - _stereo = f; - } else { - int const size = xml->number_child<int> ("Size"); - shared_ptr<dcp::MonoPictureFrame> f (new dcp::MonoPictureFrame ()); - socket->read (f->j2k_data (), size); - _mono = f; } + _data = Data (xml->number_child<int> ("Size")); + socket->read (_data.data().get (), _data.size ()); } shared_ptr<Image> @@ -81,11 +80,13 @@ J2KImageProxy::image (optional<dcp::NoteHandler> note) const { shared_ptr<Image> image (new Image (PIX_FMT_RGB48LE, _size, true)); - if (_mono) { - dcp::xyz_to_rgb (_mono->xyz_image (), dcp::ColourConversion::srgb_to_xyz(), image->data()[0], image->stride()[0], note); - } else { - dcp::xyz_to_rgb (_stereo->xyz_image (_eye.get ()), dcp::ColourConversion::srgb_to_xyz(), image->data()[0], image->stride()[0], note); - } + dcp::xyz_to_rgb ( + dcp::decompress_j2k (const_cast<uint8_t*> (_data.data().get()), _data.size (), 0), + dcp::ColourConversion::srgb_to_xyz(), + image->data()[0], + image->stride()[0], + note + ); return image; } @@ -96,36 +97,14 @@ J2KImageProxy::add_metadata (xmlpp::Node* node) const node->add_child("Type")->add_child_text (N_("J2K")); node->add_child("Width")->add_child_text (raw_convert<string> (_size.width)); node->add_child("Height")->add_child_text (raw_convert<string> (_size.height)); - if (_stereo) { + if (_eye) { node->add_child("Eye")->add_child_text (raw_convert<string> (_eye.get ())); - node->add_child("LeftSize")->add_child_text (raw_convert<string> (_stereo->left_j2k_size ())); - node->add_child("RightSize")->add_child_text (raw_convert<string> (_stereo->right_j2k_size ())); - } else { - node->add_child("Size")->add_child_text (raw_convert<string> (_mono->j2k_size ())); } + node->add_child("Size")->add_child_text (raw_convert<string> (_data.size ())); } void J2KImageProxy::send_binary (shared_ptr<Socket> socket) const { - if (_mono) { - socket->write (_mono->j2k_data(), _mono->j2k_size ()); - } else { - socket->write (_stereo->left_j2k_data(), _stereo->left_j2k_size ()); - socket->write (_stereo->right_j2k_data(), _stereo->right_j2k_size ()); - } -} - -shared_ptr<Data> -J2KImageProxy::j2k () const -{ - if (_mono) { - return shared_ptr<Data> (new Data (_mono->j2k_data(), _mono->j2k_size())); - } else { - if (_eye.get() == dcp::EYE_LEFT) { - return shared_ptr<Data> (new Data (_stereo->left_j2k_data(), _stereo->left_j2k_size())); - } else { - return shared_ptr<Data> (new Data (_stereo->right_j2k_data(), _stereo->right_j2k_size())); - } - } + socket->write (_data.data().get(), _data.size()); } diff --git a/src/lib/j2k_image_proxy.h b/src/lib/j2k_image_proxy.h index 1392f66b9..34b1490b3 100644 --- a/src/lib/j2k_image_proxy.h +++ b/src/lib/j2k_image_proxy.h @@ -18,6 +18,7 @@ */ #include "image_proxy.h" +#include "data.h" #include <dcp/util.h> class Data; @@ -34,14 +35,16 @@ public: void add_metadata (xmlpp::Node *) const; void send_binary (boost::shared_ptr<Socket>) const; - boost::shared_ptr<Data> j2k () const; + Data j2k () const { + return _data; + } + dcp::Size size () const { return _size; } private: - boost::shared_ptr<const dcp::MonoPictureFrame> _mono; - boost::shared_ptr<const dcp::StereoPictureFrame> _stereo; + Data _data; dcp::Size _size; boost::optional<dcp::Eye> _eye; }; diff --git a/src/lib/player_video.cc b/src/lib/player_video.cc index 4faed9da3..a84d3b45f 100644 --- a/src/lib/player_video.cc +++ b/src/lib/player_video.cc @@ -177,7 +177,7 @@ PlayerVideo::has_j2k () const return _crop == Crop () && _inter_size == j2k->size(); } -shared_ptr<Data> +Data PlayerVideo::j2k () const { shared_ptr<const J2KImageProxy> j2k = dynamic_pointer_cast<const J2KImageProxy> (_in); diff --git a/src/lib/player_video.h b/src/lib/player_video.h index 3abca8267..e6aa4c7b2 100644 --- a/src/lib/player_video.h +++ b/src/lib/player_video.h @@ -60,7 +60,7 @@ public: void send_binary (boost::shared_ptr<Socket> socket, bool send_subtitles) const; bool has_j2k () const; - boost::shared_ptr<Data> j2k () const; + Data j2k () const; DCPTime time () const { return _time; diff --git a/src/lib/server.cc b/src/lib/server.cc index 6dc79ec65..2a5ff5c9a 100644 --- a/src/lib/server.cc +++ b/src/lib/server.cc @@ -119,13 +119,13 @@ Server::process (shared_ptr<Socket> socket, struct timeval& after_read, struct t gettimeofday (&after_read, 0); - shared_ptr<Data> encoded = dcp_video_frame.encode_locally (boost::bind (&Log::dcp_log, _log.get(), _1, _2)); + Data encoded = dcp_video_frame.encode_locally (boost::bind (&Log::dcp_log, _log.get(), _1, _2)); gettimeofday (&after_encode, 0); try { - socket->write (encoded->size ()); - socket->write (encoded->data ().get (), encoded->size ()); + socket->write (encoded.size ()); + socket->write (encoded.data ().get (), encoded.size ()); } catch (std::exception& e) { cerr << "Send failed; frame " << dcp_video_frame.index() << "\n"; LOG_ERROR ("Send failed; frame %1", dcp_video_frame.index()); diff --git a/src/lib/writer.cc b/src/lib/writer.cc index a0a57e0bb..527fb3701 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -158,7 +158,7 @@ Writer::~Writer () } void -Writer::write (shared_ptr<const Data> encoded, int frame, Eyes eyes) +Writer::write (Data encoded, int frame, Eyes eyes) { boost::mutex::scoped_lock lock (_mutex); @@ -328,7 +328,7 @@ try { LOG_GENERAL (N_("Writer FULL-writes %1 (%2)"), qi.frame, qi.eyes); if (!qi.encoded) { - qi.encoded.reset (new Data (_film->j2c_path (qi.frame, qi.eyes, false))); + qi.encoded = Data (_film->j2c_path (qi.frame, qi.eyes, false)); } dcp::FrameInfo fin = _picture_asset_writer->write (qi.encoded->data().get (), qi.encoded->size()); diff --git a/src/lib/writer.h b/src/lib/writer.h index bc274d2b8..1094dee3c 100644 --- a/src/lib/writer.h +++ b/src/lib/writer.h @@ -24,6 +24,7 @@ #include "exceptions.h" #include "types.h" #include "player_subtitles.h" +#include "data.h" #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> #include <boost/thread.hpp> @@ -62,7 +63,7 @@ public: } type; /** encoded data for FULL */ - boost::shared_ptr<const Data> encoded; + boost::optional<Data> encoded; /** size of data for FAKE */ int size; /** frame index */ @@ -92,7 +93,7 @@ public: bool can_fake_write (int) const; - void write (boost::shared_ptr<const Data>, int, Eyes); + void write (Data, int, Eyes); void fake_write (int, Eyes); void write (boost::shared_ptr<const AudioBuffers>); void write (PlayerSubtitles subs); @@ -130,8 +131,8 @@ private: boost::condition _empty_condition; /** condition to manage thread wakeups when we have too much to do */ boost::condition _full_condition; - /** the data of the last written frame, or 0 if there isn't one */ - boost::shared_ptr<const Data> _last_written[EYES_COUNT]; + /** the data of the last written frame, if there is one */ + boost::optional<Data> _last_written[EYES_COUNT]; /** the index of the last written frame */ int _last_written_frame; Eyes _last_written_eyes; |
