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