1 #include <VLIB/P264/p264_Qp.h>
3 // define QP_core_table used to scale p264 4x4 transform coefficients
4 // QP is the quantizer parameter varying from 0 to 51.
5 // p264 rescaling rules :
6 // - luma 4x4 residual block -> use Coeff*QP%6_core_table * 2^(floor(QP/6))
8 // - 4x4 luma DC block -> use Coeff*QP%6_core_table[0] * 2^(floor(QP/6)-2) (Qp>=12)
9 // -> use [Coeff*QP%6_core_table[0] + 2^(1-floor(QP/6)] >> (2-floor(QP/6)) (Qp<12)
11 // - 2x2 chroma DC block -> use Coeff*QP%6_core_table[0] / 2 (Qp<6)
12 // -> use Coeff*QP%6_core_table[0] * 2^(floor(QP/6)-1) (Qp>=6)
14 static uint16_t QP_core_table[6][16] = {
15 // QP0 : Qstep0 * Si (* 2^6)
22 // QP1 : Qstep1 * Si (* 2^6)
29 // QP2 : Qstep2 * Si (* 2^6)
36 // QP3 : Qstep3 * Si (* 2^6)
43 // QP4 : Qstep4 * Si (* 2^6)
50 // QP5 : Qstep5 * Si (* 2^6)
60 void p264_4x4_residual_scale(int16_t* in, int16_t* out, uint32_t Qp)
61 // validate for several Qp on one value block
64 // - luma 4x4 residual block -> use Coeff*QP%6_core_table * 2^(floor(QP/6))
65 uint32_t shift = Qp/6;
66 uint16_t* p_Qp_core_table = QP_core_table[Qp%6];
71 *out++ = (((int32_t)(*in++))*((int32_t)*p_Qp_core_table++))<<shift;
75 void p264_2x2_chromaDC_scale(int16_t* in, int16_t* out, uint32_t Qp)
76 // validate for several Qp on one value block
78 // in and out could be the same
79 // - 2x2 chroma DC block -> use Coeff*QP%6_core_table[0] / 2 (Qp<6)
80 // -> use Coeff*QP%6_core_table[0] * 2^(floor(QP/6)-1) (Qp>=6)
81 uint32_t shift = Qp/6-1;
82 uint32_t scale = QP_core_table[Qp%6][0];
85 *out++ = (((int32_t)(*in++))*scale)>>1;
86 *out++ = (((int32_t)(*in++))*scale)>>1;
87 *out++ = (((int32_t)(*in++))*scale)>>1;
88 *out++ = (((int32_t)(*in++))*scale)>>1;
92 *out++ = (((int32_t)(*in++))*scale)<<shift;
93 *out++ = (((int32_t)(*in++))*scale)<<shift;
94 *out++ = (((int32_t)(*in++))*scale)<<shift;
95 *out++ = (((int32_t)(*in++))*scale)<<shift;
99 void p264_4x4_lumaDC_scale(int16_t* in, int16_t* out, uint32_t Qp)
101 // - 4x4 luma DC block -> use Coeff*QP%6_core_table[0] * 2^(floor(QP/6)-2) (Qp>=12)
102 // -> use [Coeff*QP%6_core_table[0] + 2^(1-floor(QP/6)] >> (2-floor(QP/6)) (Qp<12)
105 uint32_t scale = QP_core_table[Qp%6][0];
109 // [QP%6_core_table[0] + 2^(1-floor(QP/6)] >> (2-floor(QP/6))
114 *out++ = (((int32_t)(*in++))*scale + round )>>shift;
122 *out++ = (((int32_t)(*in++))*scale)<<shift;