/** Gain companding: raises gain to the power 1/beta for activity masking. * * @param [in] g real (uncompanded) gain * @param [in] q0 uncompanded quality parameter * @param [in] beta activity masking beta param (exponent) * @return g^(1/beta) */ static od_val32 od_gain_compand(od_val32 g, int q0, od_val16 beta) { #if defined(OD_FLOAT_PVQ) if (beta == 1) return OD_ROUND32(OD_CGAIN_SCALE*g/(double)q0); else { return OD_ROUND32(OD_CGAIN_SCALE*OD_COMPAND_SCALE*pow(g*OD_COMPAND_SCALE_1, 1./beta)/(double)q0); } #else if (beta == OD_BETA(1)) return (OD_CGAIN_SCALE*g + (q0 >> 1))/q0; else {
/* Masking enabled */ { { { 4, 256, OD_LUMA_QM_Q4[OD_MASKING_ENABLED] }, { 4, 256, OD_CHROMA_QM_Q4[OD_MASKING_ENABLED] }, { 4, 256, OD_CHROMA_QM_Q4[OD_MASKING_ENABLED] } }, { { 0, 0, NULL}, { 0, 0, NULL}, { 0, 0, NULL} } } }; /* Constants for the beta parameter, which controls how activity masking is used. beta = 1 / (1 - alpha), so when beta is 1, alpha is 0 and activity masking is disabled. When beta is 1.5, activity masking is used. Note that activity masking is neither used for 4x4 blocks nor for chroma. */ #define OD_BETA(b) OD_QCONST32(b, OD_BETA_SHIFT) static const od_val16 OD_PVQ_BETA4_LUMA[1] = {OD_BETA(1.)}; static const od_val16 OD_PVQ_BETA8_LUMA[4] = {OD_BETA(1.), OD_BETA(1.), OD_BETA(1.), OD_BETA(1.)}; static const od_val16 OD_PVQ_BETA16_LUMA[7] = {OD_BETA(1.), OD_BETA(1.), OD_BETA(1.), OD_BETA(1.), OD_BETA(1.), OD_BETA(1.), OD_BETA(1.)}; static const od_val16 OD_PVQ_BETA32_LUMA[10] = {OD_BETA(1.), OD_BETA(1.), OD_BETA(1.), OD_BETA(1.), OD_BETA(1.), OD_BETA(1.), OD_BETA(1.), OD_BETA(1.), OD_BETA(1.), OD_BETA(1.)}; static const od_val16 OD_PVQ_BETA4_LUMA_MASKING[1] = {OD_BETA(1.)}; static const od_val16 OD_PVQ_BETA8_LUMA_MASKING[4] = {OD_BETA(1.5), OD_BETA(1.5), OD_BETA(1.5), OD_BETA(1.5)}; static const od_val16 OD_PVQ_BETA16_LUMA_MASKING[7] = {OD_BETA(1.5), OD_BETA(1.5), OD_BETA(1.5), OD_BETA(1.5), OD_BETA(1.5), OD_BETA(1.5), OD_BETA(1.5)}; static const od_val16 OD_PVQ_BETA32_LUMA_MASKING[10] = {OD_BETA(1.5),