H264解析Demo10变换量化_3_反变换

Posted 叮咚咕噜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H264解析Demo10变换量化_3_反变换相关的知识,希望对你有一定的参考价值。

代码实现

//<变换量化><4>反变换(参数1:保存反量化系数  参数2:保存反变换之后)
void CResidual::coeff_invers_transform(int(*coeff_buf)[4], int(*residual_buf)[4])
{
	int temp1[4] = { 0 }, temp2[4] = { 0 };

	// horizontal-trans  //<变换量化><4>水平变换
	for (int j = 0; j < 4; j++)
	{
		for (int i = 0; i < 4; i++)
		{
			temp1[i] = coeff_buf[i][j];
		}

		//<变换量化><4>第一部分蝶形运算
		temp2[0] = (temp1[0] + temp1[2]);
		temp2[1] = (temp1[0] - temp1[2]);
		temp2[2] = (temp1[1] >> 1) - temp1[3];
		temp2[3] = temp1[1] + (temp1[3] >> 1);

		//<变换量化><4>第二部分蝶形运算
		for (int i = 0; i < 2; i++)
		{
			int i1 = 3 - i;
			residual_buf[i][j] = temp2[i] + temp2[i1];
			residual_buf[i1][j] = temp2[i] - temp2[i1];
		}
	}

	// vertical-trans  //<变换量化><4>垂直变换
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			temp1[j] = residual_buf[i][j];
		}

		temp2[0] = (temp1[0] + temp1[2]);
		temp2[1] = (temp1[0] - temp1[2]);
		temp2[2] = (temp1[1] >> 1) - temp1[3];
		temp2[3] = temp1[1] + (temp1[3] >> 1);

		for (int j = 0; j < 2; j++)
		{
			int j1 = 3 - j;
			residual_buf[i][j] = temp2[j] + temp2[j1];
			residual_buf[i][j1] = temp2[j] - temp2[j1];
		}
	}
}

疑问

蝶形运算是怎么推导而来的?有好的资料或者链接可以评论共享一下。谢谢

以上是关于H264解析Demo10变换量化_3_反变换的主要内容,如果未能解决你的问题,请参考以下文章

H264解析Demo10变换量化_1_CAVLC结果还原为系数矩阵

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

VTM10.0反量化反变换技术

VTM10.0反量化反变换技术

VTM10.0反量化反变换技术

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