// 2D DCT of a 8x8 patches. The result is restored in-place. // flag: 1/-1 forward/inverse transforms. void DCT2D(vector< vector< float > >& patch1, int flag) { std::vector< vector< float > > tmp1; tmp1.resize(PATCHSIZE); std::vector< vector< float > > tmp2; tmp2.resize(PATCHSIZE); for (int i = 0; i < PATCHSIZE; i ++) { tmp1[i].resize(PATCHSIZE); tmp2[i].resize(PATCHSIZE); } // transform row by row for (int j = 0; j < PATCHSIZE; j ++) { DCT1D(patch1[j], tmp1[j], flag); } // transform column by column // (by transposing the matrix, // transforming row by row, and // transposing again the matrix.) for (int j = 0; j < PATCHSIZE; j ++) { for (int i = 0; i < PATCHSIZE; i ++) tmp2[j][i] = tmp1[i][j]; } for (int j = 0; j < PATCHSIZE; j ++) { DCT1D(tmp2[j], tmp1[j], flag); } for (int j = 0; j < PATCHSIZE; j ++) { for (int i = 0; i < PATCHSIZE; i ++) patch1[j][i] = tmp1[i][j]; } }
static void DCT2D(int32 *p) { int32 c, *q = p; for (c = 7; c >= 0; c--, q += 8) { int32 s0 = q[0], s1 = q[1], s2 = q[2], s3 = q[3], s4 = q[4], s5 = q[5], s6 = q[6], s7 = q[7]; DCT1D(s0, s1, s2, s3, s4, s5, s6, s7); q[0] = s0 << ROW_BITS; q[1] = DCT_DESCALE(s1, CONST_BITS-ROW_BITS); q[2] = DCT_DESCALE(s2, CONST_BITS-ROW_BITS); q[3] = DCT_DESCALE(s3, CONST_BITS-ROW_BITS); q[4] = s4 << ROW_BITS; q[5] = DCT_DESCALE(s5, CONST_BITS-ROW_BITS); q[6] = DCT_DESCALE(s6, CONST_BITS-ROW_BITS); q[7] = DCT_DESCALE(s7, CONST_BITS-ROW_BITS); } for (q = p, c = 7; c >= 0; c--, q++) { int32 s0 = q[0*8], s1 = q[1*8], s2 = q[2*8], s3 = q[3*8], s4 = q[4*8], s5 = q[5*8], s6 = q[6*8], s7 = q[7*8]; DCT1D(s0, s1, s2, s3, s4, s5, s6, s7); q[0*8] = DCT_DESCALE(s0, ROW_BITS+3); q[1*8] = DCT_DESCALE(s1, CONST_BITS+ROW_BITS+3); q[2*8] = DCT_DESCALE(s2, CONST_BITS+ROW_BITS+3); q[3*8] = DCT_DESCALE(s3, CONST_BITS+ROW_BITS+3); q[4*8] = DCT_DESCALE(s4, ROW_BITS+3); q[5*8] = DCT_DESCALE(s5, CONST_BITS+ROW_BITS+3); q[6*8] = DCT_DESCALE(s6, CONST_BITS+ROW_BITS+3); q[7*8] = DCT_DESCALE(s7, CONST_BITS+ROW_BITS+3); } }