2 Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include <boost/shared_ptr.hpp>
22 #include <sigc++/bind.h>
23 #include "ab_transcoder.h"
28 #include "film_state.h"
31 #include "decoder_factory.h"
33 /** @file src/ab_transcoder.cc
34 * @brief A transcoder which uses one FilmState for the left half of the screen, and a different one
35 * for the right half (to facilitate A/B comparisons of settings)
39 using namespace boost;
41 /** @param a FilmState to use for the left half of the screen.
42 * @param b FilmState to use for the right half of the screen.
44 * @param j Job that we are associated with.
46 * @param e Encoder to use.
49 ABTranscoder::ABTranscoder (
50 shared_ptr<const FilmState> a, shared_ptr<const FilmState> b, shared_ptr<const Options> o, Job* j, Log* l, shared_ptr<Encoder> e)
59 _da = decoder_factory (_fs_a, o, j, _log);
60 _db = decoder_factory (_fs_b, o, j, _log);
62 _da->Video.connect (sigc::bind (sigc::mem_fun (*this, &ABTranscoder::process_video), 0));
63 _db->Video.connect (sigc::bind (sigc::mem_fun (*this, &ABTranscoder::process_video), 1));
64 _da->Audio.connect (sigc::mem_fun (*e, &Encoder::process_audio));
67 ABTranscoder::~ABTranscoder ()
73 ABTranscoder::process_video (shared_ptr<Image> yuv, int frame, int index)
76 /* Keep this image around until we get the other half */
79 /* Copy the right half of yuv into _image */
80 for (int i = 0; i < yuv->components(); ++i) {
81 int const line_size = yuv->line_size()[i];
82 int const half_line_size = line_size / 2;
84 uint8_t* p = _image->data()[i];
85 uint8_t* q = yuv->data()[i];
87 for (int j = 0; j < yuv->lines (i); ++j) {
88 memcpy (p + half_line_size, q + half_line_size, half_line_size);
94 /* And pass it to the encoder */
95 _encoder->process_video (_image, frame);
106 _encoder->process_begin ();
107 _da->process_begin ();
108 _db->process_begin ();
111 bool const a = _da->pass ();
112 bool const b = _db->pass ();
115 _job->set_progress (float (_last_frame) / _da->decoding_frames ());
123 _encoder->process_end ();