From a97dffe585e8e185c57a3f1b025cffa6da9525d2 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 10 Jun 2015 14:26:44 +0100 Subject: [PATCH] Tidy up J2KImageProxy a bit. --- src/lib/data.cc | 6 ++++ src/lib/data.h | 6 ++++ src/lib/dcp_video.cc | 10 +++--- src/lib/dcp_video.h | 4 +-- src/lib/encoder.cc | 7 ++-- src/lib/j2k_image_proxy.cc | 73 ++++++++++++++------------------------ src/lib/j2k_image_proxy.h | 9 +++-- src/lib/player_video.cc | 2 +- src/lib/player_video.h | 2 +- src/lib/server.cc | 6 ++-- src/lib/writer.cc | 4 +-- src/lib/writer.h | 9 ++--- src/tools/server_test.cc | 12 +++---- test/client_server_test.cc | 15 ++++---- 14 files changed, 79 insertions(+), 86 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 #include #include @@ -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 _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 frame, shared_ptr +Data DCPVideo::encode_locally (dcp::NoteHandler note) { shared_ptr xyz; @@ -236,7 +236,7 @@ DCPVideo::encode_locally (dcp::NoteHandler note) break; } - shared_ptr 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 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 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, int, int, int, Resolution, bool b, boost::shared_ptr); DCPVideo (boost::shared_ptr, cxml::ConstNodePtr, boost::shared_ptr); - boost::shared_ptr encode_locally (dcp::NoteHandler note); - boost::shared_ptr 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 #include #include @@ -279,7 +280,7 @@ try */ int remote_backoff = 0; shared_ptr last_dcp_video; - shared_ptr last_encoded; + optional last_encoded; while (true) { @@ -300,7 +301,7 @@ try lock.unlock (); - shared_ptr encoded; + optional 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 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 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 xml, shared_ptr socket) @@ -62,18 +70,9 @@ J2KImageProxy::J2KImageProxy (shared_ptr xml, shared_ptr soc _size = dcp::Size (xml->number_child ("Width"), xml->number_child ("Height")); if (xml->optional_number_child ("Eye")) { _eye = static_cast (xml->number_child ("Eye")); - int const left_size = xml->number_child ("LeftSize"); - int const right_size = xml->number_child ("RightSize"); - shared_ptr 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 ("Size"); - shared_ptr f (new dcp::MonoPictureFrame ()); - socket->read (f->j2k_data (), size); - _mono = f; } + _data = Data (xml->number_child ("Size")); + socket->read (_data.data().get (), _data.size ()); } shared_ptr @@ -81,11 +80,13 @@ J2KImageProxy::image (optional note) const { shared_ptr 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 (_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 (_size.width)); node->add_child("Height")->add_child_text (raw_convert (_size.height)); - if (_stereo) { + if (_eye) { node->add_child("Eye")->add_child_text (raw_convert (_eye.get ())); - node->add_child("LeftSize")->add_child_text (raw_convert (_stereo->left_j2k_size ())); - node->add_child("RightSize")->add_child_text (raw_convert (_stereo->right_j2k_size ())); - } else { - node->add_child("Size")->add_child_text (raw_convert (_mono->j2k_size ())); } + node->add_child("Size")->add_child_text (raw_convert (_data.size ())); } void J2KImageProxy::send_binary (shared_ptr 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 -J2KImageProxy::j2k () const -{ - if (_mono) { - return shared_ptr (new Data (_mono->j2k_data(), _mono->j2k_size())); - } else { - if (_eye.get() == dcp::EYE_LEFT) { - return shared_ptr (new Data (_stereo->left_j2k_data(), _stereo->left_j2k_size())); - } else { - return shared_ptr (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 class Data; @@ -34,14 +35,16 @@ public: void add_metadata (xmlpp::Node *) const; void send_binary (boost::shared_ptr) const; - boost::shared_ptr j2k () const; + Data j2k () const { + return _data; + } + dcp::Size size () const { return _size; } private: - boost::shared_ptr _mono; - boost::shared_ptr _stereo; + Data _data; dcp::Size _size; boost::optional _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 PlayerVideo::j2k () const { shared_ptr j2k = dynamic_pointer_cast (_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, bool send_subtitles) const; bool has_j2k () const; - boost::shared_ptr 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, struct timeval& after_read, struct t gettimeofday (&after_read, 0); - shared_ptr 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 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 #include #include @@ -62,7 +63,7 @@ public: } type; /** encoded data for FULL */ - boost::shared_ptr encoded; + boost::optional 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, int, Eyes); + void write (Data, int, Eyes); void fake_write (int, Eyes); void write (boost::shared_ptr); 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 _last_written[EYES_COUNT]; + /** the data of the last written frame, if there is one */ + boost::optional _last_written[EYES_COUNT]; /** the index of the last written frame */ int _last_written_frame; Eyes _last_written_eyes; diff --git a/src/tools/server_test.cc b/src/tools/server_test.cc index 62cc9a7b2..aab92a698 100644 --- a/src/tools/server_test.cc +++ b/src/tools/server_test.cc @@ -57,8 +57,8 @@ process_video (shared_ptr pvf) ++frame_count; - shared_ptr local_encoded = local->encode_locally (boost::bind (&Log::dcp_log, log_.get(), _1, _2)); - shared_ptr remote_encoded; + Data local_encoded = local->encode_locally (boost::bind (&Log::dcp_log, log_.get(), _1, _2)); + Data remote_encoded; string remote_error; try { @@ -72,14 +72,14 @@ process_video (shared_ptr pvf) return; } - if (local_encoded->size() != remote_encoded->size()) { + if (local_encoded.size() != remote_encoded.size()) { cout << "\033[0;31msizes differ\033[0m\n"; return; } - uint8_t* p = local_encoded->data().get (); - uint8_t* q = remote_encoded->data().get (); - for (int i = 0; i < local_encoded->size(); ++i) { + uint8_t* p = local_encoded.data().get (); + uint8_t* q = remote_encoded.data().get (); + for (int i = 0; i < local_encoded.size(); ++i) { if (*p++ != *q++) { cout << "\033[0;31mdata differ\033[0m at byte " << i << "\n"; return; diff --git a/test/client_server_test.cc b/test/client_server_test.cc index 396e6609f..511e913d9 100644 --- a/test/client_server_test.cc +++ b/test/client_server_test.cc @@ -41,14 +41,13 @@ using boost::thread; using boost::optional; void -do_remote_encode (shared_ptr frame, ServerDescription description, shared_ptr locally_encoded) +do_remote_encode (shared_ptr frame, ServerDescription description, Data locally_encoded) { - shared_ptr remotely_encoded; + Data remotely_encoded; BOOST_CHECK_NO_THROW (remotely_encoded = frame->encode_remotely (description)); - BOOST_CHECK (remotely_encoded); - BOOST_CHECK_EQUAL (locally_encoded->size(), remotely_encoded->size()); - BOOST_CHECK_EQUAL (memcmp (locally_encoded->data().get(), remotely_encoded->data().get(), locally_encoded->size()), 0); + BOOST_CHECK_EQUAL (locally_encoded.size(), remotely_encoded.size()); + BOOST_CHECK_EQUAL (memcmp (locally_encoded.data().get(), remotely_encoded.data().get(), locally_encoded.size()), 0); } BOOST_AUTO_TEST_CASE (client_server_test_rgb) @@ -109,8 +108,7 @@ BOOST_AUTO_TEST_CASE (client_server_test_rgb) ) ); - shared_ptr locally_encoded = frame->encode_locally (boost::bind (&Log::dcp_log, log.get(), _1, _2)); - BOOST_ASSERT (locally_encoded); + Data locally_encoded = frame->encode_locally (boost::bind (&Log::dcp_log, log.get(), _1, _2)); Server* server = new Server (log, true); @@ -192,8 +190,7 @@ BOOST_AUTO_TEST_CASE (client_server_test_yuv) ) ); - shared_ptr locally_encoded = frame->encode_locally (boost::bind (&Log::dcp_log, log.get(), _1, _2)); - BOOST_ASSERT (locally_encoded); + Data locally_encoded = frame->encode_locally (boost::bind (&Log::dcp_log, log.get(), _1, _2)); Server* server = new Server (log, true); -- 2.30.2