| @@ -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; | |||