[FFmpeg-devel] [PATCH] cfhd: reallocate internal buffers on format change.

Ronald S. Bultje rsbultje at gmail.com
Mon Feb 15 16:35:09 CET 2016


---
 libavcodec/cfhd.c | 26 ++++++++++++++++++++------
 libavcodec/cfhd.h |  2 ++
 2 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/libavcodec/cfhd.c b/libavcodec/cfhd.c
index 5c15d9b..c5782a2 100644
--- a/libavcodec/cfhd.c
+++ b/libavcodec/cfhd.c
@@ -60,6 +60,7 @@ static void init_frame_defaults(CFHDContext *s)
 {
     s->coded_width       = 0;
     s->coded_height      = 0;
+    s->coded_format      = AV_PIX_FMT_NONE;
     s->bpc               = 10;
     s->channel_cnt       = 4;
     s->subband_cnt       = 10;
@@ -156,6 +157,7 @@ static int alloc_buffers(AVCodecContext *avctx)
 
     if ((ret = ff_set_dimensions(avctx, s->coded_width, s->coded_height)) < 0)
         return ret;
+    avctx->pix_fmt = s->coded_format;
 
     avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_x_shift, &s->chroma_y_shift);
 
@@ -213,6 +215,7 @@ static int alloc_buffers(AVCodecContext *avctx)
 
     s->a_height = s->coded_height;
     s->a_width  = s->coded_width;
+    s->a_format = s->coded_format;
 
     return 0;
 }
@@ -227,7 +230,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
     int ret = 0, i, j, plane, got_buffer = 0;
     int16_t *coeff_data;
 
-    avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
+    s->coded_format = AV_PIX_FMT_YUV422P10;
     init_frame_defaults(s);
 
     bytestream2_init(&gb, avpkt->data, avpkt->size);
@@ -405,9 +408,9 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
         } else if (tag == 84) {
             av_log(avctx, AV_LOG_DEBUG, "Sample format? %i\n", data);
             if (data == 1)
-                avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
+                s->coded_format = AV_PIX_FMT_YUV422P10;
             else if (data == 3)
-                avctx->pix_fmt = AV_PIX_FMT_GBRP12;
+                s->coded_format = AV_PIX_FMT_GBRP12;
             else {
                 avpriv_report_missing_feature(avctx, "Sample format of %"PRIu16" is unsupported\n", data);
                 ret = AVERROR_PATCHWELCOME;
@@ -417,8 +420,10 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
             av_log(avctx, AV_LOG_DEBUG,  "Unknown tag %i data %x\n", tag, data);
 
         /* Some kind of end of header tag */
-        if (tag == 4 && data == 0x1a4a && s->coded_width && s->coded_height && avctx->pix_fmt != AV_PIX_FMT_NONE) {
-            if (s->a_width != s->coded_width || s->a_height != s->coded_height) {
+        if (tag == 4 && data == 0x1a4a && s->coded_width && s->coded_height &&
+            s->coded_format != AV_PIX_FMT_NONE) {
+            if (s->a_width != s->coded_width || s->a_height != s->coded_height ||
+                s->a_format != s->coded_format) {
                 free_buffers(avctx);
                 if ((ret = alloc_buffers(avctx)) < 0) {
                     free_buffers(avctx);
@@ -426,11 +431,19 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
                 }
             }
 
+            printf("Prev size = %dx%d, avctx size = %dx%d, this size = %dx%d|%d\n",
+                   s->a_width, s->a_height,
+                   s->avctx->width, s->avctx->height,
+                   s->coded_width, s->coded_height, s->coded_format);
             if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
                 return ret;
+            printf("Got buffer of size %dx%d, stride=%d/%d, fmt=%d\n",
+                   frame.f->width, frame.f->height,
+                   frame.f->linesize[0], frame.f->linesize[1], frame.f->format);
 
             s->coded_width = 0;
             s->coded_height = 0;
+            s->coded_format = AV_PIX_FMT_NONE;
             got_buffer = 1;
         }
         coeff_data = s->plane[s->channel_num].subband[s->subband_num_actual];
@@ -557,7 +570,8 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
         }
     }
 
-    if (!s->a_width || !s->a_height || s->coded_width || s->coded_height) {
+    if (!s->a_width || !s->a_height || s->a_format == AV_PIX_FMT_NONE ||
+        s->coded_width || s->coded_height || s->coded_format != AV_PIX_FMT_NONE) {
         av_log(avctx, AV_LOG_ERROR, "Invalid dimensions\n");
         ret = AVERROR(EINVAL);
         goto end;
diff --git a/libavcodec/cfhd.h b/libavcodec/cfhd.h
index a263124..67a0e4c 100644
--- a/libavcodec/cfhd.h
+++ b/libavcodec/cfhd.h
@@ -84,9 +84,11 @@ typedef struct CFHDContext {
 
     int coded_width;
     int coded_height;
+    int coded_format;
 
     int a_width;
     int a_height;
+    int a_format;
 
     int bpc;
     int channel_cnt;
-- 
2.1.2



More information about the ffmpeg-devel mailing list