_next += ContentTime::from_frames (1, vfr);
if ((*_reel)->main_picture ()) {
- if ((*_reel)->main_picture()->duration() >= _next.frames (vfr)) {
+ if (_next.frames (vfr) >= (*_reel)->main_picture()->duration()) {
++_reel;
}
}
}
+EncodedData::EncodedData (uint8_t const * d, int s)
+ : _data (new uint8_t[s])
+ , _size (s)
+{
+ memcpy (_data, d, s);
+}
+
EncodedData::EncodedData (boost::filesystem::path file)
{
_size = boost::filesystem::file_size (file);
public:
/** @param s Size of data, in bytes */
EncodedData (int s);
+ EncodedData (uint8_t const * d, int s);
EncodedData (boost::filesystem::path);
if (_writer->can_fake_write (_video_frames_out)) {
_writer->fake_write (_video_frames_out, pvf->eyes ());
frame_done ();
+ } else if (pvf->has_j2k ()) {
+ _writer->write (pvf->j2k(), _video_frames_out, pvf->eyes ());
} else {
/* Queue this new frame for encoding */
LOG_TIMING ("adding to queue of %1", _queue.size ());
#include "j2k_image_proxy.h"
#include "util.h"
#include "image.h"
+#include "encoded_data.h"
#include "i18n.h"
socket->write (_stereo->right_j2k_data(), _stereo->right_j2k_size ());
}
}
+
+shared_ptr<EncodedData>
+J2KImageProxy::j2k () const
+{
+ if (_mono) {
+ return shared_ptr<EncodedData> (new EncodedData (_mono->j2k_data(), _mono->j2k_size()));
+ } else {
+ if (_eye == dcp::EYE_LEFT) {
+ return shared_ptr<EncodedData> (new EncodedData (_stereo->left_j2k_data(), _stereo->left_j2k_size()));
+ } else {
+ return shared_ptr<EncodedData> (new EncodedData (_stereo->right_j2k_data(), _stereo->right_j2k_size()));
+ }
+ }
+}
#include <dcp/util.h>
#include "image_proxy.h"
+class EncodedData;
+
class J2KImageProxy : public ImageProxy
{
public:
void add_metadata (xmlpp::Node *) const;
void send_binary (boost::shared_ptr<Socket>) const;
+ boost::shared_ptr<EncodedData> j2k () const;
+ dcp::Size size () const {
+ return _size;
+ }
+
private:
boost::shared_ptr<const dcp::MonoPictureFrame> _mono;
boost::shared_ptr<const dcp::StereoPictureFrame> _stereo;
#include "player_video.h"
#include "image.h"
#include "image_proxy.h"
+#include "j2k_image_proxy.h"
#include "scaler.h"
using std::string;
using std::cout;
-using boost::shared_ptr;
using dcp::raw_convert;
+using boost::shared_ptr;
+using boost::dynamic_pointer_cast;
PlayerVideo::PlayerVideo (
shared_ptr<const ImageProxy> in,
_subtitle.image->write_to_socket (socket);
}
}
+
+bool
+PlayerVideo::has_j2k () const
+{
+ /* XXX: burnt-in subtitle; maybe other things */
+
+ shared_ptr<const J2KImageProxy> j2k = dynamic_pointer_cast<const J2KImageProxy> (_in);
+ if (!j2k) {
+ return false;
+ }
+
+ return _crop == Crop () && _inter_size == j2k->size();
+}
+
+shared_ptr<EncodedData>
+PlayerVideo::j2k () const
+{
+ shared_ptr<const J2KImageProxy> j2k = dynamic_pointer_cast<const J2KImageProxy> (_in);
+ assert (j2k);
+ return j2k->j2k ();
+}
class Scaler;
class Socket;
class Log;
+class EncodedData;
/** Everything needed to describe a video frame coming out of the player, but with the
* bits still their raw form. We may want to combine the bits on a remote machine,
void add_metadata (xmlpp::Node* node, bool send_subtitles) const;
void send_binary (boost::shared_ptr<Socket> socket, bool send_subtitles) const;
+ bool has_j2k () const;
+ boost::shared_ptr<EncodedData> j2k () const;
+
DCPTime time () const {
return _time;
}