Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
authorSebastian Vater <cdgs.basty@googlemail.com>
Tue, 1 Jun 2010 16:36:36 +0000 (16:36 +0000)
committerRonald S. Bultje <rsbultje@gmail.com>
Tue, 1 Jun 2010 16:36:36 +0000 (16:36 +0000)
unsupported and causes crashes when libavfilter is enabled.

Patch by Sebastian Vater <cdgs basty googlemail com>.

Originally committed as revision 23411 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/iff.c

index bcf4929..29353bf 100644 (file)
@@ -34,6 +34,7 @@ typedef struct {
     AVFrame frame;
     int planesize;
     uint8_t * planebuf;
+    int init; // 1 if buffer and palette data already initialized, 0 otherwise
 } IffContext;
 
 #define LUT8_PART(plane, v)                             \
@@ -167,14 +168,8 @@ static av_cold int decode_init(AVCodecContext *avctx)
         return AVERROR(ENOMEM);
 
     s->frame.reference = 1;
-    if ((err = avctx->get_buffer(avctx, &s->frame) < 0)) {
-        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
-        return err;
-    }
 
-    return (avctx->bits_per_coded_sample <= 8 &&
-            avctx->pix_fmt != PIX_FMT_GRAY8) ?
-       ff_cmap_read_palette(avctx, (uint32_t*)s->frame.data[1]) : 0;
+    return 0;
 }
 
 /**
@@ -258,12 +253,21 @@ static int decode_frame_ilbm(AVCodecContext *avctx,
     const uint8_t *buf = avpkt->data;
     int buf_size = avpkt->size;
     const uint8_t *buf_end = buf+buf_size;
-    int y, plane;
+    int y, plane, res;
 
-    if (avctx->reget_buffer(avctx, &s->frame) < 0){
+    if (s->init) {
+        if ((res = avctx->reget_buffer(avctx, &s->frame)) < 0) {
+            av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
+            return res;
+        }
+    } else if ((res = avctx->get_buffer(avctx, &s->frame)) < 0) {
         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
-        return -1;
+        return res;
+    } else if (avctx->bits_per_coded_sample <= 8 && avctx->pix_fmt != PIX_FMT_GRAY8) {
+        if ((res = ff_cmap_read_palette(avctx, (uint32_t*)s->frame.data[1])) < 0)
+            return res;
     }
+    s->init = 1;
 
     if (avctx->codec_tag == MKTAG('I','L','B','M')) { // interleaved
         if (avctx->pix_fmt == PIX_FMT_PAL8 || avctx->pix_fmt == PIX_FMT_GRAY8) {
@@ -306,12 +310,21 @@ static int decode_frame_byterun1(AVCodecContext *avctx,
     const uint8_t *buf = avpkt->data;
     int buf_size = avpkt->size;
     const uint8_t *buf_end = buf+buf_size;
-    int y, plane;
+    int y, plane, res;
 
-    if (avctx->reget_buffer(avctx, &s->frame) < 0){
+    if (s->init) {
+        if ((res = avctx->reget_buffer(avctx, &s->frame)) < 0) {
+            av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
+            return res;
+        }
+    } else if ((res = avctx->get_buffer(avctx, &s->frame)) < 0) {
         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
-        return -1;
+        return res;
+    } else if (avctx->bits_per_coded_sample <= 8 && avctx->pix_fmt != PIX_FMT_GRAY8) {
+        if ((res = ff_cmap_read_palette(avctx, (uint32_t*)s->frame.data[1])) < 0)
+            return res;
     }
+    s->init = 1;
 
     if (avctx->codec_tag == MKTAG('I','L','B','M')) { //interleaved
         if (avctx->pix_fmt == PIX_FMT_PAL8 || avctx->pix_fmt == PIX_FMT_GRAY8) {