lavc/sheervideo: Fix Y prediction for interlaced frames with transparency.
authorCarl Eugen Hoyos <cehoyos@ag.or.at>
Wed, 1 Mar 2017 22:45:10 +0000 (23:45 +0100)
committerCarl Eugen Hoyos <cehoyos@ag.or.at>
Thu, 2 Mar 2017 17:11:57 +0000 (18:11 +0100)
Based on 260de8a2 by Paul B Mahol.
Fixes ticket #6210.

libavcodec/sheervideo.c

index e8f008b..9d2da7f 100644 (file)
@@ -2185,7 +2185,7 @@ static void decode_aybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
             dst_v[x] = get_bits(gb, 8);
         }
     } else {
-        int pred[4] = { 125, 125, -128, -128 };
+        int pred[4] = { 125, s->alt ? 125 : -146, -128, -128 };
 
         for (x = 0; x < avctx->width; x++) {
             int a, y, u, v;
@@ -2263,7 +2263,7 @@ static void decode_aybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
             dst_v[x] = get_bits(gb, 8);
         }
     } else {
-        int pred[4] = { 125, 125, -128, -128 };
+        int pred[4] = { 125, s->alt ? 125 : -146, -128, -128 };
 
         for (x = 0; x < avctx->width; x++) {
             int a, y, u, v;
@@ -2959,6 +2959,7 @@ static int decode_frame(AVCodecContext *avctx,
         }
         break;
     case MKTAG('A', 'Y', 'B', 'R'):
+        s->alt = 1;
     case MKTAG('A', 'Y', 'b', 'R'):
         avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
         s->decode_frame = decode_aybr;
@@ -2968,6 +2969,7 @@ static int decode_frame(AVCodecContext *avctx,
         }
         break;
     case MKTAG('A', 'y', 'B', 'R'):
+        s->alt = 1;
     case MKTAG('A', 'y', 'b', 'R'):
         avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
         s->decode_frame = decode_aybri;