From 3db1df492e1009ee28641cdc593a139df156e8d7 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 10 May 2016 15:06:19 +0100 Subject: [PATCH] Store audio length in AudioStream. --- src/lib/audio_stream.cc | 8 +++++--- src/lib/audio_stream.h | 13 ++++++++++--- src/lib/dcp_content.cc | 9 +++++++-- src/lib/ffmpeg_audio_stream.cc | 7 ++++++- src/lib/ffmpeg_audio_stream.h | 6 +++--- src/lib/ffmpeg_examiner.cc | 10 +++++++++- src/lib/sndfile_content.cc | 16 +++++++++------- src/lib/sndfile_content.h | 8 -------- test/audio_decoder_test.cc | 2 +- test/frame_rate_test.cc | 2 +- 10 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/lib/audio_stream.cc b/src/lib/audio_stream.cc index 2119d0834..8e260b346 100644 --- a/src/lib/audio_stream.cc +++ b/src/lib/audio_stream.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2015 Carl Hetherington + Copyright (C) 2015-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 @@ -21,14 +21,16 @@ #include "audio_mapping.h" #include "util.h" -AudioStream::AudioStream (int frame_rate, int channels) +AudioStream::AudioStream (int frame_rate, Frame length, int channels) : _frame_rate (frame_rate) + , _length (length) { _mapping = AudioMapping (channels, MAX_DCP_AUDIO_CHANNELS); } -AudioStream::AudioStream (int frame_rate, AudioMapping mapping) +AudioStream::AudioStream (int frame_rate, Frame length, AudioMapping mapping) : _frame_rate (frame_rate) + , _length (length) , _mapping (mapping) { diff --git a/src/lib/audio_stream.h b/src/lib/audio_stream.h index 8d05df268..bf7b284f8 100644 --- a/src/lib/audio_stream.h +++ b/src/lib/audio_stream.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015 Carl Hetherington + Copyright (C) 2015-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 @@ -21,6 +21,7 @@ #define DCPOMATIC_AUDIO_STREAM_H #include "audio_mapping.h" +#include "types.h" #include struct audio_sampling_rate_test; @@ -28,8 +29,8 @@ struct audio_sampling_rate_test; class AudioStream { public: - AudioStream (int frame_rate, int channels); - AudioStream (int frame_rate, AudioMapping mapping); + AudioStream (int frame_rate, Frame length, int channels); + AudioStream (int frame_rate, Frame length, AudioMapping mapping); virtual ~AudioStream () {} void set_mapping (AudioMapping mapping); @@ -44,6 +45,11 @@ public: return _frame_rate; } + Frame length () const { + boost::mutex::scoped_lock lm (_mutex); + return _length; + } + int channels () const; protected: @@ -54,6 +60,7 @@ private: friend struct player_time_calculation_test3; int _frame_rate; + Frame _length; AudioMapping _mapping; }; diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index dbd9bca8d..83374fc30 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -78,7 +78,11 @@ DCPContent::DCPContent (shared_ptr film, cxml::ConstNodePtr node, in audio->set_stream ( AudioStreamPtr ( - new AudioStream (node->number_child ("AudioFrameRate"), AudioMapping (node->node_child ("AudioMapping"), version)) + new AudioStream ( + node->number_child ("AudioFrameRate"), + node->number_child ("AudioLength"), + AudioMapping (node->node_child ("AudioMapping"), version) + ) ) ); @@ -121,7 +125,7 @@ DCPContent::examine (shared_ptr job) { boost::mutex::scoped_lock lm (_mutex); - AudioStreamPtr as (new AudioStream (examiner->audio_frame_rate(), examiner->audio_channels ())); + AudioStreamPtr as (new AudioStream (examiner->audio_frame_rate(), examiner->audio_length(), examiner->audio_channels())); audio->set_stream (as); AudioMapping m = as->mapping (); film()->make_audio_mapping_default (m); @@ -174,6 +178,7 @@ DCPContent::as_xml (xmlpp::Node* node) const if (audio) { audio->as_xml (node); node->add_child("AudioFrameRate")->add_child_text (raw_convert (audio->stream()->frame_rate())); + node->add_child("AudioLength")->add_child_text (raw_convert (audio->stream()->length())); audio->stream()->mapping().as_xml (node->add_child("AudioMapping")); } diff --git a/src/lib/ffmpeg_audio_stream.cc b/src/lib/ffmpeg_audio_stream.cc index d7fc7eaed..31cbe2609 100644 --- a/src/lib/ffmpeg_audio_stream.cc +++ b/src/lib/ffmpeg_audio_stream.cc @@ -27,7 +27,11 @@ using boost::optional; FFmpegAudioStream::FFmpegAudioStream (cxml::ConstNodePtr node, int version) : FFmpegStream (node) - , AudioStream (node->number_child ("FrameRate"), AudioMapping (node->node_child ("Mapping"), version)) + , AudioStream ( + node->number_child ("FrameRate"), + node->optional_number_child("Length").get_value_or (0), + AudioMapping (node->node_child ("Mapping"), version) + ) { optional const f = node->optional_number_child ("FirstAudio"); if (f) { @@ -40,6 +44,7 @@ FFmpegAudioStream::as_xml (xmlpp::Node* root) const { FFmpegStream::as_xml (root); root->add_child("FrameRate")->add_child_text (raw_convert (frame_rate ())); + root->add_child("Length")->add_child_text (raw_convert (length ())); mapping().as_xml (root->add_child("Mapping")); if (first_audio) { root->add_child("FirstAudio")->add_child_text (raw_convert (first_audio.get().get ())); diff --git a/src/lib/ffmpeg_audio_stream.h b/src/lib/ffmpeg_audio_stream.h index 5e782ac1a..8de43c632 100644 --- a/src/lib/ffmpeg_audio_stream.h +++ b/src/lib/ffmpeg_audio_stream.h @@ -26,9 +26,9 @@ struct ffmpeg_pts_offset_test; class FFmpegAudioStream : public FFmpegStream, public AudioStream { public: - FFmpegAudioStream (std::string name, int id, int frame_rate, int channels) + FFmpegAudioStream (std::string name, int id, int frame_rate, Frame length, int channels) : FFmpegStream (name, id) - , AudioStream (frame_rate, channels) + , AudioStream (frame_rate, length, channels) {} FFmpegAudioStream (cxml::ConstNodePtr, int); @@ -45,6 +45,6 @@ private: /* Constructor for tests */ FFmpegAudioStream () : FFmpegStream ("", 0) - , AudioStream (0, 0) + , AudioStream (0, 0, 0) {} }; diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index 44d6a87df..bf9bafbfa 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -61,9 +61,17 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr c, shared_ptrcodec->channel_layout = av_get_default_channel_layout (s->codec->channels); } + DCPOMATIC_ASSERT (_format_context->duration != AV_NOPTS_VALUE); + _audio_streams.push_back ( shared_ptr ( - new FFmpegAudioStream (audio_stream_name (s), s->id, s->codec->sample_rate, s->codec->channels) + new FFmpegAudioStream ( + audio_stream_name (s), + s->id, + s->codec->sample_rate, + (double (_format_context->duration) / AV_TIME_BASE) * s->codec->sample_rate, + s->codec->channels + ) ) ); diff --git a/src/lib/sndfile_content.cc b/src/lib/sndfile_content.cc index bf5f3af5b..81e467d1d 100644 --- a/src/lib/sndfile_content.cc +++ b/src/lib/sndfile_content.cc @@ -46,14 +46,18 @@ SndfileContent::SndfileContent (shared_ptr film, boost::filesystem:: SndfileContent::SndfileContent (shared_ptr film, cxml::ConstNodePtr node, int version) : Content (film, node) - , _audio_length (node->number_child ("AudioLength")) { audio = AudioContent::from_xml (this, film, node); if (audio) { audio->set_stream ( AudioStreamPtr ( - new AudioStream (node->number_child ("AudioFrameRate"), AudioMapping (node->node_child ("AudioMapping"), version))) + new AudioStream ( + node->number_child ("AudioFrameRate"), + node->number_child ("AudioLength"), + AudioMapping (node->node_child ("AudioMapping"), version) + ) + ) ); } } @@ -68,10 +72,9 @@ SndfileContent::as_xml (xmlpp::Node* node) const if (audio) { audio->as_xml (node); node->add_child("AudioFrameRate")->add_child_text (raw_convert (audio->stream()->frame_rate ())); + node->add_child("AudioLength")->add_child_text (raw_convert (audio->stream()->length ())); audio->stream()->mapping().as_xml (node->add_child("AudioMapping")); } - - node->add_child("AudioLength")->add_child_text (raw_convert (audio_length ())); } @@ -108,12 +111,11 @@ SndfileContent::examine (shared_ptr job) { boost::mutex::scoped_lock lm (_mutex); - AudioStreamPtr as (new AudioStream (ex->audio_frame_rate(), ex->audio_channels ())); + AudioStreamPtr as (new AudioStream (ex->audio_frame_rate(), ex->audio_length(), ex->audio_channels ())); audio->set_stream (as); AudioMapping m = as->mapping (); film()->make_audio_mapping_default (m); as->set_mapping (m); - _audio_length = ex->audio_length (); } signal_changed (AudioContentProperty::STREAMS); @@ -123,5 +125,5 @@ DCPTime SndfileContent::full_length () const { FrameRateChange const frc (active_video_frame_rate(), film()->video_frame_rate()); - return DCPTime::from_frames (audio_length() / frc.speed_up, audio->stream()->frame_rate ()); + return DCPTime::from_frames (audio->stream()->length() / frc.speed_up, audio->stream()->frame_rate ()); } diff --git a/src/lib/sndfile_content.h b/src/lib/sndfile_content.h index 73d02edec..cdb842c04 100644 --- a/src/lib/sndfile_content.h +++ b/src/lib/sndfile_content.h @@ -43,14 +43,6 @@ public: void as_xml (xmlpp::Node *) const; static bool valid_file (boost::filesystem::path); - -private: - Frame audio_length () const { - boost::mutex::scoped_lock lm (_mutex); - return _audio_length; - } - - Frame _audio_length; }; #endif diff --git a/test/audio_decoder_test.cc b/test/audio_decoder_test.cc index 73d515492..7dba67b5a 100644 --- a/test/audio_decoder_test.cc +++ b/test/audio_decoder_test.cc @@ -42,7 +42,7 @@ public: : Content (film) { audio.reset (new AudioContent (this, film)); - audio->set_stream (AudioStreamPtr (new AudioStream (48000, 2))); + audio->set_stream (AudioStreamPtr (new AudioStream (48000, audio_length(), 2))); } std::string summary () const { diff --git a/test/frame_rate_test.cc b/test/frame_rate_test.cc index 9c2e9ec3f..688464705 100644 --- a/test/frame_rate_test.cc +++ b/test/frame_rate_test.cc @@ -261,7 +261,7 @@ BOOST_AUTO_TEST_CASE (audio_sampling_rate_test) afr.push_back (30); Config::instance()->set_allowed_dcp_frame_rates (afr); - shared_ptr stream (new FFmpegAudioStream ("foo", 0, 0, 0)); + shared_ptr stream (new FFmpegAudioStream ("foo", 0, 0, 0, 0)); content->audio->add_stream (stream); content->_video_frame_rate = 24; film->set_video_frame_rate (24); -- 2.30.2