From 64dc289b343641fc37db51fcd6b3069078cb5edf Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 24 Dec 2013 02:52:35 +0000 Subject: [PATCH] Some fixes to playback of drop-frame content. --- src/lib/decoder.cc | 21 ++++++++++++++------- src/lib/decoder.h | 2 +- src/lib/player.cc | 10 +++++----- test/seek_zero_test.cc | 4 ++-- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/lib/decoder.cc b/src/lib/decoder.cc index 18c5acd35..7f4973737 100644 --- a/src/lib/decoder.cc +++ b/src/lib/decoder.cc @@ -23,6 +23,7 @@ #include "film.h" #include "decoder.h" +#include "decoded.h" #include "i18n.h" @@ -37,10 +38,19 @@ Decoder::Decoder (shared_ptr f) } +class DecodedSorter +{ +public: + bool operator() (shared_ptr a, shared_ptr b) + { + return a->dcp_time < b->dcp_time; + } +}; + shared_ptr Decoder::peek () { - while (_pending.empty () && !pass ()) {} + while (_pending.empty() && !pass ()) {} if (_pending.empty ()) { return shared_ptr (); @@ -49,15 +59,12 @@ Decoder::peek () return _pending.front (); } -shared_ptr -Decoder::get () +void +Decoder::consume () { - shared_ptr d = peek (); - if (d) { + if (!_pending.empty ()) { _pending.pop_front (); } - - return d; } void diff --git a/src/lib/decoder.h b/src/lib/decoder.h index 654cacad4..1c6aff359 100644 --- a/src/lib/decoder.h +++ b/src/lib/decoder.h @@ -49,7 +49,7 @@ public: virtual void seek (ContentTime time, bool accurate); boost::shared_ptr peek (); - boost::shared_ptr get (); + void consume (); protected: diff --git a/src/lib/player.cc b/src/lib/player.cc index 0f2cc0365..3e282136f 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -147,7 +147,7 @@ Player::pass () if (_just_did_inaccurate_seek) { /* Just emit; no subtlety */ emit_video (earliest_piece, dv); - earliest_piece->decoder->get (); + earliest_piece->decoder->consume (); } else if (earliest_time > (_video_position + half_frame)) { /* See if we're inside some video content */ @@ -167,14 +167,14 @@ Player::pass () } else { if ( - dv->dcp_time >= _video_position && + abs (dv->dcp_time - _video_position) < half_frame && !earliest_piece->content->trimmed (dv->dcp_time - earliest_piece->content->position ()) ) { emit_video (earliest_piece, dv); } - earliest_piece->decoder->get (); + earliest_piece->decoder->consume (); } } else if (da && _audio) { @@ -182,13 +182,13 @@ Player::pass () emit_silence (earliest_time - _audio_position); } else { emit_audio (earliest_piece, da); - earliest_piece->decoder->get (); + earliest_piece->decoder->consume (); } } else if (ds && _video) { _in_subtitle.piece = earliest_piece; _in_subtitle.subtitle = ds; update_subtitle (); - earliest_piece->decoder->get (); + earliest_piece->decoder->consume (); } _just_did_inaccurate_seek = false; diff --git a/test/seek_zero_test.cc b/test/seek_zero_test.cc index d298a772b..0987f6b9b 100644 --- a/test/seek_zero_test.cc +++ b/test/seek_zero_test.cc @@ -45,10 +45,10 @@ BOOST_AUTO_TEST_CASE (seek_zero_test) wait_for_jobs (); FFmpegDecoder decoder (film, content, true, false); - shared_ptr a = decoder.get (); + shared_ptr a = decoder.peek (); cout << a->content_time << "\n"; decoder.seek (0, true); - shared_ptr b = decoder.get (); + shared_ptr b = decoder.peek (); cout << b->content_time << "\n"; /* a will be after no seek, and b after a seek to zero, which should -- 2.30.2