summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-05-24 22:00:53 +0100
committerCarl Hetherington <cth@carlh.net>2013-05-24 22:00:53 +0100
commit4f03da3aa12525cb8389ddefee629f5d0b2ac0aa (patch)
tree0552aa98738c47c9328c4b86adad7348607ea8a4 /src/lib
parent5b44e42b4a90331c88b15ed02a7f3d333690b9eb (diff)
Partial addition of DCP audio channel count to Film.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/analyse_audio_job.cc4
-rw-r--r--src/lib/audio_buffers.cc19
-rw-r--r--src/lib/audio_buffers.h3
-rw-r--r--src/lib/audio_decoder.cc16
-rw-r--r--src/lib/film.cc17
-rw-r--r--src/lib/film.h7
-rw-r--r--src/lib/null_content.cc9
-rw-r--r--src/lib/null_content.h4
-rw-r--r--src/lib/player.cc11
-rw-r--r--src/lib/silence_decoder.cc2
-rw-r--r--src/lib/writer.cc2
11 files changed, 66 insertions, 28 deletions
diff --git a/src/lib/analyse_audio_job.cc b/src/lib/analyse_audio_job.cc
index 13cab1a46..3a44a408f 100644
--- a/src/lib/analyse_audio_job.cc
+++ b/src/lib/analyse_audio_job.cc
@@ -57,8 +57,8 @@ AnalyseAudioJob::run ()
_samples_per_point = max (int64_t (1), _film->time_to_audio_frames (_film->length()) / _num_points);
- _current.resize (MAX_AUDIO_CHANNELS);
- _analysis.reset (new AudioAnalysis (MAX_AUDIO_CHANNELS));
+ _current.resize (_film->dcp_audio_channels ());
+ _analysis.reset (new AudioAnalysis (_film->dcp_audio_channels ()));
_done = 0;
while (player->pass ()) {
diff --git a/src/lib/audio_buffers.cc b/src/lib/audio_buffers.cc
index cd8fcd35b..c3e89f130 100644
--- a/src/lib/audio_buffers.cc
+++ b/src/lib/audio_buffers.cc
@@ -193,7 +193,7 @@ AudioBuffers::move (int from, int to, int frames)
/** Add data from from `from', `from_channel' to our channel `to_channel' */
void
-AudioBuffers::accumulate (AudioBuffers const * from, int from_channel, int to_channel)
+AudioBuffers::accumulate_channel (AudioBuffers const * from, int from_channel, int to_channel)
{
int const N = frames ();
assert (from->frames() == N);
@@ -214,9 +214,24 @@ AudioBuffers::ensure_size (int frames)
}
for (int i = 0; i < _channels; ++i) {
- _data[i] = static_cast<float*> (realloc (_data[i], _frames * sizeof (float)));
+ _data[i] = static_cast<float*> (realloc (_data[i], frames * sizeof (float)));
if (!_data[i]) {
throw bad_alloc ();
}
}
+
+ _allocated_frames = frames;
+}
+
+void
+AudioBuffers::accumulate_frames (AudioBuffers const * from, int read_offset, int write_offset, int frames)
+{
+ assert (_channels == from->channels ());
+
+ for (int i = 0; i < _channels; ++i) {
+ for (int j = 0; j < frames; ++j) {
+ _data[i][j + write_offset] += from->data()[i][j + read_offset];
+ }
+ }
}
+
diff --git a/src/lib/audio_buffers.h b/src/lib/audio_buffers.h
index 5e7b9fda4..47b8145a1 100644
--- a/src/lib/audio_buffers.h
+++ b/src/lib/audio_buffers.h
@@ -53,7 +53,8 @@ public:
void copy_from (AudioBuffers const * from, int frames_to_copy, int read_offset, int write_offset);
void move (int from, int to, int frames);
- void accumulate (AudioBuffers const *, int, int);
+ void accumulate_channel (AudioBuffers const *, int, int);
+ void accumulate_frames (AudioBuffers const *, int read_offset, int write_offset, int frames);
private:
/** Number of channels */
diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc
index 6712e0624..8950e1546 100644
--- a/src/lib/audio_decoder.cc
+++ b/src/lib/audio_decoder.cc
@@ -112,8 +112,6 @@ AudioDecoder::process_end ()
void
AudioDecoder::audio (shared_ptr<const AudioBuffers> data, Time time)
{
- /* XXX: map audio to 5.1 */
-
/* Maybe resample */
if (_swr_context) {
@@ -122,7 +120,7 @@ AudioDecoder::audio (shared_ptr<const AudioBuffers> data, Time time)
(int64_t) data->frames() * _audio_content->output_audio_frame_rate() / _audio_content->content_audio_frame_rate()
) + 32;
- shared_ptr<AudioBuffers> resampled (new AudioBuffers (MAX_AUDIO_CHANNELS, max_resampled_frames));
+ shared_ptr<AudioBuffers> resampled (new AudioBuffers (data->channels(), max_resampled_frames));
/* Resample audio */
int const resampled_frames = swr_convert (
@@ -139,10 +137,18 @@ AudioDecoder::audio (shared_ptr<const AudioBuffers> data, Time time)
data = resampled;
}
- Audio (data, time);
-
shared_ptr<const Film> film = _film.lock ();
assert (film);
+
+ /* Remap channels */
+ shared_ptr<AudioBuffers> dcp_mapped (film->dcp_audio_channels(), data->frames());
+ dcp_mapped->make_silent ();
+ list<pair<int, libdcp::Channel> > map = _audio_content->audio_mapping().content_to_dcp ();
+ for (list<pair<int, libdcp::Channel> >::iterator i = map.begin(); i != map.end(); ++i) {
+ dcp_mapped->accumulate (data, i->first, i->second);
+ }
+
+ Audio (dcp_mapped, time);
_next_audio = time + film->audio_frames_to_time (data->frames());
}
diff --git a/src/lib/film.cc b/src/lib/film.cc
index 9103024ab..a61a0d53d 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -102,6 +102,7 @@ Film::Film (string d)
, _j2k_bandwidth (200000000)
, _dci_metadata (Config::instance()->default_dci_metadata ())
, _dcp_video_frame_rate (0)
+ , _dcp_audio_channels (MAX_AUDIO_CHANNELS)
, _dirty (false)
{
set_dci_date_today ();
@@ -172,7 +173,7 @@ Film::video_state_identifier () const
<< "_" << f.first << "_" << f.second
<< "_" << scaler()->id()
<< "_" << j2k_bandwidth()
- << "_" << boost::lexical_cast<int> (colour_lut());
+ << "_" << lexical_cast<int> (colour_lut());
if (ab()) {
pair<string, string> fa = Filter::ffmpeg_strings (Config::instance()->reference_filters());
@@ -382,7 +383,7 @@ Film::write_metadata () const
xmlpp::Document doc;
xmlpp::Element* root = doc.create_root_node ("Metadata");
- root->add_child("Version")->add_child_text (boost::lexical_cast<string> (state_version));
+ root->add_child("Version")->add_child_text (lexical_cast<string> (state_version));
root->add_child("Name")->add_child_text (_name);
root->add_child("UseDCIName")->add_child_text (_use_dci_name ? "1" : "0");
@@ -401,13 +402,14 @@ Film::write_metadata () const
root->add_child("Scaler")->add_child_text (_scaler->id ());
root->add_child("AB")->add_child_text (_ab ? "1" : "0");
root->add_child("WithSubtitles")->add_child_text (_with_subtitles ? "1" : "0");
- root->add_child("SubtitleOffset")->add_child_text (boost::lexical_cast<string> (_subtitle_offset));
- root->add_child("SubtitleScale")->add_child_text (boost::lexical_cast<string> (_subtitle_scale));
- root->add_child("ColourLUT")->add_child_text (boost::lexical_cast<string> (_colour_lut));
- root->add_child("J2KBandwidth")->add_child_text (boost::lexical_cast<string> (_j2k_bandwidth));
+ root->add_child("SubtitleOffset")->add_child_text (lexical_cast<string> (_subtitle_offset));
+ root->add_child("SubtitleScale")->add_child_text (lexical_cast<string> (_subtitle_scale));
+ root->add_child("ColourLUT")->add_child_text (lexical_cast<string> (_colour_lut));
+ root->add_child("J2KBandwidth")->add_child_text (lexical_cast<string> (_j2k_bandwidth));
_dci_metadata.as_xml (root->add_child ("DCIMetadata"));
- root->add_child("DCPVideoFrameRate")->add_child_text (boost::lexical_cast<string> (_dcp_video_frame_rate));
+ root->add_child("DCPVideoFrameRate")->add_child_text (lexical_cast<string> (_dcp_video_frame_rate));
root->add_child("DCIDate")->add_child_text (boost::gregorian::to_iso_string (_dci_date));
+ root->add_child("DCPAudioChannels")->add_child_text (lexical_cast<string> (_dcp_audio_channels));
_playlist->as_xml (root->add_child ("Playlist"));
doc.write_to_file_formatted (file ("metadata.xml"));
@@ -462,6 +464,7 @@ Film::read_metadata ()
_dci_metadata = DCIMetadata (f.node_child ("DCIMetadata"));
_dcp_video_frame_rate = f.number_child<int> ("DCPVideoFrameRate");
_dci_date = boost::gregorian::from_undelimited_string (f.string_child ("DCIDate"));
+ _dcp_audio_channels = f.number_child<int> ("DCPAudioChannels");
_playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"));
diff --git a/src/lib/film.h b/src/lib/film.h
index b8d4ee40e..f0ccd99e7 100644
--- a/src/lib/film.h
+++ b/src/lib/film.h
@@ -103,6 +103,7 @@ public:
boost::shared_ptr<Playlist> playlist () const;
OutputAudioFrame dcp_audio_frame_rate () const;
+ int dcp_audio_channels () const;
OutputAudioFrame time_to_audio_frames (Time) const;
OutputVideoFrame time_to_video_frames (Time) const;
@@ -223,6 +224,11 @@ public:
return _dcp_video_frame_rate;
}
+ int dcp_audio_channels () const {
+ boost::mutex::scoped_lock lm (_state_mutex);
+ return _dcp_audio_channels;
+ }
+
/* SET */
void set_directory (std::string);
@@ -315,6 +321,7 @@ private:
int _dcp_video_frame_rate;
/** The date that we should use in a DCI name */
boost::gregorian::date _dci_date;
+ int _dcp_audio_channels;
/** true if our state has changed since we last saved it */
mutable bool _dirty;
diff --git a/src/lib/null_content.cc b/src/lib/null_content.cc
index 0084972c2..3bbda92da 100644
--- a/src/lib/null_content.cc
+++ b/src/lib/null_content.cc
@@ -46,3 +46,12 @@ NullContent::output_audio_frame_rate () const
assert (film);
return film->dcp_audio_frame_rate ();
}
+
+int
+NullContent::audio_channels () const
+{
+ shared_ptr<const Film> film = _film.lock ();
+ assert (film);
+ return film->dcp_audio_channels ();
+}
+
diff --git a/src/lib/null_content.h b/src/lib/null_content.h
index d4a3b7371..f8829658c 100644
--- a/src/lib/null_content.h
+++ b/src/lib/null_content.h
@@ -41,9 +41,7 @@ public:
return boost::shared_ptr<Content> ();
}
- int audio_channels () const {
- return MAX_AUDIO_CHANNELS;
- }
+ int audio_channels () const;
ContentAudioFrame audio_length () const {
return _audio_length;
diff --git a/src/lib/player.cc b/src/lib/player.cc
index d3886721b..032b3d49b 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -62,7 +62,7 @@ Player::Player (shared_ptr<const Film> f, shared_ptr<const Playlist> p)
, _subtitles (true)
, _have_valid_pieces (false)
, _position (0)
- , _audio_buffers (MAX_AUDIO_CHANNELS, 0)
+ , _audio_buffers (f->dcp_audio_channels(), 0)
, _next_audio (0)
{
_playlist->Changed.connect (bind (&Player::playlist_changed, this));
@@ -164,8 +164,6 @@ Player::process_audio (weak_ptr<Content> weak_content, shared_ptr<const AudioBuf
return;
}
- /* XXX: mapping */
-
/* The time of this audio may indicate that some of our buffered audio is not going to
be added to any more, so it can be emitted.
*/
@@ -174,7 +172,8 @@ Player::process_audio (weak_ptr<Content> weak_content, shared_ptr<const AudioBuf
if (time > _next_audio) {
/* We can emit some audio from our buffers */
- OutputAudioFrame const N = min (_film->time_to_audio_frames (time - _next_audio), static_cast<OutputAudioFrame> (_audio_buffers.frames()));
+ assert (_film->time_to_audio_frames (time - _next_audio) <= _audio_buffers.frames());
+ OutputAudioFrame const N = _film->time_to_audio_frames (time - _next_audio);
shared_ptr<AudioBuffers> emit (new AudioBuffers (_audio_buffers.channels(), N));
emit->copy_from (&_audio_buffers, N, 0, 0);
Audio (emit, _next_audio);
@@ -188,8 +187,8 @@ Player::process_audio (weak_ptr<Content> weak_content, shared_ptr<const AudioBuf
}
/* Now accumulate the new audio into our buffers */
- _audio_buffers.ensure_size (time - _next_audio + audio->frames());
- _audio_buffers.accumulate (audio.get(), 0, _film->time_to_audio_frames (time - _next_audio));
+ _audio_buffers.ensure_size (_audio_buffers.frames() + audio->frames());
+ _audio_buffers.accumulate_frames (audio, 0, 0, audio->frames ());
}
/** @return true on error */
diff --git a/src/lib/silence_decoder.cc b/src/lib/silence_decoder.cc
index e787262f5..6cf91b41f 100644
--- a/src/lib/silence_decoder.cc
+++ b/src/lib/silence_decoder.cc
@@ -38,7 +38,7 @@ SilenceDecoder::pass ()
assert (film);
Time const this_time = min (_audio_content->length() - _next_audio, TIME_HZ / 2);
- shared_ptr<AudioBuffers> data (new AudioBuffers (MAX_AUDIO_CHANNELS, film->time_to_audio_frames (this_time)));
+ shared_ptr<AudioBuffers> data (new AudioBuffers (film->dcp_audio_channels(), film->time_to_audio_frames (this_time)));
data->make_silent ();
audio (data, _next_audio);
}
diff --git a/src/lib/writer.cc b/src/lib/writer.cc
index aef7230dd..39b9b9304 100644
--- a/src/lib/writer.cc
+++ b/src/lib/writer.cc
@@ -87,7 +87,7 @@ Writer::Writer (shared_ptr<Film> f, shared_ptr<Job> j)
_film->dir (_film->dcp_name()),
_film->dcp_audio_mxf_filename (),
_film->dcp_video_frame_rate (),
- MAX_AUDIO_CHANNELS,
+ _film->dcp_audio_channels (),
_film->dcp_audio_frame_rate()
)
);