X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_content.cc;h=ebe11748a036ac9152bbd7f6c06e37d564a197a8;hb=3828baf56467224f5d44049bf1e7a7ed11f43a05;hp=bb9795f25d0909a138b2fb46c58deab3d3cf01c5;hpb=9423e02c37daba7f9e406929a1cfc1bb10fb4b62;p=dcpomatic.git diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index bb9795f25..ebe11748a 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -1,19 +1,20 @@ /* Copyright (C) 2013-2016 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ @@ -70,9 +71,9 @@ FFmpegContent::FFmpegContent (shared_ptr film, boost::filesystem::pa FFmpegContent::FFmpegContent (shared_ptr film, cxml::ConstNodePtr node, int version, list& notes) : Content (film, node) { - video = VideoContent::from_xml (this, film, node, version); - audio = AudioContent::from_xml (this, film, node); - subtitle = SubtitleContent::from_xml (this, film, node, version); + video = VideoContent::from_xml (this, node, version); + audio = AudioContent::from_xml (this, node); + subtitle = SubtitleContent::from_xml (this, node, version); list c = node->node_children ("SubtitleStream"); for (list::const_iterator i = c.begin(); i != c.end(); ++i) { @@ -120,9 +121,9 @@ FFmpegContent::FFmpegContent (shared_ptr film, cxml::ConstNodePtr no FFmpegContent::FFmpegContent (shared_ptr film, vector > c) : Content (film, c) { - video.reset (new VideoContent (this, film, c)); - audio.reset (new AudioContent (this, film, c)); - subtitle.reset (new SubtitleContent (this, film, c)); + video.reset (new VideoContent (this, c)); + audio.reset (new AudioContent (this, c)); + subtitle.reset (new SubtitleContent (this, c)); shared_ptr ref = dynamic_pointer_cast (c[0]); DCPOMATIC_ASSERT (ref); @@ -159,6 +160,12 @@ FFmpegContent::as_xml (xmlpp::Node* node) const if (audio) { audio->as_xml (node); + + BOOST_FOREACH (AudioStreamPtr i, audio->streams ()) { + shared_ptr f = dynamic_pointer_cast (i); + DCPOMATIC_ASSERT (f); + f->as_xml (node->add_child("AudioStream")); + } } if (subtitle) { @@ -175,12 +182,6 @@ FFmpegContent::as_xml (xmlpp::Node* node) const (*i)->as_xml (t); } - BOOST_FOREACH (AudioStreamPtr i, audio->streams ()) { - shared_ptr f = dynamic_pointer_cast (i); - DCPOMATIC_ASSERT (f); - f->as_xml (node->add_child("AudioStream")); - } - for (vector::const_iterator i = _filters.begin(); i != _filters.end(); ++i) { node->add_child("Filter")->add_child_text ((*i)->id ()); } @@ -208,7 +209,7 @@ FFmpegContent::examine (shared_ptr job) shared_ptr examiner (new FFmpegExaminer (shared_from_this (), job)); if (examiner->has_video ()) { - video.reset (new VideoContent (this, film ())); + video.reset (new VideoContent (this)); video->take_from_examiner (examiner); set_default_colour_conversion (); } @@ -226,7 +227,7 @@ FFmpegContent::examine (shared_ptr job) } if (!examiner->audio_streams().empty ()) { - audio.reset (new AudioContent (this, film ())); + audio.reset (new AudioContent (this)); BOOST_FOREACH (shared_ptr i, examiner->audio_streams ()) { audio->add_stream (i); @@ -240,7 +241,7 @@ FFmpegContent::examine (shared_ptr job) _subtitle_streams = examiner->subtitle_streams (); if (!_subtitle_streams.empty ()) { - subtitle.reset (new SubtitleContent (this, film ())); + subtitle.reset (new SubtitleContent (this)); _subtitle_stream = _subtitle_streams.front (); } @@ -253,8 +254,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 @@ -276,12 +284,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 @@ -311,7 +326,12 @@ DCPTime FFmpegContent::full_length () const { FrameRateChange const frc (active_video_frame_rate (), film()->video_frame_rate ()); - return DCPTime::from_frames (llrint (video->length_after_3d_combine() * frc.factor()), 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 @@ -330,9 +350,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); @@ -453,7 +479,7 @@ FFmpegContent::add_properties (list& p) const _("SMPTE ST 428-1 (CIE 1931 XYZ)") }; - DCPOMATIC_ASSERT (AVCOL_PRI_NB == 11); + DCPOMATIC_ASSERT (AVCOL_PRI_NB <= 11); p.push_back (UserProperty (_("Video"), _("Colour primaries"), primaries[_color_primaries])); char const * transfers[] = { @@ -477,7 +503,7 @@ FFmpegContent::add_properties (list& p) const _("SMPTE ST 428-1") }; - DCPOMATIC_ASSERT (AVCOL_TRC_NB == 18); + DCPOMATIC_ASSERT (AVCOL_TRC_NB <= 18); p.push_back (UserProperty (_("Video"), _("Colour transfer characteristic"), transfers[_color_trc])); char const * spaces[] = { @@ -517,8 +543,12 @@ vector > FFmpegContent::ffmpeg_audio_streams () const { vector > fa; - BOOST_FOREACH (AudioStreamPtr i, audio->streams()) { - fa.push_back (dynamic_pointer_cast (i)); + + if (audio) { + BOOST_FOREACH (AudioStreamPtr i, audio->streams()) { + fa.push_back (dynamic_pointer_cast (i)); + } } + return fa; }