X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Freel_writer.h;h=6e92e89230937bb2f8555b5e6c0695d6c6120462;hp=3adaaf477c956be5850b019c18b45afefd720704;hb=c103d8c1306e5fb3937b3a6c430a3fff32653fa3;hpb=7a65b08f1b09beacc0e0a8060641f677683d400c diff --git a/src/lib/reel_writer.h b/src/lib/reel_writer.h index 3adaaf477..6e92e8923 100644 --- a/src/lib/reel_writer.h +++ b/src/lib/reel_writer.h @@ -1,112 +1,150 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2020 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ -#include "types.h" -#include "data.h" + +#include "atmos_metadata.h" +#include "dcp_text_track.h" #include "dcpomatic_time.h" +#include "font_id_map.h" +#include "player_text.h" #include "referenced_reel_asset.h" -#include "player_subtitles.h" +#include "types.h" +#include "weak_film.h" +#include +#include #include -#include + +class AudioBuffers; class Film; +class InfoFileHandle; class Job; -class Font; -class AudioBuffers; +struct write_frame_info_test; namespace dcp { + class AtmosAsset; class MonoPictureAsset; class MonoPictureAssetWriter; - class StereoPictureAsset; - class StereoPictureAssetWriter; class PictureAsset; class PictureAssetWriter; + class Reel; + class ReelAsset; + class ReelPictureAsset; class SoundAsset; class SoundAssetWriter; + class StereoPictureAsset; + class StereoPictureAssetWriter; class SubtitleAsset; - class ReelAsset; - class Reel; } -class ReelWriter + +class ReelWriter : public WeakConstFilm { public: - ReelWriter (boost::shared_ptr film, DCPTimePeriod period, boost::shared_ptr job); - - void write (boost::optional encoded, Frame frame, Eyes eyes); - void fake_write (Frame frame, Eyes eyes, int size); + ReelWriter ( + std::weak_ptr film, + dcpomatic::DCPTimePeriod period, + std::shared_ptr job, + int reel_index, + int reel_count, + bool text_only + ); + + void write (std::shared_ptr encoded, Frame frame, Eyes eyes); + void fake_write (int size); void repeat_write (Frame frame, Eyes eyes); - void write (boost::shared_ptr audio); - void write (PlayerSubtitles subs); - - void finish (); - boost::shared_ptr create_reel (std::list const & refs, std::list > const & fonts); - void calculate_digests (boost::shared_ptr job); + void write (std::shared_ptr audio); + void write (PlayerText text, TextType type, boost::optional track, dcpomatic::DCPTimePeriod period, FontIdMap const& fonts); + void write (std::shared_ptr atmos, AtmosMetadata metadata); + + void finish (boost::filesystem::path output_dcp); + std::shared_ptr create_reel ( + std::list const & refs, + FontIdMap const & fonts, + std::shared_ptr chosen_interop_font, + boost::filesystem::path output_dcp, + bool ensure_subtitles, + std::set ensure_closed_captions + ); + void calculate_digests (std::function set_progress); Frame start () const; - DCPTimePeriod period () const { + dcpomatic::DCPTimePeriod period () const { return _period; } - int total_written_audio_frames () const { - return _total_written_audio_frames; + int first_nonexistent_frame () const { + return _first_nonexistent_frame; } - int last_written_video_frame () const { - return _last_written_video_frame; - } - - Eyes last_written_eyes () const { - return _last_written_eyes; - } - - int first_nonexistant_frame () const { - return _first_nonexistant_frame; - } - - dcp::FrameInfo read_frame_info (FILE* file, Frame frame, Eyes eyes) const; + dcp::FrameInfo read_frame_info (std::shared_ptr info, Frame frame, Eyes eyes) const; private: + friend struct ::write_frame_info_test; + void write_frame_info (Frame frame, Eyes eyes, dcp::FrameInfo info) const; long frame_info_position (Frame frame, Eyes eyes) const; - void check_existing_picture_asset (); - - boost::shared_ptr _film; - - DCPTimePeriod _period; - /** the first frame index that does not already exist in our MXF */ - int _first_nonexistant_frame; + Frame check_existing_picture_asset (boost::filesystem::path asset); + bool existing_picture_frame_ok (dcp::File& asset_file, std::shared_ptr info_file, Frame frame) const; + std::shared_ptr empty_text_asset (TextType type, boost::optional track, bool with_dummy) const; + + std::shared_ptr create_reel_picture (std::shared_ptr reel, std::list const & refs) const; + void create_reel_sound (std::shared_ptr reel, std::list const & refs) const; + void create_reel_text ( + std::shared_ptr reel, + std::list const & refs, + FontIdMap const& fonts, + std::shared_ptr chosen_interop_font, + int64_t duration, + boost::filesystem::path output_dcp, + bool ensure_subtitles, + std::set ensure_closed_captions + ) const; + void create_reel_markers (std::shared_ptr reel) const; + + dcpomatic::DCPTimePeriod _period; + /** the first picture frame index that does not already exist in our MXF */ + int _first_nonexistent_frame; /** the data of the last written frame, if there is one */ - boost::optional _last_written[EYES_COUNT]; - /** the index of the last written video frame within the reel */ - int _last_written_video_frame; - Eyes _last_written_eyes; - /** the number of audio frames that have been written to the reel */ - int _total_written_audio_frames; - - boost::shared_ptr _picture_asset; - boost::shared_ptr _picture_asset_writer; - boost::shared_ptr _sound_asset; - boost::shared_ptr _sound_asset_writer; - boost::shared_ptr _subtitle_asset; + std::shared_ptr _last_written[static_cast(Eyes::COUNT)]; + /** index of this reel within the DCP (starting from 0) */ + int _reel_index; + /** number of reels in the DCP */ + int _reel_count; + boost::optional _content_summary; + std::weak_ptr _job; + bool _text_only; + + dcp::ArrayData _default_font; + + std::shared_ptr _picture_asset; + /** picture asset writer, or 0 if we are not writing any picture because we already have one */ + std::shared_ptr _picture_asset_writer; + std::shared_ptr _sound_asset; + std::shared_ptr _sound_asset_writer; + std::shared_ptr _subtitle_asset; + std::map> _closed_caption_assets; + std::shared_ptr _atmos_asset; + std::shared_ptr _atmos_asset_writer; static int const _info_size; };