diff options
| author | Carl Hetherington <cth@carlh.net> | 2024-04-22 21:39:03 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2024-04-22 21:39:03 +0200 |
| commit | 764c35279cf79e96a9d738ad86625bc3137fc8d7 (patch) | |
| tree | 0f778d72bc5c8bb74dfbacd07ea570b15eaf28d7 /src/lib/dcp_decoder.cc | |
| parent | a046e7fedb6d6e6703e36999fc6b6183252f0438 (diff) | |
| parent | b74f594ce1dee47fdb5cbeebdc3d6577cdd1cab8 (diff) | |
Merge branch 'mpeg2' into v2.17.xv2.17.16
Diffstat (limited to 'src/lib/dcp_decoder.cc')
| -rw-r--r-- | src/lib/dcp_decoder.cc | 88 |
1 files changed, 54 insertions, 34 deletions
diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc index 303126caa..e471a237f 100644 --- a/src/lib/dcp_decoder.cc +++ b/src/lib/dcp_decoder.cc @@ -26,19 +26,23 @@ #include "constants.h" #include "dcp_content.h" #include "dcp_decoder.h" +#include "dcpomatic_log.h" #include "digester.h" #include "ffmpeg_image_proxy.h" #include "frame_interval_checker.h" #include "image.h" #include "j2k_image_proxy.h" +#include "raw_image_proxy.h" #include "text_decoder.h" +#include "util.h" #include "video_decoder.h" #include <dcp/cpl.h> #include <dcp/dcp.h> #include <dcp/decrypted_kdm.h> -#include <dcp/mono_picture_asset.h> -#include <dcp/mono_picture_asset_reader.h> -#include <dcp/mono_picture_frame.h> +#include <dcp/mono_j2k_picture_asset.h> +#include <dcp/mono_j2k_picture_asset_reader.h> +#include <dcp/mono_j2k_picture_frame.h> +#include <dcp/mono_mpeg2_picture_asset.h> #include <dcp/reel.h> #include <dcp/reel_atmos_asset.h> #include <dcp/reel_closed_caption_asset.h> @@ -48,9 +52,9 @@ #include <dcp/search.h> #include <dcp/sound_asset_reader.h> #include <dcp/sound_frame.h> -#include <dcp/stereo_picture_asset.h> -#include <dcp/stereo_picture_asset_reader.h> -#include <dcp/stereo_picture_frame.h> +#include <dcp/stereo_j2k_picture_asset.h> +#include <dcp/stereo_j2k_picture_asset_reader.h> +#include <dcp/stereo_j2k_picture_frame.h> #include <dcp/subtitle_image.h> #include <iostream> @@ -169,24 +173,24 @@ DCPDecoder::pass () */ pass_texts (_next, picture_asset->size()); - if ((_mono_reader || _stereo_reader) && (_decode_referenced || !_dcp_content->reference_video())) { + if ((_j2k_mono_reader || _j2k_stereo_reader || _mpeg2_mono_reader) && (_decode_referenced || !_dcp_content->reference_video())) { auto const entry_point = (*_reel)->main_picture()->entry_point().get_value_or(0); - if (_mono_reader) { + if (_j2k_mono_reader) { video->emit ( film(), std::make_shared<J2KImageProxy>( - _mono_reader->get_frame (entry_point + frame), + _j2k_mono_reader->get_frame(entry_point + frame), picture_asset->size(), AV_PIX_FMT_XYZ12LE, _forced_reduction ), ContentTime::from_frames(_offset + frame, vfr) ); - } else { + } else if (_j2k_stereo_reader) { video->emit ( film(), std::make_shared<J2KImageProxy>( - _stereo_reader->get_frame (entry_point + frame), + _j2k_stereo_reader->get_frame (entry_point + frame), picture_asset->size(), dcp::Eye::LEFT, AV_PIX_FMT_XYZ12LE, @@ -198,7 +202,7 @@ DCPDecoder::pass () video->emit ( film(), std::make_shared<J2KImageProxy>( - _stereo_reader->get_frame (entry_point + frame), + _j2k_stereo_reader->get_frame (entry_point + frame), picture_asset->size(), dcp::Eye::RIGHT, AV_PIX_FMT_XYZ12LE, @@ -206,6 +210,23 @@ DCPDecoder::pass () ), ContentTime::from_frames(_offset + frame, vfr) ); + } else if (_mpeg2_mono_reader) { + /* XXX: got to flush this at some point */ + try { + for (auto const& image: _mpeg2_decompressor->decompress_frame(_mpeg2_mono_reader->get_frame(entry_point + frame))) { + video->emit( + film(), + /* XXX: should this be PADDED? */ + std::make_shared<RawImageProxy>(std::make_shared<Image>(image.frame(), Image::Alignment::COMPACT)), + /* XXX: this will be wrong */ + ContentTime::from_frames(_offset + frame, vfr) + ); + } + } catch (dcp::MPEG2DecompressionError& e) { + LOG_ERROR("Failed to decompress MPEG video frame %1 (%2)", entry_point + frame, e.what()); + } catch (dcp::ReadError& e) { + LOG_ERROR("Failed to read MPEG2 video frame %1 (%2)", entry_point + frame, e.what()); + } } } @@ -367,38 +388,40 @@ DCPDecoder::next_reel () void DCPDecoder::get_readers () { + _j2k_mono_reader.reset(); + _j2k_stereo_reader.reset(); + _mpeg2_mono_reader.reset(); + _sound_reader.reset(); + _atmos_reader.reset(); + _mpeg2_decompressor.reset(); + _atmos_metadata = boost::none; + if (_reel == _reels.end() || !_dcp_content->can_be_played ()) { - _mono_reader.reset (); - _stereo_reader.reset (); - _sound_reader.reset (); - _atmos_reader.reset (); return; } if (video && !video->ignore() && (*_reel)->main_picture()) { auto asset = (*_reel)->main_picture()->asset (); - auto mono = dynamic_pointer_cast<dcp::MonoPictureAsset> (asset); - auto stereo = dynamic_pointer_cast<dcp::StereoPictureAsset> (asset); - DCPOMATIC_ASSERT (mono || stereo); - if (mono) { - _mono_reader = mono->start_read (); - _mono_reader->set_check_hmac (false); - _stereo_reader.reset (); + auto j2k_mono = dynamic_pointer_cast<dcp::MonoJ2KPictureAsset>(asset); + auto j2k_stereo = dynamic_pointer_cast<dcp::StereoJ2KPictureAsset>(asset); + auto mpeg2_mono = dynamic_pointer_cast<dcp::MonoMPEG2PictureAsset>(asset); + DCPOMATIC_ASSERT(j2k_mono || j2k_stereo || mpeg2_mono) + if (j2k_mono) { + _j2k_mono_reader = j2k_mono->start_read(); + _j2k_mono_reader->set_check_hmac(false); + } else if (j2k_stereo) { + _j2k_stereo_reader = j2k_stereo->start_read(); + _j2k_stereo_reader->set_check_hmac(false); } else { - _stereo_reader = stereo->start_read (); - _stereo_reader->set_check_hmac (false); - _mono_reader.reset (); + _mpeg2_mono_reader = mpeg2_mono->start_read(); + _mpeg2_mono_reader->set_check_hmac(false); + _mpeg2_decompressor = std::make_shared<dcp::MPEG2Decompressor>(); } - } else { - _mono_reader.reset (); - _stereo_reader.reset (); } if (audio && !audio->ignore() && (*_reel)->main_sound()) { _sound_reader = (*_reel)->main_sound()->asset()->start_read (); _sound_reader->set_check_hmac (false); - } else { - _sound_reader.reset (); } if ((*_reel)->atmos()) { @@ -406,9 +429,6 @@ DCPDecoder::get_readers () _atmos_reader = asset->start_read(); _atmos_reader->set_check_hmac (false); _atmos_metadata = AtmosMetadata (asset); - } else { - _atmos_reader.reset (); - _atmos_metadata = boost::none; } } |
