H264解析Demo10变换量化_2_反量化
Posted 叮咚咕噜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H264解析Demo10变换量化_2_反量化相关的知识,希望对你有一定的参考价值。
获取量化参数QP
pps中的qp值+slice header中qp值+mb中qp值:
m_mb_qp_delta = Get_sev_code_num(m_pSODB, m_bypeOffset, m_bitOffset);
m_mb_qp = m_pps_active->Get_pic_init_qp() + m_slice->m_sliceHeader->Get_slice_qp_delta() + m_mb_qp_delta;
定义
根据前面我们已经知道反量化操作是通过一个预定义的矩阵实现的:
const int dequant_coef[6][4][4] = {
{ { 10, 13, 10, 13 },{ 13, 16, 13, 16 },{ 10, 13, 10, 13 },{ 13, 16, 13, 16 } },
{ { 11, 14, 11, 14 },{ 14, 18, 14, 18 },{ 11, 14, 11, 14 },{ 14, 18, 14, 18 } },
{ { 13, 16, 13, 16 },{ 16, 20, 16, 20 },{ 13, 16, 13, 16 },{ 16, 20, 16, 20 } },
{ { 14, 18, 14, 18 },{ 18, 23, 18, 23 },{ 14, 18, 14, 18 },{ 18, 23, 18, 23 } },
{ { 16, 20, 16, 20 },{ 20, 25, 20, 25 },{ 16, 20, 16, 20 },{ 20, 25, 20, 25 } },
{ { 18, 23, 18, 23 },{ 23, 29, 23, 29 },{ 18, 23, 18, 23 },{ 23, 29, 23, 29 } }
};
代码实现
核心代码就一行:cavlc解析出的系数矩阵值乘以预定义矩阵再向左偏移
void CResidual::insert_matrix(int(*matrix)[4][4], int *block, int start, int maxCoeffNum, int c, int r)
{
int qp_per = m_qp / 6, qp_rem = m_qp % 6;
int row = 0, column = 0;
int coeff_buf[4][4] = { 0 }, residual_buf[4][4] = { 0 };
int block_index = position_to_block_index(r, c);
for (int idc = 0, pos0 = start; idc < maxCoeffNum && pos0 < 16; idc++)
{
row = SNGL_SCAN[pos0][0]; //<变换量化><2>坐标写到一个数组里面,方便使用
column = SNGL_SCAN[pos0][1];
matrix[block_index][column][row] = block[idc] * dequant_coef[qp_rem][row][column] << qp_per;//<变换量化><3>反量化
pos0++;
}
}
以上是关于H264解析Demo10变换量化_2_反量化的主要内容,如果未能解决你的问题,请参考以下文章
H264解析Demo10变换量化_1_CAVLC结果还原为系数矩阵