: _film (f)
, _job (j)
, _video_frames_out (0)
- , _have_a_real_frame (false)
, _terminate (false)
{
-
+ _have_a_real_frame[EYES_BOTH] = false;
+ _have_a_real_frame[EYES_LEFT] = false;
+ _have_a_real_frame[EYES_RIGHT] = false;
}
Encoder::~Encoder ()
Encoder::process_begin ()
{
for (int i = 0; i < Config::instance()->num_local_encoding_threads (); ++i) {
- _threads.push_back (new boost::thread (boost::bind (&Encoder::encoder_thread, this, (ServerDescription *) 0)));
+ _threads.push_back (new boost::thread (boost::bind (&Encoder::encoder_thread, this, shared_ptr<ServerDescription> ())));
}
- vector<ServerDescription*> servers = Config::instance()->servers ();
+ vector<shared_ptr<ServerDescription> > servers = Config::instance()->servers ();
- for (vector<ServerDescription*>::iterator i = servers.begin(); i != servers.end(); ++i) {
+ for (vector<shared_ptr<ServerDescription> >::iterator i = servers.begin(); i != servers.end(); ++i) {
for (int j = 0; j < (*i)->threads (); ++j) {
_threads.push_back (new boost::thread (boost::bind (&Encoder::encoder_thread, this, *i)));
}
for (list<shared_ptr<DCPVideoFrame> >::iterator i = _queue.begin(); i != _queue.end(); ++i) {
_film->log()->log (String::compose (N_("Encode left-over frame %1"), (*i)->frame ()));
try {
- _writer->write ((*i)->encode_locally(), (*i)->frame ());
+ _writer->write ((*i)->encode_locally(), (*i)->frame (), (*i)->eyes ());
frame_done ();
} catch (std::exception& e) {
_film->log()->log (String::compose (N_("Local encode failed (%1)"), e.what ()));
}
void
-Encoder::process_video (shared_ptr<const Image> image, bool same)
+Encoder::process_video (shared_ptr<const Image> image, Eyes eyes, bool same)
{
boost::mutex::scoped_lock lock (_mutex);
+ /* XXX: discard 3D here if required */
+
/* Wait until the queue has gone down a bit */
while (_queue.size() >= _threads.size() * 2 && !_terminate) {
TIMING ("decoder sleeps with queue of %1", _queue.size());
}
if (_writer->can_fake_write (_video_frames_out)) {
- _writer->fake_write (_video_frames_out);
- _have_a_real_frame = false;
+ _writer->fake_write (_video_frames_out, eyes);
+ _have_a_real_frame[eyes] = false;
frame_done ();
- } else if (same && _have_a_real_frame) {
+ } else if (same && _have_a_real_frame[eyes]) {
/* Use the last frame that we encoded. */
- _writer->repeat (_video_frames_out);
+ _writer->repeat (_video_frames_out, eyes);
frame_done ();
} else {
/* Queue this new frame for encoding */
TIMING ("adding to queue of %1", _queue.size ());
- /* XXX: padding */
_queue.push_back (shared_ptr<DCPVideoFrame> (
new DCPVideoFrame (
- image, _video_frames_out, _film->dcp_video_frame_rate(),
- _film->colour_lut(), _film->j2k_bandwidth(), _film->log()
+ image, _video_frames_out, eyes, _film->video_frame_rate(),
+ _film->j2k_bandwidth(), _film->log()
)
));
_condition.notify_all ();
- _have_a_real_frame = true;
+ _have_a_real_frame[eyes] = true;
}
- ++_video_frames_out;
+ if (eyes != EYES_LEFT) {
+ ++_video_frames_out;
+ }
}
void
}
void
-Encoder::encoder_thread (ServerDescription* server)
+Encoder::encoder_thread (shared_ptr<ServerDescription> server)
{
/* Number of seconds that we currently wait between attempts
to connect to the server; not relevant for localhost
TIMING ("encoder thread %1 wakes with queue of %2", boost::this_thread::get_id(), _queue.size());
shared_ptr<DCPVideoFrame> vf = _queue.front ();
- _film->log()->log (String::compose (N_("Encoder thread %1 pops frame %2 from queue"), boost::this_thread::get_id(), vf->frame()), Log::VERBOSE);
+ _film->log()->log (String::compose (N_("Encoder thread %1 pops frame %2 (%3) from queue"), boost::this_thread::get_id(), vf->frame(), vf->eyes ()));
_queue.pop_front ();
lock.unlock ();
}
if (encoded) {
- _writer->write (encoded, vf->frame ());
+ _writer->write (encoded, vf->frame (), vf->eyes ());
frame_done ();
} else {
lock.lock ();