using boost::shared_array;
+Data::Data ()
+ : _size (0)
+{
+
+}
+
Data::Data (int size)
: _data (new uint8_t[size])
, _size (size)
*/
+#ifndef DCPOMATIC_DATA_H
+#define DCPOMATIC_DATA_H
+
#include <boost/shared_array.hpp>
#include <boost/filesystem.hpp>
#include <stdint.h>
class Data
{
public:
+ Data ();
Data (int size);
Data (uint8_t const * data, int size);
Data (boost::filesystem::path file);
boost::shared_array<uint8_t> _data;
int _size;
};
+
+#endif
/** 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;
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);
* @param serv Server to send to.
* @return Encoded data.
*/
-shared_ptr<Data>
+Data
DCPVideo::encode_remotely (ServerDescription serv)
{
boost::asio::io_service io_service;
/* 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);
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;
#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>
*/
int remote_backoff = 0;
shared_ptr<DCPVideo> last_dcp_video;
- shared_ptr<Data> last_encoded;
+ optional<Data> last_encoded;
while (true) {
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 */
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 ();
/** 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)
_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>
{
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;
}
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());
}
*/
#include "image_proxy.h"
+#include "data.h"
#include <dcp/util.h>
class Data;
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;
};
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);
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;
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());
}
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);
{
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());
#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>
} type;
/** encoded data for FULL */
- boost::shared_ptr<const Data> encoded;
+ boost::optional<Data> encoded;
/** size of data for FAKE */
int size;
/** frame index */
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);
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;
++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 {
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;
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)
)
);
- 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);
)
);
- 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);