summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-12-24 02:52:35 +0000
committerCarl Hetherington <cth@carlh.net>2013-12-24 02:52:35 +0000
commit64dc289b343641fc37db51fcd6b3069078cb5edf (patch)
treeecdee5041e771892b34a7acd13cc8a79381b8142
parentdc87445987c00b85a44b6372e43894067fae44b3 (diff)
Some fixes to playback of drop-frame content.
-rw-r--r--src/lib/decoder.cc21
-rw-r--r--src/lib/decoder.h2
-rw-r--r--src/lib/player.cc10
-rw-r--r--test/seek_zero_test.cc4
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<const Film> f)
}
+class DecodedSorter
+{
+public:
+ bool operator() (shared_ptr<Decoded> a, shared_ptr<Decoded> b)
+ {
+ return a->dcp_time < b->dcp_time;
+ }
+};
+
shared_ptr<Decoded>
Decoder::peek ()
{
- while (_pending.empty () && !pass ()) {}
+ while (_pending.empty() && !pass ()) {}
if (_pending.empty ()) {
return shared_ptr<Decoded> ();
@@ -49,15 +59,12 @@ Decoder::peek ()
return _pending.front ();
}
-shared_ptr<Decoded>
-Decoder::get ()
+void
+Decoder::consume ()
{
- shared_ptr<Decoded> 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<Decoded> peek ();
- boost::shared_ptr<Decoded> 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<Decoded> a = decoder.get ();
+ shared_ptr<Decoded> a = decoder.peek ();
cout << a->content_time << "\n";
decoder.seek (0, true);
- shared_ptr<Decoded> b = decoder.get ();
+ shared_ptr<Decoded> b = decoder.peek ();
cout << b->content_time << "\n";
/* a will be after no seek, and b after a seek to zero, which should