diff options
| author | Carl Hetherington <cth@carlh.net> | 2016-05-10 15:06:19 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2016-05-18 11:50:29 +0100 |
| commit | 3db1df492e1009ee28641cdc593a139df156e8d7 (patch) | |
| tree | 7d86e74117a701515f381ee707d7699acab7b2dc /src/lib | |
| parent | 4fe27489ad67267081d048b45a4df9ee37541fde (diff) | |
Store audio length in AudioStream.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/audio_stream.cc | 8 | ||||
| -rw-r--r-- | src/lib/audio_stream.h | 13 | ||||
| -rw-r--r-- | src/lib/dcp_content.cc | 9 | ||||
| -rw-r--r-- | src/lib/ffmpeg_audio_stream.cc | 7 | ||||
| -rw-r--r-- | src/lib/ffmpeg_audio_stream.h | 6 | ||||
| -rw-r--r-- | src/lib/ffmpeg_examiner.cc | 10 | ||||
| -rw-r--r-- | src/lib/sndfile_content.cc | 16 | ||||
| -rw-r--r-- | src/lib/sndfile_content.h | 8 |
8 files changed, 49 insertions, 28 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 <cth@carlh.net> + Copyright (C) 2015-2016 Carl Hetherington <cth@carlh.net> 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 <cth@carlh.net> + Copyright (C) 2015-2016 Carl Hetherington <cth@carlh.net> 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 <boost/thread/mutex.hpp> 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<const Film> film, cxml::ConstNodePtr node, in audio->set_stream ( AudioStreamPtr ( - new AudioStream (node->number_child<int> ("AudioFrameRate"), AudioMapping (node->node_child ("AudioMapping"), version)) + new AudioStream ( + node->number_child<int> ("AudioFrameRate"), + node->number_child<Frame> ("AudioLength"), + AudioMapping (node->node_child ("AudioMapping"), version) + ) ) ); @@ -121,7 +125,7 @@ DCPContent::examine (shared_ptr<Job> 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<string> (audio->stream()->frame_rate())); + node->add_child("AudioLength")->add_child_text (raw_convert<string> (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<int> ("FrameRate"), AudioMapping (node->node_child ("Mapping"), version)) + , AudioStream ( + node->number_child<int> ("FrameRate"), + node->optional_number_child<Frame>("Length").get_value_or (0), + AudioMapping (node->node_child ("Mapping"), version) + ) { optional<ContentTime::Type> const f = node->optional_number_child<ContentTime::Type> ("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<string> (frame_rate ())); + root->add_child("Length")->add_child_text (raw_convert<string> (length ())); mapping().as_xml (root->add_child("Mapping")); if (first_audio) { root->add_child("FirstAudio")->add_child_text (raw_convert<string> (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<const FFmpegContent> c, shared_ptr<Jo s->codec->channel_layout = av_get_default_channel_layout (s->codec->channels); } + DCPOMATIC_ASSERT (_format_context->duration != AV_NOPTS_VALUE); + _audio_streams.push_back ( shared_ptr<FFmpegAudioStream> ( - 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<const Film> film, boost::filesystem:: SndfileContent::SndfileContent (shared_ptr<const Film> film, cxml::ConstNodePtr node, int version) : Content (film, node) - , _audio_length (node->number_child<Frame> ("AudioLength")) { audio = AudioContent::from_xml (this, film, node); if (audio) { audio->set_stream ( AudioStreamPtr ( - new AudioStream (node->number_child<int> ("AudioFrameRate"), AudioMapping (node->node_child ("AudioMapping"), version))) + new AudioStream ( + node->number_child<int> ("AudioFrameRate"), + node->number_child<Frame> ("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<string> (audio->stream()->frame_rate ())); + node->add_child("AudioLength")->add_child_text (raw_convert<string> (audio->stream()->length ())); audio->stream()->mapping().as_xml (node->add_child("AudioMapping")); } - - node->add_child("AudioLength")->add_child_text (raw_convert<string> (audio_length ())); } @@ -108,12 +111,11 @@ SndfileContent::examine (shared_ptr<Job> 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 |
