X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fdcp_decoder.cc;h=3bfbd7720c9e04cf99b951db455e306bd2be3cb9;hb=ef4b082c5d7452a34ce45f6d3bead46a7e846faf;hp=1939fc1c9d21ef731467fb2d2d5075361855835c;hpb=0dc52cd6e69890cd8a2c539e80389ea8bac5cc3c;p=dcpomatic.git diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc index 1939fc1c9..3bfbd7720 100644 --- a/src/lib/dcp_decoder.cc +++ b/src/lib/dcp_decoder.cc @@ -17,78 +17,97 @@ */ +#include "dcp_decoder.h" +#include "dcp_content.h" +#include "j2k_image_proxy.h" +#include "image.h" +#include "config.h" #include #include #include #include #include #include +#include #include #include -#include "dcp_decoder.h" -#include "dcp_content.h" -#include "image_proxy.h" -#include "image.h" +#include using std::list; using std::cout; using boost::shared_ptr; using boost::dynamic_pointer_cast; -DCPDecoder::DCPDecoder (shared_ptr c, shared_ptr log) +DCPDecoder::DCPDecoder (shared_ptr c) : VideoDecoder (c) , AudioDecoder (c) , SubtitleDecoder (c) - , _log (log) , _dcp_content (c) { dcp::DCP dcp (c->directory ()); dcp.read (); - assert (dcp.cpls().size() == 1); + if (c->kdm ()) { + dcp.add (dcp::DecryptedKDM (c->kdm().get (), Config::instance()->decryption_private_key ())); + } + DCPOMATIC_ASSERT (dcp.cpls().size() == 1); _reels = dcp.cpls().front()->reels (); _reel = _reels.begin (); } bool -DCPDecoder::pass () +DCPDecoder::pass (PassReason) { - if (_reel == _reels.end ()) { + if (_reel == _reels.end () || !_dcp_content->can_be_played ()) { return true; } float const vfr = _dcp_content->video_frame_rate (); + int64_t const frame = _next.frames (vfr); if ((*_reel)->main_picture ()) { shared_ptr mxf = (*_reel)->main_picture()->mxf (); shared_ptr mono = dynamic_pointer_cast (mxf); shared_ptr stereo = dynamic_pointer_cast (mxf); - int64_t const ep = (*_reel)->main_picture()->entry_point (); + int64_t const entry_point = (*_reel)->main_picture()->entry_point (); if (mono) { - shared_ptr image (new Image (PIX_FMT_RGB24, mxf->size(), false)); - mono->get_frame (ep + _next.frames (vfr))->rgb_frame (image->data()[0]); - shared_ptr aligned (new Image (image, true)); - video (shared_ptr (new RawImageProxy (aligned, _log)), _next.frames (vfr)); + video (shared_ptr (new J2KImageProxy (mono->get_frame (entry_point + frame), mxf->size())), frame); } else { + video ( + shared_ptr (new J2KImageProxy (stereo->get_frame (entry_point + frame), mxf->size(), dcp::EYE_LEFT)), + frame + ); + + video ( + shared_ptr (new J2KImageProxy (stereo->get_frame (entry_point + frame), mxf->size(), dcp::EYE_RIGHT)), + frame + ); + } + } - shared_ptr left (new Image (PIX_FMT_RGB24, mxf->size(), false)); - stereo->get_frame (ep + _next.frames (vfr))->rgb_frame (dcp::EYE_LEFT, left->data()[0]); - shared_ptr aligned_left (new Image (left, true)); - video (shared_ptr (new RawImageProxy (aligned_left, _log)), _next.frames (vfr)); - - shared_ptr right (new Image (PIX_FMT_RGB24, mxf->size(), false)); - stereo->get_frame (ep + _next.frames (vfr))->rgb_frame (dcp::EYE_RIGHT, right->data()[0]); - shared_ptr aligned_right (new Image (right, true)); - video (shared_ptr (new RawImageProxy (aligned_right, _log)), _next.frames (vfr)); + if ((*_reel)->main_sound ()) { + int64_t const entry_point = (*_reel)->main_sound()->entry_point (); + shared_ptr sf = (*_reel)->main_sound()->mxf()->get_frame (entry_point + frame); + uint8_t const * from = sf->data (); + + int const channels = _dcp_content->audio_channels (); + int const frames = sf->size() / (3 * channels); + shared_ptr data (new AudioBuffers (channels, frames)); + for (int i = 0; i < frames; ++i) { + for (int j = 0; j < channels; ++j) { + data->data()[j][i] = float (from[0] | (from[1] << 8) | (from[2] << 16)) / (1 << 23); + from += 3; + } } + + audio (data, _next); } - /* XXX: sound */ /* XXX: subtitle */ _next += ContentTime::from_frames (1, vfr); if ((*_reel)->main_picture ()) { - if ((*_reel)->main_picture()->duration() >= _next.frames (vfr)) { + if (_next.frames (vfr) >= (*_reel)->main_picture()->duration()) { ++_reel; } } @@ -114,7 +133,14 @@ DCPDecoder::seek (ContentTime t, bool accurate) list -DCPDecoder::subtitles_during (ContentTimePeriod, bool starting) const +DCPDecoder::image_subtitles_during (ContentTimePeriod, bool) const +{ + return list (); +} + +list +DCPDecoder::text_subtitles_during (ContentTimePeriod, bool) const { + /* XXX */ return list (); }