summaryrefslogtreecommitdiff
path: root/src/lib/decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-11-07 13:57:57 +0000
committerCarl Hetherington <cth@carlh.net>2012-11-07 13:57:57 +0000
commitf89ef49deefe91e2b1972b54ee07bfc22a22f303 (patch)
treea786f6141ce48811a355d24c1da00a09f985d6b3 /src/lib/decoder.cc
parent563de0fe1f15ca087abe45c2d259b02fcc5c0f81 (diff)
Move deinterleaving of audio into ffmpeg decoder.
Diffstat (limited to 'src/lib/decoder.cc')
-rw-r--r--src/lib/decoder.cc70
1 files changed, 3 insertions, 67 deletions
diff --git a/src/lib/decoder.cc b/src/lib/decoder.cc
index c9d8f063a..09788cd0c 100644
--- a/src/lib/decoder.cc
+++ b/src/lib/decoder.cc
@@ -154,77 +154,13 @@ Decoder::go ()
* @param size Number of bytes of data.
*/
void
-Decoder::process_audio (uint8_t* data, int size)
+Decoder::process_audio (shared_ptr<AudioBuffers> audio)
{
- /* XXX: could this be removed? */
- if (size == 0) {
- return;
- }
-
- assert (_film->audio_channels());
- assert (bytes_per_audio_sample());
-
- /* Deinterleave and convert to float */
-
- assert ((size % (bytes_per_audio_sample() * audio_channels())) == 0);
-
- int const total_samples = size / bytes_per_audio_sample();
- int const frames = total_samples / _film->audio_channels();
- shared_ptr<AudioBuffers> audio (new AudioBuffers (audio_channels(), frames));
-
- switch (audio_sample_format()) {
- case AV_SAMPLE_FMT_S16:
- {
- int16_t* p = (int16_t *) data;
- int sample = 0;
- int channel = 0;
- for (int i = 0; i < total_samples; ++i) {
- audio->data(channel)[sample] = float(*p++) / (1 << 15);
-
- ++channel;
- if (channel == _film->audio_channels()) {
- channel = 0;
- ++sample;
- }
- }
- }
- break;
-
- case AV_SAMPLE_FMT_S32:
- {
- int32_t* p = (int32_t *) data;
- int sample = 0;
- int channel = 0;
- for (int i = 0; i < total_samples; ++i) {
- audio->data(channel)[sample] = float(*p++) / (1 << 31);
-
- ++channel;
- if (channel == _film->audio_channels()) {
- channel = 0;
- ++sample;
- }
- }
- }
-
- case AV_SAMPLE_FMT_FLTP:
- {
- float* p = reinterpret_cast<float*> (data);
- for (int i = 0; i < _film->audio_channels(); ++i) {
- memcpy (audio->data(i), p, frames * sizeof(float));
- p += frames;
- }
- }
- break;
-
- default:
- assert (false);
- }
-
/* Maybe apply gain */
if (_film->audio_gain() != 0) {
float const linear_gain = pow (10, _film->audio_gain() / 20);
- for (int i = 0; i < _film->audio_channels(); ++i) {
- for (int j = 0; j < frames; ++j) {
+ for (int i = 0; i < audio->channels(); ++i) {
+ for (int j = 0; j < audio->frames(); ++j) {
audio->data(i)[j] *= linear_gain;
}
}