mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2025-01-23 20:34:45 +00:00
wmv1 header parser (unfinished)
Originally committed as revision 380 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
3825cd1d55
commit
e1a9dbffed
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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++;
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user