diff options
author | Sebastian Vater <cdgs.basty@googlemail.com> | 2010-06-01 16:36:36 +0000 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2010-06-01 16:36:36 +0000 |
commit | 522d3930ffd3e53dac4bfbc6908f0fd09674b7fc (patch) | |
tree | 75733be1205937fb940f62688df12979eb17d27b /libavcodec | |
parent | 54b11f1743168f99fceaaf2d8cc6d166a4c9440e (diff) | |
download | ffmpeg-522d3930ffd3e53dac4bfbc6908f0fd09674b7fc.tar.gz |
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
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
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/iff.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/libavcodec/iff.c b/libavcodec/iff.c index bcf4929b7f..29353bf1f4 100644 --- a/libavcodec/iff.c +++ b/libavcodec/iff.c @@ -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) { |