comparison mpegvideo.c @ 635:3e0f62e5eed6 libavcodec

dct cleanup more accurate mmx dct (dont discard bits for fun) fixing mmx quantizer bug for qscale%2==1 (bias was slightly wrong)
author michaelni
date Sun, 01 Sep 2002 16:52:33 +0000
parents f596db4aa871
children ef4a33aad86e
comparison
equal deleted inserted replaced
634:be1cb0e1f276 635:3e0f62e5eed6
88 /* 16 <= qscale * quant_matrix[i] <= 7905 */ 88 /* 16 <= qscale * quant_matrix[i] <= 7905 */
89 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */ 89 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
90 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */ 90 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
91 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */ 91 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
92 92
93 qmat[qscale][j] = (int)((UINT64_C(1) << (QMAT_SHIFT-3)) / 93 qmat[qscale][j] = (int)((UINT64_C(1) << QMAT_SHIFT) /
94 (qscale * quant_matrix[j])); 94 (qscale * quant_matrix[j]));
95 } 95 }
96 } else if (s->fdct == fdct_ifast) { 96 } else if (s->fdct == fdct_ifast) {
97 for(i=0;i<64;i++) { 97 for(i=0;i<64;i++) {
98 const int j= block_permute_op(i); 98 const int j= block_permute_op(i);
99 /* 16 <= qscale * quant_matrix[i] <= 7905 */ 99 /* 16 <= qscale * quant_matrix[i] <= 7905 */
100 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */ 100 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
101 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */ 101 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
102 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */ 102 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
103 103
104 qmat[qscale][j] = (int)((UINT64_C(1) << (QMAT_SHIFT + 11)) / 104 qmat[qscale][j] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) /
105 (aanscales[i] * qscale * quant_matrix[j])); 105 (aanscales[i] * qscale * quant_matrix[j]));
106 } 106 }
107 } else { 107 } else {
108 for(i=0;i<64;i++) { 108 for(i=0;i<64;i++) {
109 /* We can safely suppose that 16 <= quant_matrix[i] <= 255 109 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
113 */ 113 */
114 qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]); 114 qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
115 qmat16[qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[block_permute_op(i)]); 115 qmat16[qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[block_permute_op(i)]);
116 116
117 if(qmat16[qscale][i]==0 || qmat16[qscale][i]==128*256) qmat16[qscale][i]=128*256-1; 117 if(qmat16[qscale][i]==0 || qmat16[qscale][i]==128*256) qmat16[qscale][i]=128*256-1;
118
119 qmat16_bias[qscale][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][i]); 118 qmat16_bias[qscale][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][i]);
120 } 119 }
121 } 120 }
122 } 121 }
123 } 122 }
2485 /* note: block[0] is assumed to be positive */ 2484 /* note: block[0] is assumed to be positive */
2486 block[0] = (block[0] + (q >> 1)) / q; 2485 block[0] = (block[0] + (q >> 1)) / q;
2487 i = 1; 2486 i = 1;
2488 last_non_zero = 0; 2487 last_non_zero = 0;
2489 qmat = s->q_intra_matrix[qscale]; 2488 qmat = s->q_intra_matrix[qscale];
2490 bias= s->intra_quant_bias<<(QMAT_SHIFT - 3 - QUANT_BIAS_SHIFT); 2489 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
2491 } else { 2490 } else {
2492 i = 0; 2491 i = 0;
2493 last_non_zero = -1; 2492 last_non_zero = -1;
2494 qmat = s->q_inter_matrix[qscale]; 2493 qmat = s->q_inter_matrix[qscale];
2495 bias= s->inter_quant_bias<<(QMAT_SHIFT - 3 - QUANT_BIAS_SHIFT); 2494 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
2496 } 2495 }
2497 threshold1= (1<<(QMAT_SHIFT - 3)) - bias - 1; 2496 threshold1= (1<<QMAT_SHIFT) - bias - 1;
2498 threshold2= threshold1<<1; 2497 threshold2= (threshold1<<1);
2499 2498
2500 for(;i<64;i++) { 2499 for(;i<64;i++) {
2501 j = zigzag_direct[i]; 2500 j = zigzag_direct[i];
2502 level = block[j]; 2501 level = block[j];
2503 level = level * qmat[j]; 2502 level = level * qmat[j];
2504 2503
2505 // if( bias+level >= (1<<(QMAT_SHIFT - 3)) 2504 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
2506 // || bias-level >= (1<<(QMAT_SHIFT - 3))){ 2505 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
2507 if(((unsigned)(level+threshold1))>threshold2){ 2506 if(((unsigned)(level+threshold1))>threshold2){
2508 if(level>0){ 2507 if(level>0){
2509 level= (bias + level)>>(QMAT_SHIFT - 3); 2508 level= (bias + level)>>QMAT_SHIFT;
2510 block[j]= level; 2509 block[j]= level;
2511 }else{ 2510 }else{
2512 level= (bias - level)>>(QMAT_SHIFT - 3); 2511 level= (bias - level)>>QMAT_SHIFT;
2513 block[j]= -level; 2512 block[j]= -level;
2514 } 2513 }
2515 max |=level; 2514 max |=level;
2516 last_non_zero = i; 2515 last_non_zero = i;
2517 }else{ 2516 }else{