avcodec/magicyuv: fix decoding of raw slices
authorPaul B Mahol <onemda@gmail.com>
Thu, 2 Jun 2016 04:59:46 +0000 (06:59 +0200)
committerPaul B Mahol <onemda@gmail.com>
Thu, 2 Jun 2016 04:59:46 +0000 (06:59 +0200)
Signed-off-by: Paul B Mahol <onemda@gmail.com>
libavcodec/magicyuv.c

index 1af7671..d96084d 100644 (file)
@@ -124,26 +124,37 @@ static int decode_slice(AVCodecContext *avctx, void *tdata,
         int sheight = AV_CEIL_RSHIFT(s->slice_height, s->vshift[i]);
         int fake_stride = p->linesize[i] * (1 + interlaced);
         int stride = p->linesize[i];
-        int pred;
+        int flags, pred;
 
         if ((ret = init_get_bits8(&b, s->buf + s->slices[i][j].start, s->slices[i][j].size)) < 0)
             return ret;
 
-        pred = get_bits(&b, 16);
+        flags = get_bits(&b, 8);
+        pred  = get_bits(&b, 8);
+
         dst = p->data[i] + j * sheight * stride;
-        for (k = 0; k < height; k++) {
-            for (x = 0; x < width; x++) {
-                int pix;
-                if (get_bits_left(&b) <= 0) {
-                    return AVERROR_INVALIDDATA;
+        if (flags & 1) {
+            for (k = 0; k < height; k++) {
+                for (x = 0; x < width; x++) {
+                    dst[x] = get_bits(&b, 8);
                 }
-                pix = get_vlc2(&b, s->vlc[i].table, s->vlc[i].bits, 3);
-                if (pix < 0) {
-                    return AVERROR_INVALIDDATA;
+                dst += stride;
+            }
+        } else {
+            for (k = 0; k < height; k++) {
+                for (x = 0; x < width; x++) {
+                    int pix;
+                    if (get_bits_left(&b) <= 0) {
+                        return AVERROR_INVALIDDATA;
+                    }
+                    pix = get_vlc2(&b, s->vlc[i].table, s->vlc[i].bits, 3);
+                    if (pix < 0) {
+                        return AVERROR_INVALIDDATA;
+                    }
+                    dst[x] = 255 - pix;
                 }
-                dst[x] = 255 - pix;
+                dst += stride;
             }
-            dst += stride;
         }
 
         if (pred == LEFT) {