diff options
| author | Carl Hetherington <cth@carlh.net> | 2012-11-15 22:26:16 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2012-11-15 22:26:16 +0000 |
| commit | 4fbd1901fdabc829cfa7e7d4d0c1272bba87033c (patch) | |
| tree | 416701b4a2923cdc16983311239bd311282e8438 /src/lib/video_decoder.cc | |
| parent | f5c40275a2dc444c295a547dfedcd8f9eee2bcb2 (diff) | |
Untested external audio support; AB transcodes still broken.
Diffstat (limited to 'src/lib/video_decoder.cc')
| -rw-r--r-- | src/lib/video_decoder.cc | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc new file mode 100644 index 000000000..906f92ef1 --- /dev/null +++ b/src/lib/video_decoder.cc @@ -0,0 +1,79 @@ +#include "video_decoder.h" +#include "subtitle.h" +#include "film.h" +#include "image.h" +#include "log.h" +#include "options.h" +#include "job.h" + +using boost::shared_ptr; +using boost::optional; + +VideoDecoder::VideoDecoder (shared_ptr<Film> f, shared_ptr<const Options> o, Job* j) + : Decoder (f, o, j) + , _video_frame (0) +{ + +} + +/** Called by subclasses to tell the world that some video data is ready. + * We find a subtitle then emit it for listeners. + * @param frame to decode; caller manages memory. + */ +void +VideoDecoder::emit_video (shared_ptr<Image> image) +{ + shared_ptr<Subtitle> sub; + if (_timed_subtitle && _timed_subtitle->displayed_at (double (video_frame()) / _film->frames_per_second())) { + sub = _timed_subtitle->subtitle (); + } + + signal_video (image, sub); +} + +void +VideoDecoder::repeat_last_video () +{ + if (!_last_image) { + _last_image.reset (new CompactImage (pixel_format(), native_size())); + _last_image->make_black (); + } + + signal_video (_last_image, _last_subtitle); +} + +void +VideoDecoder::signal_video (shared_ptr<Image> image, shared_ptr<Subtitle> sub) +{ + TIMING ("Decoder emits %1", _video_frame); + Video (image, sub); + ++_video_frame; + + _last_image = image; + _last_subtitle = sub; +} + +void +VideoDecoder::emit_subtitle (shared_ptr<TimedSubtitle> s) +{ + _timed_subtitle = s; + + if (_timed_subtitle && _opt->apply_crop) { + Position const p = _timed_subtitle->subtitle()->position (); + _timed_subtitle->subtitle()->set_position (Position (p.x - _film->crop().left, p.y - _film->crop().top)); + } +} + +void +VideoDecoder::set_subtitle_stream (optional<SubtitleStream> s) +{ + _subtitle_stream = s; +} + +void +VideoDecoder::set_progress () const +{ + if (_job && _film->dcp_length()) { + _job->set_progress (float (_video_frame) / _film->length().get()); + } +} |
