summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2022-03-30 22:59:05 +0200
committerCarl Hetherington <cth@carlh.net>2022-04-02 22:27:11 +0200
commitd1a436bea5981167b810c8849e7409ac9fbc9d83 (patch)
tree6879ae51af7b5c256ace16e9064e215e8a460287 /src
parentee9b12e6874c02baa9bde19bebe3f9223667ef8c (diff)
Fix writing of planar audio to export buffers in some cases (#2223).
Previously we did not take into account alignment padding that can exist with FLTP samples; each channel's block of samples can have a gap between. This doesn't happen with the normal 1024 sample blocks; only when flushing at the end, when we write shorter blocks. Not doing this right meant that we were passing uninitialised memory to aacenc which sometimes responded by returning an EINVAL due to one of its internal calculations returning a NaN.
Diffstat (limited to 'src')
-rw-r--r--src/lib/ffmpeg_file_encoder.cc7
1 files changed, 3 insertions, 4 deletions
diff --git a/src/lib/ffmpeg_file_encoder.cc b/src/lib/ffmpeg_file_encoder.cc
index f9443b256..57103abc7 100644
--- a/src/lib/ffmpeg_file_encoder.cc
+++ b/src/lib/ffmpeg_file_encoder.cc
@@ -134,7 +134,8 @@ public:
auto frame = av_frame_alloc ();
DCPOMATIC_ASSERT (frame);
- int const buffer_size = av_samples_get_buffer_size (0, channels, size, _codec_context->sample_fmt, 0);
+ int line_size;
+ int const buffer_size = av_samples_get_buffer_size (&line_size, channels, size, _codec_context->sample_fmt, 0);
DCPOMATIC_ASSERT (buffer_size >= 0);
auto samples = av_malloc (buffer_size);
@@ -169,10 +170,8 @@ public:
}
case AV_SAMPLE_FMT_FLTP:
{
- float* q = reinterpret_cast<float*> (samples);
for (int i = 0; i < channels; ++i) {
- memcpy (q, data[i + channel_offset], sizeof(float) * size);
- q += size;
+ memcpy (reinterpret_cast<float*>(static_cast<uint8_t*>(samples) + i * line_size), data[i + channel_offset], sizeof(float) * size);
}
break;
}