uint32_t dequant_mpeg_intra_c(int16_t * data, const int16_t * coeff, const uint32_t quant, const uint32_t dcscalar, const uint16_t * mpeg_quant_matrices) { const uint16_t *intra_matrix = get_intra_matrix(mpeg_quant_matrices); int i; data[0] = coeff[0] * dcscalar; if (data[0] < -2048) { data[0] = -2048; } else if (data[0] > 2047) { data[0] = 2047; } for (i = 1; i < 64; i++) { if (coeff[i] == 0) { data[i] = 0; } else if (coeff[i] < 0) { uint32_t level = -coeff[i]; level = (level * intra_matrix[i] * quant) >> 3; data[i] = (level <= 2048 ? -(int16_t) level : -2048); } else {
uint32_t dequant_mpeg_intra_altivec_c(int16_t * data, const int16_t * coeff, const uint32_t quant, const uint32_t dcscalar, const uint16_t * mpeg_quant_matrices) { register const uint16_t *intra_matrix = get_intra_matrix(mpeg_quant_matrices); register const int16_t *coeff_ptr = coeff; register int16_t *data_ptr = data; register vec_sint16_t ox00; register vec_sint16_t level; register vec_sint16_t vec_2048; register vec_uint16_t vintra; register vec_uint32_t swap; register vec_uint32_t even,odd; register vec_uint32_t et,ot,t; vec_uint32_t vquant; vector bool short zero_less; vector bool short overflow; #ifdef DEBUG if((long)data & 0xf) fprintf(stderr, "xvidcore: error in dequant_mpeg_intra_altivec_c, incorrect align: %x\n", data); #endif /* Initialize */ ox00 = vec_splat_s16(0); *((uint32_t*)&vquant) = quant; vquant = vec_splat(vquant,0); swap = vec_rl(vquant, vec_splat_u32(-16)); vec_2048 = (vec_sint16_t)vec_rl(vec_splat_u16(8),vec_splat_u16(8)); DEQUANT_MPEG_INTRA(); DEQUANT_MPEG_INTRA(); DEQUANT_MPEG_INTRA(); DEQUANT_MPEG_INTRA(); DEQUANT_MPEG_INTRA(); DEQUANT_MPEG_INTRA(); DEQUANT_MPEG_INTRA(); DEQUANT_MPEG_INTRA(); /* Process the first */ data[0] = coeff[0] * dcscalar; if (data[0] < -2048) { data[0] = -2048; } else if (data[0] > 2047) { data[0] = 2047; } return 0; }
/* dequantize intra-block & clamp to [-2048,2047] * * data[i] = (coeff[i] * default_intra_matrix[i] * quant2) >> 4; */ void dequant_mpeg_intra(int *data, const int *coeff, dword quant, dword dcscalar, const dword *mpeg_quant_matrices) { const dword *intra_matrix = get_intra_matrix(mpeg_quant_matrices); data[0] = coeff[0] * dcscalar; if(data[0] < -2048) { data[0] = -2048; } else if(data[0] > 2047) { data[0] = 2047; } for(int i = 1; i < 64; i++) { if(coeff[i] == 0) { data[i] = 0; } else if(coeff[i] < 0) { int level = -coeff[i]; level = (level * intra_matrix[i] * quant) >> 3; data[i] = (level <= 2048 ? -level : -2048); } else {