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; igb.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);