Split Options into encode / decode.
authorCarl Hetherington <cth@carlh.net>
Sun, 16 Dec 2012 13:26:45 +0000 (13:26 +0000)
committerCarl Hetherington <cth@carlh.net>
Sun, 16 Dec 2012 13:26:45 +0000 (13:26 +0000)
41 files changed:
src/lib/ab_transcode_job.cc
src/lib/ab_transcode_job.h
src/lib/ab_transcoder.cc
src/lib/ab_transcoder.h
src/lib/audio_decoder.cc
src/lib/audio_decoder.h
src/lib/check_hashes_job.cc
src/lib/check_hashes_job.h
src/lib/dcp_video_frame.cc
src/lib/dcp_video_frame.h
src/lib/decoder.cc
src/lib/decoder.h
src/lib/decoder_factory.cc
src/lib/decoder_factory.h
src/lib/encoder.cc
src/lib/encoder.h
src/lib/encoder_factory.cc
src/lib/encoder_factory.h
src/lib/examine_content_job.cc
src/lib/external_audio_decoder.cc
src/lib/external_audio_decoder.h
src/lib/ffmpeg_decoder.cc
src/lib/ffmpeg_decoder.h
src/lib/film.cc
src/lib/imagemagick_decoder.cc
src/lib/imagemagick_decoder.h
src/lib/j2k_still_encoder.cc
src/lib/j2k_still_encoder.h
src/lib/j2k_wav_encoder.cc
src/lib/j2k_wav_encoder.h
src/lib/job.h
src/lib/make_dcp_job.cc
src/lib/make_dcp_job.h
src/lib/options.h
src/lib/transcode_job.cc
src/lib/transcode_job.h
src/lib/transcoder.cc
src/lib/transcoder.h
src/lib/video_decoder.cc
src/lib/video_decoder.h
src/wx/film_viewer.cc

index c9fd5bc977fbc9bfe0640a04d655db1588f4a01f..b9538ce2e669ae2528087817b4192b810c64ff37 100644 (file)
@@ -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);
index 8331edf76a12ec53eec05ad87eb2467db9e4857b..86a2a81b8b2b0e4416503eb00ae1c7025f5dd5a2 100644 (file)
@@ -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;
index d65fcbd4e0990f1e210622ddd1dbcef62ac69eef..d85f078a5aa0e1601f01a90b8582fcdb1a95815f 100644 (file)
@@ -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)
 {
index 86094301b97902f63d6d4ac1558c575632c121bc..7bfcb393cb32182d833bde5cc52eeae0e47327a1 100644 (file)
@@ -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;
index 70f0effd9faa742bf5e744ab71d2dd8ff35e35b0..9d8de971c654356a753f85fc48b8618d49568fc9 100644 (file)
@@ -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)
 {
 
index 1570fe3b00ea3318587d9f7c70d097c2032455cf..013a6327f1d8587b3e9d4991f3603f618e995da5 100644 (file)
@@ -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>);
 
index 3967d0d704e4c46b8e43db6f6fbd3022a98f5db8..50d86c523588ec34de6d7148e9082f5e8dd7a834 100644 (file)
@@ -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);
index e0ed6a64aafb78b9e408980167073e59b0ecee52..c41af9d3f885fbfc0bb63873b3dd85a5b0c0afff 100644 (file)
 
 #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;
 };
index c185de0f4d74ffeef5b6df6cdec2299874db6c3f..996aff33f7016d7c86f7e2a75ac537185543faab 100644 (file)
@@ -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);
 
index 5ae53f1e8743b3ce711521502c192ef0ba67e9ca..57e7e6203fe158970bfcb124136fbbf60ae46f86 100644 (file)
@@ -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
index 93ce2cdbb2c816d0b388fba69e556c70a27dffed..50770834586f10c1cb5405d7846fa2696d26fd66 100644 (file)
@@ -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)
index e4693fb6df76fa8db8558460c2963d7c5916be96..be1fe38b6ef2ff52e6f0b6e22b4ec7785af5baf9 100644 (file)
@@ -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;
 };
index 8674c6262e03aab9e940f3808d03940634d75e8d..1d8d12cd552bf3f7236243d489026359fb94b3d5 100644 (file)
@@ -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) {
index 88f719ba230307d3932c7136e132fad2dc06f8df..47d977ce7581dd966d7db70980aca574882f0be5 100644 (file)
@@ -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
index 17a6726a6841db8c3bd753b35d5f9ac1686b1991..1fc7d5997630f32477f17e355bfb2e89a7b551a7 100644 (file)
@@ -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());
 
index b12bd0d48710291ce9e2ae8745137e8ac21bf817..64f113d74d9a53280e8ec1194de82c4ada6d5be5 100644 (file)
@@ -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;
index 2da021ad8265df36bef1beeb0fe4ef7bb8965ad9..fe4d50ef31e0379870c6273a3f3e5f38ba6376e4 100644 (file)
@@ -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));
index 1bc4e18df164b1bd2d15d795c4e9545dd707c214..5ac5c9559b3ae965eb6162c68c3ca1508117a802 100644 (file)
@@ -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>);
index eaf1033d9830d262192c08d12517b846d3a8e0fb..dc2fc305cdd5618524371bf299affbd101ba0ee6 100644 (file)
@@ -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);
index 9b121235a4bc8db3a85f8f920fa489ea2a1a4984..25c8068b6fcdb02726a0b93f8163b7ef6b968e1b 100644 (file)
@@ -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)
 {
index 45a2a809c214569e27f927a3c46b680dbbebe132..2558955eb1985f45c396d5067a753f1109ec976d 100644 (file)
@@ -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 ();
 
index 7b97a422e9afa6b1992b22d1e4d56adb086d4e6d..b3b1acbbb4463dea5824dfcd5de6467d39bd8d34 100644 (file)
@@ -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);
index 89e42f9786e33e584d88417aaf4d51fabc091ae4..d483db1d97a418a40919d9855ac704200747e031 100644 (file)
@@ -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;
index ddc7e371c8aa6bf676673bda979573f8d6f06036..e7f47c462c550c4bb8bc9fedb97cad1871bdd1ed 100644 (file)
@@ -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 ();
index d68c1648fe1242dcc2ab1d64ca43fcfeb29707ae..3957da5ddd1df8e01be6306b6f4657d93733c146 100644 (file)
@@ -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)
 {
index f636191f2e3bdbb6da13d799c13a496cabbd6885..75107ef4febea666c1c7697f539edc2f543bfcf3 100644 (file)
@@ -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 */
index dd6ef49b2a414fdf9c3567a06012aeb4f353ed8b..68088377b17aeb18b89f05c8c1624d36fb95e435 100644 (file)
@@ -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)
 {
        
index 4ffe876af6de5f46757425b27a8b793f0e44dd3f..6069637d0c03e9db3453b5aac68cd60337a3c238 100644 (file)
@@ -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>);
index 134d74623d7087cf3d508778d6ae4cfcc096d40e..e7659155288eb0dd81779e4b6677564238e4f6d7 100644 (file)
@@ -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)
index f3340ba7260230aa67a756998a34c991cad760fe..064f4221ed648ff98ba4189f75075916ca1d88d0 100644 (file)
@@ -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 ();
index 41cefb9bee113a2ba322f06845fb4e02cf3daca0..f32cfa811ad58c19d10c320bcb323120099354ba 100644 (file)
@@ -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.
index 65cd272e7b7fa88b09fc48aa30d559dad727f28b..4605d17247e14c1e6f038c57f632016698df1ce3 100644 (file)
@@ -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)
 {
index 442bb55f54b03b982060379f43724346c850177f..1aa906b0adc5fd9518334ffab78e47f347d5a37b 100644 (file)
 
 #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;
 };
 
index 9b3866dcb5c886793db6ee581db04ec427946233..4457969f3399254b89f77be38b3d308ee1c54ce9 100644 (file)
 #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;
+};
index 081e042521c962aa49c43b0a89c9732b0b6d479e..54619c39f795067b11bc6c32e7d71b3dd139b539 100644 (file)
@@ -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);
index 1decea070001717cde392f12eeba1310da99b860..97f655e15c212e78aba5ad9f6564dbfc84f9f7e9 100644 (file)
@@ -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;
 };
index 114803fb533892d020a03b64f18b6152cbe08eb0..f44a3ed7be30de313b459e2e242a13c66c7ed566 100644 (file)
@@ -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))
index 35aac0b501f5c21381fb4b1eac74af228991d602..f27984aaa53f5632ecd3547695f345bdbaa2eddb 100644 (file)
@@ -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 ();
 
index 03a697865cbd8c7781ee687ecc0ae9e752a596cd..a8da40b7c39e08ada1e013d7cd90b8d157ff17c3 100644 (file)
@@ -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)
 {
index ea1899840a7252a6358c682a0a1e85167bb3c7bd..a8296d918badc5b8ce61a0481bfb03752d56bfa3 100644 (file)
@@ -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;
index 12fe302f4564bd849cbec7813470947412e5da1f..1ed560428e32777ef601422019d3389f7a2e1034 100644 (file)
@@ -104,10 +104,9 @@ FilmViewer::set_film (shared_ptr<Film> f)
                return;
        }
 
-       /* XXX: Options is not decoder-specific at all */
-       shared_ptr<Options> o (new Options ("", "", ""));
+       shared_ptr<DecodeOptions> o (new DecodeOptions);
        o->decode_audio = false;
-       o->decoder_alignment = false;
+       o->video_sync = false;
        _decoders = decoder_factory (_film, o, 0);
        _decoders.video->Video.connect (bind (&FilmViewer::process_video, this, _1, _2));