summaryrefslogtreecommitdiff
path: root/libavcodec/iff.c
diff options
context:
space:
mode:
authorSebastian Vater <cdgs.basty@googlemail.com>2010-06-01 16:36:36 +0000
committerRonald S. Bultje <rsbultje@gmail.com>2010-06-01 16:36:36 +0000
commit522d3930ffd3e53dac4bfbc6908f0fd09674b7fc (patch)
tree75733be1205937fb940f62688df12979eb17d27b /libavcodec/iff.c
parent54b11f1743168f99fceaaf2d8cc6d166a4c9440e (diff)
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/iff.c')
-rw-r--r--libavcodec/iff.c39
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) {