/* Inverse 2-D Discrete Cosine Transform. */ void IDCT(const FBlock * input, PBlock * output) { int Y[64]; int k, l; /* Pass 1: process rows. */ for (k = 0; k < 8; k++) { /* Prescale k-th row: */ for (l = 0; l < 8; l++) Y(k, l) = SCALE(input->block[k][l], S_BITS); /* 1-D IDCT on k-th row: */ idct_1d(&Y(k, 0)); /* Result Y is scaled up by factor sqrt(8)*2^S_BITS. */ } /* Pass 2: process columns. */ for (l = 0; l < 8; l++) { int Yc[8]; for (k = 0; k < 8; k++) Yc[k] = Y(k, l); /* 1-D IDCT on l-th column: */ idct_1d(Yc); /* Result is once more scaled up by a factor sqrt(8). */ for (k = 0; k < 8; k++) { int r = 128 + DESCALE(Yc[k], S_BITS + 3); /* includes level shift */ /* Clip to 8 bits unsigned: */ r = r > 0 ? (r < 255 ? r : 255) : 0; X(k, l) = r; } } }
static void idct(float *dst, const float *src) { float tmp[N*N]; idct_1d(tmp, src, 1, N, 1, N); idct_1d(dst, tmp, N, 1, N, 1); }