summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-06-10 14:26:44 +0100
committerCarl Hetherington <cth@carlh.net>2015-06-10 14:26:44 +0100
commita97dffe585e8e185c57a3f1b025cffa6da9525d2 (patch)
treeca367b6965afcda95a9c1ef86114c855ad3f0a88 /src/lib
parent5c0a67869dbddb924c9f5ccb4126aa06d85b9b8b (diff)
Tidy up J2KImageProxy a bit.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/data.cc6
-rw-r--r--src/lib/data.h6
-rw-r--r--src/lib/dcp_video.cc10
-rw-r--r--src/lib/dcp_video.h4
-rw-r--r--src/lib/encoder.cc7
-rw-r--r--src/lib/j2k_image_proxy.cc73
-rw-r--r--src/lib/j2k_image_proxy.h9
-rw-r--r--src/lib/player_video.cc2
-rw-r--r--src/lib/player_video.h2
-rw-r--r--src/lib/server.cc6
-rw-r--r--src/lib/writer.cc4
-rw-r--r--src/lib/writer.h9
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;