summaryrefslogtreecommitdiff
path: root/src/decoder/plugins/FfmpegDecoderPlugin.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/decoder/plugins/FfmpegDecoderPlugin.cxx')
-rw-r--r--src/decoder/plugins/FfmpegDecoderPlugin.cxx26
1 files changed, 12 insertions, 14 deletions
diff --git a/src/decoder/plugins/FfmpegDecoderPlugin.cxx b/src/decoder/plugins/FfmpegDecoderPlugin.cxx
index 1a601a55d..2b8774bd3 100644
--- a/src/decoder/plugins/FfmpegDecoderPlugin.cxx
+++ b/src/decoder/plugins/FfmpegDecoderPlugin.cxx
@@ -182,25 +182,24 @@ start_time_fallback(const AVStream &stream)
* Throws #std::exception on error.
*/
static ConstBuffer<void>
-copy_interleave_frame(const AVCodecContext &codec_context,
- const AVFrame &frame,
- FfmpegBuffer &global_buffer)
+copy_interleave_frame(const AVFrame &frame, FfmpegBuffer &global_buffer)
{
assert(frame.nb_samples > 0);
+ const AVSampleFormat format = AVSampleFormat(frame.format);
+ const unsigned channels = frame.channels;
+ const std::size_t n_frames = frame.nb_samples;
+
int plane_size;
const int data_size =
- av_samples_get_buffer_size(&plane_size,
- codec_context.channels,
- frame.nb_samples,
- codec_context.sample_fmt, 1);
+ av_samples_get_buffer_size(&plane_size, channels,
+ n_frames, format, 1);
assert(data_size != 0);
if (data_size < 0)
throw MakeFfmpegError(data_size);
void *output_buffer;
- if (av_sample_fmt_is_planar(codec_context.sample_fmt) &&
- codec_context.channels > 1) {
+ if (av_sample_fmt_is_planar(format) && channels > 1) {
output_buffer = global_buffer.GetT<uint8_t>(data_size);
if (output_buffer == nullptr)
/* Not enough memory - shouldn't happen */
@@ -208,9 +207,9 @@ copy_interleave_frame(const AVCodecContext &codec_context,
PcmInterleave(output_buffer,
ConstBuffer<const void *>((const void *const*)frame.extended_data,
- codec_context.channels),
- frame.nb_samples,
- av_get_bytes_per_sample(codec_context.sample_fmt));
+ channels),
+ n_frames,
+ av_get_bytes_per_sample(format));
} else {
output_buffer = frame.extended_data[0];
}
@@ -257,8 +256,7 @@ FfmpegSendFrame(DecoderClient &client, InputStream *is,
size_t &skip_bytes,
FfmpegBuffer &buffer)
{
- ConstBuffer<void> output_buffer =
- copy_interleave_frame(codec_context, frame, buffer);
+ ConstBuffer<void> output_buffer = copy_interleave_frame(frame, buffer);
if (skip_bytes > 0) {
if (skip_bytes >= output_buffer.size) {