aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlberto Delmás <adelmas@gmail.com>2012-11-11 09:23:06 +0100
committerKostya Shishkov <kostya.shishkov@gmail.com>2012-11-11 16:07:36 +0100
commitb077eb07805dc5d139b2f118ddb122cc9df8b87a (patch)
tree47b4ccd803698d9d949cee88d8a28e5c2cea5a79
parente5e1a06e443f4994cdeff39e99f67ce2c518ed2a (diff)
downloadffmpeg-b077eb07805dc5d139b2f118ddb122cc9df8b87a.tar.gz
mss2: fix handling of unmasked implicit WMV9 rectangles
Signed-off-by: Kostya Shishkov <kostya.shishkov@gmail.com>
-rw-r--r--libavcodec/mss2.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/libavcodec/mss2.c b/libavcodec/mss2.c
index 597ebb646e..ceeff5a32d 100644
--- a/libavcodec/mss2.c
+++ b/libavcodec/mss2.c
@@ -474,7 +474,7 @@ static int mss2_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
int keyframe, has_wmv9, has_mv, is_rle, is_555, ret;
Rectangle wmv9rects[MAX_WMV9_RECTANGLES], *r;
- int used_rects = 0, i, implicit_rect, av_uninit(wmv9_mask);
+ int used_rects = 0, i, implicit_rect = 0, av_uninit(wmv9_mask);
av_assert0(FF_INPUT_BUFFER_PADDING_SIZE >=
ARITH2_PADDING + (MIN_CACHE_BITS + 7) / 8);
@@ -650,7 +650,14 @@ static int mss2_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
return AVERROR_INVALIDDATA;
buf_size -= bytestream2_tell(&gB);
- } else if (is_rle) {
+ } else {
+ if (keyframe) {
+ c->corrupted = 0;
+ ff_mss12_slicecontext_reset(&ctx->sc[0]);
+ if (c->slice_split)
+ ff_mss12_slicecontext_reset(&ctx->sc[1]);
+ }
+ if (is_rle) {
init_get_bits(&gb, buf, buf_size * 8);
if (ret = decode_rle(&gb, c->pal_pic, c->pal_stride,
c->rgb_pic, c->rgb_stride, c->pal, keyframe,
@@ -669,14 +676,8 @@ static int mss2_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
align_get_bits(&gb);
buf += get_bits_count(&gb) >> 3;
buf_size -= get_bits_count(&gb) >> 3;
- } else {
- if (keyframe) {
- c->corrupted = 0;
- ff_mss12_slicecontext_reset(&ctx->sc[0]);
- if (c->slice_split)
- ff_mss12_slicecontext_reset(&ctx->sc[1]);
- }
- else if (c->corrupted)
+ } else if (!implicit_rect || wmv9_mask != -1) {
+ if (c->corrupted)
return AVERROR_INVALIDDATA;
bytestream2_init(&gB, buf, buf_size + ARITH2_PADDING);
arith2_init(&acoder, &gB);
@@ -702,6 +703,8 @@ static int mss2_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
buf += arith2_get_consumed_bytes(&acoder);
buf_size -= arith2_get_consumed_bytes(&acoder);
}
+ } else
+ memset(c->pal_pic, 0, c->pal_stride * avctx->height);
}
if (has_wmv9) {