avformat: add ff_alloc_extradata() helper
authorPaul B Mahol <onemda@gmail.com>
Sun, 13 Oct 2013 10:19:09 +0000 (10:19 +0000)
committerPaul B Mahol <onemda@gmail.com>
Sun, 13 Oct 2013 20:13:38 +0000 (20:13 +0000)
Signed-off-by: Paul B Mahol <onemda@gmail.com>
libavformat/internal.h
libavformat/utils.c

index ceeaa1c..36ee4c0 100644 (file)
@@ -361,4 +361,13 @@ AVRational ff_choose_timebase(AVFormatContext *s, AVStream *st, int min_precissi
  */
 void ff_generate_avci_extradata(AVStream *st);
 
+/**
+ * Allocate extradata with additional FF_INPUT_BUFFER_PADDING_SIZE at end
+ * which is always set to 0.
+ *
+ * @param size size of extradata
+ * @return 0 if OK, AVERROR_xxx on error
+ */
+int ff_alloc_extradata(AVCodecContext *avctx, int size);
+
 #endif /* AVFORMAT_INTERNAL_H */
index 61405d7..6a7f580 100644 (file)
@@ -2678,6 +2678,26 @@ int av_find_stream_info(AVFormatContext *ic)
 }
 #endif
 
+int ff_alloc_extradata(AVCodecContext *avctx, int size)
+{
+    int ret;
+
+    if (size < 0 || size >= INT32_MAX - FF_INPUT_BUFFER_PADDING_SIZE) {
+        avctx->extradata_size = 0;
+        return AVERROR(EINVAL);
+    }
+    avctx->extradata = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
+    if (avctx->extradata) {
+        memset(avctx->extradata + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+        avctx->extradata_size = size;
+        ret = 0;
+    } else {
+        avctx->extradata_size = 0;
+        ret = AVERROR(ENOMEM);
+    }
+    return ret;
+}
+
 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
 {
     int i, count, ret = 0, j;