cinepak: More correct Cinepak decoder.
authoru-bo1b@0w.se <u-bo1b@0w.se>
Mon, 18 Feb 2013 19:47:45 +0000 (20:47 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 20 Feb 2013 03:14:04 +0000 (04:14 +0100)
change the treatment of the strip y coordinates which previously did
not follow the description (nor did it behave like the binary decoder
on files with absolute strip offsets).

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/cinepak.c

index a88469a..5bd3f13 100644 (file)
@@ -366,10 +366,13 @@ static int cinepak_decode (CinepakContext *s)
             return AVERROR_INVALIDDATA;
 
         s->strips[i].id = s->data[0];
-        s->strips[i].y1 = y0;
-        s->strips[i].x1 = 0;
-        s->strips[i].y2 = y0 + AV_RB16 (&s->data[8]);
-        s->strips[i].x2 = s->avctx->width;
+/* zero y1 means "relative to the previous stripe" */
+        if (!(s->strips[i].y1 = AV_RB16 (&s->data[4])))
+            s->strips[i].y2 = (s->strips[i].y1 = y0) + AV_RB16 (&s->data[8]);
+        else
+            s->strips[i].y2 = AV_RB16 (&s->data[8]);
+        s->strips[i].x1 = AV_RB16 (&s->data[6]);
+        s->strips[i].x2 = AV_RB16 (&s->data[10]);
 
         if (s->strips[i].id == 0x10)
             s->frame.key_frame = 1;