#include <iostream>
#include <boost/shared_ptr.hpp>
-#include <sigc++/bind.h>
#include "ab_transcoder.h"
#include "film.h"
#include "decoder.h"
#include "encoder.h"
#include "job.h"
-#include "film_state.h"
#include "options.h"
#include "image.h"
#include "decoder_factory.h"
/** @file src/ab_transcoder.cc
- * @brief A transcoder which uses one FilmState for the left half of the screen, and a different one
+ * @brief A transcoder which uses one Film for the left half of the screen, and a different one
* for the right half (to facilitate A/B comparisons of settings)
*/
-using namespace std;
-using namespace boost;
+using std::string;
+using boost::shared_ptr;
-/** @param a FilmState to use for the left half of the screen.
- * @param b FilmState to use for the right half of the screen.
+/** @param a Film to use for the left half of the screen.
+ * @param b Film to use for the right half of the screen.
* @param o Options.
* @param j Job that we are associated with.
- * @param l Log.
* @param e Encoder to use.
*/
ABTranscoder::ABTranscoder (
- shared_ptr<const FilmState> a, shared_ptr<const FilmState> b, shared_ptr<const Options> o, Job* j, Log* l, shared_ptr<Encoder> e)
- : _fs_a (a)
- , _fs_b (b)
+ shared_ptr<Film> a, shared_ptr<Film> b, shared_ptr<const Options> o, Job* j, shared_ptr<Encoder> e)
+ : _film_a (a)
+ , _film_b (b)
, _opt (o)
, _job (j)
- , _log (l)
, _encoder (e)
, _last_frame (0)
{
- _da = decoder_factory (_fs_a, o, j, _log);
- _db = decoder_factory (_fs_b, o, j, _log);
+ _da = decoder_factory (_film_a, o, j);
+ _db = decoder_factory (_film_b, o, j);
- _da->Video.connect (sigc::bind (sigc::mem_fun (*this, &ABTranscoder::process_video), 0));
- _db->Video.connect (sigc::bind (sigc::mem_fun (*this, &ABTranscoder::process_video), 1));
- _da->Audio.connect (sigc::mem_fun (*e, &Encoder::process_audio));
+ _da->Video.connect (bind (&ABTranscoder::process_video, this, _1, _2, _3, 0));
+ _db->Video.connect (bind (&ABTranscoder::process_video, this, _1, _2, _3, 1));
+ _da->Audio.connect (bind (&Encoder::process_audio, e, _1, _2));
}
ABTranscoder::~ABTranscoder ()
}
void
-ABTranscoder::process_video (shared_ptr<Image> yuv, int frame, int index)
+ABTranscoder::process_video (shared_ptr<Image> yuv, SourceFrame frame, shared_ptr<Subtitle> sub, int index)
{
if (index == 0) {
/* Keep this image around until we get the other half */
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 += line_size;
- q += line_size;
+ p += stride;
+ q += stride;
}
}
/* And pass it to the encoder */
- _encoder->process_video (_image, frame);
+ _encoder->process_video (_image, frame, sub);
_image.reset ();
}
void
ABTranscoder::go ()
{
- _encoder->process_begin (_da->audio_channel_layout(), _da->audio_sample_format());
+ _encoder->process_begin ();
_da->process_begin ();
_db->process_begin ();
bool const a = _da->pass ();
bool const b = _db->pass ();
- if (_job) {
- _job->set_progress (float (_last_frame) / _fs_a->dcp_length());
- }
-
if (a && b) {
break;
}