X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Freel_writer.cc;h=da79dfc048dc427478efa6145a9281030e296bfc;hb=5bcbd6821a6ff1419f9069cf9e1a94c8557a992c;hp=9d2f9d0bc633cbe102d9513dd7f9abfa087f130d;hpb=f64496a0e94c452caf179cf31722b5808c3e1907;p=dcpomatic.git diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 9d2f9d0bc..da79dfc04 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -88,6 +88,7 @@ ReelWriter::ReelWriter ( if (_film->encrypted ()) { _picture_asset->set_key (_film->key ()); + _picture_asset->set_context_id (_film->context_id ()); } _picture_asset->set_file ( @@ -112,11 +113,13 @@ ReelWriter::ReelWriter ( _sound_asset->set_key (_film->key ()); } + DCPOMATIC_ASSERT (_film->directory()); + /* Write the sound asset into the film directory so that we leave the creation of the DCP directory until the last minute. */ _sound_asset_writer = _sound_asset->start_write ( - _film->directory() / audio_asset_filename (_sound_asset, _reel_index, _reel_count, _content_summary), + _film->directory().get() / audio_asset_filename (_sound_asset, _reel_index, _reel_count, _content_summary), _film->interop() ? dcp::INTEROP : dcp::SMPTE ); } @@ -128,13 +131,27 @@ ReelWriter::write_frame_info (Frame frame, Eyes eyes, dcp::FrameInfo info) const { FILE* file = 0; boost::filesystem::path info_file = _film->info_file (_period); - if (boost::filesystem::exists (info_file)) { + + bool const read = boost::filesystem::exists (info_file); + +#ifdef DCPOMATIC_WINDOWS + if (read) { + LOG_GENERAL ( + "Checked %1 (which exists) length is %2 perms are %3", + info_file, boost::filesystem::file_size (info_file), int(boost::filesystem::status(info_file).permissions()) + ); + } else { + LOG_GENERAL ("Checked %1 (which does not exist)", info_file); + } +#endif + + if (read) { file = fopen_boost (info_file, "r+b"); } else { file = fopen_boost (info_file, "wb"); } if (!file) { - throw OpenFileError (info_file); + throw OpenFileError (info_file, errno, read); } dcpomatic_fseek (file, frame_info_position (frame, eyes), SEEK_SET); fwrite (&info.offset, sizeof (info.offset), 1, file); @@ -180,12 +197,13 @@ void ReelWriter::check_existing_picture_asset () { /* Try to open the existing asset */ - FILE* asset_file = fopen_boost (_picture_asset->file(), "rb"); + DCPOMATIC_ASSERT (_picture_asset->file()); + FILE* asset_file = fopen_boost (_picture_asset->file().get(), "rb"); if (!asset_file) { - LOG_GENERAL ("Could not open existing asset at %1 (errno=%2)", _picture_asset->file().string(), errno); + LOG_GENERAL ("Could not open existing asset at %1 (errno=%2)", _picture_asset->file()->string(), errno); return; } else { - LOG_GENERAL ("Opened existing asset at %1", _picture_asset->file().string()); + LOG_GENERAL ("Opened existing asset at %1", _picture_asset->file()->string()); } /* Offset of the last dcp::FrameInfo in the info file */ @@ -258,6 +276,7 @@ ReelWriter::finish () { if (!_picture_asset_writer->finalize ()) { /* Nothing was written to the picture asset */ + LOG_GENERAL ("Nothing was written to reel %1 of %2", _reel_index, _reel_count); _picture_asset.reset (); } @@ -268,7 +287,8 @@ ReelWriter::finish () /* Hard-link any video asset file into the DCP */ if (_picture_asset) { - boost::filesystem::path video_from = _picture_asset->file (); + DCPOMATIC_ASSERT (_picture_asset->file()); + boost::filesystem::path video_from = _picture_asset->file().get(); boost::filesystem::path video_to; video_to /= _film->dir (_film->dcp_name()); video_to /= video_asset_filename (_picture_asset, _reel_index, _reel_count, _content_summary); @@ -325,16 +345,23 @@ ReelWriter::create_reel (list const & refs, list k = dynamic_pointer_cast (j.asset); + if (k) { + LOG_GENERAL ("candidate picture asset period is %1-%2", j.period.from.get(), j.period.to.get()); + } if (k && j.period == _period) { reel_picture_asset = k; } } } + LOG_GENERAL ("create_reel for %1-%2; %3 of %4", _period.from.get(), _period.to.get(), _reel_index, _reel_count); + DCPOMATIC_ASSERT (reel_picture_asset); + DCPOMATIC_ASSERT (reel_picture_asset->duration() == _period.duration().frames_round (_film->video_frame_rate ())); reel->add (reel_picture_asset); /* If we have a hash for this asset in the CPL, assume that it is correct */ @@ -342,15 +369,17 @@ ReelWriter::create_reel (list const & refs, listasset_ref()->set_hash (reel_picture_asset->hash().get()); } + shared_ptr reel_sound_asset; + if (_sound_asset) { /* We have made a sound asset of our own. Put it into the reel */ - reel->add (shared_ptr (new dcp::ReelSoundAsset (_sound_asset, 0))); + reel_sound_asset.reset (new dcp::ReelSoundAsset (_sound_asset, 0)); } else { /* We don't have a sound asset of our own; hopefully we have one to reference */ BOOST_FOREACH (ReferencedReelAsset j, refs) { shared_ptr k = dynamic_pointer_cast (j.asset); if (k && j.period == _period) { - reel->add (k); + reel_sound_asset = k; /* If we have a hash for this asset in the CPL, assume that it is correct */ if (k->hash()) { k->asset_ref()->set_hash (k->hash().get()); @@ -359,6 +388,12 @@ ReelWriter::create_reel (list const & refs, listduration() == _period.duration().frames_round (_film->video_frame_rate ())); + reel->add (reel_sound_asset); + + shared_ptr reel_subtitle_asset; + if (_subtitle_asset) { boost::filesystem::path liberation_normal; @@ -399,20 +434,20 @@ ReelWriter::create_reel (list const & refs, listadd (shared_ptr ( - new dcp::ReelSubtitleAsset ( - _subtitle_asset, - dcp::Fraction (_film->video_frame_rate(), 1), - reel_picture_asset->intrinsic_duration (), - 0 - ) - )); + reel_subtitle_asset.reset ( + new dcp::ReelSubtitleAsset ( + _subtitle_asset, + dcp::Fraction (_film->video_frame_rate(), 1), + reel_picture_asset->intrinsic_duration (), + 0 + ) + ); } else { /* We don't have a subtitle asset of our own; hopefully we have one to reference */ BOOST_FOREACH (ReferencedReelAsset j, refs) { shared_ptr k = dynamic_pointer_cast (j.asset); if (k && j.period == _period) { - reel->add (k); + reel_subtitle_asset = k; /* If we have a hash for this asset in the CPL, assume that it is correct */ if (k->hash()) { k->asset_ref()->set_hash (k->hash().get()); @@ -421,6 +456,11 @@ ReelWriter::create_reel (list const & refs, listduration() == _period.duration().frames_round (_film->video_frame_rate ())); + reel->add (reel_subtitle_asset); + } + return reel; } @@ -454,7 +494,7 @@ ReelWriter::write (shared_ptr audio) _sound_asset_writer->write (audio->data(), audio->frames()); } - ++_total_written_audio_frames; + _total_written_audio_frames += audio->frames (); } void @@ -486,7 +526,7 @@ ReelWriter::write (PlayerSubtitles subs) } } - BOOST_FOREACH (dcp::SubtitleString i, subs.text) { + BOOST_FOREACH (SubtitleString i, subs.text) { i.set_in (i.in() - dcp::Time (_period.from.seconds(), i.in().tcr)); i.set_out (i.out() - dcp::Time (_period.from.seconds(), i.out().tcr)); _subtitle_asset->add (i);