summaryrefslogtreecommitdiff
path: root/src/lib/encoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-10-20 09:55:24 +0100
committerCarl Hetherington <cth@carlh.net>2015-10-22 10:30:45 +0100
commit2c5398adaea8bc56fe196144a9a233981657fba0 (patch)
treef243d30eaef1f30045f0974b0f99fce3ed1d483b /src/lib/encoder.cc
parent3a626081718fe09edafb951ac9a69e44145bf551 (diff)
Various multi-reel fixes.
* _video_frames_enqueued -> _position * some int -> Frame replacements * Call Writer::ref_write when there is nothing to encode / write for one frame. * Assume Encoder::encode is called once per output video frame. * Possibly correct some off-by-1 overlap bugs. * Don't reset _last_written on FAKE write as I believe there is no need.
Diffstat (limited to 'src/lib/encoder.cc')
-rw-r--r--src/lib/encoder.cc54
1 files changed, 24 insertions, 30 deletions
diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc
index f7a66708e..95a85f7e8 100644
--- a/src/lib/encoder.cc
+++ b/src/lib/encoder.cc
@@ -59,9 +59,7 @@ int const Encoder::_history_size = 25;
Encoder::Encoder (shared_ptr<const Film> film, weak_ptr<Job> j, shared_ptr<Writer> writer)
: _film (film)
, _job (j)
- , _video_frames_enqueued (0)
- , _left_done (false)
- , _right_done (false)
+ , _position (0)
, _terminate_enqueue (false)
, _terminate_encoding (false)
, _writer (writer)
@@ -155,7 +153,7 @@ int
Encoder::video_frames_out () const
{
boost::mutex::scoped_lock (_state_mutex);
- return _video_frames_enqueued;
+ return _position;
}
/** Should be called when a frame has been encoded successfully.
@@ -174,10 +172,25 @@ Encoder::frame_done ()
}
}
-/** Called in order, so each time this is called the supplied frame is the one
- * after the previous one.
+/** Called to start encoding of the next video frame in the DCP. This is called in order,
+ * so each time the supplied frame is the one after the previous one.
+ * pv represents one video frame, and could be empty if there is nothing to encode
+ * for this DCP frame.
*/
void
+Encoder::encode (list<shared_ptr<PlayerVideo> > pv)
+{
+ if (pv.empty ()) {
+ _writer->ref_write (_position);
+ } else {
+ BOOST_FOREACH (shared_ptr<PlayerVideo> i, pv) {
+ enqueue (i);
+ }
+ }
+ ++_position;
+}
+
+void
Encoder::enqueue (shared_ptr<PlayerVideo> pv)
{
_waker.nudge ();
@@ -210,22 +223,22 @@ Encoder::enqueue (shared_ptr<PlayerVideo> pv)
*/
rethrow ();
- if (_writer->can_fake_write (_video_frames_enqueued)) {
+ if (_writer->can_fake_write (_position)) {
/* We can fake-write this frame */
- _writer->fake_write (_video_frames_enqueued, pv->eyes ());
+ _writer->fake_write (_position, pv->eyes ());
frame_done ();
} else if (pv->has_j2k ()) {
/* This frame already has JPEG2000 data, so just write it */
- _writer->write (pv->j2k(), _video_frames_enqueued, pv->eyes ());
+ _writer->write (pv->j2k(), _position, pv->eyes ());
} else if (_last_player_video && pv->same (_last_player_video)) {
- _writer->repeat (_video_frames_enqueued, pv->eyes ());
+ _writer->repeat (_position, pv->eyes ());
} else {
/* Queue this new frame for encoding */
LOG_TIMING ("add-frame-to-queue queue=%1", _queue.size ());
_queue.push_back (shared_ptr<DCPVideo> (
new DCPVideo (
pv,
- _video_frames_enqueued,
+ _position,
_film->video_frame_rate(),
_film->j2k_bandwidth(),
_film->resolution(),
@@ -239,25 +252,6 @@ Encoder::enqueue (shared_ptr<PlayerVideo> pv)
_empty_condition.notify_all ();
}
- switch (pv->eyes ()) {
- case EYES_BOTH:
- ++_video_frames_enqueued;
- break;
- case EYES_LEFT:
- _left_done = true;
- break;
- case EYES_RIGHT:
- _right_done = true;
- break;
- default:
- break;
- }
-
- if (_left_done && _right_done) {
- ++_video_frames_enqueued;
- _left_done = _right_done = false;
- }
-
_last_player_video = pv;
}