X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_content.cc;h=8bcc0986d0eb7f89bbed9cc83adfcdfcaa537aa3;hb=e39cf78842eb33fac1deaf095c549ce857743b74;hp=c67d643a5980ea4cf03ae579479b2f8019f39933;hpb=65b331d32c383f3a9049f29bf03ab3fe3193b31a;p=dcpomatic.git diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index c67d643a5..8bcc0986d 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -64,19 +64,15 @@ int const FFmpegContentProperty::FILTERS = 102; FFmpegContent::FFmpegContent (shared_ptr film, boost::filesystem::path p) : Content (film, p) { - video.reset (new VideoContent (this, film)); - audio.reset (new AudioContent (this, film)); - subtitle.reset (new SubtitleContent (this, film)); - set_default_colour_conversion (); } FFmpegContent::FFmpegContent (shared_ptr film, cxml::ConstNodePtr node, int version, list& notes) : Content (film, node) { - video.reset (new VideoContent (this, film, node, version)); - audio.reset (new AudioContent (this, film, node)); - subtitle.reset (new SubtitleContent (this, film, node, version)); + video = VideoContent::from_xml (this, film, node, version); + audio = AudioContent::from_xml (this, film, node); + subtitle = SubtitleContent::from_xml (this, film, node, version); list c = node->node_children ("SubtitleStream"); for (list::const_iterator i = c.begin(); i != c.end(); ++i) { @@ -92,7 +88,7 @@ FFmpegContent::FFmpegContent (shared_ptr film, cxml::ConstNodePtr no audio->add_stream (as); if (version < 11 && !(*i)->optional_node_child ("Selected")) { /* This is an old file and this stream is not selected, so un-map it */ - as->set_mapping (AudioMapping (_audio_streams.back()->channels (), MAX_DCP_AUDIO_CHANNELS)); + as->set_mapping (AudioMapping (as->channels (), MAX_DCP_AUDIO_CHANNELS)); } } @@ -133,7 +129,7 @@ FFmpegContent::FFmpegContent (shared_ptr film, vector fc = dynamic_pointer_cast (c[i]); - if (fc->subtitle->use_subtitles() && *(fc->_subtitle_stream.get()) != *(ref->_subtitle_stream.get())) { + if (fc->subtitle->use() && *(fc->_subtitle_stream.get()) != *(ref->_subtitle_stream.get())) { throw JoinError (_("Content to be joined must use the same subtitle stream.")); } } @@ -156,9 +152,18 @@ FFmpegContent::as_xml (xmlpp::Node* node) const { node->add_child("Type")->add_child_text ("FFmpeg"); Content::as_xml (node); - video->as_xml (node); - audio->as_xml (node); - subtitle->as_xml (node); + + if (video) { + video->as_xml (node); + } + + if (audio) { + audio->as_xml (node); + } + + if (subtitle) { + subtitle->as_xml (node); + } boost::mutex::scoped_lock lm (_mutex); @@ -201,35 +206,44 @@ FFmpegContent::examine (shared_ptr job) Content::examine (job); shared_ptr examiner (new FFmpegExaminer (shared_from_this (), job)); - video->take_from_video_examiner (examiner); - set_default_colour_conversion (); + + if (examiner->has_video ()) { + video.reset (new VideoContent (this, film ())); + video->take_from_examiner (examiner); + set_default_colour_conversion (); + } { boost::mutex::scoped_lock lm (_mutex); - _subtitle_streams = examiner->subtitle_streams (); - if (!_subtitle_streams.empty ()) { - _subtitle_stream = _subtitle_streams.front (); + if (examiner->has_video ()) { + _first_video = examiner->first_video (); + _color_range = examiner->color_range (); + _color_primaries = examiner->color_primaries (); + _color_trc = examiner->color_trc (); + _colorspace = examiner->colorspace (); + _bits_per_pixel = examiner->bits_per_pixel (); } - BOOST_FOREACH (shared_ptr i, examiner->audio_streams ()) { - audio->add_stream (i); - } + if (!examiner->audio_streams().empty ()) { + audio.reset (new AudioContent (this, film ())); + + BOOST_FOREACH (shared_ptr i, examiner->audio_streams ()) { + audio->add_stream (i); + } - if (!audio->streams().empty ()) { AudioStreamPtr as = audio->streams().front(); AudioMapping m = as->mapping (); film()->make_audio_mapping_default (m); as->set_mapping (m); } - _first_video = examiner->first_video (); + _subtitle_streams = examiner->subtitle_streams (); + if (!_subtitle_streams.empty ()) { + subtitle.reset (new SubtitleContent (this, film ())); + _subtitle_stream = _subtitle_streams.front (); + } - _color_range = examiner->color_range (); - _color_primaries = examiner->color_primaries (); - _color_trc = examiner->color_trc (); - _colorspace = examiner->colorspace (); - _bits_per_pixel = examiner->bits_per_pixel (); } signal_changed (FFmpegContentProperty::SUBTITLE_STREAMS); @@ -239,8 +253,15 @@ FFmpegContent::examine (shared_ptr job) string FFmpegContent::summary () const { - /* Get the string() here so that the name does not have quotes around it */ - return String::compose (_("%1 [movie]"), path_summary ()); + if (video && audio) { + return String::compose (_("%1 [movie]"), path_summary ()); + } else if (video) { + return String::compose (_("%1 [video]"), path_summary ()); + } else if (audio) { + return String::compose (_("%1 [audio]"), path_summary ()); + } + + return path_summary (); } string @@ -262,12 +283,19 @@ FFmpegContent::technical_summary () const string filt = Filter::ffmpeg_string (_filters); - return Content::technical_summary() + " - " - + video->technical_summary() + " - " - + audio->technical_summary() + " - " - + String::compose ( - "ffmpeg: audio %1 subtitle %2 filters %3", as, ss, filt - ); + string s = Content::technical_summary (); + + if (video) { + s += " - " + video->technical_summary (); + } + + if (audio) { + s += " - " + audio->technical_summary (); + } + + return s + String::compose ( + "ffmpeg: audio %1 subtitle %2 filters %3", as, ss, filt + ); } void @@ -296,8 +324,13 @@ operator!= (FFmpegStream const & a, FFmpegStream const & b) DCPTime FFmpegContent::full_length () const { - FrameRateChange const frc (video->video_frame_rate (), film()->video_frame_rate ()); - return DCPTime::from_frames (llrint (video->video_length_after_3d_combine() * frc.factor()), film()->video_frame_rate()); + FrameRateChange const frc (active_video_frame_rate (), film()->video_frame_rate ()); + if (video) { + return DCPTime::from_frames (llrint (video->length_after_3d_combine() * frc.factor()), film()->video_frame_rate()); + } + + DCPOMATIC_ASSERT (audio); + return DCPTime::from_frames (llrint (audio->stream()->length() / frc.speed_up), audio->stream()->frame_rate()); } void @@ -316,9 +349,15 @@ FFmpegContent::identifier () const { SafeStringStream s; - s << Content::identifier() << "_" - << video->identifier() << "_" - << subtitle->identifier(); + s << Content::identifier(); + + if (video) { + s << "_" << video->identifier(); + } + + if (subtitle) { + s << "_" << subtitle->identifier(); + } boost::mutex::scoped_lock lm (_mutex); @@ -355,34 +394,10 @@ FFmpegContent::text_subtitles_during (ContentTimePeriod period, bool starting) c return stream->text_subtitles_during (period, starting); } -bool -FFmpegContent::has_image_subtitles () const -{ - BOOST_FOREACH (shared_ptr i, subtitle_streams()) { - if (i->has_image_subtitles()) { - return true; - } - } - - return false; -} - -bool -FFmpegContent::has_text_subtitles () const -{ - BOOST_FOREACH (shared_ptr i, subtitle_streams()) { - if (i->has_text_subtitles()) { - return true; - } - } - - return false; -} - void FFmpegContent::set_default_colour_conversion () { - dcp::Size const s = video->video_size (); + dcp::Size const s = video->size (); boost::mutex::scoped_lock lm (_mutex); @@ -393,16 +408,6 @@ FFmpegContent::set_default_colour_conversion () } } -vector -FFmpegContent::audio_streams () const -{ - boost::mutex::scoped_lock lm (_mutex); - - vector s; - copy (_audio_streams.begin(), _audio_streams.end(), back_inserter (s)); - return s; -} - void FFmpegContent::add_properties (list& p) const { @@ -533,10 +538,16 @@ FFmpegContent::signal_subtitle_stream_changed () signal_changed (FFmpegContentProperty::SUBTITLE_STREAM); } -void -FFmpegContent::changed (int property) +vector > +FFmpegContent::ffmpeg_audio_streams () const { - if (property == VideoContentProperty::VIDEO_FRAME_RATE && subtitle) { - subtitle->set_subtitle_video_frame_rate (video->video_frame_rate ()); + vector > fa; + + if (audio) { + BOOST_FOREACH (AudioStreamPtr i, audio->streams()) { + fa.push_back (dynamic_pointer_cast (i)); + } } + + return fa; }