Originally committed as revision 380 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
| @@ -17,6 +17,7 @@ enum CodecID { | |||||
| CODEC_ID_MSMPEG4V1, | CODEC_ID_MSMPEG4V1, | ||||
| CODEC_ID_MSMPEG4V2, | CODEC_ID_MSMPEG4V2, | ||||
| CODEC_ID_MSMPEG4V3, | CODEC_ID_MSMPEG4V3, | ||||
| CODEC_ID_WMV1, | |||||
| CODEC_ID_H263P, | CODEC_ID_H263P, | ||||
| CODEC_ID_H263I, | CODEC_ID_H263I, | ||||
| @@ -212,6 +213,7 @@ extern AVCodec mpeg4_decoder; | |||||
| extern AVCodec msmpeg4v1_decoder; | extern AVCodec msmpeg4v1_decoder; | ||||
| extern AVCodec msmpeg4v2_decoder; | extern AVCodec msmpeg4v2_decoder; | ||||
| extern AVCodec msmpeg4v3_decoder; | extern AVCodec msmpeg4v3_decoder; | ||||
| extern AVCodec wmv1_decoder; | |||||
| extern AVCodec mpeg_decoder; | extern AVCodec mpeg_decoder; | ||||
| extern AVCodec h263i_decoder; | extern AVCodec h263i_decoder; | ||||
| extern AVCodec rv10_decoder; | extern AVCodec rv10_decoder; | ||||
| @@ -62,6 +62,11 @@ static int h263_decode_init(AVCodecContext *avctx) | |||||
| s->h263_pred = 1; | s->h263_pred = 1; | ||||
| s->msmpeg4_version=3; | s->msmpeg4_version=3; | ||||
| break; | break; | ||||
| case CODEC_ID_WMV1: | |||||
| s->h263_msmpeg4 = 1; | |||||
| s->h263_pred = 1; | |||||
| s->msmpeg4_version=4; | |||||
| break; | |||||
| case CODEC_ID_H263I: | case CODEC_ID_H263I: | ||||
| s->h263_intel = 1; | s->h263_intel = 1; | ||||
| break; | 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; | if(msmpeg4_decode_ext_header(s, buf_size) < 0) return -1; | ||||
| MPV_frame_end(s); | MPV_frame_end(s); | ||||
| @@ -322,6 +327,18 @@ AVCodec msmpeg4v3_decoder = { | |||||
| CODEC_CAP_DRAW_HORIZ_BAND, | 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 = { | AVCodec h263i_decoder = { | ||||
| "h263i", | "h263i", | ||||
| CODEC_TYPE_VIDEO, | CODEC_TYPE_VIDEO, | ||||
| @@ -1652,7 +1652,7 @@ static void encode_picture(MpegEncContext *s, int picture_number) | |||||
| } | } | ||||
| emms_c(); | 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); | msmpeg4_encode_ext_header(s); | ||||
| //if (s->gob_number) | //if (s->gob_number) | ||||
| @@ -802,8 +802,18 @@ static int decode012(GetBitContext *gb) | |||||
| int msmpeg4_decode_picture_header(MpegEncContext * s) | 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; | s->pict_type = get_bits(&s->gb, 2) + 1; | ||||
| if (s->pict_type != I_TYPE && | if (s->pict_type != I_TYPE && | ||||
| s->pict_type != P_TYPE) | s->pict_type != P_TYPE) | ||||
| @@ -817,16 +827,34 @@ int msmpeg4_decode_picture_header(MpegEncContext * s) | |||||
| if (code < 0x17) | if (code < 0x17) | ||||
| return -1; | return -1; | ||||
| s->slice_height = s->mb_height / (code - 0x16); | 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_chroma_table_index = 2; | ||||
| s->rl_table_index = 2; | s->rl_table_index = 2; | ||||
| s->dc_table_index = 0; //not used | s->dc_table_index = 0; //not used | ||||
| }else{ | |||||
| break; | |||||
| case 3: | |||||
| s->rl_chroma_table_index = decode012(&s->gb); | s->rl_chroma_table_index = decode012(&s->gb); | ||||
| s->rl_table_index = decode012(&s->gb); | s->rl_table_index = decode012(&s->gb); | ||||
| s->dc_table_index = get_bits1(&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; | s->no_rounding = 1; | ||||
| /* printf(" %d %d %d %d \n", | /* printf(" %d %d %d %d \n", | ||||
| @@ -864,6 +892,7 @@ int msmpeg4_decode_picture_header(MpegEncContext * s) | |||||
| s->no_rounding = 0; | s->no_rounding = 0; | ||||
| } | } | ||||
| // printf("%d", s->no_rounding); | // printf("%d", s->no_rounding); | ||||
| //return -1; | |||||
| } | } | ||||
| #if 0 | #if 0 | ||||
| @@ -1250,6 +1279,7 @@ static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | |||||
| i += run; | i += run; | ||||
| if (i >= 64) | if (i >= 64) | ||||
| return -1; | return -1; | ||||
| //printf("RL:%d %d %d ", run, level, last); | |||||
| j = scan_table[i]; | j = scan_table[i]; | ||||
| block[j] = level; | block[j] = level; | ||||
| i++; | i++; | ||||
| @@ -429,6 +429,7 @@ void avcodec_register_all(void) | |||||
| register_avcodec(&msmpeg4v1_decoder); | register_avcodec(&msmpeg4v1_decoder); | ||||
| register_avcodec(&msmpeg4v2_decoder); | register_avcodec(&msmpeg4v2_decoder); | ||||
| register_avcodec(&msmpeg4v3_decoder); | register_avcodec(&msmpeg4v3_decoder); | ||||
| register_avcodec(&wmv1_decoder); | |||||
| register_avcodec(&mpeg_decoder); | register_avcodec(&mpeg_decoder); | ||||
| register_avcodec(&h263i_decoder); | register_avcodec(&h263i_decoder); | ||||
| register_avcodec(&rv10_decoder); | register_avcodec(&rv10_decoder); | ||||