changeset 12521:db36486a6f89 libavcodec

Make WMV3 decoder attempt to decode WMVP as well
author kostya
date Sun, 26 Sep 2010 13:56:50 +0000
parents 5915f4f0e172
children 776789af0304
files avcodec.h vc1.c vc1dec.c
diffstat 3 files changed, 25 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/avcodec.h	Sun Sep 26 13:54:35 2010 +0000
+++ b/avcodec.h	Sun Sep 26 13:56:50 2010 +0000
@@ -32,7 +32,7 @@
 
 #define LIBAVCODEC_VERSION_MAJOR 52
 #define LIBAVCODEC_VERSION_MINOR 90
-#define LIBAVCODEC_VERSION_MICRO  0
+#define LIBAVCODEC_VERSION_MICRO  1
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                LIBAVCODEC_VERSION_MINOR, \
--- a/vc1.c	Sun Sep 26 13:54:35 2010 +0000
+++ b/vc1.c	Sun Sep 26 13:56:50 2010 +0000
@@ -315,8 +315,7 @@
             return -1;
         }
         if (v->res_sprite) {
-            av_log(avctx, AV_LOG_ERROR, "WMVP is not supported\n");
-            return -1;
+            av_log(avctx, AV_LOG_ERROR, "WMVP is not fully supported\n");
         }
     }
 
@@ -387,7 +386,21 @@
     v->quantizer_mode = get_bits(gb, 2); //common
 
     v->finterpflag = get_bits1(gb); //common
-    v->res_rtm_flag = get_bits1(gb); //reserved
+
+    if (v->res_sprite) {
+        v->s.avctx->width  = v->s.avctx->coded_width  = get_bits(gb, 11);
+        v->s.avctx->height = v->s.avctx->coded_height = get_bits(gb, 11);
+        skip_bits(gb, 5); //frame rate
+        v->res_x8 = get_bits1(gb);
+        if (get_bits1(gb)) { // something to do with DC VLC selection
+            av_log(avctx, AV_LOG_ERROR, "Unsupported sprite feature\n");
+            return -1;
+        }
+        skip_bits(gb, 3); //slice code
+        v->res_rtm_flag = 0;
+    } else {
+        v->res_rtm_flag = get_bits1(gb); //reserved
+    }
     if (!v->res_rtm_flag)
     {
 //            av_log(avctx, AV_LOG_ERROR,
@@ -566,6 +579,9 @@
 {
     int pqindex, lowquant, status;
 
+    if(v->res_sprite) {
+        skip_bits(gb, 2); //not yet deciphered
+    }
     if(v->finterpflag) v->interpfrm = get_bits1(gb);
     skip_bits(gb, 2); //framecnt unused
     v->rangeredfrm = 0;
--- a/vc1dec.c	Sun Sep 26 13:54:35 2010 +0000
+++ b/vc1dec.c	Sun Sep 26 13:56:50 2010 +0000
@@ -3240,6 +3240,11 @@
         }
     }
 
+    if(v->res_sprite && (s->pict_type!=FF_I_TYPE)){
+        av_free(buf2);
+        return -1;
+    }
+
     // for hurry_up==5
     s->current_picture.pict_type= s->pict_type;
     s->current_picture.key_frame= s->pict_type == FF_I_TYPE;