X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffilm.h;h=2e81575e4710ef3fce0cee5ce9440eb1b4805387;hb=2231b171b4b624f4b747031727f61bd93f80957f;hp=06ebba3ce7545a6cac8939e8b547dd0c2b9bd69c;hpb=b7466a9653345bc51db4cb1d7e960bfc4c12721f;p=dcpomatic.git diff --git a/src/lib/film.h b/src/lib/film.h index 06ebba3ce..2e81575e4 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -44,6 +44,7 @@ class Job; class Filter; class Log; class ExamineContentJob; +class ExternalAudioStream; /** @class Film * @brief A representation of a video with sound. @@ -64,7 +65,6 @@ public: void examine_content (); void send_dcp_to_tms (); - void copy_from_dvd (); void make_dcp (bool); @@ -83,8 +83,6 @@ public: std::string content_path () const; ContentType content_type () const; - bool content_is_dvd () const; - std::string thumb_file (int) const; std::string thumb_base (int) const; SourceFrame thumb_frame (int) const; @@ -120,7 +118,9 @@ public: DCP_TRIM_START, DCP_TRIM_END, DCP_AB, - AUDIO_STREAM, + CONTENT_AUDIO_STREAM, + EXTERNAL_AUDIO, + USE_CONTENT_AUDIO, AUDIO_GAIN, AUDIO_DELAY, STILL_DURATION, @@ -132,9 +132,7 @@ public: THUMBS, SIZE, LENGTH, - AUDIO_SAMPLE_RATE, - HAS_SUBTITLES, - AUDIO_STREAMS, + CONTENT_AUDIO_STREAMS, SUBTITLE_STREAMS, FRAMES_PER_SECOND, }; @@ -202,15 +200,19 @@ public: return _dcp_ab; } - int audio_stream_index () const { + boost::shared_ptr content_audio_stream () const { boost::mutex::scoped_lock lm (_state_mutex); - return _audio_stream; + return _content_audio_stream; } - AudioStream audio_stream () const { + std::vector external_audio () const { boost::mutex::scoped_lock lm (_state_mutex); - assert (_audio_stream < int (_audio_streams.size())); - return _audio_streams[_audio_stream]; + return _external_audio; + } + + bool use_content_audio () const { + boost::mutex::scoped_lock lm (_state_mutex); + return _use_content_audio; } float audio_gain () const { @@ -228,17 +230,11 @@ public: return _still_duration; } - int subtitle_stream_index () const { + boost::shared_ptr subtitle_stream () const { boost::mutex::scoped_lock lm (_state_mutex); return _subtitle_stream; } - SubtitleStream subtitle_stream () const { - boost::mutex::scoped_lock lm (_state_mutex); - assert (_subtitle_stream < int (_subtitle_streams.size())); - return _subtitle_streams[_subtitle_stream]; - } - bool with_subtitles () const { boost::mutex::scoped_lock lm (_state_mutex); return _with_subtitles; @@ -304,27 +300,17 @@ public: return _length; } - int audio_sample_rate () const { - boost::mutex::scoped_lock lm (_state_mutex); - return _audio_sample_rate; - } - std::string content_digest () const { boost::mutex::scoped_lock lm (_state_mutex); return _content_digest; } - bool has_subtitles () const { + std::vector > content_audio_streams () const { boost::mutex::scoped_lock lm (_state_mutex); - return _has_subtitles; + return _content_audio_streams; } - std::vector audio_streams () const { - boost::mutex::scoped_lock lm (_state_mutex); - return _audio_streams; - } - - std::vector subtitle_streams () const { + std::vector > subtitle_streams () const { boost::mutex::scoped_lock lm (_state_mutex); return _subtitle_streams; } @@ -334,13 +320,15 @@ public: return _frames_per_second; } + boost::shared_ptr audio_stream () const; + /* SET */ void set_directory (std::string); void set_name (std::string); void set_use_dci_name (bool); - virtual void set_content (std::string); + void set_content (std::string); void set_dcp_content_type (DCPContentType const *); void set_format (Format const *); void set_crop (Crop); @@ -353,11 +341,13 @@ public: void set_dcp_trim_start (int); void set_dcp_trim_end (int); void set_dcp_ab (bool); - void set_audio_stream (int); + void set_content_audio_stream (boost::shared_ptr); + void set_external_audio (std::vector); + void set_use_content_audio (bool); void set_audio_gain (float); void set_audio_delay (int); void set_still_duration (int); - void set_subtitle_stream (int); + void set_subtitle_stream (boost::shared_ptr); void set_with_subtitles (bool); void set_subtitle_offset (int); void set_subtitle_scale (float); @@ -372,16 +362,17 @@ public: void set_size (Size); void set_length (SourceFrame); void unset_length (); - void set_audio_sample_rate (int); void set_content_digest (std::string); - void set_has_subtitles (bool); - void set_audio_streams (std::vector); - void set_subtitle_streams (std::vector); + void set_content_audio_streams (std::vector >); + void set_subtitle_streams (std::vector >); void set_frames_per_second (float); /** Emitted when some property has changed */ mutable boost::signals2::signal Changed; - + + /** Current version number of the state file */ + static int const state_version; + private: /** Log to write to */ @@ -390,13 +381,14 @@ private: /** Any running ExamineContentJob, or 0 */ boost::shared_ptr _examine_content_job; + /** The date that we should use in a DCI name */ boost::gregorian::date _dci_date; std::string thumb_file_for_frame (SourceFrame) const; std::string thumb_base_for_frame (SourceFrame) const; void signal_changed (Property); void examine_content_finished (); - + /** Complete path to directory containing the film metadata; * must not be relative. */ @@ -422,23 +414,30 @@ private: std::vector _filters; /** Scaler algorithm to use */ Scaler const * _scaler; + /** Frames to trim off the start of the source */ SourceFrame _dcp_trim_start; + /** Frames to trim off the end of the source */ SourceFrame _dcp_trim_end; /** true to create an A/B comparison DCP, where the left half of the image is the video without any filters or post-processing, and the right half has the specified filters and post-processing. */ bool _dcp_ab; - /** An index into our _audio_streams vector for the stream to use for audio, or -1 if there is none */ - int _audio_stream; + /** The audio stream to use from our content */ + boost::shared_ptr _content_audio_stream; + /** List of filenames of external audio files, in channel order + (L, R, C, Lfe, Ls, Rs) + */ + std::vector _external_audio; + /** true to use audio from our content file; false to use external audio */ + bool _use_content_audio; /** Gain to apply to audio in dB */ float _audio_gain; /** Delay to apply to audio (positive moves audio later) in milliseconds */ int _audio_delay; /** Duration to make still-sourced films (in seconds) */ int _still_duration; - /** An index into our _subtitle_streams vector for the stream to use for subtitles, or -1 if there is none */ - int _subtitle_stream; + boost::shared_ptr _subtitle_stream; /** True if subtitles should be shown for this film */ bool _with_subtitles; /** y offset for placing subtitles, in source pixels; +ve is further down @@ -465,19 +464,18 @@ private: Size _size; /** Actual length of the source (in video frames) from examining it */ boost::optional _length; - /** Sample rate of the source audio, in Hz */ - int _audio_sample_rate; /** MD5 digest of our content file */ std::string _content_digest; - /** true if the source has subtitles */ - bool _has_subtitles; - /** the audio streams that the source has */ - std::vector _audio_streams; - /** the subtitle streams that the source has */ - std::vector _subtitle_streams; + /** The audio streams in our content */ + std::vector > _content_audio_streams; + /** A stream to represent possible external audio (will always exist) */ + boost::shared_ptr _external_audio_stream; + /** the subtitle streams that we can use */ + std::vector > _subtitle_streams; /** Frames per second of the source */ float _frames_per_second; + /** true if our state has changed since we last saved it */ mutable bool _dirty; /** Mutex for all state except _directory */