X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fffmpeg_content.cc;h=a3a1cfb0fd491da77b0b2ac23b6964fb75983309;hp=c7a15619dd0e12d6c4eed919af2567d03932467d;hb=f0c10e92b849566e458bc323f8783a6fe83e52d2;hpb=a60428e8a618c648fccab0d9c115f1d2a3dea2d2 diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index c7a15619d..a3a1cfb0f 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -45,8 +45,6 @@ extern "C" { #include "i18n.h" -#define LOG_GENERAL(...) film->log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_GENERAL); - using std::string; using std::vector; using std::list; @@ -63,8 +61,8 @@ int const FFmpegContentProperty::SUBTITLE_STREAMS = 100; int const FFmpegContentProperty::SUBTITLE_STREAM = 101; int const FFmpegContentProperty::FILTERS = 102; -FFmpegContent::FFmpegContent (shared_ptr film, boost::filesystem::path p) - : Content (film, p) +FFmpegContent::FFmpegContent (boost::filesystem::path p) + : Content (p) , _encrypted (false) { @@ -81,8 +79,8 @@ get_optional_enum (cxml::ConstNodePtr node, string name) return static_cast(*v); } -FFmpegContent::FFmpegContent (shared_ptr film, cxml::ConstNodePtr node, int version, list& notes) - : Content (film, node) +FFmpegContent::FFmpegContent (cxml::ConstNodePtr node, int version, list& notes) + : Content (node) { video = VideoContent::from_xml (this, node, version); audio = AudioContent::from_xml (this, node, version); @@ -130,8 +128,8 @@ FFmpegContent::FFmpegContent (shared_ptr film, cxml::ConstNodePtr no _encrypted = node->optional_bool_child("Encrypted").get_value_or(false); } -FFmpegContent::FFmpegContent (shared_ptr film, vector > c) - : Content (film, c) +FFmpegContent::FFmpegContent (vector > c) + : Content (c) { vector >::const_iterator i = c.begin (); @@ -258,14 +256,14 @@ FFmpegContent::as_xml (xmlpp::Node* node, bool with_paths) const } void -FFmpegContent::examine (shared_ptr job) +FFmpegContent::examine (shared_ptr film, shared_ptr job) { ChangeSignaller cc1 (this, FFmpegContentProperty::SUBTITLE_STREAMS); ChangeSignaller cc2 (this, FFmpegContentProperty::SUBTITLE_STREAM); job->set_progress_unknown (); - Content::examine (job); + Content::examine (film, job); shared_ptr examiner (new FFmpegExaminer (shared_from_this (), job)); @@ -309,7 +307,7 @@ FFmpegContent::examine (shared_ptr job) AudioStreamPtr as = audio->streams().front(); AudioMapping m = as->mapping (); - film()->make_audio_mapping_default (m, first_path); + m.make_default (film ? film->audio_processor() : 0, first_path); as->set_mapping (m); } @@ -400,21 +398,41 @@ operator!= (FFmpegStream const & a, FFmpegStream const & b) } DCPTime -FFmpegContent::full_length () const +FFmpegContent::full_length (shared_ptr film) const +{ + FrameRateChange const frc (film, shared_from_this()); + if (video) { + return DCPTime::from_frames (llrint (video->length_after_3d_combine() * frc.factor()), film->video_frame_rate()); + } + + if (audio) { + DCPTime longest; + BOOST_FOREACH (AudioStreamPtr i, audio->streams()) { + longest = max (longest, DCPTime::from_frames(llrint(i->length() / frc.speed_up), i->frame_rate())); + } + return longest; + } + + /* XXX: subtitle content? */ + + return DCPTime(); +} + +DCPTime +FFmpegContent::approximate_length () const { - 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()); + return DCPTime::from_frames (video->length_after_3d_combine(), 24); } DCPOMATIC_ASSERT (audio); - DCPTime longest; + Frame longest = 0; BOOST_FOREACH (AudioStreamPtr i, audio->streams ()) { - longest = max (longest, DCPTime::from_frames (llrint (i->length() / frc.speed_up), i->frame_rate())); + longest = max (longest, Frame(llrint(i->length()))); } - return longest; + return DCPTime::from_frames (longest, 24); } void @@ -490,9 +508,9 @@ FFmpegContent::set_default_colour_conversion () } void -FFmpegContent::add_properties (list& p) const +FFmpegContent::add_properties (shared_ptr film, list& p) const { - Content::add_properties (p); + Content::add_properties (film, p); if (video) { video->add_properties (p); @@ -627,7 +645,7 @@ FFmpegContent::add_properties (list& p) const } if (audio) { - audio->add_properties (p); + audio->add_properties (film, p); } }