From 7662a532fbb83d5b3e559a7da58254e56cae3157 Mon Sep 17 00:00:00 2001
From: Hendrik Leppkes <h.leppkes@gmail.com>
Date: Fri, 13 Jan 2012 18:41:21 +0100
Subject: [PATCH] vc1: don't read the interpfrm and bfraction elements for
 interlaced frames

This matches the spec as well as the reference decoder, and fixes a bug
with interlaced frame decoding.

Signed-off-by: Kostya Shishkov <kostya.shishkov@gmail.com>
---
 libavcodec/vc1.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c
index d728f9beb44..0a700628930 100644
--- a/libavcodec/vc1.c
+++ b/libavcodec/vc1.c
@@ -911,13 +911,15 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
         }
         goto parse_common_info;
     }
-    if (v->finterpflag)
-        v->interpfrm = get_bits1(gb);
-    if (v->s.pict_type == AV_PICTURE_TYPE_B) {
-        v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
-        v->bfraction           = ff_vc1_bfraction_lut[v->bfraction_lut_index];
-        if (v->bfraction == 0) {
-            v->s.pict_type = AV_PICTURE_TYPE_BI; /* XXX: should not happen here */
+    if (v->fcm == PROGRESSIVE) {
+        if (v->finterpflag)
+            v->interpfrm = get_bits1(gb);
+        if (v->s.pict_type == AV_PICTURE_TYPE_B) {
+            v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
+            v->bfraction           = ff_vc1_bfraction_lut[v->bfraction_lut_index];
+            if (v->bfraction == 0) {
+                v->s.pict_type = AV_PICTURE_TYPE_BI; /* XXX: should not happen here */
+            }
         }
     }
 
-- 
GitLab