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结果还原为系数矩阵

VTM10.0反量化反变换技术

VTM10.0反量化反变换技术

VTM10.0反量化反变换技术

H264解析Demo11帧内预测编码_1_预测当前块的预测模式

十四变换编码:2H264的整数变换方法——整数变换与量化