diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/wmv2.c')
-rw-r--r-- | src/libffmpeg/libavcodec/wmv2.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/src/libffmpeg/libavcodec/wmv2.c b/src/libffmpeg/libavcodec/wmv2.c index 99780f6f4..30812198c 100644 --- a/src/libffmpeg/libavcodec/wmv2.c +++ b/src/libffmpeg/libavcodec/wmv2.c @@ -131,7 +131,10 @@ int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number) w->abt_type=0; w->j_type=0; + assert(s->flipflop_rounding); + if (s->pict_type == I_TYPE) { + assert(s->no_rounding==1); if(w->j_type_bit) put_bits(&s->pb, 1, w->j_type); if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table); @@ -144,7 +147,6 @@ int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number) put_bits(&s->pb, 1, s->dc_table_index); s->inter_intra_pred= 0; - s->no_rounding = 1; }else{ int cbp_index; @@ -181,7 +183,6 @@ int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number) put_bits(&s->pb, 1, s->mv_table_index); s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE); - s->no_rounding ^= 1; } s->esc3_level_length= 0; s->esc3_run_length= 0; @@ -266,20 +267,21 @@ void ff_wmv2_encode_mb(MpegEncContext * s, static void parse_mb_skip(Wmv2Context * w){ int mb_x, mb_y; MpegEncContext * const s= &w->s; + uint32_t * const mb_type= s->current_picture_ptr->mb_type; w->skip_type= get_bits(&s->gb, 2); switch(w->skip_type){ case SKIP_TYPE_NONE: for(mb_y=0; mb_y<s->mb_height; mb_y++){ for(mb_x=0; mb_x<s->mb_width; mb_x++){ - s->mb_type[mb_y*s->mb_width + mb_x]= 0; + mb_type[mb_y*s->mb_stride + mb_x]= MB_TYPE_16x16 | MB_TYPE_L0; } } break; case SKIP_TYPE_MPEG: for(mb_y=0; mb_y<s->mb_height; mb_y++){ for(mb_x=0; mb_x<s->mb_width; mb_x++){ - s->mb_type[mb_y*s->mb_width + mb_x]= get_bits1(&s->gb) ? MB_TYPE_SKIPED : 0; + mb_type[mb_y*s->mb_stride + mb_x]= (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_L0; } } break; @@ -287,11 +289,11 @@ static void parse_mb_skip(Wmv2Context * w){ for(mb_y=0; mb_y<s->mb_height; mb_y++){ if(get_bits1(&s->gb)){ for(mb_x=0; mb_x<s->mb_width; mb_x++){ - s->mb_type[mb_y*s->mb_width + mb_x]= MB_TYPE_SKIPED; + mb_type[mb_y*s->mb_stride + mb_x]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; } }else{ for(mb_x=0; mb_x<s->mb_width; mb_x++){ - s->mb_type[mb_y*s->mb_width + mb_x]= get_bits1(&s->gb) ? MB_TYPE_SKIPED : 0; + mb_type[mb_y*s->mb_stride + mb_x]= (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_L0; } } } @@ -300,11 +302,11 @@ static void parse_mb_skip(Wmv2Context * w){ for(mb_x=0; mb_x<s->mb_width; mb_x++){ if(get_bits1(&s->gb)){ for(mb_y=0; mb_y<s->mb_height; mb_y++){ - s->mb_type[mb_y*s->mb_width + mb_x]= MB_TYPE_SKIPED; + mb_type[mb_y*s->mb_stride + mb_x]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; } }else{ for(mb_y=0; mb_y<s->mb_height; mb_y++){ - s->mb_type[mb_y*s->mb_width + mb_x]= get_bits1(&s->gb) ? MB_TYPE_SKIPED : 0; + mb_type[mb_y*s->mb_stride + mb_x]= (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_L0; } } } @@ -347,7 +349,7 @@ static int decode_ext_header(Wmv2Context *w){ int ff_wmv2_decode_picture_header(MpegEncContext * s) { Wmv2Context * const w= (Wmv2Context*)s; - int code, i; + int code; #if 0 { @@ -368,6 +370,15 @@ return -1; printf("I7:%X/\n", code); } s->qscale = get_bits(&s->gb, 5); + if(s->qscale < 0) + return -1; + + return 0; +} + +int ff_wmv2_decode_secondary_picture_header(MpegEncContext * s) +{ + Wmv2Context * const w= (Wmv2Context*)s; if (s->pict_type == I_TYPE) { if(w->j_type_bit) w->j_type= get_bits1(&s->gb); @@ -454,12 +465,6 @@ return -1; s->esc3_level_length= 0; s->esc3_run_length= 0; - if(s->avctx->debug&FF_DEBUG_SKIP){ - for(i=0; i<s->mb_num; i++){ - if(i%s->mb_width==0) printf("\n"); - printf("%d", s->mb_type[i]); - } - } s->picture_number++; //FIXME ? @@ -711,7 +716,7 @@ static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) if(w->j_type) return 0; if (s->pict_type == P_TYPE) { - if(s->mb_type[s->mb_y * s->mb_width + s->mb_x]&MB_TYPE_SKIPED){ + if(IS_SKIP(s->current_picture.mb_type[s->mb_y * s->mb_stride + s->mb_x])){ /* skip mb */ s->mb_intra = 0; for(i=0;i<6;i++) @@ -721,6 +726,7 @@ static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) s->mv[0][0][0] = 0; s->mv[0][0][1] = 0; s->mb_skiped = 1; + w->hshift=0; return 0; } |