]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/avuidec.c
Merge remote-tracking branch 'qatar/master'
[ffmpeg] / libavcodec / avuidec.c
index d43de33cbd3897b8b14fc5e62c9bed54d3b09ef0..32fd819ea75e22680aa85ccb4f76625ec43d2673 100644 (file)
@@ -43,29 +43,27 @@ static int avui_decode_frame(AVCodecContext *avctx, void *data,
     const uint8_t *src = avpkt->data;
     const uint8_t *srca;
     uint8_t *y, *u, *v, *a;
-    int transparent, interlaced = 1, skip[2], i, j, k;
+    int transparent, interlaced = 1, skip, opaque_length, i, j, k;
 
     if (pic->data[0])
         avctx->release_buffer(avctx, pic);
 
-    if (!memcmp(&avctx->extradata[4], "APRGAPRG0001", 12) &&
-        avctx->extradata_size >= 24)
+    if (avctx->extradata_size >= 24 &&
+        !memcmp(&avctx->extradata[4], "APRGAPRG0001", 12))
         interlaced = avctx->extradata[19] != 1;
-    skip[0] = skip[1] = 16;
     if (avctx->height == 486) {
-        skip[0] =  8;
-        skip[1] = 12;
+        skip = 10;
+    } else {
+        skip = 16;
     }
-    if (avpkt->size < avctx->width * (2 * avctx->height + skip[0] + skip[1])
-                      + 4 * interlaced) {
+    opaque_length = 2 * avctx->width * (avctx->height + skip) + 4 * interlaced;
+    if (avpkt->size < opaque_length) {
         av_log(avctx, AV_LOG_ERROR, "Insufficient input data.\n");
         return AVERROR(EINVAL);
     }
     transparent = avctx->bits_per_coded_sample == 32 &&
-                  avpkt->size >= (2 * avctx->height + skip[0] + skip[1]) *
-                                 2 * avctx->width + 4 + 8 * interlaced;
-    srca = src + (2 * avctx->height + skip[0] + skip[1]) * avctx->width
-           + 5 + interlaced * 4;
+                  avpkt->size >= opaque_length * 2 + 4;
+    srca = src + opaque_length + 5;
 
     pic->reference = 0;
 
@@ -78,17 +76,24 @@ static int avui_decode_frame(AVCodecContext *avctx, void *data,
     pic->pict_type = AV_PICTURE_TYPE_I;
 
     if (!interlaced) {
-        src  += avctx->width * skip[1];
-        srca += avctx->width * skip[1];
+        src  += avctx->width * skip;
+        srca += avctx->width * skip;
     }
 
     for (i = 0; i < interlaced + 1; i++) {
-        src  += avctx->width * skip[i];
-        srca += avctx->width * skip[i];
-        y = pic->data[0] + i * pic->linesize[0];
-        u = pic->data[1] + i * pic->linesize[1];
-        v = pic->data[2] + i * pic->linesize[2];
-        a = pic->data[3] + i * pic->linesize[3];
+        src  += avctx->width * skip;
+        srca += avctx->width * skip;
+        if (interlaced && avctx->height == 486) {
+            y = pic->data[0] + (1 - i) * pic->linesize[0];
+            u = pic->data[1] + (1 - i) * pic->linesize[1];
+            v = pic->data[2] + (1 - i) * pic->linesize[2];
+            a = pic->data[3] + (1 - i) * pic->linesize[3];
+        } else {
+            y = pic->data[0] + i * pic->linesize[0];
+            u = pic->data[1] + i * pic->linesize[1];
+            v = pic->data[2] + i * pic->linesize[2];
+            a = pic->data[3] + i * pic->linesize[3];
+        }
 
         for (j = 0; j < avctx->height >> interlaced; j++) {
             for (k = 0; k < avctx->width >> 1; k++) {