summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2016-05-10 15:06:19 +0100
committerCarl Hetherington <cth@carlh.net>2016-05-18 11:50:29 +0100
commit3db1df492e1009ee28641cdc593a139df156e8d7 (patch)
tree7d86e74117a701515f381ee707d7699acab7b2dc /src/lib
parent4fe27489ad67267081d048b45a4df9ee37541fde (diff)
Store audio length in AudioStream.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/audio_stream.cc8
-rw-r--r--src/lib/audio_stream.h13
-rw-r--r--src/lib/dcp_content.cc9
-rw-r--r--src/lib/ffmpeg_audio_stream.cc7
-rw-r--r--src/lib/ffmpeg_audio_stream.h6
-rw-r--r--src/lib/ffmpeg_examiner.cc10
-rw-r--r--src/lib/sndfile_content.cc16
-rw-r--r--src/lib/sndfile_content.h8
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