From 150f708d27b25d5b5d4e486d03c5bc4078027997 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 14 Apr 2016 03:28:38 +0100 Subject: [PATCH] Fix some confusions with FFmpeg audio streams. --- src/lib/ffmpeg_content.cc | 22 +++++++++++----------- src/lib/ffmpeg_content.h | 10 ++-------- test/ffmpeg_pts_offset_test.cc | 13 +++++++------ test/frame_rate_test.cc | 2 +- test/time_calculation_test.cc | 3 ++- 5 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index d9941685d..dfeb2a0ad 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -92,7 +92,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)); } } @@ -393,16 +393,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 { @@ -540,3 +530,13 @@ FFmpegContent::changed (int property) subtitle->set_video_frame_rate (video->frame_rate ()); } } + +vector > +FFmpegContent::ffmpeg_audio_streams () const +{ + vector > fa; + BOOST_FOREACH (AudioStreamPtr i, audio->streams()) { + fa.push_back (dynamic_pointer_cast (i)); + } + return fa; +} diff --git a/src/lib/ffmpeg_content.h b/src/lib/ffmpeg_content.h index f39414a61..de222b0de 100644 --- a/src/lib/ffmpeg_content.h +++ b/src/lib/ffmpeg_content.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2015 Carl Hetherington + Copyright (C) 2013-2016 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -63,8 +63,6 @@ public: void set_default_colour_conversion (); - std::vector audio_streams () const; - bool has_text_subtitles () const; bool has_image_subtitles () const; @@ -82,10 +80,7 @@ public: return _subtitle_stream; } - std::vector > ffmpeg_audio_streams () const { - boost::mutex::scoped_lock lm (_mutex); - return _audio_streams; - } + std::vector > ffmpeg_audio_streams () const; std::vector filters () const { boost::mutex::scoped_lock lm (_mutex); @@ -112,7 +107,6 @@ private: std::vector > _subtitle_streams; boost::shared_ptr _subtitle_stream; - std::vector > _audio_streams; boost::optional _first_video; /** Video filters that should be used when generating DCPs */ std::vector _filters; diff --git a/test/ffmpeg_pts_offset_test.cc b/test/ffmpeg_pts_offset_test.cc index 7e3cd9cfd..5b1821dae 100644 --- a/test/ffmpeg_pts_offset_test.cc +++ b/test/ffmpeg_pts_offset_test.cc @@ -26,6 +26,7 @@ #include "lib/ffmpeg_decoder.h" #include "lib/ffmpeg_content.h" #include "lib/ffmpeg_audio_stream.h" +#include "lib/audio_content.h" #include "test.h" using boost::shared_ptr; @@ -34,13 +35,13 @@ BOOST_AUTO_TEST_CASE (ffmpeg_pts_offset_test) { shared_ptr film = new_test_film ("ffmpeg_pts_offset_test"); shared_ptr content (new FFmpegContent (film, "test/data/test.mp4")); - content->_audio_streams.push_back (shared_ptr (new FFmpegAudioStream)); + content->audio->add_stream (shared_ptr (new FFmpegAudioStream)); content->video->_frame_rate = 24; { /* Sound == video so no offset required */ content->_first_video = ContentTime (); - content->_audio_streams.front()->first_audio = ContentTime (); + content->ffmpeg_audio_streams().front()->first_audio = ContentTime (); FFmpegDecoder decoder (content, film->log(), false); BOOST_CHECK_EQUAL (decoder._pts_offset, ContentTime ()); } @@ -48,7 +49,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_pts_offset_test) { /* Common offset should be removed */ content->_first_video = ContentTime::from_seconds (600); - content->_audio_streams.front()->first_audio = ContentTime::from_seconds (600); + content->ffmpeg_audio_streams().front()->first_audio = ContentTime::from_seconds (600); FFmpegDecoder decoder (content, film->log(), false); BOOST_CHECK_EQUAL (decoder._pts_offset, ContentTime::from_seconds (-600)); } @@ -56,7 +57,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_pts_offset_test) { /* Video is on a frame boundary */ content->_first_video = ContentTime::from_frames (1, 24); - content->_audio_streams.front()->first_audio = ContentTime (); + content->ffmpeg_audio_streams().front()->first_audio = ContentTime (); FFmpegDecoder decoder (content, film->log(), false); BOOST_CHECK_EQUAL (decoder._pts_offset, ContentTime ()); } @@ -65,7 +66,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_pts_offset_test) /* Video is off a frame boundary */ double const frame = 1.0 / 24.0; content->_first_video = ContentTime::from_seconds (frame + 0.0215); - content->_audio_streams.front()->first_audio = ContentTime (); + content->ffmpeg_audio_streams().front()->first_audio = ContentTime (); FFmpegDecoder decoder (content, film->log(), false); BOOST_CHECK_CLOSE (decoder._pts_offset.seconds(), (frame - 0.0215), 0.00001); } @@ -74,7 +75,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_pts_offset_test) /* Video is off a frame boundary and both have a common offset */ double const frame = 1.0 / 24.0; content->_first_video = ContentTime::from_seconds (frame + 0.0215 + 4.1); - content->_audio_streams.front()->first_audio = ContentTime::from_seconds (4.1); + content->ffmpeg_audio_streams().front()->first_audio = ContentTime::from_seconds (4.1); FFmpegDecoder decoder (content, film->log(), false); BOOST_CHECK_CLOSE (decoder._pts_offset.seconds(), (frame - 0.0215) - 4.1, 0.1); } diff --git a/test/frame_rate_test.cc b/test/frame_rate_test.cc index 68a6ffa2d..35cd5523a 100644 --- a/test/frame_rate_test.cc +++ b/test/frame_rate_test.cc @@ -262,7 +262,7 @@ BOOST_AUTO_TEST_CASE (audio_sampling_rate_test) Config::instance()->set_allowed_dcp_frame_rates (afr); shared_ptr stream (new FFmpegAudioStream ("foo", 0, 0, 0)); - content->_audio_streams.push_back (stream); + content->audio->add_stream (stream); content->video->_frame_rate = 24; film->set_video_frame_rate (24); stream->_frame_rate = 48000; diff --git a/test/time_calculation_test.cc b/test/time_calculation_test.cc index 353a97dd0..7f13e6c0e 100644 --- a/test/time_calculation_test.cc +++ b/test/time_calculation_test.cc @@ -21,6 +21,7 @@ #include "lib/ffmpeg_content.h" #include "lib/video_content.h" #include "lib/player.h" +#include "lib/audio_content.h" #include "test.h" #include @@ -534,7 +535,7 @@ BOOST_AUTO_TEST_CASE (player_time_calculation_test3) list notes; shared_ptr content (new FFmpegContent (film, doc, film->state_version(), notes)); - AudioStreamPtr stream = content->audio_streams().front(); + AudioStreamPtr stream = content->audio->streams().front(); film->set_sequence (false); film->add_content (content); -- 2.30.2