wmv1 header parser (unfinished)

Originally committed as revision 380 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Michael Niedermayer 23 years ago
parent 3825cd1d55
commit e1a9dbffed
  1. 2
      libavcodec/avcodec.h
  2. 19
      libavcodec/h263dec.c
  3. 2
      libavcodec/mpegvideo.c
  4. 36
      libavcodec/msmpeg4.c
  5. 1
      libavcodec/utils.c

@ -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…
Cancel
Save