+ std::string _directory;
+ /** Mutex for _directory */
+ mutable boost::mutex _directory_mutex;
+
+ /** Name for DVD-o-matic */
+ std::string _name;
+ /** True if a auto-generated DCI-compliant name should be used for our DCP */
+ bool _use_dci_name;
+ /** File or directory containing content; may be relative to our directory
+ * or an absolute path.
+ */
+ std::string _content;
+ /** If this is true, we will believe the length specified by the content
+ * file's header; if false, we will run through the whole content file
+ * the first time we see it in order to obtain the length.
+ */
+ bool _trust_content_header;
+ /** The type of content that this Film represents (feature, trailer etc.) */
+ DCPContentType const * _dcp_content_type;
+ /** The format to present this Film in (flat, scope, etc.) */
+ Format const * _format;
+ /** The crop to apply to the source */
+ Crop _crop;
+ /** Video filters that should be used when generating DCPs */
+ std::vector<Filter const *> _filters;
+ /** Scaler algorithm to use */
+ Scaler const * _scaler;
+ /** Frames to trim off the start of the DCP */
+ int _trim_start;
+ /** Frames to trim off the end of the DCP */
+ int _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;
+ /** The audio stream to use from our content */
+ boost::shared_ptr<AudioStream> _content_audio_stream;
+ /** List of filenames of external audio files, in channel order
+ (L, R, C, Lfe, Ls, Rs)
+ */
+ std::vector<std::string> _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;
+ boost::shared_ptr<SubtitleStream> _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
+ the frame, -ve is further up.
+ */
+ int _subtitle_offset;
+ /** scale factor to apply to subtitles */
+ float _subtitle_scale;
+ /** index of colour LUT to use when converting RGB to XYZ.
+ * 0: sRGB
+ * 1: Rec 709
+ */
+ int _colour_lut;
+ /** bandwidth for J2K files in bits per second */
+ int _j2k_bandwidth;
+
+ /** DCI naming stuff */
+ DCIMetadata _dci_metadata;
+
+ /* Data which are cached to speed things up */
+
+ /** Size, in pixels, of the source (ignoring cropping) */
+ libdcp::Size _size;
+ /** The length of the source, in video frames (as far as we know) */
+ boost::optional<SourceFrame> _length;
+ boost::optional<int> _dcp_intrinsic_duration;
+ /** MD5 digest of our content file */
+ std::string _content_digest;
+ /** The audio streams in our content */
+ std::vector<boost::shared_ptr<AudioStream> > _content_audio_streams;
+ /** A stream to represent possible external audio (will always exist) */
+ boost::shared_ptr<AudioStream> _external_audio_stream;
+ /** the subtitle streams that we can use */
+ std::vector<boost::shared_ptr<SubtitleStream> > _subtitle_streams;
+ /** Frames per second of the source */
+ float _frames_per_second;
+
+ /** true if our state has changed since we last saved it */