# HG changeset patch # User michaelni # Date 1027215245 0 # Node ID 23eee7d73c4b904565cb2f2fe255b9bc81a82d2e # Parent c9b17c1a02e0db066f697a557353bba9728ff176 minor optimizations fixing numbers.avi fixing ac prediction between MBs with different QP diff -r c9b17c1a02e0 -r 23eee7d73c4b h263.c --- a/h263.c Sun Jul 21 00:48:50 2002 +0000 +++ b/h263.c Sun Jul 21 01:34:05 2002 +0000 @@ -57,7 +57,7 @@ int n, int coded); static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, - int n, int coded); + int n, int coded, int intra); static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr); static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, int dir); @@ -1414,16 +1414,36 @@ ac_val1 = ac_val; if (s->ac_pred) { if (dir == 0) { + const int xy= s->mb_x-1 + s->mb_y*s->mb_width; /* left prediction */ ac_val -= 16; - for(i=1;i<8;i++) { - block[block_permute_op(i*8)] += ac_val[i]; + + if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){ + /* same qscale */ + for(i=1;i<8;i++) { + block[block_permute_op(i*8)] += ac_val[i]; + } + }else{ + /* different qscale, we must rescale */ + for(i=1;i<8;i++) { + block[block_permute_op(i*8)] += ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale); + } } } else { + const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width; /* top prediction */ ac_val -= 16 * s->block_wrap[n]; - for(i=1;i<8;i++) { - block[block_permute_op(i)] += ac_val[i + 8]; + + if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){ + /* same qscale */ + for(i=1;i<8;i++) { + block[block_permute_op(i)] += ac_val[i + 8]; + } + }else{ + /* different qscale, we must rescale */ + for(i=1;i<8;i++) { + block[block_permute_op(i)] += ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale); + } } } } @@ -2344,7 +2364,7 @@ /* decode each block */ for (i = 0; i < 6; i++) { - int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1); + int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1); if(ret==DECODING_AC_LOST){ fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y); s->decoding_error=DECODING_AC_LOST; @@ -2367,7 +2387,7 @@ if(s->decoding_error==0 && cbp){ /* decode each block */ for (i = 0; i < 6; i++) { - int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1); + int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 0); if(ret==DECODING_AC_LOST){ fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y); s->decoding_error=DECODING_AC_LOST; @@ -2383,7 +2403,7 @@ /* decode each block */ for (i = 0; i < 6; i++) { - int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1); + int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1); if(ret==DECODING_AC_LOST){ fprintf(stderr, "texture corrupted at %d %d (trying to continue with dc only)\n", s->mb_x, s->mb_y); s->decoding_error=DECODING_AC_LOST; @@ -2697,19 +2717,33 @@ s->qscale = 31; h263_dc_scale(s); } + + /* decode each block */ + if (s->h263_pred) { + for (i = 0; i < 6; i++) { + if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1) < 0) + return -1; + } + } else { + for (i = 0; i < 6; i++) { + if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) + return -1; + } + } + return 0; } /* decode each block */ if (s->h263_pred) { - for (i = 0; i < 6; i++) { - if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) + for (i = 0; i < 6; i++) { + if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 0) < 0) return -1; - } + } } else { - for (i = 0; i < 6; i++) { - if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) + for (i = 0; i < 6; i++) { + if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) return -1; - } + } } return 0; } @@ -2915,16 +2949,16 @@ * returns DECODING_ACDC_LOST if an error was detected during DC decoding */ static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, - int n, int coded) + int n, int coded, int intra) { int level, i, last, run; int dc_pred_dir; - RLTable *rl; - RL_VLC_ELEM *rl_vlc; - const UINT8 *scan_table; + RLTable * rl; + RL_VLC_ELEM * rl_vlc; + const UINT8 * scan_table; int qmul, qadd; - if (s->mb_intra) { + if(intra) { /* DC coef */ if(s->data_partitioning && s->pict_type!=B_TYPE){ level = s->dc_val[0][ s->block_index[n] ]; @@ -3661,7 +3695,17 @@ } s->scalability= get_bits1(&s->gb); + if(s->workaround_bugs==1) s->scalability=0; if (s->scalability) { + int dummy= s->hierachy_type= get_bits1(&s->gb); + int ref_layer_id= get_bits(&s->gb, 4); + int ref_layer_sampling_dir= get_bits1(&s->gb); + int h_sampling_factor_n= get_bits(&s->gb, 5); + int h_sampling_factor_m= get_bits(&s->gb, 5); + int v_sampling_factor_n= get_bits(&s->gb, 5); + int v_sampling_factor_m= get_bits(&s->gb, 5); + s->enhancement_type= get_bits1(&s->gb); + // bin shape stuff FIXME printf("scalability not supported\n"); } } @@ -3817,6 +3861,14 @@ if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) { skip_bits1(&s->gb); // vop shape coding type } + }else{ + if(s->enhancement_type){ + int load_backward_shape= get_bits1(&s->gb); + if(load_backward_shape){ + printf("load backward shape isnt supported\n"); + } + } + skip_bits(&s->gb, 2); //ref_select_code } } /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/ diff -r c9b17c1a02e0 -r 23eee7d73c4b mpegvideo.c --- a/mpegvideo.c Sun Jul 21 00:48:50 2002 +0000 +++ b/mpegvideo.c Sun Jul 21 01:34:05 2002 +0000 @@ -270,9 +270,9 @@ /* cbp, ac_pred, pred_dir */ CHECKED_ALLOCZ(s->cbp_table , s->mb_num * sizeof(UINT8)) CHECKED_ALLOCZ(s->pred_dir_table, s->mb_num * sizeof(UINT8)) - - CHECKED_ALLOCZ(s->qscale_table , s->mb_num * sizeof(UINT8)) } + CHECKED_ALLOCZ(s->qscale_table , s->mb_num * sizeof(UINT8)) + /* default structure is frame */ s->picture_structure = PICT_FRAME; @@ -1414,8 +1414,10 @@ quant_store[mb_y][mb_x]=s->qscale; //printf("[%02d][%02d] %d\n",mb_x,mb_y,s->qscale); #else + /* even more obsolete, exists for mplayer xp only */ if(s->avctx->quant_store) s->avctx->quant_store[mb_y*s->avctx->qstride+mb_x] = s->qscale; #endif + s->qscale_table[mb_xy]= s->qscale; /* update DC predictors for P macroblocks */ if (!s->mb_intra) {