Make WMV3 decoder attempt to decode WMVP as well
authorKostya Shishkov <kostya.shishkov@gmail.com>
Sun, 26 Sep 2010 13:56:50 +0000 (13:56 +0000)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Sun, 26 Sep 2010 13:56:50 +0000 (13:56 +0000)
Originally committed as revision 25209 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/avcodec.h
libavcodec/vc1.c
libavcodec/vc1dec.c
libavformat/riff.c

index 24e9077..45609d0 100644 (file)
@@ -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, \
index d9d7d51..86904cb 100644 (file)
@@ -315,8 +315,7 @@ int vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitConte
             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 @@ int vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitConte
     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 vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
 {
     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;
index 8c9cbcd..c9a547b 100644 (file)
@@ -3240,6 +3240,11 @@ static int vc1_decode_frame(AVCodecContext *avctx,
         }
     }
 
+    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;
index 24d0cce..5541851 100644 (file)
@@ -227,6 +227,7 @@ const AVCodecTag ff_codec_bmp_tags[] = {
     { CODEC_ID_QPEG,         MKTAG('Q', '1', '.', '0') },
     { CODEC_ID_QPEG,         MKTAG('Q', '1', '.', '1') },
     { CODEC_ID_WMV3,         MKTAG('W', 'M', 'V', '3') },
+    { CODEC_ID_WMV3,         MKTAG('W', 'M', 'V', 'P') },
     { CODEC_ID_VC1,          MKTAG('W', 'V', 'C', '1') },
     { CODEC_ID_VC1,          MKTAG('W', 'M', 'V', 'A') },
     { CODEC_ID_LOCO,         MKTAG('L', 'O', 'C', 'O') },