summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2002-04-06 22:29:37 +0000
committerMichael Niedermayer <michaelni@gmx.at>2002-04-06 22:29:37 +0000
commite1a9dbffed0b9d087d9f062ee61c493dd262caba (patch)
tree107b114bfedd9400110cddb2f15662e29bedbaf4
parent3825cd1d55950929e22a6bc1b41e92d083b0d598 (diff)
wmv1 header parser (unfinished)
Originally committed as revision 380 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/avcodec.h2
-rw-r--r--libavcodec/h263dec.c19
-rw-r--r--libavcodec/mpegvideo.c2
-rw-r--r--libavcodec/msmpeg4.c36
-rw-r--r--libavcodec/utils.c1
5 files changed, 55 insertions, 5 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 41bd49eff5..499cff7cff 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -17,6 +17,7 @@ enum CodecID {
CODEC_ID_MSMPEG4V1,
CODEC_ID_MSMPEG4V2,
CODEC_ID_MSMPEG4V3,
+ CODEC_ID_WMV1,
CODEC_ID_H263P,
CODEC_ID_H263I,
@@ -212,6 +213,7 @@ extern AVCodec mpeg4_decoder;
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;
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index 50440d18a8..5a3d331865 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -62,6 +62,11 @@ static int h263_decode_init(AVCodecContext *avctx)
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 @@ static int h263_decode_frame(AVCodecContext *avctx,
}
}
- 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 @@ AVCodec msmpeg4v3_decoder = {
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,
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 521e06f902..f35483e3a1 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -1652,7 +1652,7 @@ static void encode_picture(MpegEncContext *s, int picture_number)
}
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)
diff --git a/libavcodec/msmpeg4.c b/libavcodec/msmpeg4.c
index 66fc5255e4..188e2302f6 100644
--- a/libavcodec/msmpeg4.c
+++ b/libavcodec/msmpeg4.c
@@ -802,8 +802,18 @@ static int decode012(GetBitContext *gb)
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 @@ int msmpeg4_decode_picture_header(MpegEncContext * s)
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 @@ int msmpeg4_decode_picture_header(MpegEncContext * s)
s->no_rounding = 0;
}
// printf("%d", s->no_rounding);
+//return -1;
}
#if 0
@@ -1250,6 +1279,7 @@ static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
i += run;
if (i >= 64)
return -1;
+//printf("RL:%d %d %d ", run, level, last);
j = scan_table[i];
block[j] = level;
i++;
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index c0f640591a..9a4abaa9ba 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -429,6 +429,7 @@ void avcodec_register_all(void)
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);