X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=0c513056c56e45ddc1e301d001da346862de7401;hb=4ee6786d1c3db04dcc77e511121e5d62d0d595b5;hp=2abb6a30c2a6d3a53b45eea27104f65b3b180d67;hpb=19f94521139aac13ef8fb4eaa55855b2ada307b4;p=dcpomatic.git diff --git a/src/lib/player.cc b/src/lib/player.cc index 2abb6a30c..0c513056c 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -20,16 +20,19 @@ #include "player.h" #include "film.h" #include "ffmpeg_decoder.h" +#include "video_decoder.h" +#include "audio_decoder.h" #include "audio_buffers.h" #include "audio_content.h" #include "ffmpeg_content.h" #include "image_decoder.h" +#include "content_audio.h" #include "image_content.h" -#include "sndfile_decoder.h" -#include "sndfile_content.h" #include "subtitle_content.h" #include "text_subtitle_decoder.h" #include "text_subtitle_content.h" +#include "video_mxf_decoder.h" +#include "video_mxf_content.h" #include "dcp_content.h" #include "job.h" #include "image.h" @@ -159,34 +162,6 @@ Player::setup_pieces () frc = FrameRateChange (ic->active_video_frame_rate(), _film->video_frame_rate()); } - /* SndfileContent */ - shared_ptr sc = dynamic_pointer_cast (i); - if (sc) { - decoder.reset (new SndfileDecoder (sc, _fast, _film->log())); - - /* Work out a FrameRateChange for the best overlap video for this content */ - DCPTime best_overlap_t; - shared_ptr best_overlap; - BOOST_FOREACH (shared_ptr j, _playlist->content ()) { - if (!j->video) { - continue; - } - - DCPTime const overlap = min (j->end(), i->end()) - max (j->position(), i->position()); - if (overlap > best_overlap_t) { - best_overlap = j; - best_overlap_t = overlap; - } - } - - if (best_overlap) { - frc = FrameRateChange (best_overlap->active_video_frame_rate(), _film->video_frame_rate ()); - } else { - /* No video overlap; e.g. if the DCP is just audio */ - frc = FrameRateChange (_film->video_frame_rate(), _film->video_frame_rate ()); - } - } - /* It's questionable whether subtitle content should have a video frame rate; perhaps it should be assumed that any subtitle content has been prepared at the same rate as simultaneous video content (like we do with audio). @@ -206,14 +181,21 @@ Player::setup_pieces () frc = FrameRateChange (dsc->active_video_frame_rate(), _film->video_frame_rate()); } - shared_ptr vd = dynamic_pointer_cast (decoder); - if (vd && _ignore_video) { - vd->set_ignore_video (); + /* VideoMXFContent */ + shared_ptr vmc = dynamic_pointer_cast (i); + if (vmc) { + decoder.reset (new VideoMXFDecoder (vmc, _film->log())); + frc = FrameRateChange (vmc->active_video_frame_rate(), _film->video_frame_rate()); + } + + DCPOMATIC_ASSERT (decoder); + + if (decoder->video && _ignore_video) { + decoder->video->set_ignore (); } - shared_ptr ad = dynamic_pointer_cast (decoder); - if (ad && _ignore_audio) { - ad->set_ignore_audio (); + if (decoder->audio && _ignore_audio) { + decoder->audio->set_ignore (); } _pieces.push_back (shared_ptr (new Piece (i, decoder, frc.get ()))); @@ -421,7 +403,7 @@ Player::get_video (DCPTime time, bool accurate) /* Get video from appropriate piece(s) */ BOOST_FOREACH (shared_ptr piece, ov) { - shared_ptr decoder = dynamic_pointer_cast (piece->decoder); + shared_ptr decoder = piece->decoder->video; DCPOMATIC_ASSERT (decoder); shared_ptr dcp_content = dynamic_pointer_cast (piece->content); @@ -438,7 +420,7 @@ Player::get_video (DCPTime time, bool accurate) if (use) { /* We want to use this piece */ - list content_video = decoder->get_video (dcp_to_content_video (piece, time), accurate); + list content_video = decoder->get (dcp_to_content_video (piece, time), accurate); if (content_video.empty ()) { pvf.push_back (black_player_video_frame (time)); } else { @@ -466,7 +448,7 @@ Player::get_video (DCPTime time, bool accurate) } } else { /* Discard unused video */ - decoder->get_video (dcp_to_content_video (piece, time), accurate); + decoder->get (dcp_to_content_video (piece, time), accurate); } } } @@ -514,7 +496,7 @@ Player::get_audio (DCPTime time, DCPTime length, bool accurate) BOOST_FOREACH (shared_ptr i, ov) { DCPOMATIC_ASSERT (i->content->audio); - shared_ptr decoder = dynamic_pointer_cast (i->decoder); + shared_ptr decoder = i->decoder->audio; DCPOMATIC_ASSERT (decoder); /* The time that we should request from the content */ @@ -543,7 +525,7 @@ Player::get_audio (DCPTime time, DCPTime length, bool accurate) } /* Audio from this piece's decoder stream (which might be more or less than what we asked for) */ - ContentAudio all = decoder->get_audio (j, content_frame, request_frames, accurate); + ContentAudio all = decoder->get (j, content_frame, request_frames, accurate); /* Gain */ if (i->content->audio->gain() != 0) { @@ -656,12 +638,12 @@ Player::get_subtitles (DCPTime time, DCPTime length, bool starting, bool burnt, continue; } - shared_ptr subtitle_decoder = dynamic_pointer_cast ((*j)->decoder); + shared_ptr subtitle_decoder = (*j)->decoder->subtitle; ContentTime const from = dcp_to_content_subtitle (*j, time); /* XXX: this video_frame_rate() should be the rate that the subtitle content has been prepared for */ ContentTime const to = from + ContentTime::from_frames (1, _film->video_frame_rate ()); - list image = subtitle_decoder->get_image_subtitles (ContentTimePeriod (from, to), starting, accurate); + list image = subtitle_decoder->get_image (ContentTimePeriod (from, to), starting, accurate); for (list::iterator i = image.begin(); i != image.end(); ++i) { /* Apply content's subtitle offsets */ @@ -679,7 +661,7 @@ Player::get_subtitles (DCPTime time, DCPTime length, bool starting, bool burnt, ps.image.push_back (i->sub); } - list text = subtitle_decoder->get_text_subtitles (ContentTimePeriod (from, to), starting, accurate); + list text = subtitle_decoder->get_text (ContentTimePeriod (from, to), starting, accurate); BOOST_FOREACH (ContentTextSubtitle& ts, text) { BOOST_FOREACH (dcp::SubtitleString s, ts.subs) { s.set_h_position (s.h_position() + (*j)->content->subtitle->x_offset ());