From 76ee27e08be5bf8e4a9eeb4fef09de307c6a6aa8 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 9 May 2017 13:58:35 +0100 Subject: [PATCH] Make Transcoder a virtual base. --- src/lib/transcode_job.cc | 5 +- src/lib/transcode_job.h | 4 +- src/lib/transcoder.cc | 99 +--------------------------------------- src/lib/transcoder.h | 33 ++++++-------- src/lib/wscript | 1 + 5 files changed, 22 insertions(+), 120 deletions(-) diff --git a/src/lib/transcode_job.cc b/src/lib/transcode_job.cc index 17108c278..17738deff 100644 --- a/src/lib/transcode_job.cc +++ b/src/lib/transcode_job.cc @@ -23,6 +23,7 @@ */ #include "transcode_job.h" +#include "dcp_transcoder.h" #include "upload_job.h" #include "job_manager.h" #include "film.h" @@ -71,7 +72,7 @@ TranscodeJob::run () 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); @@ -134,7 +135,7 @@ int TranscodeJob::remaining_time () const { /* _transcoder might be destroyed by the job-runner thread */ - shared_ptr t = _transcoder; + shared_ptr t = _transcoder; if (!t || t->finishing()) { /* We aren't doing any actual encoding so just use the job's guess */ diff --git a/src/lib/transcode_job.h b/src/lib/transcode_job.h index 14ad693c3..9e827e412 100644 --- a/src/lib/transcode_job.h +++ b/src/lib/transcode_job.h @@ -25,7 +25,7 @@ #include "job.h" #include -class Transcoder; +class DCPTranscoder; /** @class TranscodeJob * @brief A job which transcodes from one format to another. @@ -43,5 +43,5 @@ public: private: int remaining_time () const; - boost::shared_ptr _transcoder; + boost::shared_ptr _transcoder; }; diff --git a/src/lib/transcoder.cc b/src/lib/transcoder.cc index 21ef60b79..c77bf7724 100644 --- a/src/lib/transcoder.cc +++ b/src/lib/transcoder.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2016 Carl Hetherington + Copyright (C) 2012-2017 Carl Hetherington This file is part of DCP-o-matic. @@ -26,29 +26,12 @@ */ #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 -#include -#include #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. @@ -58,86 +41,8 @@ Transcoder::Transcoder (shared_ptr film, weak_ptr job) : _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 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.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 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 data, DCPTime time) -{ - _writer->write (data); - - shared_ptr 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 (); } diff --git a/src/lib/transcoder.h b/src/lib/transcoder.h index 50cbfdfec..b6378119b 100644 --- a/src/lib/transcoder.h +++ b/src/lib/transcoder.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2012 Carl Hetherington + Copyright (C) 2012-2017 Carl Hetherington This file is part of DCP-o-matic. @@ -18,6 +18,9 @@ */ +#ifndef DCPOMATIC_TRANSCODER_H +#define DCPOMATIC_TRANSCODER_H + #include "types.h" #include "player_subtitles.h" #include @@ -25,7 +28,6 @@ class Film; class Encoder; class Player; -class Writer; class Job; class PlayerVideo; class AudioBuffers; @@ -35,28 +37,21 @@ class Transcoder : public boost::noncopyable { public: Transcoder (boost::shared_ptr film, boost::weak_ptr 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, DCPTime); - void audio (boost::shared_ptr, DCPTime); - void subtitle (PlayerSubtitles, DCPTimePeriod); +protected: + virtual void video (boost::shared_ptr, DCPTime) = 0; + virtual void audio (boost::shared_ptr, DCPTime) = 0; + virtual void subtitle (PlayerSubtitles, DCPTimePeriod) = 0; boost::shared_ptr _film; boost::weak_ptr _job; boost::shared_ptr _player; - boost::shared_ptr _writer; - boost::shared_ptr _encoder; - bool _finishing; - bool _non_burnt_subtitles; }; + +#endif diff --git a/src/lib/wscript b/src/lib/wscript index 765ee60a3..bf39ce2a7 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -56,6 +56,7 @@ sources = """ dcp_subtitle.cc dcp_subtitle_content.cc dcp_subtitle_decoder.cc + dcp_transcoder.cc dcp_video.cc dcpomatic_socket.cc dcpomatic_time.cc -- 2.30.2