diff --git a/libavutil/frame.c b/libavutil/frame.c index a5ddab9f05..2ec75e402a 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -18,6 +18,7 @@ */ #include "channel_layout.h" +#include "avassert.h" #include "buffer.h" #include "common.h" #include "dict.h" @@ -40,6 +41,11 @@ MAKE_ACCESSORS(AVFrame, frame, AVDictionary *, metadata) MAKE_ACCESSORS(AVFrame, frame, int, decode_error_flags) MAKE_ACCESSORS(AVFrame, frame, int, pkt_size) +#define CHECK_CHANNELS_CONSISTENCY(frame) \ + av_assert2(!(frame)->channel_layout || \ + (frame)->channels == \ + av_get_channel_layout_nb_channels((frame)->channel_layout)) + AVDictionary **avpriv_frame_get_metadatap(AVFrame *frame) {return &frame->metadata;}; int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int qp_type) @@ -158,11 +164,12 @@ fail: static int get_audio_buffer(AVFrame *frame, int align) { - int channels = av_get_channel_layout_nb_channels(frame->channel_layout); + int channels = frame->channels; int planar = av_sample_fmt_is_planar(frame->format); int planes = planar ? channels : 1; int ret, i; + CHECK_CHANNELS_CONSISTENCY(frame); if (!frame->linesize[0]) { ret = av_samples_get_buffer_size(&frame->linesize[0], channels, frame->nb_samples, frame->format, @@ -240,7 +247,8 @@ int av_frame_ref(AVFrame *dst, AVFrame *src) return ret; if (src->nb_samples) { - int ch = av_get_channel_layout_nb_channels(src->channel_layout); + int ch = src->channels; + CHECK_CHANNELS_CONSISTENCY(src); av_samples_copy(dst->extended_data, src->extended_data, 0, 0, dst->nb_samples, ch, dst->format); } else { @@ -279,12 +287,13 @@ int av_frame_ref(AVFrame *dst, AVFrame *src) /* duplicate extended data */ if (src->extended_data != src->data) { - int ch = av_get_channel_layout_nb_channels(src->channel_layout); + int ch = src->channels; if (!ch) { ret = AVERROR(EINVAL); goto fail; } + CHECK_CHANNELS_CONSISTENCY(src); dst->extended_data = av_malloc(sizeof(*dst->extended_data) * ch); if (!dst->extended_data) { @@ -388,7 +397,8 @@ int av_frame_make_writable(AVFrame *frame) return ret; if (tmp.nb_samples) { - int ch = av_get_channel_layout_nb_channels(tmp.channel_layout); + int ch = tmp.channels; + CHECK_CHANNELS_CONSISTENCY(&tmp); av_samples_copy(tmp.extended_data, frame->extended_data, 0, 0, frame->nb_samples, ch, frame->format); } else { @@ -478,9 +488,10 @@ AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane) int planes, i; if (frame->nb_samples) { - int channels = av_get_channel_layout_nb_channels(frame->channel_layout); + int channels = frame->channels; if (!channels) return NULL; + CHECK_CHANNELS_CONSISTENCY(frame); planes = av_sample_fmt_is_planar(frame->format) ? channels : 1; } else planes = 4;