Mercurial > libavcodec.hg
comparison h263.c @ 575:23eee7d73c4b libavcodec
minor optimizations
fixing numbers.avi
fixing ac prediction between MBs with different QP
author | michaelni |
---|---|
date | Sun, 21 Jul 2002 01:34:05 +0000 |
parents | 5329d156177a |
children | 5132a4ee50cd |
comparison
equal
deleted
inserted
replaced
574:c9b17c1a02e0 | 575:23eee7d73c4b |
---|---|
55 static int h263p_decode_umotion(MpegEncContext * s, int pred); | 55 static int h263p_decode_umotion(MpegEncContext * s, int pred); |
56 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, | 56 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
57 int n, int coded); | 57 int n, int coded); |
58 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); | 58 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); |
59 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | 59 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
60 int n, int coded); | 60 int n, int coded, int intra); |
61 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr); | 61 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr); |
62 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, | 62 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, |
63 int dir); | 63 int dir); |
64 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s); | 64 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s); |
65 | 65 |
1412 /* find prediction */ | 1412 /* find prediction */ |
1413 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | 1413 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
1414 ac_val1 = ac_val; | 1414 ac_val1 = ac_val; |
1415 if (s->ac_pred) { | 1415 if (s->ac_pred) { |
1416 if (dir == 0) { | 1416 if (dir == 0) { |
1417 const int xy= s->mb_x-1 + s->mb_y*s->mb_width; | |
1417 /* left prediction */ | 1418 /* left prediction */ |
1418 ac_val -= 16; | 1419 ac_val -= 16; |
1419 for(i=1;i<8;i++) { | 1420 |
1420 block[block_permute_op(i*8)] += ac_val[i]; | 1421 if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){ |
1422 /* same qscale */ | |
1423 for(i=1;i<8;i++) { | |
1424 block[block_permute_op(i*8)] += ac_val[i]; | |
1425 } | |
1426 }else{ | |
1427 /* different qscale, we must rescale */ | |
1428 for(i=1;i<8;i++) { | |
1429 block[block_permute_op(i*8)] += ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale); | |
1430 } | |
1421 } | 1431 } |
1422 } else { | 1432 } else { |
1433 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width; | |
1423 /* top prediction */ | 1434 /* top prediction */ |
1424 ac_val -= 16 * s->block_wrap[n]; | 1435 ac_val -= 16 * s->block_wrap[n]; |
1425 for(i=1;i<8;i++) { | 1436 |
1426 block[block_permute_op(i)] += ac_val[i + 8]; | 1437 if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){ |
1438 /* same qscale */ | |
1439 for(i=1;i<8;i++) { | |
1440 block[block_permute_op(i)] += ac_val[i + 8]; | |
1441 } | |
1442 }else{ | |
1443 /* different qscale, we must rescale */ | |
1444 for(i=1;i<8;i++) { | |
1445 block[block_permute_op(i)] += ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale); | |
1446 } | |
1427 } | 1447 } |
1428 } | 1448 } |
1429 } | 1449 } |
1430 /* left copy */ | 1450 /* left copy */ |
1431 for(i=1;i<8;i++) | 1451 for(i=1;i<8;i++) |
2342 }else if(s->mb_intra && s->decoding_error!=DECODING_ACDC_LOST){ | 2362 }else if(s->mb_intra && s->decoding_error!=DECODING_ACDC_LOST){ |
2343 s->ac_pred = s->pred_dir_table[xy]>>7; | 2363 s->ac_pred = s->pred_dir_table[xy]>>7; |
2344 | 2364 |
2345 /* decode each block */ | 2365 /* decode each block */ |
2346 for (i = 0; i < 6; i++) { | 2366 for (i = 0; i < 6; i++) { |
2347 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1); | 2367 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1); |
2348 if(ret==DECODING_AC_LOST){ | 2368 if(ret==DECODING_AC_LOST){ |
2349 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y); | 2369 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y); |
2350 s->decoding_error=DECODING_AC_LOST; | 2370 s->decoding_error=DECODING_AC_LOST; |
2351 cbp=0; | 2371 cbp=0; |
2352 }else if(ret==DECODING_ACDC_LOST){ | 2372 }else if(ret==DECODING_ACDC_LOST){ |
2365 s->mv_type = MV_TYPE_16X16; | 2385 s->mv_type = MV_TYPE_16X16; |
2366 } | 2386 } |
2367 if(s->decoding_error==0 && cbp){ | 2387 if(s->decoding_error==0 && cbp){ |
2368 /* decode each block */ | 2388 /* decode each block */ |
2369 for (i = 0; i < 6; i++) { | 2389 for (i = 0; i < 6; i++) { |
2370 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1); | 2390 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 0); |
2371 if(ret==DECODING_AC_LOST){ | 2391 if(ret==DECODING_AC_LOST){ |
2372 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y); | 2392 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y); |
2373 s->decoding_error=DECODING_AC_LOST; | 2393 s->decoding_error=DECODING_AC_LOST; |
2374 break; | 2394 break; |
2375 } | 2395 } |
2381 s->mb_intra = 1; | 2401 s->mb_intra = 1; |
2382 s->ac_pred = s->pred_dir_table[xy]>>7; | 2402 s->ac_pred = s->pred_dir_table[xy]>>7; |
2383 | 2403 |
2384 /* decode each block */ | 2404 /* decode each block */ |
2385 for (i = 0; i < 6; i++) { | 2405 for (i = 0; i < 6; i++) { |
2386 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1); | 2406 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1); |
2387 if(ret==DECODING_AC_LOST){ | 2407 if(ret==DECODING_AC_LOST){ |
2388 fprintf(stderr, "texture corrupted at %d %d (trying to continue with dc only)\n", s->mb_x, s->mb_y); | 2408 fprintf(stderr, "texture corrupted at %d %d (trying to continue with dc only)\n", s->mb_x, s->mb_y); |
2389 s->decoding_error=DECODING_AC_LOST; | 2409 s->decoding_error=DECODING_AC_LOST; |
2390 cbp=0; | 2410 cbp=0; |
2391 }else if(ret==DECODING_ACDC_LOST){ | 2411 }else if(ret==DECODING_ACDC_LOST){ |
2695 s->qscale = 1; | 2715 s->qscale = 1; |
2696 else if (s->qscale > 31) | 2716 else if (s->qscale > 31) |
2697 s->qscale = 31; | 2717 s->qscale = 31; |
2698 h263_dc_scale(s); | 2718 h263_dc_scale(s); |
2699 } | 2719 } |
2720 | |
2721 /* decode each block */ | |
2722 if (s->h263_pred) { | |
2723 for (i = 0; i < 6; i++) { | |
2724 if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1) < 0) | |
2725 return -1; | |
2726 } | |
2727 } else { | |
2728 for (i = 0; i < 6; i++) { | |
2729 if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) | |
2730 return -1; | |
2731 } | |
2732 } | |
2733 return 0; | |
2700 } | 2734 } |
2701 | 2735 |
2702 /* decode each block */ | 2736 /* decode each block */ |
2703 if (s->h263_pred) { | 2737 if (s->h263_pred) { |
2704 for (i = 0; i < 6; i++) { | 2738 for (i = 0; i < 6; i++) { |
2705 if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) | 2739 if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 0) < 0) |
2706 return -1; | 2740 return -1; |
2707 } | 2741 } |
2708 } else { | 2742 } else { |
2709 for (i = 0; i < 6; i++) { | 2743 for (i = 0; i < 6; i++) { |
2710 if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) | 2744 if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) |
2711 return -1; | 2745 return -1; |
2712 } | 2746 } |
2713 } | 2747 } |
2714 return 0; | 2748 return 0; |
2715 } | 2749 } |
2716 | 2750 |
2717 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code) | 2751 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code) |
2913 * returns 0 if everything went ok | 2947 * returns 0 if everything went ok |
2914 * returns DECODING_AC_LOST if an error was detected during AC decoding | 2948 * returns DECODING_AC_LOST if an error was detected during AC decoding |
2915 * returns DECODING_ACDC_LOST if an error was detected during DC decoding | 2949 * returns DECODING_ACDC_LOST if an error was detected during DC decoding |
2916 */ | 2950 */ |
2917 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | 2951 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
2918 int n, int coded) | 2952 int n, int coded, int intra) |
2919 { | 2953 { |
2920 int level, i, last, run; | 2954 int level, i, last, run; |
2921 int dc_pred_dir; | 2955 int dc_pred_dir; |
2922 RLTable *rl; | 2956 RLTable * rl; |
2923 RL_VLC_ELEM *rl_vlc; | 2957 RL_VLC_ELEM * rl_vlc; |
2924 const UINT8 *scan_table; | 2958 const UINT8 * scan_table; |
2925 int qmul, qadd; | 2959 int qmul, qadd; |
2926 | 2960 |
2927 if (s->mb_intra) { | 2961 if(intra) { |
2928 /* DC coef */ | 2962 /* DC coef */ |
2929 if(s->data_partitioning && s->pict_type!=B_TYPE){ | 2963 if(s->data_partitioning && s->pict_type!=B_TYPE){ |
2930 level = s->dc_val[0][ s->block_index[n] ]; | 2964 level = s->dc_val[0][ s->block_index[n] ]; |
2931 if(n<4) level= (level + (s->y_dc_scale>>1))/s->y_dc_scale; //FIXME optimizs | 2965 if(n<4) level= (level + (s->y_dc_scale>>1))/s->y_dc_scale; //FIXME optimizs |
2932 else level= (level + (s->c_dc_scale>>1))/s->c_dc_scale; | 2966 else level= (level + (s->c_dc_scale>>1))/s->c_dc_scale; |
3659 s->new_pred=0; | 3693 s->new_pred=0; |
3660 s->reduced_res_vop= 0; | 3694 s->reduced_res_vop= 0; |
3661 } | 3695 } |
3662 | 3696 |
3663 s->scalability= get_bits1(&s->gb); | 3697 s->scalability= get_bits1(&s->gb); |
3698 if(s->workaround_bugs==1) s->scalability=0; | |
3664 if (s->scalability) { | 3699 if (s->scalability) { |
3700 int dummy= s->hierachy_type= get_bits1(&s->gb); | |
3701 int ref_layer_id= get_bits(&s->gb, 4); | |
3702 int ref_layer_sampling_dir= get_bits1(&s->gb); | |
3703 int h_sampling_factor_n= get_bits(&s->gb, 5); | |
3704 int h_sampling_factor_m= get_bits(&s->gb, 5); | |
3705 int v_sampling_factor_n= get_bits(&s->gb, 5); | |
3706 int v_sampling_factor_m= get_bits(&s->gb, 5); | |
3707 s->enhancement_type= get_bits1(&s->gb); | |
3708 // bin shape stuff FIXME | |
3665 printf("scalability not supported\n"); | 3709 printf("scalability not supported\n"); |
3666 } | 3710 } |
3667 } | 3711 } |
3668 //printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7); | 3712 //printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7); |
3669 goto redo; | 3713 goto redo; |
3815 //printf("quant:%d fcode:%d bcode:%d type:%d\n", s->qscale, s->f_code, s->b_code, s->pict_type); | 3859 //printf("quant:%d fcode:%d bcode:%d type:%d\n", s->qscale, s->f_code, s->b_code, s->pict_type); |
3816 if(!s->scalability){ | 3860 if(!s->scalability){ |
3817 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) { | 3861 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) { |
3818 skip_bits1(&s->gb); // vop shape coding type | 3862 skip_bits1(&s->gb); // vop shape coding type |
3819 } | 3863 } |
3864 }else{ | |
3865 if(s->enhancement_type){ | |
3866 int load_backward_shape= get_bits1(&s->gb); | |
3867 if(load_backward_shape){ | |
3868 printf("load backward shape isnt supported\n"); | |
3869 } | |
3870 } | |
3871 skip_bits(&s->gb, 2); //ref_select_code | |
3820 } | 3872 } |
3821 } | 3873 } |
3822 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/ | 3874 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/ |
3823 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too) | 3875 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too) |
3824 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){ | 3876 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){ |