From e4cc9f309e96a9145970989fd20394933923f574 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Tue, 27 Mar 2012 18:53:05 +0000 Subject: [PATCH] Support FLIC in AVI. Signed-off-by: Paul B Mahol Signed-off-by: Michael Niedermayer --- libavcodec/flicvideo.c | 19 ++++++++++++++----- libavformat/riff.c | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/libavcodec/flicvideo.c b/libavcodec/flicvideo.c index c5df949b31..c46b5da44a 100644 --- a/libavcodec/flicvideo.c +++ b/libavcodec/flicvideo.c @@ -85,8 +85,9 @@ static av_cold int flic_decode_init(AVCodecContext *avctx) if (avctx->extradata_size != 0 && avctx->extradata_size != 12 && - avctx->extradata_size != 128) { - av_log(avctx, AV_LOG_ERROR, "Expected extradata of 12 or 128 bytes\n"); + avctx->extradata_size != 128 && + avctx->extradata_size != 1024) { + av_log(avctx, AV_LOG_ERROR, "Expected extradata of 12, 128 or 1024 bytes\n"); return AVERROR_INVALIDDATA; } @@ -96,6 +97,15 @@ static av_cold int flic_decode_init(AVCodecContext *avctx) /* special case for magic carpet FLIs */ s->fli_type = FLC_MAGIC_CARPET_SYNTHETIC_TYPE_CODE; depth = 8; + } else if (avctx->extradata_size == 1024) { + uint8_t *ptr = avctx->extradata; + int i; + + for (i = 0; i < 256; i++) { + s->palette[i] = AV_RL32(ptr); + ptr += 4; + } + depth = 8; } else if (avctx->extradata_size == 0) { /* FLI in MOV, see e.g. FFmpeg trac issue #626 */ s->fli_type = FLI_TYPE_CODE; @@ -433,9 +443,8 @@ static int flic_decode_frame_8BPP(AVCodecContext *avctx, } /* by the end of the chunk, the stream ptr should equal the frame - * size (minus 1, possibly); if it doesn't, issue a warning */ - if ((bytestream2_get_bytes_left(&g2) != 0) && - (bytestream2_get_bytes_left(&g2) != 1)) + * size (minus 1 or 2, possibly); if it doesn't, issue a warning */ + if (bytestream2_get_bytes_left(&g2) > 2) av_log(avctx, AV_LOG_ERROR, "Processed FLI chunk where chunk size = %d " \ "and final chunk ptr = %d\n", buf_size, buf_size - bytestream2_get_bytes_left(&g2)); diff --git a/libavformat/riff.c b/libavformat/riff.c index 650bea6f72..80a44b07b4 100644 --- a/libavformat/riff.c +++ b/libavformat/riff.c @@ -300,6 +300,7 @@ const AVCodecTag ff_codec_bmp_tags[] = { { CODEC_ID_DXTORY, MKTAG('x', 't', 'o', 'r') }, { CODEC_ID_ZEROCODEC, MKTAG('Z', 'E', 'C', 'O') }, { CODEC_ID_Y41P, MKTAG('Y', '4', '1', 'P') }, + { CODEC_ID_FLIC, MKTAG('A', 'F', 'L', 'C') }, { CODEC_ID_NONE, 0 } };