aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/flicvideo.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2012-03-27 18:53:05 +0000
committerMichael Niedermayer <michaelni@gmx.at>2012-03-28 02:34:06 +0200
commite4cc9f309e96a9145970989fd20394933923f574 (patch)
tree2705554ed096e01c7f2cf76b2bf354817acce595 /libavcodec/flicvideo.c
parente206b51fd377425ec4c4a37160b9753e49809416 (diff)
downloadffmpeg-e4cc9f309e96a9145970989fd20394933923f574.tar.gz
Support FLIC in AVI.
Signed-off-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/flicvideo.c')
-rw-r--r--libavcodec/flicvideo.c19
1 files changed, 14 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));