ffmpegencoder: split sample buffer when writing audio

Avoids integer overflow in FFmpeg

Fixes #2072
This commit is contained in:
itsmattkc
2022-10-29 12:07:55 -07:00
parent 972ec1e340
commit e94580c369
+21 -11
View File
@@ -280,13 +280,20 @@ bool FFmpegEncoder::WriteFrame(FramePtr frame, rational time)
bool FFmpegEncoder::WriteAudio(const SampleBuffer &audio)
{
if (!audio.is_allocated()) {
return true;
}
bool result = true;
// Create input buffer
int input_sample_count = 0;
uint8_t** input_data = nullptr;
if (audio.is_allocated()) {
input_sample_count = audio.sample_count();
size_t start = 0;
size_t end = audio.sample_count();
const size_t max_frame = 48000;
while (start < end) {
// Create input buffer
uint8_t** input_data = nullptr;
size_t input_sample_count = std::min(end - start, max_frame);
int input_linesize;
int r = av_samples_alloc_array_and_samples(&input_data, &input_linesize, audio.audio_params().channel_count(),
@@ -296,17 +303,20 @@ bool FFmpegEncoder::WriteAudio(const SampleBuffer &audio)
FFmpegError(tr("Failed to allocate sample array"), r);
return false;
} else {
int bpsc = audio.audio_params().bytes_per_sample_per_channel();
for (int i=0; i<audio.audio_params().channel_count(); i++) {
memcpy(input_data[i], audio.data(i), input_sample_count * audio.audio_params().bytes_per_sample_per_channel());
memcpy(input_data[i], audio.data(i) + start, input_sample_count * bpsc);
}
start += input_sample_count;
}
}
result = WriteAudioData(audio.audio_params().is_valid() ? audio.audio_params() : params().audio_params(), const_cast<const uint8_t**>(input_data), input_sample_count);
result = WriteAudioData(audio.audio_params().is_valid() ? audio.audio_params() : params().audio_params(), const_cast<const uint8_t**>(input_data), input_sample_count);
if (input_data) {
av_freep(&input_data[0]);
av_freep(&input_data);
if (input_data) {
av_freep(&input_data[0]);
av_freep(&input_data);
}
}
return result;