123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921 |
- /****************************************************************************
- *
- * Module Title : idctpart.c
- *
- * Description : IDCT with multiple versions based on # of non 0 coeffs
- *
- ****************************************************************************/
- /****************************************************************************
- * Header Files
- ****************************************************************************/
- #include "dct.h"
- #include "string.h"
- /****************************************************************************
- * Macros
- ****************************************************************************/
- #define int32 int
- #define int16 short
- #define IdctAdjustBeforeShift 8
- #define xC1S7 64277
- #define xC2S6 60547
- #define xC3S5 54491
- #define xC4S4 46341
- #define xC5S3 36410
- #define xC6S2 25080
- #define xC7S1 12785
- /****************************************************************************
- * Module statics
- ****************************************************************************/
- static const UINT32 dequant_index[64] =
- {
- 0, 1, 8, 16, 9, 2, 3, 10,
- 17, 24, 32, 25, 18, 11, 4, 5,
- 12, 19, 26, 33, 40, 48, 41, 34,
- 27, 20, 13, 6, 7, 14, 21, 28,
- 35, 42, 49, 56, 57, 50, 43, 36,
- 29, 22, 15, 23, 30, 37, 44, 51,
- 58, 59, 52, 45, 38, 31, 39, 46,
- 53, 60, 61, 54, 47, 55, 62, 63
- };
- #if 0 // AWG CODE NO LONGER USED IN CODEBASE.
- /* Cos and Sin constant multipliers used during DCT and IDCT */
- const double C1S7 = (double)0.9807852804032;
- const double C2S6 = (double)0.9238795325113;
- const double C3S5 = (double)0.8314696123025;
- const double C4S4 = (double)0.7071067811865;
- const double C5S3 = (double)0.5555702330196;
- const double C6S2 = (double)0.3826834323651;
- const double C7S1 = (double)0.1950903220161;
- /****************************************************************************
- * Exports
- ****************************************************************************/
- // DCT lookup tables
- INT32 * C4S4_TablePtr;
- INT32 C4S4_Table[(COEFF_MAX * 4) + 1];
- INT32 * C6S2_TablePtr;
- INT32 C6S2_Table[(COEFF_MAX * 2) + 1];
- INT32 * C2S6_TablePtr;
- INT32 C2S6_Table[(COEFF_MAX * 2) + 1];
- INT32 * C1S7_TablePtr;
- INT32 C1S7_Table[(COEFF_MAX * 2) + 1];
- INT32 * C7S1_TablePtr;
- INT32 C7S1_Table[(COEFF_MAX * 2) + 1];
- INT32 * C3S5_TablePtr;
- INT32 C3S5_Table[(COEFF_MAX * 2) + 1];
- INT32 * C5S3_TablePtr;
- INT32 C5S3_Table[(COEFF_MAX * 2) + 1];
- /****************************************************************************
- *
- * ROUTINE : InitDctTables
- *
- * INPUTS : None.
- *
- * OUTPUTS : None.
- *
- * RETURNS : void
- *
- * FUNCTION : Initialises lookup tables used in IDCT.
- *
- * SPECIAL NOTES : NO LONGER USED IN CODEBASE.
- *
- ****************************************************************************/
- void InitDctTables ( void )
- {
- INT32 i;
- C4S4_TablePtr = &C4S4_Table[COEFF_MAX*2];
- for( i = -(2 * COEFF_MAX); i < (2 * COEFF_MAX); i++ )
- {
- if ( i < 0 )
- C4S4_TablePtr[i] = (INT32)((i * C4S4) - 0.5);
- else
- C4S4_TablePtr[i] = (INT32)((i * C4S4) + 0.5);
- }
- C6S2_TablePtr = &C6S2_Table[COEFF_MAX];
- for( i = -COEFF_MAX ; i < COEFF_MAX; i++ )
- {
- if ( i < 0 )
- C6S2_TablePtr[i] = (INT32)((i * C6S2) - 0.5);
- else
- C6S2_TablePtr[i] = (INT32)((i * C6S2) + 0.5);
- }
- C2S6_TablePtr = &C2S6_Table[COEFF_MAX];
- for( i = -COEFF_MAX ; i < COEFF_MAX; i++ )
- {
- if ( i < 0 )
- C2S6_TablePtr[i] = (INT32)((i * C2S6) - 0.5);
- else
- C2S6_TablePtr[i] = (INT32)((i * C2S6) + 0.5);
- }
- C1S7_TablePtr = &C1S7_Table[COEFF_MAX];
- for( i = -COEFF_MAX ; i < COEFF_MAX; i++ )
- {
- if ( i < 0 )
- C1S7_TablePtr[i] = (INT32)((i * C1S7) - 0.5);
- else
- C1S7_TablePtr[i] = (INT32)((i * C1S7) + 0.5);
- }
- C7S1_TablePtr = &C7S1_Table[COEFF_MAX];
- for( i = -COEFF_MAX ; i < COEFF_MAX; i++ )
- {
- if ( i < 0 )
- C7S1_TablePtr[i] = (INT32)((i * C7S1) - 0.5);
- else
- C7S1_TablePtr[i] = (INT32)((i * C7S1) + 0.5);
- }
- C3S5_TablePtr = &C3S5_Table[COEFF_MAX];
- for( i = -COEFF_MAX ; i < COEFF_MAX; i++ )
- {
- if ( i < 0 )
- C3S5_TablePtr[i] = (INT32)((i * C3S5) - 0.5);
- else
- C3S5_TablePtr[i] = (INT32)((i * C3S5) + 0.5);
- }
- C5S3_TablePtr = &C5S3_Table[COEFF_MAX];
- for( i = -COEFF_MAX ; i < COEFF_MAX; i++ )
- {
- if ( i < 0 )
- C5S3_TablePtr[i] = (INT32)((i * C5S3) - 0.5);
- else
- C5S3_TablePtr[i] = (INT32)((i * C5S3) + 0.5);
- }
- }
- #endif
- /****************************************************************************
- *
- * ROUTINE : dequant_slow
- *
- * INPUTS : INT16 *dequant_coeffs : Pointer to dequantization step sizes.
- * INT16 *quantized_list : Pointer to quantized DCT coeffs
- * (in zig-zag order).
- *
- * OUTPUTS : INT32 *DCT_block : Pointer to 8x8 de-quantized block
- * (in 2-D raster order).
- *
- * RETURNS : void
- *
- * FUNCTION : De-quantizes an 8x8 block of quantized DCT coeffs.
- *
- * SPECIAL NOTES : Uses dequant_index to invert zig-zag ordering.
- *
- ****************************************************************************/
- void dequant_slow ( INT16 *dequant_coeffs, INT16 *quantized_list, INT32 *DCT_block )
- {
- // Loop fully expanded for maximum speed
- DCT_block[dequant_index[0]] = quantized_list[0] * dequant_coeffs[0];
- DCT_block[dequant_index[1]] = quantized_list[1] * dequant_coeffs[1];
- DCT_block[dequant_index[2]] = quantized_list[2] * dequant_coeffs[2];
- DCT_block[dequant_index[3]] = quantized_list[3] * dequant_coeffs[3];
- DCT_block[dequant_index[4]] = quantized_list[4] * dequant_coeffs[4];
- DCT_block[dequant_index[5]] = quantized_list[5] * dequant_coeffs[5];
- DCT_block[dequant_index[6]] = quantized_list[6] * dequant_coeffs[6];
- DCT_block[dequant_index[7]] = quantized_list[7] * dequant_coeffs[7];
- DCT_block[dequant_index[8]] = quantized_list[8] * dequant_coeffs[8];
- DCT_block[dequant_index[9]] = quantized_list[9] * dequant_coeffs[9];
- DCT_block[dequant_index[10]] = quantized_list[10] * dequant_coeffs[10];
- DCT_block[dequant_index[11]] = quantized_list[11] * dequant_coeffs[11];
- DCT_block[dequant_index[12]] = quantized_list[12] * dequant_coeffs[12];
- DCT_block[dequant_index[13]] = quantized_list[13] * dequant_coeffs[13];
- DCT_block[dequant_index[14]] = quantized_list[14] * dequant_coeffs[14];
- DCT_block[dequant_index[15]] = quantized_list[15] * dequant_coeffs[15];
- DCT_block[dequant_index[16]] = quantized_list[16] * dequant_coeffs[16];
- DCT_block[dequant_index[17]] = quantized_list[17] * dequant_coeffs[17];
- DCT_block[dequant_index[18]] = quantized_list[18] * dequant_coeffs[18];
- DCT_block[dequant_index[19]] = quantized_list[19] * dequant_coeffs[19];
- DCT_block[dequant_index[20]] = quantized_list[20] * dequant_coeffs[20];
- DCT_block[dequant_index[21]] = quantized_list[21] * dequant_coeffs[21];
- DCT_block[dequant_index[22]] = quantized_list[22] * dequant_coeffs[22];
- DCT_block[dequant_index[23]] = quantized_list[23] * dequant_coeffs[23];
- DCT_block[dequant_index[24]] = quantized_list[24] * dequant_coeffs[24];
- DCT_block[dequant_index[25]] = quantized_list[25] * dequant_coeffs[25];
- DCT_block[dequant_index[26]] = quantized_list[26] * dequant_coeffs[26];
- DCT_block[dequant_index[27]] = quantized_list[27] * dequant_coeffs[27];
- DCT_block[dequant_index[28]] = quantized_list[28] * dequant_coeffs[28];
- DCT_block[dequant_index[29]] = quantized_list[29] * dequant_coeffs[29];
- DCT_block[dequant_index[30]] = quantized_list[30] * dequant_coeffs[30];
- DCT_block[dequant_index[31]] = quantized_list[31] * dequant_coeffs[31];
- DCT_block[dequant_index[32]] = quantized_list[32] * dequant_coeffs[32];
- DCT_block[dequant_index[33]] = quantized_list[33] * dequant_coeffs[33];
- DCT_block[dequant_index[34]] = quantized_list[34] * dequant_coeffs[34];
- DCT_block[dequant_index[35]] = quantized_list[35] * dequant_coeffs[35];
- DCT_block[dequant_index[36]] = quantized_list[36] * dequant_coeffs[36];
- DCT_block[dequant_index[37]] = quantized_list[37] * dequant_coeffs[37];
- DCT_block[dequant_index[38]] = quantized_list[38] * dequant_coeffs[38];
- DCT_block[dequant_index[39]] = quantized_list[39] * dequant_coeffs[39];
- DCT_block[dequant_index[40]] = quantized_list[40] * dequant_coeffs[40];
- DCT_block[dequant_index[41]] = quantized_list[41] * dequant_coeffs[41];
- DCT_block[dequant_index[42]] = quantized_list[42] * dequant_coeffs[42];
- DCT_block[dequant_index[43]] = quantized_list[43] * dequant_coeffs[43];
- DCT_block[dequant_index[44]] = quantized_list[44] * dequant_coeffs[44];
- DCT_block[dequant_index[45]] = quantized_list[45] * dequant_coeffs[45];
- DCT_block[dequant_index[46]] = quantized_list[46] * dequant_coeffs[46];
- DCT_block[dequant_index[47]] = quantized_list[47] * dequant_coeffs[47];
- DCT_block[dequant_index[48]] = quantized_list[48] * dequant_coeffs[48];
- DCT_block[dequant_index[49]] = quantized_list[49] * dequant_coeffs[49];
- DCT_block[dequant_index[50]] = quantized_list[50] * dequant_coeffs[50];
- DCT_block[dequant_index[51]] = quantized_list[51] * dequant_coeffs[51];
- DCT_block[dequant_index[52]] = quantized_list[52] * dequant_coeffs[52];
- DCT_block[dequant_index[53]] = quantized_list[53] * dequant_coeffs[53];
- DCT_block[dequant_index[54]] = quantized_list[54] * dequant_coeffs[54];
- DCT_block[dequant_index[55]] = quantized_list[55] * dequant_coeffs[55];
- DCT_block[dequant_index[56]] = quantized_list[56] * dequant_coeffs[56];
- DCT_block[dequant_index[57]] = quantized_list[57] * dequant_coeffs[57];
- DCT_block[dequant_index[58]] = quantized_list[58] * dequant_coeffs[58];
- DCT_block[dequant_index[59]] = quantized_list[59] * dequant_coeffs[59];
- DCT_block[dequant_index[60]] = quantized_list[60] * dequant_coeffs[60];
- DCT_block[dequant_index[61]] = quantized_list[61] * dequant_coeffs[61];
- DCT_block[dequant_index[62]] = quantized_list[62] * dequant_coeffs[62];
- DCT_block[dequant_index[63]] = quantized_list[63] * dequant_coeffs[63];
- }
- /****************************************************************************
- *
- * ROUTINE : IDctSlow
- *
- * INPUTS : int16 *InputData : Pointer to 8x8 quantized DCT coefficients.
- * int16 *QuantMatrix : Pointer to 8x8 quantization matrix.
- *
- * OUTPUTS : int16 *OutputData : Pointer to 8x8 block to hold output.
- *
- * RETURNS : void
- *
- * FUNCTION : Inverse quantizes and inverse DCT's input 8x8 block
- * to reproduce prediction error.
- *
- * SPECIAL NOTES : None.
- *
- ****************************************************************************/
- void IDctSlow ( int16 *InputData, int16 *QuantMatrix, int16 *OutputData )
- {
- int loop;
- int32 t1, t2;
- int32 IntermediateData[64];
- int32 _A, _B, _C, _D, _Ad, _Bd, _Cd, _Dd, _E, _F, _G, _H;
- int32 _Ed, _Gd, _Add, _Bdd, _Fd, _Hd;
-
- int32 *ip = IntermediateData;
- int16 *op = OutputData;
-
- // dequantize the input
- dequant_slow ( QuantMatrix, InputData, IntermediateData );
- // Inverse DCT on the rows now
- for ( loop=0; loop<8; loop++ )
- {
- // Check for non-zero values
- if ( ip[0] | ip[1] | ip[2] | ip[3] | ip[4] | ip[5] | ip[6] | ip[7] )
- {
- t1 = (int32)(xC1S7 * ip[1]);
- t2 = (int32)(xC7S1 * ip[7]);
- t1 >>= 16;
- t2 >>= 16;
- _A = t1 + t2;
- t1 = (int32)(xC7S1 * ip[1]);
- t2 = (int32)(xC1S7 * ip[7]);
- t1 >>= 16;
- t2 >>= 16;
- _B = t1 - t2;
- t1 = (int32)(xC3S5 * ip[3]);
- t2 = (int32)(xC5S3 * ip[5]);
- t1 >>= 16;
- t2 >>= 16;
- _C = t1 + t2;
- t1 = (int32)(xC3S5 * ip[5]);
- t2 = (int32)(xC5S3 * ip[3]);
- t1 >>= 16;
- t2 >>= 16;
- _D = t1 - t2;
- t1 = (int32)(xC4S4 * (_A - _C));
- t1 >>= 16;
- _Ad = t1;
- t1 = (int32)(xC4S4 * (_B - _D));
- t1 >>= 16;
- _Bd = t1;
-
- _Cd = _A + _C;
- _Dd = _B + _D;
- t1 = (int32)(xC4S4 * (ip[0] + ip[4]));
- t1 >>= 16;
- _E = t1;
- t1 = (int32)(xC4S4 * (ip[0] - ip[4]));
- t1 >>= 16;
- _F = t1;
-
- t1 = (int32)(xC2S6 * ip[2]);
- t2 = (int32)(xC6S2 * ip[6]);
- t1 >>= 16;
- t2 >>= 16;
- _G = t1 + t2;
- t1 = (int32)(xC6S2 * ip[2]);
- t2 = (int32)(xC2S6 * ip[6]);
- t1 >>= 16;
- t2 >>= 16;
- _H = t1 - t2;
- _Ed = _E - _G;
- _Gd = _E + _G;
- _Add = _F + _Ad;
- _Bdd = _Bd - _H;
-
- _Fd = _F - _Ad;
- _Hd = _Bd + _H;
-
- // Final sequence of operations over-write original inputs.
- ip[0] = (int16)((_Gd + _Cd ) >> 0);
- ip[7] = (int16)((_Gd - _Cd ) >> 0);
- ip[1] = (int16)((_Add + _Hd ) >> 0);
- ip[2] = (int16)((_Add - _Hd ) >> 0);
- ip[3] = (int16)((_Ed + _Dd ) >> 0);
- ip[4] = (int16)((_Ed - _Dd ) >> 0);
- ip[5] = (int16)((_Fd + _Bdd ) >> 0);
- ip[6] = (int16)((_Fd - _Bdd ) >> 0);
- }
- ip += 8; /* next row */
- }
- ip = IntermediateData;
- for ( loop=0; loop<8; loop++ )
- {
- // Check for non-zero values (bitwise | faster than logical ||)
- if ( ip[0 * 8] | ip[1 * 8] | ip[2 * 8] | ip[3 * 8] |
- ip[4 * 8] | ip[5 * 8] | ip[6 * 8] | ip[7 * 8] )
- {
- t1 = (int32)(xC1S7 * ip[1*8]);
- t2 = (int32)(xC7S1 * ip[7*8]);
- t1 >>= 16;
- t2 >>= 16;
- _A = t1 + t2;
- t1 = (int32)(xC7S1 * ip[1*8]);
- t2 = (int32)(xC1S7 * ip[7*8]);
- t1 >>= 16;
- t2 >>= 16;
- _B = t1 - t2;
- t1 = (int32)(xC3S5 * ip[3*8]);
- t2 = (int32)(xC5S3 * ip[5*8]);
- t1 >>= 16;
- t2 >>= 16;
- _C = t1 + t2;
- t1 = (int32)(xC3S5 * ip[5*8]);
- t2 = (int32)(xC5S3 * ip[3*8]);
- t1 >>= 16;
- t2 >>= 16;
- _D = t1 - t2;
- t1 = (int32)(xC4S4 * (_A - _C));
- t1 >>= 16;
- _Ad = t1;
- t1 = (int32)(xC4S4 * (_B - _D));
- t1 >>= 16;
- _Bd = t1;
- _Cd = _A + _C;
- _Dd = _B + _D;
- t1 = (int32)(xC4S4 * (ip[0*8] + ip[4*8]));
- t1 >>= 16;
- _E = t1;
- t1 = (int32)(xC4S4 * (ip[0*8] - ip[4*8]));
- t1 >>= 16;
- _F = t1;
-
- t1 = (int32)(xC2S6 * ip[2*8]);
- t2 = (int32)(xC6S2 * ip[6*8]);
- t1 >>= 16;
- t2 >>= 16;
- _G = t1 + t2;
- t1 = (int32)(xC6S2 * ip[2*8]);
- t2 = (int32)(xC2S6 * ip[6*8]);
- t1 >>= 16;
- t2 >>= 16;
- _H = t1 - t2;
-
- _Ed = _E - _G;
- _Gd = _E + _G;
- _Add = _F + _Ad;
- _Bdd = _Bd - _H;
-
- _Fd = _F - _Ad;
- _Hd = _Bd + _H;
-
- _Gd += IdctAdjustBeforeShift;
- _Add += IdctAdjustBeforeShift;
- _Ed += IdctAdjustBeforeShift;
- _Fd += IdctAdjustBeforeShift;
- // Final sequence of operations over-write original inputs.
- op[0*8] = (int16)((_Gd + _Cd ) >> 4);
- op[7*8] = (int16)((_Gd - _Cd ) >> 4);
- op[1*8] = (int16)((_Add + _Hd ) >> 4);
- op[2*8] = (int16)((_Add - _Hd ) >> 4);
- op[3*8] = (int16)((_Ed + _Dd ) >> 4);
- op[4*8] = (int16)((_Ed - _Dd ) >> 4);
- op[5*8] = (int16)((_Fd + _Bdd ) >> 4);
- op[6*8] = (int16)((_Fd - _Bdd ) >> 4);
- }
- else
- {
- op[0*8] = 0;
- op[7*8] = 0;
- op[1*8] = 0;
- op[2*8] = 0;
- op[3*8] = 0;
- op[4*8] = 0;
- op[5*8] = 0;
- op[6*8] = 0;
- }
- ip++; // next column
- op++;
- }
- }
- /****************************************************************************
- *
- * ROUTINE : dequant_slow10
- *
- * INPUTS : INT16 *dequant_coeffs : Pointer to dequantization step sizes.
- * INT16 *quantized_list : Pointer to quantized DCT coeffs
- * (in zig-zag order).
- *
- * OUTPUTS : INT32 *DCT_block : Pointer to 8x8 de-quantized block
- * (in 2-D raster order).
- *
- * RETURNS : void
- *
- * FUNCTION : De-quantizes an 8x8 block of quantized DCT coeffs that
- * only has non-zero coefficients in the first 10, i.e.
- * only DC & AC1-9 are non-zero, AC10-63 __MUST_BE_ zero.
- *
- * SPECIAL NOTES : Uses dequant_index to invert zig-zag ordering.
- *
- ****************************************************************************/
- void dequant_slow10 ( INT16 *dequant_coeffs, INT16 *quantized_list, INT32 *DCT_block )
- {
- memset(DCT_block,0, 128);
- // Loop fully expanded for maximum speed
- DCT_block[dequant_index[0]] = quantized_list[0] * dequant_coeffs[0];
- DCT_block[dequant_index[1]] = quantized_list[1] * dequant_coeffs[1];
- DCT_block[dequant_index[2]] = quantized_list[2] * dequant_coeffs[2];
- DCT_block[dequant_index[3]] = quantized_list[3] * dequant_coeffs[3];
- DCT_block[dequant_index[4]] = quantized_list[4] * dequant_coeffs[4];
- DCT_block[dequant_index[5]] = quantized_list[5] * dequant_coeffs[5];
- DCT_block[dequant_index[6]] = quantized_list[6] * dequant_coeffs[6];
- DCT_block[dequant_index[7]] = quantized_list[7] * dequant_coeffs[7];
- DCT_block[dequant_index[8]] = quantized_list[8] * dequant_coeffs[8];
- DCT_block[dequant_index[9]] = quantized_list[9] * dequant_coeffs[9];
- DCT_block[dequant_index[10]] = quantized_list[10] * dequant_coeffs[10];
- }
- /****************************************************************************
- *
- * ROUTINE : IDctSlow10
- *
- * INPUTS : int16 *InputData : Pointer to 8x8 quantized DCT coefficients.
- * int16 *QuantMatrix : Pointer to 8x8 quantization matrix.
- *
- * OUTPUTS : int16 *OutputData : Pointer to 8x8 block to hold output.
- *
- * RETURNS : void
- *
- * FUNCTION : Inverse quantizes and inverse DCT's input 8x8 block
- * with non-zero coeffs only in DC & the first 9 AC coeffs.
- * i.e. non-zeros ONLY in the following 10 positions:
- *
- * x x x x 0 0 0 0
- * x x x 0 0 0 0 0
- * x x 0 0 0 0 0 0
- * x 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- *
- * SPECIAL NOTES : Output data is in raster, not zig-zag, order.
- *
- ****************************************************************************/
- void IDct10 ( int16 *InputData, int16 *QuantMatrix, int16 *OutputData )
- {
- int loop;
- int32 t1, t2;
- int32 IntermediateData[64];
- int32 _A, _B, _C, _D, _Ad, _Bd, _Cd, _Dd, _E, _F, _G, _H;
- int32 _Ed, _Gd, _Add, _Bdd, _Fd, _Hd;
- int32 *ip = IntermediateData;
- int16 *op = OutputData;
-
- // dequantize the input
- dequant_slow10 ( QuantMatrix, InputData, IntermediateData );
- // Inverse DCT on the rows now
- for ( loop=0; loop<4; loop++ )
- {
- // Check for non-zero values
- if ( ip[0] | ip[1] | ip[2] | ip[3] )
- {
- t1 = (int32)(xC1S7 * ip[1]);
- t1 >>= 16;
- _A = t1;
- t1 = (int32)(xC7S1 * ip[1]);
- t1 >>= 16;
- _B = t1 ;
- t1 = (int32)(xC3S5 * ip[3]);
- t1 >>= 16;
- _C = t1;
- t2 = (int32)(xC5S3 * ip[3]);
- t2 >>= 16;
- _D = -t2;
- t1 = (int32)(xC4S4 * (_A - _C));
- t1 >>= 16;
- _Ad = t1;
- t1 = (int32)(xC4S4 * (_B - _D));
- t1 >>= 16;
- _Bd = t1;
-
- _Cd = _A + _C;
- _Dd = _B + _D;
- t1 = (int32)(xC4S4 * ip[0] );
- t1 >>= 16;
- _E = t1;
- _F = t1;
-
- t1 = (int32)(xC2S6 * ip[2]);
- t1 >>= 16;
- _G = t1;
- t1 = (int32)(xC6S2 * ip[2]);
- t1 >>= 16;
- _H = t1 ;
-
- _Ed = _E - _G;
- _Gd = _E + _G;
- _Add = _F + _Ad;
- _Bdd = _Bd - _H;
-
- _Fd = _F - _Ad;
- _Hd = _Bd + _H;
-
- // Final sequence of operations over-write original inputs.
- ip[0] = (int16)((_Gd + _Cd ) >> 0);
- ip[7] = (int16)((_Gd - _Cd ) >> 0);
- ip[1] = (int16)((_Add + _Hd ) >> 0);
- ip[2] = (int16)((_Add - _Hd ) >> 0);
- ip[3] = (int16)((_Ed + _Dd ) >> 0);
- ip[4] = (int16)((_Ed - _Dd ) >> 0);
- ip[5] = (int16)((_Fd + _Bdd ) >> 0);
- ip[6] = (int16)((_Fd - _Bdd ) >> 0);
- }
- ip += 8; /* next row */
- }
- ip = IntermediateData;
- for ( loop=0; loop<8; loop++ )
- {
- // Check for non-zero values (bitwise or faster than ||)
- if ( ip[0 * 8] | ip[1 * 8] | ip[2 * 8] | ip[3 * 8] )
- {
- t1 = (int32)(xC1S7 * ip[1*8]);
- t1 >>= 16;
- _A = t1 ;
- t1 = (int32)(xC7S1 * ip[1*8]);
- t1 >>= 16;
- _B = t1 ;
- t1 = (int32)(xC3S5 * ip[3*8]);
- t1 >>= 16;
- _C = t1 ;
- t2 = (int32)(xC5S3 * ip[3*8]);
- t2 >>= 16;
- _D = - t2;
- t1 = (int32)(xC4S4 * (_A - _C));
- t1 >>= 16;
- _Ad = t1;
- t1 = (int32)(xC4S4 * (_B - _D));
- t1 >>= 16;
- _Bd = t1;
- _Cd = _A + _C;
- _Dd = _B + _D;
- t1 = (int32)(xC4S4 * ip[0*8]);
- t1 >>= 16;
- _E = t1;
- _F = t1;
-
- t1 = (int32)(xC2S6 * ip[2*8]);
- t1 >>= 16;
- _G = t1;
- t1 = (int32)(xC6S2 * ip[2*8]);
- t1 >>= 16;
- _H = t1;
-
- _Ed = _E - _G;
- _Gd = _E + _G;
- _Add = _F + _Ad;
- _Bdd = _Bd - _H;
-
- _Fd = _F - _Ad;
- _Hd = _Bd + _H;
-
- _Gd += IdctAdjustBeforeShift;
- _Add += IdctAdjustBeforeShift;
- _Ed += IdctAdjustBeforeShift;
- _Fd += IdctAdjustBeforeShift;
- // Final sequence of operations over-write original inputs.
- op[0*8] = (int16)((_Gd + _Cd ) >> 4);
- op[7*8] = (int16)((_Gd - _Cd ) >> 4);
- op[1*8] = (int16)((_Add + _Hd ) >> 4);
- op[2*8] = (int16)((_Add - _Hd ) >> 4);
- op[3*8] = (int16)((_Ed + _Dd ) >> 4);
- op[4*8] = (int16)((_Ed - _Dd ) >> 4);
- op[5*8] = (int16)((_Fd + _Bdd ) >> 4);
- op[6*8] = (int16)((_Fd - _Bdd ) >> 4);
- }
- else
- {
- op[0*8] = 0;
- op[7*8] = 0;
- op[1*8] = 0;
- op[2*8] = 0;
- op[3*8] = 0;
- op[4*8] = 0;
- op[5*8] = 0;
- op[6*8] = 0;
- }
- ip++; // next column
- op++;
- }
- }
- /****************************************************************************
- *
- * ROUTINE : IDct1
- *
- * INPUTS : int16 *InputData : Pointer to 8x8 quantized DCT coefficients.
- * int16 *QuantMatrix : Pointer to 8x8 quantization matrix.
- *
- * OUTPUTS : int16 *OutputData : Pointer to 8x8 block to hold output.
- *
- * RETURNS : void
- *
- * FUNCTION : Inverse DCT's input 8x8 block with only one non-zero
- * coeff in the DC position:
- *
- * x 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- *
- * SPECIAL NOTES : Output data is in raster, not zig-zag, order.
- *
- ****************************************************************************/
- void IDct1 ( int16 *InputData, int16 *QuantMatrix, INT16 *OutputData )
- {
- INT32 loop;
- INT16 OutD;
-
- OutD = (INT16)((INT32)(InputData[0]*QuantMatrix[0]+15)>>5);
- for ( loop=0; loop<64; loop++ )
- OutputData[loop] = OutD;
- }
- #if 0
- /****************************************************************************
- *
- * ROUTINE : IDct4
- *
- * INPUTS : int16 *InputData : Pointer to 8x8 DCT coefficients.
- *
- * OUTPUTS : int16 *OutputData : Pointer to 8x8 block to hold output.
- *
- * RETURNS : void
- *
- * FUNCTION : Inverse DCT's input 8x8 block with at most four non-zero
- * coeffs in the following positions:
- *
- * x x 0 0 0 0 0 0
- * x x 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- *
- * SPECIAL NOTES : CURRENTLY NOT USED IN CODEBASE.
- *
- ****************************************************************************/
- void IDct4 ( int16 *InputData, int16 *OutputData )
- {
- int32 t1;
- int loop;
- int32 _Add, _Fd;
- int32 _A, _B, _Ad, _Bd, _Cd, _Dd, _E;
- int16 *ip = InputData;
- int16 *op = OutputData;
- // Unzigzag the coefficents
- ip[8] = ip[2];
- ip[9] = ip[4];
- ip[2] = 0;
- ip[5] = 0;
- // Inverse DCT on the rows now
- for ( loop = 0; loop < 2; loop++)
- {
- // Check for non-zero values
- if ( ip[0] | ip[1] )
- {
- t1 = (int32)(xC1S7 * ip[1]);
- t1 >>= 16;
- _A = t1;
- t1 = (int32)(xC7S1 * ip[1]);
- t1 >>= 16;
- _B = t1 ;
- t1 = (int32)(xC4S4 * _A );
- t1 >>= 16;
- _Ad = t1;
- t1 = (int32)(xC4S4 * _B );
- t1 >>= 16;
- _Bd = t1;
- _Cd = _A ;
- _Dd = _B ;
- t1 = (int32)(xC4S4 * ip[0] );
- t1 >>= 16;
- _E = t1;
- _Add = _E + _Ad;
-
- _Fd = _E - _Ad;
-
- // Final sequence of operations over-write original inputs.
- ip[0] = (int16)((_E + _Cd ) >> 0);
- ip[7] = (int16)((_E - _Cd ) >> 0);
- ip[1] = (int16)((_Add + _Bd ) >> 0);
- ip[2] = (int16)((_Add - _Bd ) >> 0);
- ip[3] = (int16)((_E + _Dd ) >> 0);
- ip[4] = (int16)((_E - _Dd ) >> 0);
- ip[5] = (int16)((_Fd + _Bd ) >> 0);
- ip[6] = (int16)((_Fd - _Bd ) >> 0);
- }
- ip += 8; /* next row */
- }
- ip = InputData;
- for ( loop=0; loop<8; loop++ )
- {
- // Check for non-zero values (bitwise or faster than ||)
- if ( ip[0 * 8] | ip[1 * 8] )
- {
- t1 = (int32)(xC1S7 * ip[1*8]);
- t1 >>= 16;
- _A = t1 ;
- t1 = (int32)(xC7S1 * ip[1*8]);
- t1 >>= 16;
- _B = t1 ;
- t1 = (int32)(xC4S4 * _A );
- t1 >>= 16;
- _Ad = t1;
- t1 = (int32)(xC4S4 * _B );
- t1 >>= 16;
- _Bd = t1;
-
- _Cd = _A ;
- _Dd = _B ;
- t1 = (int32)(xC4S4 * ip[0*8]);
- t1 >>= 16;
- _E = t1;
- _Add = _E + _Ad;
-
- _Fd = _E - _Ad;
-
- _Add += IdctAdjustBeforeShift;
- _E += IdctAdjustBeforeShift;
- _Fd += IdctAdjustBeforeShift;
- // Final sequence of operations over-write original inputs.
- op[0*8] = (int16)((_E + _Cd ) >> 4);
- op[7*8] = (int16)((_E - _Cd ) >> 4);
- op[1*8] = (int16)((_Add + _Bd ) >> 4);
- op[2*8] = (int16)((_Add - _Bd ) >> 4);
- op[3*8] = (int16)((_E + _Dd ) >> 4);
- op[4*8] = (int16)((_E - _Dd ) >> 4);
- op[5*8] = (int16)((_Fd + _Bd ) >> 4);
- op[6*8] = (int16)((_Fd - _Bd ) >> 4);
- }
- else
- {
- op[0*8] = 0;
- op[7*8] = 0;
- op[1*8] = 0;
- op[2*8] = 0;
- op[3*8] = 0;
- op[4*8] = 0;
- op[5*8] = 0;
- op[6*8] = 0;
- }
- ip++; // next column
- op++;
- }
- }
- #endif
|