summaryrefslogtreecommitdiff
path: root/src/lib/ffmpeg_file_encoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2022-03-30 22:59:05 +0200
committerCarl Hetherington <cth@carlh.net>2022-03-30 22:59:05 +0200
commitbd5c164496bcb86c41ae8ac42241a652ee3a1b14 (patch)
tree01a4bfc802bc0084244346497f8d4c6ae30acd83 /src/lib/ffmpeg_file_encoder.cc
parent0e6dc8bedbb7d6b621f24a864403240973322677 (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/lib/ffmpeg_file_encoder.cc')
-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 705557f79..6f13f5dd6 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;
}