--- quant_mpeg.c 2003/10/07 13:02:35 1.1.2.1 +++ quant_mpeg.c 2008/11/26 02:21:02 1.5 @@ -19,7 +19,7 @@ * along with this program ; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: quant_mpeg.c,v 1.1.2.1 2003/10/07 13:02:35 edgomez Exp $ + * $Id: quant_mpeg.c,v 1.5 2008/11/26 02:21:02 Isibaar Exp $ * ****************************************************************************/ @@ -43,13 +43,9 @@ * Local data ****************************************************************************/ -#define VM18P 3 -#define VM18Q 4 - /* divide-by-multiply table * needs 17 bit shift (16 causes slight errors when q > 19) */ -#define SCALEBITS 17 #define FIX(X) ((1UL << SCALEBITS) / (X) + 1) static const uint32_t multipliers[32] = @@ -69,48 +65,29 @@ ****************************************************************************/ /* quantize intra-block - * - * const int32_t quantd = DIV_DIV(VM18P*quant, VM18Q); - * level = DIV_DIV(16 * data[i], default_intra_matrix[i]); - * coeff[i] = (level + quantd) / quant2; */ uint32_t quant_mpeg_intra_c(int16_t * coeff, const int16_t * data, const uint32_t quant, - const uint32_t dcscalar) + const uint32_t dcscalar, + const uint16_t * mpeg_quant_matrices) { - const uint32_t quantd = ((VM18P * quant) + (VM18Q / 2)) / VM18Q; - const uint32_t mult = multipliers[quant]; - const int16_t *intra_matrix = get_intra_matrix(); - uint32_t sum = 0; + const uint16_t * intra_matrix_rec = mpeg_quant_matrices + 1*64; int i; + int rounding = 1<<(SCALEBITS-1-3); coeff[0] = DIV_DIV(data[0], (int32_t) dcscalar); - sum += coeff[0]; - + for (i = 1; i < 64; i++) { - if (data[i] < 0) { - uint32_t level = -data[i]; - - level = ((level << 4) + (intra_matrix[i] >> 1)) / intra_matrix[i]; - level = ((level + quantd) * mult) >> SCALEBITS; - sum += level; - coeff[i] = -(int16_t) level; - } else if (data[i] > 0) { - uint32_t level = data[i]; - - level = ((level << 4) + (intra_matrix[i] >> 1)) / intra_matrix[i]; - level = ((level + quantd) * mult) >> SCALEBITS; - sum += level; - coeff[i] = level; - } else { - coeff[i] = 0; - } + int32_t level = data[i]; + level *= intra_matrix_rec[i]; + level = (level + rounding)>>(SCALEBITS-3); + coeff[i] = level; } - return(sum); + return(0); } /* quantize inter-block @@ -123,10 +100,11 @@ uint32_t quant_mpeg_inter_c(int16_t * coeff, const int16_t * data, - const uint32_t quant) + const uint32_t quant, + const uint16_t * mpeg_quant_matrices) { const uint32_t mult = multipliers[quant]; - const int16_t *inter_matrix = get_inter_matrix(); + const uint16_t *inter_matrix = get_inter_matrix(mpeg_quant_matrices); uint32_t sum = 0; int i; @@ -162,9 +140,10 @@ dequant_mpeg_intra_c(int16_t * data, const int16_t * coeff, const uint32_t quant, - const uint32_t dcscalar) + const uint32_t dcscalar, + const uint16_t * mpeg_quant_matrices) { - const int16_t *intra_matrix = get_intra_matrix(); + const uint16_t *intra_matrix = get_intra_matrix(mpeg_quant_matrices); int i; data[0] = coeff[0] * dcscalar; @@ -201,10 +180,11 @@ uint32_t dequant_mpeg_inter_c(int16_t * data, const int16_t * coeff, - const uint32_t quant) + const uint32_t quant, + const uint16_t * mpeg_quant_matrices) { uint32_t sum = 0; - const int16_t *inter_matrix = get_inter_matrix(); + const uint16_t *inter_matrix = get_inter_matrix(mpeg_quant_matrices); int i; for (i = 0; i < 64; i++) {