#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
_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
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
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;
};
{
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));
+}
/** 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>);
};
#include "gain.h"
#include "video_decoder.h"
#include "audio_decoder.h"
+#include "trimmer.h"
using std::string;
using boost::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 ()) {
_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
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.
boost::shared_ptr<Matcher> _matcher;
boost::shared_ptr<DelayLine> _delay_line;
boost::shared_ptr<Gain> _gain;
+ boost::shared_ptr<Trimmer> _trimmer;
};
{
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));
+}
+
+
*/
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>);
};