diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/encoder.cc | 19 | ||||
| -rw-r--r-- | src/lib/encoder.h | 2 | ||||
| -rw-r--r-- | src/lib/player.cc | 79 |
3 files changed, 69 insertions, 31 deletions
diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index 07c97c674..9b195bade 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -64,6 +64,8 @@ Encoder::Encoder (shared_ptr<const Film> film, weak_ptr<Job> j, shared_ptr<Write : _film (film) , _job (j) , _video_frames_enqueued (0) + , _left_done (false) + , _right_done (false) , _terminate (false) , _writer (writer) { @@ -247,8 +249,23 @@ Encoder::enqueue (shared_ptr<PlayerVideo> pv) _empty_condition.notify_all (); } - if (pv->eyes() != EYES_LEFT) { + 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; diff --git a/src/lib/encoder.h b/src/lib/encoder.h index 85bc6ae99..47eef823b 100644 --- a/src/lib/encoder.h +++ b/src/lib/encoder.h @@ -100,6 +100,8 @@ private: /** Number of video frames enqueued so far */ int _video_frames_enqueued; + bool _left_done; + bool _right_done; bool _terminate; std::list<boost::shared_ptr<DCPVideo> > _queue; diff --git a/src/lib/player.cc b/src/lib/player.cc index 328920549..b0ba41597 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -361,38 +361,57 @@ Player::get_video (DCPTime time, bool accurate) /* No video content at this time */ pvf.push_back (black_player_video_frame (time)); } else { - /* Create a PlayerVideo from the content's video at this time */ - - shared_ptr<Piece> piece = ov.back (); - shared_ptr<VideoDecoder> decoder = dynamic_pointer_cast<VideoDecoder> (piece->decoder); - DCPOMATIC_ASSERT (decoder); - shared_ptr<VideoContent> video_content = dynamic_pointer_cast<VideoContent> (piece->content); - DCPOMATIC_ASSERT (video_content); - - list<ContentVideo> content_video = decoder->get_video (dcp_to_content_video (piece, time), accurate); - if (content_video.empty ()) { - pvf.push_back (black_player_video_frame (time)); - return pvf; + /* Decide which pieces of content to use */ + list<shared_ptr<Piece> > ov_to_use; + + /* Always use the last one */ + list<shared_ptr<Piece> >::reverse_iterator i = ov.rbegin (); + ov_to_use.push_back (*i); + VideoFrameType const first_type = dynamic_pointer_cast<VideoContent> ((*i)->content)->video_frame_type (); + + ++i; + if (i != ov.rend ()) { + shared_ptr<VideoContent> vc = dynamic_pointer_cast<VideoContent> ((*i)->content); + /* Use the second to last if it's the other part of a 3D content pair */ + if ( + (first_type == EYES_LEFT && vc->video_frame_type() == EYES_RIGHT) || + (first_type == EYES_RIGHT && vc->video_frame_type() == EYES_LEFT) + ) { + /* Other part of a pair of 3D content */ + ov_to_use.push_back (*i); + } } - dcp::Size image_size = video_content->scale().size (video_content, _video_container_size, _film->frame_size ()); - - for (list<ContentVideo>::const_iterator i = content_video.begin(); i != content_video.end(); ++i) { - pvf.push_back ( - shared_ptr<PlayerVideo> ( - new PlayerVideo ( - i->image, - content_video_to_dcp (piece, i->frame), - video_content->crop (), - video_content->fade (i->frame), - image_size, - _video_container_size, - i->eyes, - i->part, - video_content->colour_conversion () - ) - ) - ); + BOOST_FOREACH (shared_ptr<Piece> piece, ov_to_use) { + shared_ptr<VideoDecoder> decoder = dynamic_pointer_cast<VideoDecoder> (piece->decoder); + DCPOMATIC_ASSERT (decoder); + shared_ptr<VideoContent> video_content = dynamic_pointer_cast<VideoContent> (piece->content); + DCPOMATIC_ASSERT (video_content); + + list<ContentVideo> content_video = decoder->get_video (dcp_to_content_video (piece, time), accurate); + if (content_video.empty ()) { + pvf.push_back (black_player_video_frame (time)); + } else { + dcp::Size image_size = video_content->scale().size (video_content, _video_container_size, _film->frame_size ()); + + for (list<ContentVideo>::const_iterator i = content_video.begin(); i != content_video.end(); ++i) { + pvf.push_back ( + shared_ptr<PlayerVideo> ( + new PlayerVideo ( + i->image, + content_video_to_dcp (piece, i->frame), + video_content->crop (), + video_content->fade (i->frame), + image_size, + _video_container_size, + i->eyes, + i->part, + video_content->colour_conversion () + ) + ) + ); + } + } } } |
