summaryrefslogtreecommitdiff
path: root/src/lib/video_decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-11-15 22:26:16 +0000
committerCarl Hetherington <cth@carlh.net>2012-11-15 22:26:16 +0000
commit4fbd1901fdabc829cfa7e7d4d0c1272bba87033c (patch)
tree416701b4a2923cdc16983311239bd311282e8438 /src/lib/video_decoder.cc
parentf5c40275a2dc444c295a547dfedcd8f9eee2bcb2 (diff)
Untested external audio support; AB transcodes still broken.
Diffstat (limited to 'src/lib/video_decoder.cc')
-rw-r--r--src/lib/video_decoder.cc79
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());
+ }
+}