*/
#include "transcode_job.h"
+#include "dcp_transcoder.h"
#include "upload_job.h"
#include "job_manager.h"
#include "film.h"
gettimeofday (&start, 0);
LOG_GENERAL_NC (N_("Transcode job starting"));
- _transcoder.reset (new Transcoder (_film, shared_from_this ()));
+ _transcoder.reset (new DCPTranscoder (_film, shared_from_this ()));
_transcoder->go ();
set_progress (1);
set_state (FINISHED_OK);
TranscodeJob::remaining_time () const
{
/* _transcoder might be destroyed by the job-runner thread */
- shared_ptr<Transcoder> t = _transcoder;
+ shared_ptr<DCPTranscoder> t = _transcoder;
if (!t || t->finishing()) {
/* We aren't doing any actual encoding so just use the job's guess */
/*
- Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2017 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
*/
#include "transcoder.h"
-#include "encoder.h"
-#include "film.h"
-#include "video_decoder.h"
-#include "audio_decoder.h"
#include "player.h"
-#include "job.h"
-#include "writer.h"
-#include "compose.hpp"
-#include "referenced_reel_asset.h"
-#include "subtitle_content.h"
-#include "player_video.h"
-#include <boost/signals2.hpp>
-#include <boost/foreach.hpp>
-#include <iostream>
#include "i18n.h"
-using std::string;
-using std::cout;
-using std::list;
-using boost::shared_ptr;
using boost::weak_ptr;
-using boost::dynamic_pointer_cast;
+using boost::shared_ptr;
/** Construct a transcoder.
* @param film Film that we are transcoding.
: _film (film)
, _job (job)
, _player (new Player (film, film->playlist ()))
- , _writer (new Writer (film, job))
- , _encoder (new Encoder (film, _writer))
- , _finishing (false)
- , _non_burnt_subtitles (false)
{
_player->Video.connect (bind (&Transcoder::video, this, _1, _2));
_player->Audio.connect (bind (&Transcoder::audio, this, _1, _2));
_player->Subtitle.connect (bind (&Transcoder::subtitle, this, _1, _2));
-
- BOOST_FOREACH (shared_ptr<const Content> c, _film->content ()) {
- if (c->subtitle && c->subtitle->use() && !c->subtitle->burn()) {
- _non_burnt_subtitles = true;
- }
- }
-}
-
-void
-Transcoder::go ()
-{
- _writer->start ();
- _encoder->begin ();
-
- {
- shared_ptr<Job> job = _job.lock ();
- DCPOMATIC_ASSERT (job);
- job->sub (_("Encoding"));
- }
-
- if (_non_burnt_subtitles) {
- _writer->write (_player->get_subtitle_fonts ());
- }
-
- while (!_player->pass ()) {}
-
- BOOST_FOREACH (ReferencedReelAsset i, _player->get_reel_assets ()) {
- _writer->write (i);
- }
-
- _finishing = true;
- _encoder->end ();
- _writer->finish ();
-}
-
-void
-Transcoder::video (shared_ptr<PlayerVideo> data, DCPTime time)
-{
- if (!_film->three_d() && data->eyes() == EYES_LEFT) {
- /* Use left-eye images for both eyes */
- data->set_eyes (EYES_BOTH);
- }
-
- _encoder->encode (data, time);
-}
-
-void
-Transcoder::audio (shared_ptr<AudioBuffers> data, DCPTime time)
-{
- _writer->write (data);
-
- shared_ptr<Job> job = _job.lock ();
- DCPOMATIC_ASSERT (job);
- job->set_progress (float(time.get()) / _film->length().get());
-}
-
-void
-Transcoder::subtitle (PlayerSubtitles data, DCPTimePeriod period)
-{
- if (_non_burnt_subtitles) {
- _writer->write (data, period);
- }
-}
-
-float
-Transcoder::current_encoding_rate () const
-{
- return _encoder->current_encoding_rate ();
-}
-
-int
-Transcoder::video_frames_enqueued () const
-{
- return _encoder->video_frames_enqueued ();
}
/*
- Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2017 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
*/
+#ifndef DCPOMATIC_TRANSCODER_H
+#define DCPOMATIC_TRANSCODER_H
+
#include "types.h"
#include "player_subtitles.h"
#include <boost/weak_ptr.hpp>
class Film;
class Encoder;
class Player;
-class Writer;
class Job;
class PlayerVideo;
class AudioBuffers;
{
public:
Transcoder (boost::shared_ptr<const Film> film, boost::weak_ptr<Job> job);
+ virtual ~Transcoder () {}
- void go ();
-
- float current_encoding_rate () const;
- int video_frames_enqueued () const;
+ virtual void go () = 0;
- /** @return true if we are in the process of calling Encoder::process_end */
- bool finishing () const {
- return _finishing;
- }
+ virtual float current_encoding_rate () const = 0;
+ virtual int video_frames_enqueued () const = 0;
-private:
-
- void video (boost::shared_ptr<PlayerVideo>, DCPTime);
- void audio (boost::shared_ptr<AudioBuffers>, DCPTime);
- void subtitle (PlayerSubtitles, DCPTimePeriod);
+protected:
+ virtual void video (boost::shared_ptr<PlayerVideo>, DCPTime) = 0;
+ virtual void audio (boost::shared_ptr<AudioBuffers>, DCPTime) = 0;
+ virtual void subtitle (PlayerSubtitles, DCPTimePeriod) = 0;
boost::shared_ptr<const Film> _film;
boost::weak_ptr<Job> _job;
boost::shared_ptr<Player> _player;
- boost::shared_ptr<Writer> _writer;
- boost::shared_ptr<Encoder> _encoder;
- bool _finishing;
- bool _non_burnt_subtitles;
};
+
+#endif