summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-05-24 17:36:41 +0100
committerCarl Hetherington <cth@carlh.net>2013-05-24 17:36:41 +0100
commita0f1a3d40f1c93d4432d1d4857c1620907259b2f (patch)
tree2281ecafd32c5d982b0ba164d194fc7a38e0a0b2 /src/lib
parentd6ae629f4a11579818235d37b2558c6cc9838779 (diff)
Seeking tweaks.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/black_decoder.cc22
-rw-r--r--src/lib/black_decoder.h2
-rw-r--r--src/lib/decoder.h7
-rw-r--r--src/lib/imagemagick_decoder.cc22
-rw-r--r--src/lib/imagemagick_decoder.h2
-rw-r--r--src/lib/player.cc13
-rw-r--r--src/lib/player.h1
-rw-r--r--src/lib/silence_decoder.cc22
-rw-r--r--src/lib/silence_decoder.h2
-rw-r--r--src/lib/sndfile_decoder.h3
10 files changed, 89 insertions, 7 deletions
diff --git a/src/lib/black_decoder.cc b/src/lib/black_decoder.cc
index e8e1a3df2..3cdd5eef5 100644
--- a/src/lib/black_decoder.cc
+++ b/src/lib/black_decoder.cc
@@ -70,3 +70,25 @@ BlackDecoder::seek (Time t)
{
_next_video = t;
}
+
+void
+BlackDecoder::seek_back ()
+{
+ boost::shared_ptr<const Film> f = _film.lock ();
+ if (!f) {
+ return;
+ }
+
+ _next_video -= f->video_frames_to_time (2);
+}
+
+void
+BlackDecoder::seek_forward ()
+{
+ boost::shared_ptr<const Film> f = _film.lock ();
+ if (!f) {
+ return;
+ }
+
+ _next_video += f->video_frames_to_time (1);
+}
diff --git a/src/lib/black_decoder.h b/src/lib/black_decoder.h
index b4beb0fdd..3aa63e22f 100644
--- a/src/lib/black_decoder.h
+++ b/src/lib/black_decoder.h
@@ -30,6 +30,8 @@ public:
void pass ();
void seek (Time);
+ void seek_back ();
+ void seek_forward ();
Time next () const;
/* VideoDecoder */
diff --git a/src/lib/decoder.h b/src/lib/decoder.h
index be9555dc4..edb532b9c 100644
--- a/src/lib/decoder.h
+++ b/src/lib/decoder.h
@@ -57,14 +57,15 @@ public:
/** Seek this decoder to as close as possible to some time,
* expressed relative to our source's start.
* @param t Time.
+ * @param a true to try hard to be accurate, otherwise false.
*/
- virtual void seek (Time) {}
+ virtual void seek (Time) = 0;
/** Seek back one video frame */
- virtual void seek_back () {}
+ virtual void seek_back () = 0;
/** Seek forward one video frame */
- virtual void seek_forward () {}
+ virtual void seek_forward () = 0;
/** @return Approximate time of the next content that we will emit,
* expressed relative to the start of our source.
diff --git a/src/lib/imagemagick_decoder.cc b/src/lib/imagemagick_decoder.cc
index b2bbb4118..15c919e87 100644
--- a/src/lib/imagemagick_decoder.cc
+++ b/src/lib/imagemagick_decoder.cc
@@ -111,6 +111,28 @@ ImageMagickDecoder::seek (Time t)
_next_video = t;
}
+void
+ImageMagickDecoder::seek_back ()
+{
+ boost::shared_ptr<const Film> f = _film.lock ();
+ if (!f) {
+ return;
+ }
+
+ _next_video -= f->video_frames_to_time (2);
+}
+
+void
+ImageMagickDecoder::seek_forward ()
+{
+ boost::shared_ptr<const Film> f = _film.lock ();
+ if (!f) {
+ return;
+ }
+
+ _next_video += f->video_frames_to_time (1);
+}
+
Time
ImageMagickDecoder::next () const
{
diff --git a/src/lib/imagemagick_decoder.h b/src/lib/imagemagick_decoder.h
index 26dbb8ca0..6640032ba 100644
--- a/src/lib/imagemagick_decoder.h
+++ b/src/lib/imagemagick_decoder.h
@@ -34,6 +34,8 @@ public:
void pass ();
void seek (Time);
+ void seek_back ();
+ void seek_forward ();
Time next () const;
/* VideoDecoder */
diff --git a/src/lib/player.cc b/src/lib/player.cc
index 8a13efd0c..d3886721b 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -103,13 +103,14 @@ Player::pass ()
shared_ptr<Piece> earliest;
for (list<shared_ptr<Piece> >::iterator i = _pieces.begin(); i != _pieces.end(); ++i) {
-// cout << "check " << (*i)->decoder->next() << " cf " << (*i)->content->end() << "\n";
+ cout << "check " << (*i)->content->file() << " start=" << (*i)->content->start() << ", next=" << (*i)->decoder->next() << ", end=" << (*i)->content->end() << "\n";
if (((*i)->decoder->next() + (*i)->content->start()) >= (*i)->content->end()) {
continue;
}
Time const t = (*i)->content->start() + (*i)->decoder->next();
if (t < earliest_t) {
+ cout << "\t candidate; " << t << " " << (t / TIME_HZ) << ".\n";
earliest_t = t;
earliest = *i;
}
@@ -120,7 +121,7 @@ Player::pass ()
}
cout << "PASS:\n";
- cout << "\tpass ";
+ cout << "\tpass " << earliest->content->file() << " ";
if (dynamic_pointer_cast<FFmpegContent> (earliest->content)) {
cout << " FFmpeg.\n";
} else if (dynamic_pointer_cast<ImageMagickContent> (earliest->content)) {
@@ -135,6 +136,7 @@ Player::pass ()
earliest->decoder->pass ();
_position = earliest->content->start() + earliest->decoder->next ();
+ cout << "\tpassed to " << _position << " " << (_position / TIME_HZ) << "\n";
return false;
}
@@ -142,6 +144,8 @@ Player::pass ()
void
Player::process_video (weak_ptr<Content> weak_content, shared_ptr<const Image> image, bool same, shared_ptr<Subtitle> sub, Time time)
{
+ cout << "[V]\n";
+
shared_ptr<Content> content = weak_content.lock ();
if (!content) {
return;
@@ -207,6 +211,7 @@ Player::seek (Time t)
Time s = t - (*i)->content->start ();
s = max (static_cast<Time> (0), s);
s = min ((*i)->content->length(), s);
+ cout << "seek [" << (*i)->content->file() << "," << (*i)->content->start() << "," << (*i)->content->end() << "] to " << s << "\n";
(*i)->decoder->seek (s);
}
@@ -217,13 +222,13 @@ Player::seek (Time t)
void
Player::seek_back ()
{
- /* XXX */
+
}
void
Player::seek_forward ()
{
- /* XXX */
+
}
struct ContentSorter
diff --git a/src/lib/player.h b/src/lib/player.h
index a5fe844f0..4d23d1951 100644
--- a/src/lib/player.h
+++ b/src/lib/player.h
@@ -67,6 +67,7 @@ private:
void setup_pieces ();
void playlist_changed ();
void content_changed (boost::weak_ptr<Content>, int);
+ void do_seek (Time, bool);
boost::shared_ptr<const Film> _film;
boost::shared_ptr<const Playlist> _playlist;
diff --git a/src/lib/silence_decoder.cc b/src/lib/silence_decoder.cc
index 9eee5bb10..e787262f5 100644
--- a/src/lib/silence_decoder.cc
+++ b/src/lib/silence_decoder.cc
@@ -49,6 +49,28 @@ SilenceDecoder::seek (Time t)
_next_audio = t;
}
+void
+SilenceDecoder::seek_back ()
+{
+ boost::shared_ptr<const Film> f = _film.lock ();
+ if (!f) {
+ return;
+ }
+
+ _next_audio -= f->video_frames_to_time (2);
+}
+
+void
+SilenceDecoder::seek_forward ()
+{
+ boost::shared_ptr<const Film> f = _film.lock ();
+ if (!f) {
+ return;
+ }
+
+ _next_audio += f->video_frames_to_time (1);
+}
+
Time
SilenceDecoder::next () const
{
diff --git a/src/lib/silence_decoder.h b/src/lib/silence_decoder.h
index e2a004d61..8452bc43f 100644
--- a/src/lib/silence_decoder.h
+++ b/src/lib/silence_decoder.h
@@ -30,5 +30,7 @@ public:
void pass ();
void seek (Time);
+ void seek_back ();
+ void seek_forward ();
Time next () const;
};
diff --git a/src/lib/sndfile_decoder.h b/src/lib/sndfile_decoder.h
index 1dc484fdc..b4fa5bc58 100644
--- a/src/lib/sndfile_decoder.h
+++ b/src/lib/sndfile_decoder.h
@@ -30,6 +30,9 @@ public:
~SndfileDecoder ();
void pass ();
+ void seek (Time) {}
+ void seek_back () {}
+ void seek_forward () {}
Time next () const;
int audio_channels () const;