changeset 311:ac677a84d5df libavcodec

wmv1 header parser (unfinished)
author michaelni
date Sat, 06 Apr 2002 22:29:37 +0000
parents 49e73229a5e6
children 8cf5507e6ca5
files avcodec.h h263dec.c mpegvideo.c msmpeg4.c utils.c
diffstat 5 files changed, 55 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/avcodec.h	Fri Apr 05 21:04:09 2002 +0000
+++ b/avcodec.h	Sat Apr 06 22:29:37 2002 +0000
@@ -17,6 +17,7 @@
     CODEC_ID_MSMPEG4V1,
     CODEC_ID_MSMPEG4V2,
     CODEC_ID_MSMPEG4V3,
+    CODEC_ID_WMV1,
     CODEC_ID_H263P,
     CODEC_ID_H263I,
 
@@ -212,6 +213,7 @@
 extern AVCodec msmpeg4v1_decoder;
 extern AVCodec msmpeg4v2_decoder;
 extern AVCodec msmpeg4v3_decoder;
+extern AVCodec wmv1_decoder;
 extern AVCodec mpeg_decoder;
 extern AVCodec h263i_decoder;
 extern AVCodec rv10_decoder;
--- a/h263dec.c	Fri Apr 05 21:04:09 2002 +0000
+++ b/h263dec.c	Sat Apr 06 22:29:37 2002 +0000
@@ -62,6 +62,11 @@
         s->h263_pred = 1;
         s->msmpeg4_version=3;
         break;
+    case CODEC_ID_WMV1:
+        s->h263_msmpeg4 = 1;
+        s->h263_pred = 1;
+        s->msmpeg4_version=4;
+        break;
     case CODEC_ID_H263I:
         s->h263_intel = 1;
         break;
@@ -234,7 +239,7 @@
         }
     }
     
-    if (s->h263_msmpeg4 && s->pict_type==I_TYPE)
+    if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type==I_TYPE)
         if(msmpeg4_decode_ext_header(s, buf_size) < 0) return -1;
 
     MPV_frame_end(s);
@@ -322,6 +327,18 @@
     CODEC_CAP_DRAW_HORIZ_BAND,
 };
 
+AVCodec wmv1_decoder = {
+    "wmv1",
+    CODEC_TYPE_VIDEO,
+    CODEC_ID_WMV1,
+    sizeof(MpegEncContext),
+    h263_decode_init,
+    NULL,
+    h263_decode_end,
+    h263_decode_frame,
+    CODEC_CAP_DRAW_HORIZ_BAND,
+};
+
 AVCodec h263i_decoder = {
     "h263i",
     CODEC_TYPE_VIDEO,
--- a/mpegvideo.c	Fri Apr 05 21:04:09 2002 +0000
+++ b/mpegvideo.c	Sat Apr 06 22:29:37 2002 +0000
@@ -1652,7 +1652,7 @@
     }
     emms_c();
 
-    if (s->h263_msmpeg4 && s->pict_type == I_TYPE)
+    if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
         msmpeg4_encode_ext_header(s);
 
     //if (s->gob_number)
--- a/msmpeg4.c	Fri Apr 05 21:04:09 2002 +0000
+++ b/msmpeg4.c	Sat Apr 06 22:29:37 2002 +0000
@@ -802,8 +802,18 @@
 
 int msmpeg4_decode_picture_header(MpegEncContext * s)
 {
-    int code;
+    int code, code2;
 
+#if 0
+{
+int i;
+for(i=0; i<s->gb.size*8; i++)
+    printf("%d", get_bits1(&s->gb));
+//    get_bits1(&s->gb);
+printf("END\n");
+return -1;
+}
+#endif
     s->pict_type = get_bits(&s->gb, 2) + 1;
     if (s->pict_type != I_TYPE &&
         s->pict_type != P_TYPE)
@@ -817,16 +827,34 @@
         if (code < 0x17)
             return -1;
         s->slice_height = s->mb_height / (code - 0x16);
-        if(s->msmpeg4_version==2){
+
+        switch(s->msmpeg4_version){
+        case 2:
             s->rl_chroma_table_index = 2;
             s->rl_table_index = 2;
 
             s->dc_table_index = 0; //not used
-        }else{
+            break;
+        case 3:
             s->rl_chroma_table_index = decode012(&s->gb);
             s->rl_table_index = decode012(&s->gb);
 
             s->dc_table_index = get_bits1(&s->gb);
+            break;
+        case 4:
+            msmpeg4_decode_ext_header(s, 999 /* bufer size (useless here) */);
+            printf("%X\n", show_bits(&s->gb, 24));
+            code= get_bits(&s->gb, 2);
+            if(code==1){
+                code2= get_bits(&s->gb, 3);
+                if(code2==7) skip_bits(&s->gb, 1);
+            }
+            printf("%X\n", show_bits(&s->gb, 24));
+            s->rl_chroma_table_index = 2;
+            s->rl_table_index = 2;
+
+            s->dc_table_index = 0;
+            break;
         }
         s->no_rounding = 1;
 /*	printf(" %d %d %d %d     \n", 
@@ -864,6 +892,7 @@
 	    s->no_rounding = 0;
 	}
 //	printf("%d", s->no_rounding);
+//return -1;
     }
     
 #if 0
@@ -1250,6 +1279,7 @@
         i += run;
         if (i >= 64)
             return -1;
+//printf("RL:%d %d %d ", run, level, last);
 	j = scan_table[i];
         block[j] = level;
         i++;
--- a/utils.c	Fri Apr 05 21:04:09 2002 +0000
+++ b/utils.c	Sat Apr 06 22:29:37 2002 +0000
@@ -429,6 +429,7 @@
     register_avcodec(&msmpeg4v1_decoder);
     register_avcodec(&msmpeg4v2_decoder);
     register_avcodec(&msmpeg4v3_decoder);
+    register_avcodec(&wmv1_decoder);
     register_avcodec(&mpeg_decoder);
     register_avcodec(&h263i_decoder);
     register_avcodec(&rv10_decoder);