Connect Trimmer clsas.
authorCarl Hetherington <cth@carlh.net>
Tue, 23 Apr 2013 15:17:20 +0000 (16:17 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 23 Apr 2013 15:17:20 +0000 (16:17 +0100)
src/lib/ab_transcoder.cc
src/lib/ab_transcoder.h
src/lib/audio_source.cc
src/lib/audio_source.h
src/lib/transcoder.cc
src/lib/transcoder.h
src/lib/video_source.cc
src/lib/video_source.h

index 6eef397c245e69db4700ccc4454964b49ffabc33..26643b50edd5d3b936c1d970ae8af748faef9da3 100644 (file)
@@ -32,6 +32,7 @@
 #include "delay_line.h"
 #include "gain.h"
 #include "combiner.h"
+#include "trimmer.h"
 
 /** @file src/ab_transcoder.cc
  *  @brief A transcoder which uses one Film for the left half of the screen, and a different one
@@ -61,26 +62,48 @@ ABTranscoder::ABTranscoder (
        _db = decoder_factory (_film_b, o);
 
        shared_ptr<AudioStream> st = _film_a->audio_stream();
-       _matcher.reset (new Matcher (_film_a->log(), st->sample_rate(), _film_a->source_frame_rate()));
+       if (st) {
+               _matcher.reset (new Matcher (_film_a->log(), st->sample_rate(), _film_a->source_frame_rate()));
+       }
        _delay_line.reset (new DelayLine (_film_a->log(), _film_a->audio_delay() / 1000.0f));
        _gain.reset (new Gain (_film_a->log(), _film_a->audio_gain()));
 
+       int const sr = st ? st->sample_rate() : 0;
+       int const trim_start = _film_a->trim_type() == Film::ENCODE ? _film_a->trim_start() : 0;
+       int const trim_end = _film_a->trim_type() == Film::ENCODE ? _film_a->trim_end() : 0;
+       _trimmer.reset (new Trimmer (
+                               _film_a->log(), trim_start, trim_end, _film_a->length().get(),
+                               sr, _film_a->source_frame_rate(), _film_a->dcp_frame_rate()
+                               ));
+       
        /* Set up the decoder to use the film's set streams */
        _da.video->set_subtitle_stream (_film_a->subtitle_stream ());
        _db.video->set_subtitle_stream (_film_a->subtitle_stream ());
-       _da.audio->set_audio_stream (_film_a->audio_stream ());
+       if (_film_a->audio_stream ()) {
+               _da.audio->set_audio_stream (_film_a->audio_stream ());
+       }
 
        _da.video->Video.connect (bind (&Combiner::process_video, _combiner, _1, _2, _3, _4));
        _db.video->Video.connect (bind (&Combiner::process_video_b, _combiner, _1, _2, _3, _4));
 
        _combiner->connect_video (_delay_line);
-       _delay_line->connect_video (_matcher);
-       _matcher->connect_video (_encoder);
+       if (_matcher) {
+               _delay_line->connect_video (_matcher);
+               _matcher->connect_video (_trimmer);
+       } else {
+               _delay_line->connect_video (_trimmer);
+       }
+       _trimmer->connect_video (_encoder);
        
        _da.audio->connect_audio (_delay_line);
-       _delay_line->connect_audio (_matcher);
-       _matcher->connect_audio (_gain);
-       _gain->connect_audio (_encoder);
+       if (_matcher) {
+               _delay_line->connect_audio (_matcher);
+               _matcher->connect_audio (_gain);
+       } else {
+               _delay_line->connect_audio (_gain);
+       }
+       _gain->connect_audio (_trimmer);
+       _trimmer->connect_audio (_encoder);
 }
 
 void
index 58a08af04ca7fbe67eddd78937af60c0fd53b51d..4f1b14e48ef27bea3072510ae58088046c784ca0 100644 (file)
@@ -39,6 +39,7 @@ class Matcher;
 class DelayLine;
 class Gain;
 class Combiner;
+class Trimmer;
 
 /** @class ABTranscoder
  *  @brief A transcoder which uses one Film for the left half of the screen, and a different one
@@ -68,5 +69,6 @@ private:
        boost::shared_ptr<Matcher> _matcher;
        boost::shared_ptr<DelayLine> _delay_line;
        boost::shared_ptr<Gain> _gain;
+       boost::shared_ptr<Trimmer> _trimmer;
        boost::shared_ptr<Image> _image;
 };
index bca3562cf974f36ea45077b1a08ed01142ea79a2..d77e89367b059de70606d953be86f9ca50dae6ca 100644 (file)
@@ -34,3 +34,9 @@ TimedAudioSource::connect_audio (shared_ptr<TimedAudioSink> s)
 {
        Audio.connect (bind (&TimedAudioSink::process_audio, s, _1, _2));
 }
+
+void
+TimedAudioSource::connect_audio (shared_ptr<AudioSink> s)
+{
+       Audio.connect (bind (&AudioSink::process_audio, s, _1));
+}
index 3dc998ccacd7156cf2f766b7f40dff009791fcb2..e255d566d6ac5f0c8fac47fd376ef3f5a396bfe3 100644 (file)
@@ -48,6 +48,7 @@ public:
        /** Emitted when some audio data is ready */
        boost::signals2::signal<void (boost::shared_ptr<AudioBuffers>, double)> Audio;
 
+       void connect_audio (boost::shared_ptr<AudioSink>);
        void connect_audio (boost::shared_ptr<TimedAudioSink>);
 };
 
index e00b2f1e090ff09f55caab5e3c58a0edcf445c17..a10789e11f69394e642f61c4a6e0ef41d35e53c6 100644 (file)
@@ -36,6 +36,7 @@
 #include "gain.h"
 #include "video_decoder.h"
 #include "audio_decoder.h"
+#include "trimmer.h"
 
 using std::string;
 using boost::shared_ptr;
@@ -61,6 +62,14 @@ Transcoder::Transcoder (shared_ptr<Film> f, DecodeOptions o, Job* j, shared_ptr<
        _delay_line.reset (new DelayLine (f->log(), f->audio_delay() / 1000.0f));
        _gain.reset (new Gain (f->log(), f->audio_gain()));
 
+       int const sr = st ? st->sample_rate() : 0;
+       int const trim_start = f->trim_type() == Film::ENCODE ? f->trim_start() : 0;
+       int const trim_end = f->trim_type() == Film::ENCODE ? f->trim_end() : 0;
+       _trimmer.reset (new Trimmer (
+                               f->log(), trim_start, trim_end, f->length().get(),
+                               sr, f->source_frame_rate(), f->dcp_frame_rate()
+                               ));
+
        /* Set up the decoder to use the film's set streams */
        _decoders.video->set_subtitle_stream (f->subtitle_stream ());
        if (f->audio_stream ()) {
@@ -70,19 +79,21 @@ Transcoder::Transcoder (shared_ptr<Film> f, DecodeOptions o, Job* j, shared_ptr<
        _decoders.video->connect_video (_delay_line);
        if (_matcher) {
                _delay_line->connect_video (_matcher);
-               _matcher->connect_video (_encoder);
+               _matcher->connect_video (_trimmer);
        } else {
-               _delay_line->Video.connect (bind (&Encoder::process_video, _encoder, _1, _2, _3));
+               _delay_line->connect_video (_trimmer);
        }
+       _trimmer->connect_video (_encoder);
        
        _decoders.audio->connect_audio (_delay_line);
        if (_matcher) {
                _delay_line->connect_audio (_matcher);
                _matcher->connect_audio (_gain);
        } else {
-               _delay_line->Audio.connect (bind (&Encoder::process_audio, _encoder, _1));
+               _delay_line->connect_audio (_gain);
        }
-       _gain->connect_audio (_encoder);
+       _gain->connect_audio (_trimmer);
+       _trimmer->connect_audio (_encoder);
 }
 
 /** Run the decoder, passing its output to the encoder, until the decoder
index b0c263d07823f6450a6daa725a63bb6852df5976..f5b8ae6e329d3892735bf5d5a4d36f1615c44fc5 100644 (file)
@@ -35,6 +35,7 @@ class Gain;
 class VideoDecoder;
 class AudioDecoder;
 class DelayLine;
+class Trimmer;
 
 /** @class Transcoder
  *  @brief A class which takes a Film and some Options, then uses those to transcode the film.
@@ -68,4 +69,5 @@ protected:
        boost::shared_ptr<Matcher> _matcher;
        boost::shared_ptr<DelayLine> _delay_line;
        boost::shared_ptr<Gain> _gain;
+       boost::shared_ptr<Trimmer> _trimmer;
 };
index af6f941fd1f3f00a2b6ea2055e879bd75ddbf337..539243402e0824f7551940fe0cb12d2313d77acf 100644 (file)
@@ -34,3 +34,11 @@ TimedVideoSource::connect_video (shared_ptr<TimedVideoSink> s)
 {
        Video.connect (bind (&TimedVideoSink::process_video, s, _1, _2, _3, _4));
 }
+
+void
+TimedVideoSource::connect_video (shared_ptr<VideoSink> s)
+{
+       Video.connect (bind (&VideoSink::process_video, s, _1, _2, _3));
+}
+
+       
index 705b0023aec3037877a60e5e7af16db1a854d97e..e4a8ab0582535faf127481d53f7e1850821d2e1d 100644 (file)
@@ -65,6 +65,7 @@ public:
         */
        boost::signals2::signal<void (boost::shared_ptr<Image>, bool, boost::shared_ptr<Subtitle>, double)> Video;
 
+       void connect_video (boost::shared_ptr<VideoSink>);
        void connect_video (boost::shared_ptr<TimedVideoSink>);
 };