diff options
| author | Carl Hetherington <cth@carlh.net> | 2012-12-16 13:26:45 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2012-12-16 13:26:45 +0000 |
| commit | 1f2bc4d8f3601ad1e12b94f37b3889fcd003509b (patch) | |
| tree | f192579eda6eaaea73a3b17acd2bb19965ae331f /src/lib | |
| parent | 0813034d7193dc8869126d13a9d12d2c4d1e6c14 (diff) | |
Split Options into encode / decode.
Diffstat (limited to 'src/lib')
40 files changed, 142 insertions, 109 deletions
diff --git a/src/lib/ab_transcode_job.cc b/src/lib/ab_transcode_job.cc index c9fd5bc97..b9538ce2e 100644 --- a/src/lib/ab_transcode_job.cc +++ b/src/lib/ab_transcode_job.cc @@ -33,9 +33,10 @@ using boost::shared_ptr; /** @param f Film to compare. * @param o Options. */ -ABTranscodeJob::ABTranscodeJob (shared_ptr<Film> f, shared_ptr<const Options> o, shared_ptr<Job> req) +ABTranscodeJob::ABTranscodeJob (shared_ptr<Film> f, shared_ptr<const DecodeOptions> od, shared_ptr<const EncodeOptions> oe, shared_ptr<Job> req) : Job (f, req) - , _opt (o) + , _decode_opt (od) + , _encode_opt (oe) { _film_b.reset (new Film (*_film)); _film_b->set_scaler (Config::instance()->reference_scaler ()); @@ -53,7 +54,7 @@ ABTranscodeJob::run () { try { /* _film_b is the one with reference filters */ - ABTranscoder w (_film_b, _film, _opt, this, encoder_factory (_film, _opt)); + ABTranscoder w (_film_b, _film, _decode_opt, this, encoder_factory (_film, _encode_opt)); w.go (); set_progress (1); set_state (FINISHED_OK); diff --git a/src/lib/ab_transcode_job.h b/src/lib/ab_transcode_job.h index 8331edf76..86a2a81b8 100644 --- a/src/lib/ab_transcode_job.h +++ b/src/lib/ab_transcode_job.h @@ -25,6 +25,8 @@ #include "job.h" class Film; +class DecodeOptions; +class EncodeOptions; /** @class ABTranscodeJob * @brief Job to run a transcoder which produces output for A/B comparison of various settings. @@ -36,13 +38,19 @@ class Film; class ABTranscodeJob : public Job { public: - ABTranscodeJob (boost::shared_ptr<Film> f, boost::shared_ptr<const Options> o, boost::shared_ptr<Job> req); + ABTranscodeJob ( + boost::shared_ptr<Film> f, + boost::shared_ptr<const DecodeOptions> od, + boost::shared_ptr<const EncodeOptions> oe, + boost::shared_ptr<Job> req + ); std::string name () const; void run (); private: - boost::shared_ptr<const Options> _opt; + boost::shared_ptr<const DecodeOptions> _decode_opt; + boost::shared_ptr<const EncodeOptions> _encode_opt; /** Copy of our Film using the reference filters and scaler */ boost::shared_ptr<Film> _film_b; diff --git a/src/lib/ab_transcoder.cc b/src/lib/ab_transcoder.cc index d65fcbd4e..d85f078a5 100644 --- a/src/lib/ab_transcoder.cc +++ b/src/lib/ab_transcoder.cc @@ -43,16 +43,15 @@ using boost::shared_ptr; /** @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 o Decoder options. * @param j Job that we are associated with. * @param e Encoder to use. */ ABTranscoder::ABTranscoder ( - shared_ptr<Film> a, shared_ptr<Film> b, shared_ptr<const Options> o, Job* j, shared_ptr<Encoder> e) + shared_ptr<Film> a, shared_ptr<Film> b, shared_ptr<const DecodeOptions> o, Job* j, shared_ptr<Encoder> e) : _film_a (a) , _film_b (b) - , _opt (o) , _job (j) , _encoder (e) { diff --git a/src/lib/ab_transcoder.h b/src/lib/ab_transcoder.h index 86094301b..7bfcb393c 100644 --- a/src/lib/ab_transcoder.h +++ b/src/lib/ab_transcoder.h @@ -31,7 +31,7 @@ class Job; class Encoder; class VideoDecoder; class AudioDecoder; -class Options; +class DecodeOptions; class Image; class Log; class Subtitle; @@ -51,7 +51,7 @@ public: ABTranscoder ( boost::shared_ptr<Film> a, boost::shared_ptr<Film> b, - boost::shared_ptr<const Options> o, + boost::shared_ptr<const DecodeOptions> o, Job* j, boost::shared_ptr<Encoder> e ); @@ -61,7 +61,6 @@ public: private: boost::shared_ptr<Film> _film_a; boost::shared_ptr<Film> _film_b; - boost::shared_ptr<const Options> _opt; Job* _job; boost::shared_ptr<Encoder> _encoder; Decoders _da; diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc index 70f0effd9..9d8de971c 100644 --- a/src/lib/audio_decoder.cc +++ b/src/lib/audio_decoder.cc @@ -23,7 +23,7 @@ using boost::optional; using boost::shared_ptr; -AudioDecoder::AudioDecoder (shared_ptr<Film> f, shared_ptr<const Options> o, Job* j) +AudioDecoder::AudioDecoder (shared_ptr<Film> f, shared_ptr<const DecodeOptions> o, Job* j) : Decoder (f, o, j) { diff --git a/src/lib/audio_decoder.h b/src/lib/audio_decoder.h index 1570fe3b0..013a6327f 100644 --- a/src/lib/audio_decoder.h +++ b/src/lib/audio_decoder.h @@ -34,7 +34,7 @@ class AudioDecoder : public AudioSource, public virtual Decoder { public: - AudioDecoder (boost::shared_ptr<Film>, boost::shared_ptr<const Options>, Job *); + AudioDecoder (boost::shared_ptr<Film>, boost::shared_ptr<const DecodeOptions>, Job *); virtual void set_audio_stream (boost::shared_ptr<AudioStream>); diff --git a/src/lib/check_hashes_job.cc b/src/lib/check_hashes_job.cc index 3967d0d70..50d86c523 100644 --- a/src/lib/check_hashes_job.cc +++ b/src/lib/check_hashes_job.cc @@ -34,9 +34,10 @@ using std::stringstream; using std::ifstream; using boost::shared_ptr; -CheckHashesJob::CheckHashesJob (shared_ptr<Film> f, shared_ptr<const Options> o, shared_ptr<Job> req) +CheckHashesJob::CheckHashesJob (shared_ptr<Film> f, shared_ptr<const DecodeOptions> od, shared_ptr<const EncodeOptions> oe, shared_ptr<Job> req) : Job (f, req) - , _opt (o) + , _decode_opt (od) + , _encode_opt (oe) , _bad (0) { @@ -61,7 +62,7 @@ CheckHashesJob::run () DCPFrameRate const dfr = dcp_frame_rate (_film->frames_per_second ()); for (SourceFrame i = _film->dcp_trim_start(); i < N; i += dfr.skip) { - string const j2k_file = _opt->frame_out_path (i, false); + string const j2k_file = _encode_opt->frame_out_path (i, false); string const hash_file = j2k_file + ".md5"; if (!boost::filesystem::exists (j2k_file)) { @@ -91,13 +92,13 @@ CheckHashesJob::run () shared_ptr<Job> tc; if (_film->dcp_ab()) { - tc.reset (new ABTranscodeJob (_film, _opt, shared_from_this())); + tc.reset (new ABTranscodeJob (_film, _decode_opt, _encode_opt, shared_from_this())); } else { - tc.reset (new TranscodeJob (_film, _opt, shared_from_this())); + tc.reset (new TranscodeJob (_film, _decode_opt, _encode_opt, shared_from_this())); } JobManager::instance()->add_after (shared_from_this(), tc); - JobManager::instance()->add_after (tc, shared_ptr<Job> (new CheckHashesJob (_film, _opt, tc))); + JobManager::instance()->add_after (tc, shared_ptr<Job> (new CheckHashesJob (_film, _decode_opt, _encode_opt, tc))); } set_progress (1); diff --git a/src/lib/check_hashes_job.h b/src/lib/check_hashes_job.h index e0ed6a64a..c41af9d3f 100644 --- a/src/lib/check_hashes_job.h +++ b/src/lib/check_hashes_job.h @@ -19,16 +19,25 @@ #include "job.h" +class DecodeOptions; +class EncodeOptions; + class CheckHashesJob : public Job { public: - CheckHashesJob (boost::shared_ptr<Film> f, boost::shared_ptr<const Options> o, boost::shared_ptr<Job> req); + CheckHashesJob ( + boost::shared_ptr<Film> f, + boost::shared_ptr<const DecodeOptions> od, + boost::shared_ptr<const EncodeOptions> oe, + boost::shared_ptr<Job> req + ); std::string name () const; void run (); std::string status () const; private: - boost::shared_ptr<const Options> _opt; + boost::shared_ptr<const DecodeOptions> _decode_opt; + boost::shared_ptr<const EncodeOptions> _encode_opt; int _bad; }; diff --git a/src/lib/dcp_video_frame.cc b/src/lib/dcp_video_frame.cc index c185de0f4..996aff33f 100644 --- a/src/lib/dcp_video_frame.cc +++ b/src/lib/dcp_video_frame.cc @@ -376,7 +376,7 @@ DCPVideoFrame::encode_remotely (ServerDescription const * serv) * @param frame Frame index. */ void -EncodedData::write (shared_ptr<const Options> opt, SourceFrame frame) +EncodedData::write (shared_ptr<const EncodeOptions> opt, SourceFrame frame) { string const tmp_j2k = opt->frame_out_path (frame, true); diff --git a/src/lib/dcp_video_frame.h b/src/lib/dcp_video_frame.h index 5ae53f1e8..57e7e6203 100644 --- a/src/lib/dcp_video_frame.h +++ b/src/lib/dcp_video_frame.h @@ -26,7 +26,7 @@ */ class FilmState; -class Options; +class EncodeOptions; class ServerDescription; class Scaler; class Image; @@ -50,7 +50,7 @@ public: virtual ~EncodedData () {} void send (boost::shared_ptr<Socket> socket); - void write (boost::shared_ptr<const Options>, SourceFrame); + void write (boost::shared_ptr<const EncodeOptions>, SourceFrame); /** @return data */ uint8_t* data () const { @@ -122,7 +122,6 @@ public: private: void create_openjpeg_container (); - void write_encoded (boost::shared_ptr<const Options>, uint8_t *, int); boost::shared_ptr<const Image> _input; ///< the input image boost::shared_ptr<Subtitle> _subtitle; ///< any subtitle that should be on the image diff --git a/src/lib/decoder.cc b/src/lib/decoder.cc index 93ce2cdbb..507708345 100644 --- a/src/lib/decoder.cc +++ b/src/lib/decoder.cc @@ -49,7 +49,7 @@ using boost::optional; * @param o Options. * @param j Job that we are running within, or 0 */ -Decoder::Decoder (boost::shared_ptr<Film> f, boost::shared_ptr<const Options> o, Job* j) +Decoder::Decoder (boost::shared_ptr<Film> f, boost::shared_ptr<const DecodeOptions> o, Job* j) : _film (f) , _opt (o) , _job (j) diff --git a/src/lib/decoder.h b/src/lib/decoder.h index e4693fb6d..be1fe38b6 100644 --- a/src/lib/decoder.h +++ b/src/lib/decoder.h @@ -35,7 +35,7 @@ #include "audio_source.h" class Job; -class Options; +class DecodeOptions; class Image; class Log; class DelayLine; @@ -54,7 +54,7 @@ class FilterGraph; class Decoder { public: - Decoder (boost::shared_ptr<Film>, boost::shared_ptr<const Options>, Job *); + Decoder (boost::shared_ptr<Film>, boost::shared_ptr<const DecodeOptions>, Job *); virtual ~Decoder () {} virtual bool pass () = 0; @@ -67,7 +67,7 @@ protected: /** our Film */ boost::shared_ptr<Film> _film; /** our options */ - boost::shared_ptr<const Options> _opt; + boost::shared_ptr<const DecodeOptions> _opt; /** associated Job, or 0 */ Job* _job; }; diff --git a/src/lib/decoder_factory.cc b/src/lib/decoder_factory.cc index 8674c6262..1d8d12cd5 100644 --- a/src/lib/decoder_factory.cc +++ b/src/lib/decoder_factory.cc @@ -36,7 +36,7 @@ using boost::dynamic_pointer_cast; Decoders decoder_factory ( - shared_ptr<Film> f, shared_ptr<const Options> o, Job* j + shared_ptr<Film> f, shared_ptr<const DecodeOptions> o, Job* j ) { if (boost::filesystem::is_directory (f->content_path()) || f->content_type() == STILL) { diff --git a/src/lib/decoder_factory.h b/src/lib/decoder_factory.h index 88f719ba2..47d977ce7 100644 --- a/src/lib/decoder_factory.h +++ b/src/lib/decoder_factory.h @@ -25,7 +25,7 @@ */ class Film; -class Options; +class DecodeOptions; class Job; class VideoDecoder; class AudioDecoder; @@ -43,7 +43,7 @@ struct Decoders { }; extern Decoders decoder_factory ( - boost::shared_ptr<Film>, boost::shared_ptr<const Options>, Job * + boost::shared_ptr<Film>, boost::shared_ptr<const DecodeOptions>, Job * ); #endif diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index 17a6726a6..1fc7d5997 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -33,7 +33,7 @@ int const Encoder::_history_size = 25; /** @param f Film that we are encoding. * @param o Options. */ -Encoder::Encoder (shared_ptr<const Film> f, shared_ptr<const Options> o) +Encoder::Encoder (shared_ptr<const Film> f, shared_ptr<const EncodeOptions> o) : _film (f) , _opt (o) , _just_skipped (false) @@ -107,13 +107,13 @@ Encoder::frame_skipped () void Encoder::process_video (shared_ptr<Image> i, boost::shared_ptr<Subtitle> s) { - if (_opt->decode_video_skip != 0 && (_video_frame % _opt->decode_video_skip) != 0) { + if (_opt->video_skip != 0 && (_video_frame % _opt->video_skip) != 0) { ++_video_frame; return; } - if (_opt->video_decode_range) { - pair<SourceFrame, SourceFrame> const r = _opt->video_decode_range.get(); + if (_opt->video_range) { + pair<SourceFrame, SourceFrame> const r = _opt->video_range.get(); if (_video_frame < r.first || _video_frame >= r.second) { ++_video_frame; return; @@ -127,12 +127,12 @@ Encoder::process_video (shared_ptr<Image> i, boost::shared_ptr<Subtitle> s) void Encoder::process_audio (shared_ptr<AudioBuffers> data) { - if (_opt->audio_decode_range) { + if (_opt->audio_range) { shared_ptr<AudioBuffers> trimmed (new AudioBuffers (*data.get ())); /* Range that we are encoding */ - pair<int64_t, int64_t> required_range = _opt->audio_decode_range.get(); + pair<int64_t, int64_t> required_range = _opt->audio_range.get(); /* Range of this block of data */ pair<int64_t, int64_t> this_range (_audio_frame, _audio_frame + trimmed->frames()); diff --git a/src/lib/encoder.h b/src/lib/encoder.h index b12bd0d48..64f113d74 100644 --- a/src/lib/encoder.h +++ b/src/lib/encoder.h @@ -35,7 +35,7 @@ extern "C" { #include "video_sink.h" #include "audio_sink.h" -class Options; +class EncodeOptions; class Image; class Subtitle; class AudioBuffers; @@ -54,7 +54,7 @@ class Film; class Encoder : public VideoSink, public AudioSink { public: - Encoder (boost::shared_ptr<const Film> f, boost::shared_ptr<const Options> o); + Encoder (boost::shared_ptr<const Film> f, boost::shared_ptr<const EncodeOptions> o); virtual ~Encoder () {} /** Called to indicate that a processing run is about to begin */ @@ -93,7 +93,7 @@ protected: /** Film that we are encoding */ boost::shared_ptr<const Film> _film; /** Options */ - boost::shared_ptr<const Options> _opt; + boost::shared_ptr<const EncodeOptions> _opt; /** Mutex for _time_history, _just_skipped and _last_frame */ mutable boost::mutex _history_mutex; diff --git a/src/lib/encoder_factory.cc b/src/lib/encoder_factory.cc index 2da021ad8..fe4d50ef3 100644 --- a/src/lib/encoder_factory.cc +++ b/src/lib/encoder_factory.cc @@ -29,7 +29,7 @@ using boost::shared_ptr; shared_ptr<Encoder> -encoder_factory (shared_ptr<const Film> f, shared_ptr<const Options> o) +encoder_factory (shared_ptr<const Film> f, shared_ptr<const EncodeOptions> o) { if (!boost::filesystem::is_directory (f->content_path()) && f->content_type() == STILL) { return shared_ptr<Encoder> (new J2KStillEncoder (f, o)); diff --git a/src/lib/encoder_factory.h b/src/lib/encoder_factory.h index 1bc4e18df..5ac5c9559 100644 --- a/src/lib/encoder_factory.h +++ b/src/lib/encoder_factory.h @@ -22,9 +22,9 @@ */ class Encoder; -class Options; +class EncodeOptions; class Job; class Log; class Film; -extern boost::shared_ptr<Encoder> encoder_factory (boost::shared_ptr<const Film>, boost::shared_ptr<const Options>); +extern boost::shared_ptr<Encoder> encoder_factory (boost::shared_ptr<const Film>, boost::shared_ptr<const EncodeOptions>); diff --git a/src/lib/examine_content_job.cc b/src/lib/examine_content_job.cc index eaf1033d9..dc2fc305c 100644 --- a/src/lib/examine_content_job.cc +++ b/src/lib/examine_content_job.cc @@ -67,8 +67,7 @@ ExamineContentJob::run () _film->unset_length (); _film->set_crop (Crop ()); - shared_ptr<Options> o (new Options ("", "", "")); - o->out_size = Size (512, 512); + shared_ptr<DecodeOptions> o (new DecodeOptions); o->decode_audio = false; descend (1); diff --git a/src/lib/external_audio_decoder.cc b/src/lib/external_audio_decoder.cc index 9b121235a..25c8068b6 100644 --- a/src/lib/external_audio_decoder.cc +++ b/src/lib/external_audio_decoder.cc @@ -31,7 +31,7 @@ using std::cout; using boost::shared_ptr; using boost::optional; -ExternalAudioDecoder::ExternalAudioDecoder (shared_ptr<Film> f, shared_ptr<const Options> o, Job* j) +ExternalAudioDecoder::ExternalAudioDecoder (shared_ptr<Film> f, shared_ptr<const DecodeOptions> o, Job* j) : Decoder (f, o, j) , AudioDecoder (f, o, j) { diff --git a/src/lib/external_audio_decoder.h b/src/lib/external_audio_decoder.h index 45a2a809c..2558955eb 100644 --- a/src/lib/external_audio_decoder.h +++ b/src/lib/external_audio_decoder.h @@ -44,7 +44,7 @@ private: class ExternalAudioDecoder : public AudioDecoder { public: - ExternalAudioDecoder (boost::shared_ptr<Film>, boost::shared_ptr<const Options>, Job *); + ExternalAudioDecoder (boost::shared_ptr<Film>, boost::shared_ptr<const DecodeOptions>, Job *); bool pass (); diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index 7b97a422e..b3b1acbbb 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -59,7 +59,7 @@ using boost::shared_ptr; using boost::optional; using boost::dynamic_pointer_cast; -FFmpegDecoder::FFmpegDecoder (shared_ptr<Film> f, shared_ptr<const Options> o, Job* j) +FFmpegDecoder::FFmpegDecoder (shared_ptr<Film> f, shared_ptr<const DecodeOptions> o, Job* j) : Decoder (f, o, j) , VideoDecoder (f, o, j) , AudioDecoder (f, o, j) @@ -270,7 +270,7 @@ FFmpegDecoder::pass () _film->log()->log (String::compose ("Used only %1 bytes of %2 in packet", r, _packet.size)); } - if (_opt->decoder_alignment) { + if (_opt->video_sync) { out_careful (); } else { filter_and_emit_video (_frame); diff --git a/src/lib/ffmpeg_decoder.h b/src/lib/ffmpeg_decoder.h index 89e42f978..d483db1d9 100644 --- a/src/lib/ffmpeg_decoder.h +++ b/src/lib/ffmpeg_decoder.h @@ -84,7 +84,7 @@ private: class FFmpegDecoder : public VideoDecoder, public AudioDecoder { public: - FFmpegDecoder (boost::shared_ptr<Film>, boost::shared_ptr<const Options>, Job *); + FFmpegDecoder (boost::shared_ptr<Film>, boost::shared_ptr<const DecodeOptions>, Job *); ~FFmpegDecoder (); float frames_per_second () const; diff --git a/src/lib/film.cc b/src/lib/film.cc index ddc7e371c..e7f47c462 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -258,35 +258,37 @@ Film::make_dcp (bool transcode) throw MissingSettingError ("name"); } - shared_ptr<Options> o (new Options (j2k_dir(), ".j2c", dir ("wavs"))); - o->out_size = format()->dcp_size (); - o->padding = format()->dcp_padding (shared_from_this ()); - o->ratio = format()->ratio_as_float (shared_from_this ()); + shared_ptr<EncodeOptions> oe (new EncodeOptions (j2k_dir(), ".j2c", dir ("wavs"))); + oe->out_size = format()->dcp_size (); + oe->padding = format()->dcp_padding (shared_from_this ()); if (dcp_length ()) { - o->video_decode_range = make_pair (dcp_trim_start(), dcp_trim_start() + dcp_length().get()); + oe->video_range = make_pair (dcp_trim_start(), dcp_trim_start() + dcp_length().get()); if (audio_stream()) { - o->audio_decode_range = make_pair ( - video_frames_to_audio_frames (o->video_decode_range.get().first, audio_stream()->sample_rate(), frames_per_second()), - video_frames_to_audio_frames (o->video_decode_range.get().second, audio_stream()->sample_rate(), frames_per_second()) + oe->audio_range = make_pair ( + video_frames_to_audio_frames (oe->video_range.get().first, audio_stream()->sample_rate(), frames_per_second()), + video_frames_to_audio_frames (oe->video_range.get().second, audio_stream()->sample_rate(), frames_per_second()) ); } } - o->decode_subtitles = with_subtitles (); - o->decode_video_skip = dcp_frame_rate (frames_per_second()).skip; + + oe->video_skip = dcp_frame_rate (frames_per_second()).skip; + + shared_ptr<DecodeOptions> od (new DecodeOptions); + od->decode_subtitles = with_subtitles (); shared_ptr<Job> r; if (transcode) { if (dcp_ab()) { - r = JobManager::instance()->add (shared_ptr<Job> (new ABTranscodeJob (shared_from_this(), o, shared_ptr<Job> ()))); + r = JobManager::instance()->add (shared_ptr<Job> (new ABTranscodeJob (shared_from_this(), od, oe, shared_ptr<Job> ()))); } else { - r = JobManager::instance()->add (shared_ptr<Job> (new TranscodeJob (shared_from_this(), o, shared_ptr<Job> ()))); + r = JobManager::instance()->add (shared_ptr<Job> (new TranscodeJob (shared_from_this(), od, oe, shared_ptr<Job> ()))); } } - r = JobManager::instance()->add (shared_ptr<Job> (new CheckHashesJob (shared_from_this(), o, r))); - JobManager::instance()->add (shared_ptr<Job> (new MakeDCPJob (shared_from_this(), o, r))); + r = JobManager::instance()->add (shared_ptr<Job> (new CheckHashesJob (shared_from_this(), od, oe, r))); + JobManager::instance()->add (shared_ptr<Job> (new MakeDCPJob (shared_from_this(), oe, r))); } /** Start a job to examine our content file */ @@ -844,9 +846,7 @@ Film::set_content (string c) */ try { - shared_ptr<Options> o (new Options ("", "", "")); - o->out_size = Size (1024, 1024); - + shared_ptr<DecodeOptions> o (new DecodeOptions); Decoders d = decoder_factory (shared_from_this(), o, 0); set_size (d.video->native_size ()); @@ -1038,8 +1038,7 @@ Film::set_external_audio (vector<string> a) _external_audio = a; } - shared_ptr<Options> o (new Options ("", "", "")); - o->decode_audio = true; + shared_ptr<DecodeOptions> o (new DecodeOptions); shared_ptr<ExternalAudioDecoder> decoder (new ExternalAudioDecoder (shared_from_this(), o, 0)); if (decoder->audio_stream()) { _external_audio_stream = decoder->audio_stream (); diff --git a/src/lib/imagemagick_decoder.cc b/src/lib/imagemagick_decoder.cc index d68c1648f..3957da5dd 100644 --- a/src/lib/imagemagick_decoder.cc +++ b/src/lib/imagemagick_decoder.cc @@ -29,7 +29,7 @@ using std::cout; using boost::shared_ptr; ImageMagickDecoder::ImageMagickDecoder ( - boost::shared_ptr<Film> f, boost::shared_ptr<const Options> o, Job* j) + boost::shared_ptr<Film> f, boost::shared_ptr<const DecodeOptions> o, Job* j) : Decoder (f, o, j) , VideoDecoder (f, o, j) { diff --git a/src/lib/imagemagick_decoder.h b/src/lib/imagemagick_decoder.h index f636191f2..75107ef4f 100644 --- a/src/lib/imagemagick_decoder.h +++ b/src/lib/imagemagick_decoder.h @@ -26,7 +26,7 @@ namespace Magick { class ImageMagickDecoder : public VideoDecoder { public: - ImageMagickDecoder (boost::shared_ptr<Film>, boost::shared_ptr<const Options>, Job *); + ImageMagickDecoder (boost::shared_ptr<Film>, boost::shared_ptr<const DecodeOptions>, Job *); float frames_per_second () const { /* We don't know */ diff --git a/src/lib/j2k_still_encoder.cc b/src/lib/j2k_still_encoder.cc index dd6ef49b2..68088377b 100644 --- a/src/lib/j2k_still_encoder.cc +++ b/src/lib/j2k_still_encoder.cc @@ -42,7 +42,7 @@ using std::string; using std::pair; using boost::shared_ptr; -J2KStillEncoder::J2KStillEncoder (shared_ptr<const Film> f, shared_ptr<const Options> o) +J2KStillEncoder::J2KStillEncoder (shared_ptr<const Film> f, shared_ptr<const EncodeOptions> o) : Encoder (f, o) { diff --git a/src/lib/j2k_still_encoder.h b/src/lib/j2k_still_encoder.h index 4ffe876af..6069637d0 100644 --- a/src/lib/j2k_still_encoder.h +++ b/src/lib/j2k_still_encoder.h @@ -27,6 +27,7 @@ class Image; class Log; +class EncodeOptions; /** @class J2KStillEncoder * @brief An encoder which writes repeated JPEG2000 files from a single decoded input. @@ -34,7 +35,7 @@ class Log; class J2KStillEncoder : public Encoder { public: - J2KStillEncoder (boost::shared_ptr<const Film>, boost::shared_ptr<const Options>); + J2KStillEncoder (boost::shared_ptr<const Film>, boost::shared_ptr<const EncodeOptions>); private: void do_process_video (boost::shared_ptr<Image>, boost::shared_ptr<Subtitle>); diff --git a/src/lib/j2k_wav_encoder.cc b/src/lib/j2k_wav_encoder.cc index 134d74623..e76591552 100644 --- a/src/lib/j2k_wav_encoder.cc +++ b/src/lib/j2k_wav_encoder.cc @@ -51,7 +51,7 @@ using boost::shared_ptr; using boost::thread; using boost::lexical_cast; -J2KWAVEncoder::J2KWAVEncoder (shared_ptr<const Film> f, shared_ptr<const Options> o) +J2KWAVEncoder::J2KWAVEncoder (shared_ptr<const Film> f, shared_ptr<const EncodeOptions> o) : Encoder (f, o) #ifdef HAVE_SWRESAMPLE , _swr_context (0) diff --git a/src/lib/j2k_wav_encoder.h b/src/lib/j2k_wav_encoder.h index f3340ba72..064f4221e 100644 --- a/src/lib/j2k_wav_encoder.h +++ b/src/lib/j2k_wav_encoder.h @@ -47,7 +47,7 @@ class AudioBuffers; class J2KWAVEncoder : public Encoder { public: - J2KWAVEncoder (boost::shared_ptr<const Film>, boost::shared_ptr<const Options>); + J2KWAVEncoder (boost::shared_ptr<const Film>, boost::shared_ptr<const EncodeOptions>); ~J2KWAVEncoder (); void process_begin (); diff --git a/src/lib/job.h b/src/lib/job.h index 41cefb9be..f32cfa811 100644 --- a/src/lib/job.h +++ b/src/lib/job.h @@ -30,7 +30,6 @@ #include <boost/signals2.hpp> class Film; -class Options; /** @class Job * @brief A parent class to represent long-running tasks which are run in their own thread. diff --git a/src/lib/make_dcp_job.cc b/src/lib/make_dcp_job.cc index 65cd272e7..4605d1724 100644 --- a/src/lib/make_dcp_job.cc +++ b/src/lib/make_dcp_job.cc @@ -42,7 +42,7 @@ using boost::shared_ptr; /** @param f Film we are making the DCP for. * @param o Options. */ -MakeDCPJob::MakeDCPJob (shared_ptr<Film> f, shared_ptr<const Options> o, shared_ptr<Job> req) +MakeDCPJob::MakeDCPJob (shared_ptr<Film> f, shared_ptr<const EncodeOptions> o, shared_ptr<Job> req) : Job (f, req) , _opt (o) { diff --git a/src/lib/make_dcp_job.h b/src/lib/make_dcp_job.h index 442bb55f5..1aa906b0a 100644 --- a/src/lib/make_dcp_job.h +++ b/src/lib/make_dcp_job.h @@ -23,13 +23,15 @@ #include "job.h" +class EncodeOptions; + /** @class MakeDCPJob * @brief A job to create DCPs */ class MakeDCPJob : public Job { public: - MakeDCPJob (boost::shared_ptr<Film>, boost::shared_ptr<const Options>, boost::shared_ptr<Job> req); + MakeDCPJob (boost::shared_ptr<Film>, boost::shared_ptr<const EncodeOptions>, boost::shared_ptr<Job> req); std::string name () const; void run (); @@ -39,6 +41,6 @@ private: std::string j2c_path (int) const; std::string wav_path (libdcp::Channel) const; - boost::shared_ptr<const Options> _opt; + boost::shared_ptr<const EncodeOptions> _opt; }; diff --git a/src/lib/options.h b/src/lib/options.h index 9b3866dcb..4457969f3 100644 --- a/src/lib/options.h +++ b/src/lib/options.h @@ -27,22 +27,19 @@ #include <boost/optional.hpp> #include "util.h" -/** @class Options - * @brief Options for a transcoding operation. +/** @class EncodeOptions + * @brief EncodeOptions for an encoding operation. * * These are settings which may be different, in different circumstances, for - * the same film; ie they are options for a particular transcode operation. + * the same film; ie they are options for a particular operation. */ -class Options +class EncodeOptions { public: - Options (std::string f, std::string e, std::string m) + EncodeOptions (std::string f, std::string e, std::string m) : padding (0) - , decode_video_skip (0) - , decode_audio (true) - , decode_subtitles (false) - , decoder_alignment (true) + , video_skip (0) , _frame_out_path (f) , _frame_out_extension (e) , _multichannel_audio_out_path (m) @@ -94,22 +91,17 @@ public: } Size out_size; ///< size of output images - float ratio; ///< ratio of the wanted output image (not considering padding) int padding; ///< number of pixels of padding (in terms of the output size) each side of the image /** Range of video frames to decode */ - boost::optional<std::pair<SourceFrame, SourceFrame> > video_decode_range; + boost::optional<std::pair<SourceFrame, SourceFrame> > video_range; /** Range of audio frames to decode */ - boost::optional<std::pair<int64_t, int64_t> > audio_decode_range; + boost::optional<std::pair<int64_t, int64_t> > audio_range; /** Skip frames such that we don't decode any frame where (index % decode_video_skip) != 0; e.g. * 1 for every frame, 2 for every other frame, etc. */ - SourceFrame decode_video_skip; - bool decode_audio; ///< true to decode audio, otherwise false - bool decode_subtitles; - - bool decoder_alignment; + SourceFrame video_skip; private: /** Path of the directory to write video frames to */ @@ -119,3 +111,18 @@ private: /** Path of the directory to write audio files to */ std::string _multichannel_audio_out_path; }; + + +class DecodeOptions +{ +public: + DecodeOptions () + : decode_audio (true) + , decode_subtitles (false) + , video_sync (true) + {} + + bool decode_audio; + bool decode_subtitles; + bool video_sync; +}; diff --git a/src/lib/transcode_job.cc b/src/lib/transcode_job.cc index 081e04252..54619c39f 100644 --- a/src/lib/transcode_job.cc +++ b/src/lib/transcode_job.cc @@ -41,9 +41,10 @@ using boost::shared_ptr; * @param o Options. * @param req Job that must be completed before this job is run. */ -TranscodeJob::TranscodeJob (shared_ptr<Film> f, shared_ptr<const Options> o, shared_ptr<Job> req) +TranscodeJob::TranscodeJob (shared_ptr<Film> f, shared_ptr<const DecodeOptions> od, shared_ptr<const EncodeOptions> oe, shared_ptr<Job> req) : Job (f, req) - , _opt (o) + , _decode_opt (od) + , _encode_opt (oe) { } @@ -62,8 +63,8 @@ TranscodeJob::run () _film->log()->log ("Transcode job starting"); _film->log()->log (String::compose ("Audio delay is %1ms", _film->audio_delay())); - _encoder = encoder_factory (_film, _opt); - Transcoder w (_film, _opt, this, _encoder); + _encoder = encoder_factory (_film, _encode_opt); + Transcoder w (_film, _decode_opt, this, _encoder); w.go (); set_progress (1); set_state (FINISHED_OK); diff --git a/src/lib/transcode_job.h b/src/lib/transcode_job.h index 1decea070..97f655e15 100644 --- a/src/lib/transcode_job.h +++ b/src/lib/transcode_job.h @@ -25,6 +25,8 @@ #include "job.h" class Encoder; +class DecodeOptions; +class EncodeOptions; /** @class TranscodeJob * @brief A job which transcodes from one format to another. @@ -32,7 +34,7 @@ class Encoder; class TranscodeJob : public Job { public: - TranscodeJob (boost::shared_ptr<Film> f, boost::shared_ptr<const Options> o, boost::shared_ptr<Job> req); + TranscodeJob (boost::shared_ptr<Film> f, boost::shared_ptr<const DecodeOptions> od, boost::shared_ptr<const EncodeOptions> oe, boost::shared_ptr<Job> req); std::string name () const; void run (); @@ -42,6 +44,7 @@ protected: int remaining_time () const; private: - boost::shared_ptr<const Options> _opt; + boost::shared_ptr<const DecodeOptions> _decode_opt; + boost::shared_ptr<const EncodeOptions> _encode_opt; boost::shared_ptr<Encoder> _encoder; }; diff --git a/src/lib/transcoder.cc b/src/lib/transcoder.cc index 114803fb5..f44a3ed7b 100644 --- a/src/lib/transcoder.cc +++ b/src/lib/transcoder.cc @@ -44,11 +44,11 @@ using boost::dynamic_pointer_cast; /** Construct a transcoder using a Decoder that we create and a supplied Encoder. * @param f Film that we are transcoding. - * @param o Options. + * @param o Decode options. * @param j Job that we are running under, or 0. * @param e Encoder to use. */ -Transcoder::Transcoder (shared_ptr<Film> f, shared_ptr<const Options> o, Job* j, shared_ptr<Encoder> e) +Transcoder::Transcoder (shared_ptr<Film> f, shared_ptr<const DecodeOptions> o, Job* j, shared_ptr<Encoder> e) : _job (j) , _encoder (e) , _decoders (decoder_factory (f, o, j)) diff --git a/src/lib/transcoder.h b/src/lib/transcoder.h index 35aac0b50..f27984aaa 100644 --- a/src/lib/transcoder.h +++ b/src/lib/transcoder.h @@ -36,7 +36,8 @@ class Gain; class VideoDecoder; class AudioDecoder; class DelayLine; -class Options; +class EncodeOptions; +class DecodeOptions; /** @class Transcoder * @brief A class which takes a FilmState and some Options, then uses those to transcode a Film. @@ -47,7 +48,12 @@ class Options; class Transcoder { public: - Transcoder (boost::shared_ptr<Film> f, boost::shared_ptr<const Options> o, Job* j, boost::shared_ptr<Encoder> e); + Transcoder ( + boost::shared_ptr<Film> f, + boost::shared_ptr<const DecodeOptions> o, + Job* j, + boost::shared_ptr<Encoder> e + ); void go (); diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc index 03a697865..a8da40b7c 100644 --- a/src/lib/video_decoder.cc +++ b/src/lib/video_decoder.cc @@ -28,7 +28,7 @@ using boost::shared_ptr; using boost::optional; -VideoDecoder::VideoDecoder (shared_ptr<Film> f, shared_ptr<const Options> o, Job* j) +VideoDecoder::VideoDecoder (shared_ptr<Film> f, shared_ptr<const DecodeOptions> o, Job* j) : Decoder (f, o, j) , _video_frame (0) { diff --git a/src/lib/video_decoder.h b/src/lib/video_decoder.h index ea1899840..a8296d918 100644 --- a/src/lib/video_decoder.h +++ b/src/lib/video_decoder.h @@ -27,7 +27,7 @@ class VideoDecoder : public VideoSource, public virtual Decoder { public: - VideoDecoder (boost::shared_ptr<Film>, boost::shared_ptr<const Options>, Job *); + VideoDecoder (boost::shared_ptr<Film>, boost::shared_ptr<const DecodeOptions>, Job *); /** @return video frames per second, or 0 if unknown */ virtual float frames_per_second () const = 0; |
