整数DCT的作用是变换编码,提取信号特征。H264的整数DCT分两步:
1、DCT整数部分变换;
2、DCT实数部分变换。
实数部分和量化在一起进行,可以统一损失精度,也可以降低运算复杂度。
整数部分用蝶形变换,以最常见的4x4宏块为例,代码如下:
#include <iostream>
using namespace std;
#define BLOCK_SIZE 4
int block[BLOCK_SIZE][BLOCK_SIZE], tblock[BLOCK_SIZE][BLOCK_SIZE];
//蝶形算法
void forward4x4(int pos_y, int pos_x)
{
int i, ii;
int tmp[16] = { 0 };
int *pTmp = tmp, *pblock;
int p0, p1, p2, p3;
int t0, t1, t2, t3;
// Horizontal
for (i = pos_y; i < pos_y + BLOCK_SIZE; i++)
{
pblock = &block[i][pos_x];
p0 = *(pblock++);
p1 = *(pblock++);
p2 = *(pblock++);
p3 = *(pblock);
t0 = p0 + p3;
t1 = p1 + p2;
t2 = p1 - p2;
t3 = p0 - p3;
*(pTmp++) = t0 + t1;
*(pTmp++) = (t3 << 1) + t2;
*(pTmp++) = t0 - t1