utvideodec: Fix single symbol mode decoding
authorJan Ekström <jeebjp@gmail.com>
Thu, 23 Aug 2012 20:32:06 +0000 (23:32 +0300)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Fri, 24 Aug 2012 11:12:31 +0000 (13:12 +0200)
Put the zero length check in place of code that was never used
during decoding, as zero-length slices were generally refused
in decode_frame().

Signed-off-by: Kostya Shishkov <kostya.shishkov@gmail.com>
libavcodec/utvideodec.c

index 8b71d62..7ae2573 100644 (file)
@@ -134,12 +134,9 @@ static int decode_plane(UtvideoContext *c, int plane_no,
         slice_size       = slice_data_end - slice_data_start;
 
         if (!slice_size) {
         slice_size       = slice_data_end - slice_data_start;
 
         if (!slice_size) {
-            for (j = sstart; j < send; j++) {
-                for (i = 0; i < width * step; i += step)
-                    dest[i] = 0x80;
-                dest += stride;
-            }
-            continue;
+            av_log(c->avctx, AV_LOG_ERROR, "Plane has more than one symbol "
+                   "yet a slice has a length of zero.\n");
+            goto fail;
         }
 
         memcpy(c->slice_bits, src + slice_data_start + c->slices * 4,
         }
 
         memcpy(c->slice_bits, src + slice_data_start + c->slices * 4,
@@ -361,7 +358,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
         for (j = 0; j < c->slices; j++) {
             slice_end   = bytestream2_get_le32u(&gb);
             slice_size  = slice_end - slice_start;
         for (j = 0; j < c->slices; j++) {
             slice_end   = bytestream2_get_le32u(&gb);
             slice_size  = slice_end - slice_start;
-            if (slice_end <= 0 || slice_size <= 0 ||
+            if (slice_end < 0 || slice_size < 0 ||
                 bytestream2_get_bytes_left(&gb) < slice_end) {
                 av_log(avctx, AV_LOG_ERROR, "Incorrect slice size\n");
                 return AVERROR_INVALIDDATA;
                 bytestream2_get_bytes_left(&gb) < slice_end) {
                 av_log(avctx, AV_LOG_ERROR, "Incorrect slice size\n");
                 return AVERROR_INVALIDDATA;