[FFmpeg-devel] [PATCH] Support FLIC in AVI.

Paul B Mahol onemda at gmail.com
Tue Mar 27 20:53:05 CEST 2012


Signed-off-by: Paul B Mahol <onemda at gmail.com>
---
 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 c5df949..c46b5da 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 650bea6..80a44b0 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 }
 };
 
-- 
1.7.7



More information about the ffmpeg-devel mailing list