From: Carl Hetherington Date: Thu, 15 Nov 2012 23:20:25 +0000 (+0000) Subject: Untested rework of AB transcoder. X-Git-Tag: v2.0.48~1526 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=549d0e4a24d7bf8f45a3a43b70ff82dd2c337639 Untested rework of AB transcoder. --- diff --git a/src/lib/ab_transcoder.cc b/src/lib/ab_transcoder.cc index 9999eda90..00fc025a2 100644 --- a/src/lib/ab_transcoder.cc +++ b/src/lib/ab_transcoder.cc @@ -28,6 +28,10 @@ #include "options.h" #include "image.h" #include "decoder_factory.h" +#include "matcher.h" +#include "delay_line.h" +#include "gain.h" +#include "combiner.h" /** @file src/ab_transcoder.cc * @brief A transcoder which uses one Film for the left half of the screen, and a different one @@ -55,48 +59,36 @@ ABTranscoder::ABTranscoder ( _da = decoder_factory (_film_a, o, j); _db = decoder_factory (_film_b, o, j); - /* XXX */ - -// _da->Video.connect (bind (&ABTranscoder::process_video, this, _1, _2, 0)); -// _db->Video.connect (bind (&ABTranscoder::process_video, this, _1, _2, 1)); -// _da->Audio.connect (bind (&Encoder::process_audio, e, _1)); -} + if (_film_a->audio_stream()) { + AudioStream st = _film_a->audio_stream().get(); + _matcher.reset (new Matcher (_film_a->log(), st.sample_rate(), _film_a->frames_per_second())); + _delay_line.reset (new DelayLine (_film_a->log(), st.channels(), _film_a->audio_delay() * st.sample_rate() / 1000)); + _gain.reset (new Gain (_film_a->log(), _film_a->audio_gain())); + } -ABTranscoder::~ABTranscoder () -{ + /* Set up the decoder to use the film's set streams */ + _da.first->set_subtitle_stream (_film_a->subtitle_stream ()); + _db.first->set_subtitle_stream (_film_a->subtitle_stream ()); + _da.second->set_audio_stream (_film_a->audio_stream ()); -} + _da.first->Video.connect (bind (&Combiner::process_video, _combiner, _1, _2)); + _db.first->Video.connect (bind (&Combiner::process_video_b, _combiner, _1, _2)); -void -ABTranscoder::process_video (shared_ptr yuv, shared_ptr sub, int index) -{ - if (index == 0) { - /* Keep this image around until we get the other half */ - _image = yuv; + if (_matcher) { + _combiner->connect_video (_matcher); + _matcher->connect_video (_encoder); } else { - /* Copy the right half of yuv into _image */ - for (int i = 0; i < yuv->components(); ++i) { - int const line_size = yuv->line_size()[i]; - int const half_line_size = line_size / 2; - int const stride = yuv->stride()[i]; - - uint8_t* p = _image->data()[i]; - uint8_t* q = yuv->data()[i]; - - for (int j = 0; j < yuv->lines (i); ++j) { - memcpy (p + half_line_size, q + half_line_size, half_line_size); - p += stride; - q += stride; - } - } - - /* And pass it to the encoder */ - _encoder->process_video (_image, sub); - _image.reset (); + _combiner->connect_video (_encoder); + } + + if (_matcher && _delay_line) { + _da.second->connect_audio (_delay_line); + _delay_line->connect_audio (_matcher); + _matcher->connect_audio (_gain); + _gain->connect_audio (_encoder); } } - void ABTranscoder::go () { diff --git a/src/lib/ab_transcoder.h b/src/lib/ab_transcoder.h index c951329f2..9b57e4f73 100644 --- a/src/lib/ab_transcoder.h +++ b/src/lib/ab_transcoder.h @@ -35,6 +35,10 @@ class Image; class Log; class Subtitle; class Film; +class Matcher; +class DelayLine; +class Gain; +class Combiner; /** @class ABTranscoder * @brief A transcoder which uses one Film for the left half of the screen, and a different one @@ -51,13 +55,9 @@ public: boost::shared_ptr e ); - ~ABTranscoder (); - void go (); private: - void process_video (boost::shared_ptr, boost::shared_ptr, int); - boost::shared_ptr _film_a; boost::shared_ptr _film_b; boost::shared_ptr _opt; @@ -65,5 +65,9 @@ private: boost::shared_ptr _encoder; std::pair, boost::shared_ptr > _da; std::pair, boost::shared_ptr > _db; + boost::shared_ptr _combiner; + boost::shared_ptr _matcher; + boost::shared_ptr _delay_line; + boost::shared_ptr _gain; boost::shared_ptr _image; }; diff --git a/src/lib/combiner.cc b/src/lib/combiner.cc new file mode 100644 index 000000000..4ccf7bb37 --- /dev/null +++ b/src/lib/combiner.cc @@ -0,0 +1,39 @@ +#include "combiner.h" +#include "image.h" + +using boost::shared_ptr; + +Combiner::Combiner (Log* log) + : VideoProcessor (log) +{ + +} + +void +Combiner::process_video (shared_ptr image, shared_ptr sub) +{ + _image = image; +} + +void +Combiner::process_video_b (shared_ptr image, shared_ptr sub) +{ + /* Copy the right half of this image into our _image */ + for (int i = 0; i < image->components(); ++i) { + int const line_size = image->line_size()[i]; + int const half_line_size = line_size / 2; + int const stride = image->stride()[i]; + + uint8_t* p = _image->data()[i]; + uint8_t* q = image->data()[i]; + + for (int j = 0; j < image->lines (i); ++j) { + memcpy (p + half_line_size, q + half_line_size, half_line_size); + p += stride; + q += stride; + } + } + + Video (_image, sub); + _image.reset (); +} diff --git a/src/lib/combiner.h b/src/lib/combiner.h new file mode 100644 index 000000000..7d81500a8 --- /dev/null +++ b/src/lib/combiner.h @@ -0,0 +1,13 @@ +#include "processor.h" + +class Combiner : public VideoProcessor +{ +public: + Combiner (Log* log); + + void process_video (boost::shared_ptr i, boost::shared_ptr s); + void process_video_b (boost::shared_ptr i, boost::shared_ptr s); + +private: + boost::shared_ptr _image; +}; diff --git a/src/lib/wscript b/src/lib/wscript index 339c73e47..5284dc97f 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -13,6 +13,7 @@ def build(bld): check_hashes_job.cc config.cc copy_from_dvd_job.cc + combiner.cc cross.cc dcp_content_type.cc dcp_video_frame.cc