Tidy up J2KImageProxy a bit.
authorCarl Hetherington <cth@carlh.net>
Wed, 10 Jun 2015 13:26:44 +0000 (14:26 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 10 Jun 2015 13:26:44 +0000 (14:26 +0100)
14 files changed:
src/lib/data.cc
src/lib/data.h
src/lib/dcp_video.cc
src/lib/dcp_video.h
src/lib/encoder.cc
src/lib/j2k_image_proxy.cc
src/lib/j2k_image_proxy.h
src/lib/player_video.cc
src/lib/player_video.h
src/lib/server.cc
src/lib/writer.cc
src/lib/writer.h
src/tools/server_test.cc
test/client_server_test.cc

index e117199a1c9b3cfcbc736248edf36f274eececf1..92b0b19d53380590fb2071b43d646612a45a058b 100644 (file)
 
 using boost::shared_array;
 
+Data::Data ()
+       : _size (0)
+{
+
+}
+
 Data::Data (int size)
        : _data (new uint8_t[size])
        , _size (size)
index 84ff6671acc2f6bd807cc0f65e3fcd6719e7bdfe..14658ad4a8b625aaf2ed7f1e723ab91fbbde1e69 100644 (file)
@@ -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
index af614a10f2d12d6322033211387566466a843fa6..78cbe65bddbf3945f9c12cb6633a33a31dc36389 100644 (file)
@@ -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);
        
index 37d95826c5103a7c4fc283fb26250cee5a71ffb8..c1c48623def2595f4979f0a36bb2da2d3363c777 100644 (file)
@@ -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;
index c6cb8b9dfdd72f651b052d6ff96d6a90651b36be..83baacd418b7201d91c7af428c4b73fbe8b217ad 100644 (file)
@@ -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 ();
index 3fc6ce9b252e50cd7c951069bc04dbe967fca7db..a5d13b869c03f844166716614584d599e07d792e 100644 (file)
@@ -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());
 }
index 1392f66b9cd9b33620c73c5f78c164a66a245a2d..34b1490b3858fb0a2eee07f693d8573a25ced4e6 100644 (file)
@@ -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;
 };
index 4faed9da394017b21545629c01d730027bb3dda6..a84d3b45f2c9346c6e58251dedf8328bcea774e0 100644 (file)
@@ -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);
index 3abca82675ad46b2ac74dbcb6ecf696e072a999b..e6aa4c7b2919b44afc1e6dab71c5fbe4e05d1782 100644 (file)
@@ -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;
index 6dc79ec653e362de65c6d78f13eea7f500578018..2a5ff5c9adf0f839250355a0a5afcb6cc8241493 100644 (file)
@@ -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());
index a0a57e0bbd84a66a506ba547757f9c6edc9e8e27..527fb370102bb5b4573aef041fa4d96db085d901 100644 (file)
@@ -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());
index bc274d2b869c150ebeb6076befc88f5a560c47a3..1094dee3cc70505ab3ba982a8e5b07d421b065cf 100644 (file)
@@ -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;
index 62cc9a7b275ebe04e9308b1b4915e656c25c15d7..aab92a698cc96595407aeb64ab001ce650cbb265 100644 (file)
@@ -57,8 +57,8 @@ process_video (shared_ptr<PlayerVideo> pvf)
 
        ++frame_count;
 
-       shared_ptr<Data> local_encoded = local->encode_locally (boost::bind (&Log::dcp_log, log_.get(), _1, _2));
-       shared_ptr<Data> 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<PlayerVideo> 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;
index 396e6609f3a3d37b263b954140dcfd20e285cc32..511e913d9b4e95dce3826fe945462b2b0fb44ca0 100644 (file)
@@ -41,14 +41,13 @@ using boost::thread;
 using boost::optional;
 
 void
-do_remote_encode (shared_ptr<DCPVideo> frame, ServerDescription description, shared_ptr<Data> locally_encoded)
+do_remote_encode (shared_ptr<DCPVideo> frame, ServerDescription description, Data locally_encoded)
 {
-       shared_ptr<Data> 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<Data> 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<Data> 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);