From ee4e8050931250f609a37f300a1d1831a44ecb1b Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 25 Dec 2013 16:34:46 +0100 Subject: [PATCH] avformat: add ff_get_extradata() Signed-off-by: Michael Niedermayer --- libavformat/internal.h | 9 +++++++++ libavformat/utils.c | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/libavformat/internal.h b/libavformat/internal.h index edc6a11685..1560e9f44f 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -371,6 +371,15 @@ int ff_generate_avci_extradata(AVStream *st); */ int ff_alloc_extradata(AVCodecContext *avctx, int size); +/** + * Allocate extradata with additional FF_INPUT_BUFFER_PADDING_SIZE at end + * which is always set to 0 and fill it from pb. + * + * @param size size of extradata + * @return >= 0 if OK, AVERROR_xxx on error + */ +int ff_get_extradata(AVCodecContext *avctx, AVIOContext *pb, int size); + /** * add frame for rfps calculation. * diff --git a/libavformat/utils.c b/libavformat/utils.c index 7f19abc5f1..40d886f58a 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2701,6 +2701,22 @@ int ff_alloc_extradata(AVCodecContext *avctx, int size) return ret; } +int ff_get_extradata(AVCodecContext *avctx, AVIOContext *pb, int size) +{ + int ret = ff_alloc_extradata(avctx, size); + if (ret < 0) + return ret; + ret = avio_read(pb, avctx->extradata, size); + if (ret != size) { + av_freep(&avctx->extradata); + avctx->extradata_size = 0; + av_log(avctx, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size); + return ret < 0 ? ret : AVERROR_INVALIDDATA; + } + + return ret; +} + int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts) { int i, j;