diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-05-24 17:36:41 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-05-24 17:36:41 +0100 |
| commit | a0f1a3d40f1c93d4432d1d4857c1620907259b2f (patch) | |
| tree | 2281ecafd32c5d982b0ba164d194fc7a38e0a0b2 /src/lib | |
| parent | d6ae629f4a11579818235d37b2558c6cc9838779 (diff) | |
Seeking tweaks.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/black_decoder.cc | 22 | ||||
| -rw-r--r-- | src/lib/black_decoder.h | 2 | ||||
| -rw-r--r-- | src/lib/decoder.h | 7 | ||||
| -rw-r--r-- | src/lib/imagemagick_decoder.cc | 22 | ||||
| -rw-r--r-- | src/lib/imagemagick_decoder.h | 2 | ||||
| -rw-r--r-- | src/lib/player.cc | 13 | ||||
| -rw-r--r-- | src/lib/player.h | 1 | ||||
| -rw-r--r-- | src/lib/silence_decoder.cc | 22 | ||||
| -rw-r--r-- | src/lib/silence_decoder.h | 2 | ||||
| -rw-r--r-- | src/lib/sndfile_decoder.h | 3 |
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; |
