Mercurial > libavcodec.hg
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{ |