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){