diff -r 951a5db380a0 -r e0b5df5c0969 videoeditorengine/h263decoder/src/idctiforepoc.cpp --- a/videoeditorengine/h263decoder/src/idctiforepoc.cpp Fri Jan 29 14:08:33 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,641 +0,0 @@ -/* -* Copyright (c) 2010 Ixonos Plc. -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - Initial contribution -* -* Contributors: -* Ixonos Plc -* -* Description: -* Symbian OS -specific IDCT routines. -* -*/ - - - -/* - - 1 ABSTRACT - - - 1.1 Module Type - - type subroutine - - - 1.2 Functional Description - - Fixed point arithmetic for fast calculation of IDCT for 8x8 size image - blocks. The full calculation of the IDCT takes 208 multiplications and - 400 additions. - - The routine optionally checks if AC coefficients are all zero and in that - case makes a shortcut in IDCT, thus making the calculation faster. This - feature is activated by defining CHECK_ZERO_AC_COEFFICIENTS_0, - CHECK_ZERO_AC_COEFFICIENTS_1 or CHECK_ZERO_AC_COEFFICIENTS_2 in envdef.h. - - - 1.3 Specification/Design Reference - - The algorithm used is the fast algorithm introduced in W.-H. Chen, C. H. - Smith, and S. C. Fralick, "A fast computational algorithm for the - Discrete Cosine Transform," IEEE Transactions on Communications, vol. - COM-25, pp. 1004-1009, 1977. - - This IDCT routine conforms to the accuracy requirements specified in the - H.261 and H.263 recommendations. - - NRC documentation: Moments: H.263 Decoder - Functional Definition - Specification - - NRC documentation: Moments: H.263 Decoder - Implementation Design - Specification - - - 1.4 Module Test Specification Reference - - TRABANT:h263_test_spec.BASE-TEST - - - 1.5 Compilation Information - - Compiler: RISC OS ARM C compiler (Acorn Computers Ltd.) - Version: 5.05 - Activation: cc -DBUILD_TARGET=ACORNDEC idcti.c - - - 1.6 Notes - - This source code can be used in both 16-bit and 32-bit application. - - PREC defines the precision for the fixed point numbers. The best value - for it depends on several things: You should always have enough room for - the integer part of the number, and in 386s/486s smaller PREC values are - faster, but the smaller it is, the poorer is the accuracy. - - The TMPPRECDEC is another adjustable constant. It tells how many bits are - ripped off the number for the temporary storage. This way the accuracy - for the multiplications can be better. TMPPREC can be zero. This speeds - the code up a bit. - - To determine the maximum values for PREC and TMPPRECDEC, count bits you - need for the integer part anywhere during the calculation, substract that - from 32, and divide the remaining number by two. This number should be - >= (2*PREC-TMPPRECDEC)/2, otherwise the results may be corrupted due to - lost bits. - - For example, if you know that your data will vary from -2048 - 2047, you - need twelve bits for the integer part. 32-12 = 20, 20 / 2 = 10, so good - example values for PREC and TMPPRECDEC would be 12 and 4. Also 11 and 2 - would be legal, as would 11 and 3, but 12 and 3 would not ((2*12-3)/2 = - 10.5 > 10). - - NOTE: Several PREC and TMPPRECDEC values were tried in order to meet - the . - The requirements could not be met. PREC = 13, TMPPRECDEC = 5 was - the closest combination to meet the requirements violating only - the overall mean square error requirement. - - Both the input and output tables are assumed to be normal C ints. Thus, - in the 16-bit version they are 16-bit integers and in the 32-bit version - 32-bit ones. - - - Define CHECK_ZERO_AC_COEFFICIENTS_0, CHECK_ZERO_AC_COEFFICIENTS_1 and - CHECK_ZERO_AC_COEFFICIENTS_2 in envdef.h if zero AC coefficients checking - for the whole block, for current row or for current column is desired, - respectively. - - -*/ - - -/* 2 CONTENTS - - - 1 ABSTRACT - - 2 CONTENTS - - 3 GLOSSARY - - 4 EXTERNAL RESOURCES - 4.1 Include Files - 4.2 External Data Structures - 4.3 External Function Prototypes - - 5 LOCAL CONSTANTS AND MACROS - - 6 MODULE DATA STRUCTURES - 6.1 Local Data Structures - 6.2 Local Function Prototypes - - 7 MODULE CODE - 7.1 idct - 7.2 firstPass - 7.3 secondPass - -*/ - - -/* 3 GLOSSARY - - IDCT Inverse discrete cosine transform - -*/ - - -/* 4 EXTERNAL RESOURCES */ - - -/* 4.1 Include Files */ - -#include "h263dconfig.h" - -/* 4.2 External Data Structures */ - - /* None */ - - -/* 4.3 External Function Prototypes */ - - /* None */ - - -/* 5 LOCAL CONSTANTS AND MACROS */ - -#define PREC 13 /* Fixed point precision */ -#define TMPPRECDEC 5 /* Temporary precision decrease */ - - /* See note about PREC and TMPPRECDEC above. */ - -#define TMPPREC ( PREC - TMPPRECDEC ) -#define CDIV ( 1 << ( 16 - PREC )) -#define ROUNDER ( 1 << ( PREC - 1 )) - -#define f0 (int32)(0xb504 / CDIV) /* .7071068 = cos( pi / 4 ) */ -#define f1 (int32)(0x7d8a / CDIV) /* .4903926 = 0.5 * cos( 7pi / 16 ) */ -#define f2 (int32)(0x7641 / CDIV) /* .4619398 = 0.5 * cos( 6pi / 16 ) */ -#define f3 (int32)(0x6a6d / CDIV) /* .4157348 = 0.5 * cos( 5pi / 16 ) */ -#define f4 (int32)(0x5a82 / CDIV) /* .3535534 = 0.5 * cos( 4pi / 16 ) */ -#define f5 (int32)(0x471c / CDIV) /* .2777851 = 0.5 * cos( 3pi / 16 ) */ -#define f6 (int32)(0x30fb / CDIV) /* .1913417 = 0.5 * cos( 2pi / 16 ) */ -#define f7 (int32)(0x18f8 / CDIV) /* .0975452 = 0.5 * cos( pi / 16 ) */ - -#define f0TMP (int32)(0xb504 / (1 << (16 - TMPPREC))) - - - -/* 6 MODULE DATA STRUCTURES */ - - -/* 6.1 Local Data Structures */ - -#ifdef _WIN32_EXPLICIT /* EPOC32_PORT static data */ - -static const int idctZigzag[64] = /* array of zig-zag positioning */ -{ 0, 1, 5, 6, 14, 15, 27, 28, /* of transform coefficients */ - 2, 4, 7, 13, 16, 26, 29, 42, - 3, 8, 12, 17, 25, 30, 41, 43, - 9, 11, 18, 24, 31, 40, 44, 53, - 10, 19, 23, 32, 39, 45, 52, 54, - 20, 22, 33, 38, 46, 51, 55, 60, - 21, 34, 37, 47, 50, 56, 59, 61, - 35, 36, 48, 49, 57, 58, 62, 63 }; - -static int32 idctTmpbuf1[64]; /* array for temporary storage of - transform results */ -#endif - -/* 6.2 Local Function Prototypes */ - -static void firstPass (int *buffer, - int32 *tmpbuf); - -static void secondPass (int32 *tmpbuf, - int *dest); - - - -/* 7 MODULE CODE */ - -/* -============================================================================= -*/ - -/* 7.1 */ - -void idct - (int *block) - - { - - -/* Functional Description - - Fixed point arithmetic for fast calculation of IDCT for 8x8 size image - blocks. - - - Activation - - by function call - - Reentrancy: no - - - Inputs - - Parameters: - - *block: 8x8 source block of zigzagged cosine transform - coefficients - - Externals: - - None - - - Outputs - - Parameters: - - *block: 8x8 destination block of pixel values - - Externals: - - None - - Return Values: - - None - - - Exceptional Conditions - - None - ------------------------------------------------------------------------------ -*/ - - - -/* Pseudocode - - Calculate 1D-IDCT by rows. - Calculate 1D-IDCT by columns. - -*/ - - - -/* Data Structures */ - - -/* These are only needed if checking the AC coefficients of the whole block - is desired. */ - - int i = 1; /* Loop variable */ - int result; /* Calculation result */ - - -#ifndef _WIN32_EXPLICIT /* EPOC32_PORT static data */ - int32 idctTmpbuf1[64]; -#endif - -/* Code */ - - - /* - * Check if the AC coefficients of the whole block are all zero. - * In that case the inverse transform is equal to the DC - * coefficient with a scale factor. - */ - - while (i < 64 && !block[i++]) {} - if (i == 64) { - int *blk = block; - result = (block[0] + 4) >> 3; - i = 8; - while ( i-- ) - { - blk[0] = result; blk[1] = result; blk[2] = result; blk[3] = result; - blk[4] = result; blk[5] = result; blk[6] = result; blk[7] = result; - blk += 8; - } - /* - for (i = 0; i < 64; i++) - { - block[i] = result; - } - */ - } - else - { - firstPass(block, idctTmpbuf1); - secondPass(idctTmpbuf1, block); - } - - - } - -/* -============================================================================= -*/ - - - -/* 7.2 */ - -static void firstPass - (int *buffer, - int32 *tmpbuf) - - { - - -/* Functional Description - - Local function: Calculate 1D-IDCT for the rows of the 8x8 block. - - - Activation - - by function call - - Reentrancy: no - - - Inputs - - Parameters: - - *block: 8x8 block of cosine transform coefficients - - Externals: - - None - - - Outputs - - Parameters: - - *tmpbuf Temporary storage for the results of the first pass. - - Externals: - - None - - Return Values: - - None - - - Exceptional Conditions - - None - ------------------------------------------------------------------------------ -*/ - - - -/* Pseudocode - - Calculate 1D-IDCT by rows. - -*/ - - - -/* Data Structures */ - - int row; /* Loop variable */ - int32 e, f, g, h; /* Temporary storage */ - int32 t0, t1, t2, t3, t5, t6; /* Temporary storage */ - int32 bd2, bd3; /* Temporary storage */ - -#ifndef _WIN32_EXPLICIT /* EPOC32_PORT static data */ - static const int idctZigzag[64] = -{ 0, 1, 5, 6, 14, 15, 27, 28, - 2, 4, 7, 13, 16, 26, 29, 42, - 3, 8, 12, 17, 25, 30, 41, 43, - 9, 11, 18, 24, 31, 40, 44, 53, - 10, 19, 23, 32, 39, 45, 52, 54, - 20, 22, 33, 38, 46, 51, 55, 60, - 21, 34, 37, 47, 50, 56, 59, 61, - 35, 36, 48, 49, 57, 58, 62, 63 }; - - const int *zz = idctZigzag; -#else - int *zz = idctZigzag; -#endif - - -/* Code */ - -#define ZZ(x) ((int32)buffer[zz[x]]) - - for( row = 0; row < 8; row++ ) - { - - - /* - * Check if the AC coefficients on the current row are all zero. - * In that case the inverse transform is equal to the DC - * coefficient with a scale factor. - */ - - if ((ZZ(1) | ZZ(2) | ZZ(3) | ZZ(4) | ZZ(5) | ZZ(6) | ZZ(7)) == 0) - { - tmpbuf[7] = - tmpbuf[6] = - tmpbuf[5] = - tmpbuf[4] = - tmpbuf[3] = - tmpbuf[2] = - tmpbuf[1] = - tmpbuf[0] = (ZZ(0) * f4) >> TMPPRECDEC; - - tmpbuf += 8; - zz += 8; - continue; - } - - t0 = t3 = (ZZ(0) + ZZ(4)) * f4; - bd3 = ZZ(6) * f6 + ZZ(2) * f2; - t0 += bd3; - t3 -= bd3; - - t1 = t2 = (ZZ(0) - ZZ(4)) * f4; - bd2 = ZZ(2) * f6 - ZZ(6) * f2; - t1 += bd2; - t2 -= bd2; - - e = h = (ZZ(1) + ZZ(7)) * f7; - h += ZZ(1) * ( -f7+f1 ); - f = g = (ZZ(5) + ZZ(3)) * f3; - g += ZZ(5) * ( -f3+f5 ); - - tmpbuf[0] = ( t0 + ( h + g )) >> TMPPRECDEC; - tmpbuf[7] = ( t0 - ( h + g )) >> TMPPRECDEC; - - f += ZZ(3) * ( -f3-f5 ); - e += ZZ(7) * ( -f7-f1 ); - - tmpbuf[3] = ( t3 + ( e + f )) >> TMPPRECDEC; - tmpbuf[4] = ( t3 - ( e + f )) >> TMPPRECDEC; - - t6 = ( h - g + e - f ) * f0TMP >> TMPPREC; - t5 = ( h - g - e + f ) * f0TMP >> TMPPREC; - - tmpbuf[1] = ( t1 + t6 ) >> TMPPRECDEC; - tmpbuf[6] = ( t1 - t6 ) >> TMPPRECDEC; - tmpbuf[2] = ( t2 + t5 ) >> TMPPRECDEC; - tmpbuf[5] = ( t2 - t5 ) >> TMPPRECDEC; - - tmpbuf += 8; - zz += 8; - } - } - -#undef ZZ - - -/* -============================================================================= -*/ - - - -/* 7.3 */ - -static void secondPass - (int32 *tmpbuf, - int *dest) - - { - - -/* Functional Description - - Local function: Calculate 1D-IDCT for the columns of the 8x8 block. - - - Activation - - by function call - - Reentrancy: no - - - Inputs - - Parameters: - - *tmpbuf Temporary storage for the results of the first pass. - - Externals: - - None - - - Outputs - - Parameters: - - *block: 8x8 block of pixel values - - Externals: - - None - - Return Values: - - None - - - Exceptional Conditions - - None - ------------------------------------------------------------------------------ -*/ - - -/* Pseudocode - - Calculate 1D-IDCT by columns. - -*/ - - -/* Data Structures */ - - int col; /* Loop variable */ - int32 e, f, g, h; /* Temporary storage */ - int32 t0, t1, t2, t3, t5, t6; /* Temporary storage */ - int32 bd2, bd3; /* Temporary storage */ - - -/* Code */ - -#define ZZ(x) tmpbuf[x * 8] - - for( col = 0; col < 8; col++ ) - { - - t0 = t3 = ((ZZ(0) + ZZ(4)) * f4 ) >> TMPPREC; - bd3 = ( ZZ(6) * f6 + ZZ(2) * f2 ) >> TMPPREC; - t0 += bd3; - t3 -= bd3; - - t1 = t2 = ((ZZ(0) - ZZ(4)) * f4 ) >> TMPPREC; - bd2 = ( ZZ(2) * f6 - ZZ(6) * f2 ) >> TMPPREC; - t1 += bd2; - t2 -= bd2; - - e = h = (ZZ(1) + ZZ(7)) * f7; - h += (ZZ(1) * ( -f7+f1 )); - h >>= TMPPREC; - f = g = (ZZ(5) + ZZ(3)) * f3; - g += (ZZ(5) * ( -f3+f5 )); - g >>= TMPPREC; - - dest[0*8] = (int) (( t0 + ( h + g ) + ROUNDER ) >> PREC); - dest[7*8] = (int) (( t0 - ( h + g ) + ROUNDER ) >> PREC); - - f += ZZ(3) * ( -f3-f5 ); - f >>= TMPPREC; - e += ZZ(7) * ( -f7-f1 ); - e >>= TMPPREC; - - dest[3*8] = (int) (( t3 + ( e + f ) + ROUNDER ) >> PREC); - dest[4*8] = (int) (( t3 - ( e + f ) + ROUNDER ) >> PREC); - - t6 = ( h - g + e - f ) * f0TMP >> TMPPREC; - t5 = ( h - g - e + f ) * f0TMP >> TMPPREC; - - dest[1*8] = (int) (( t1 + t6 + ROUNDER ) >> PREC); - dest[6*8] = (int) (( t1 - t6 + ROUNDER ) >> PREC); - dest[2*8] = (int) (( t2 + t5 + ROUNDER ) >> PREC); - dest[5*8] = (int) (( t2 - t5 + ROUNDER ) >> PREC); - - tmpbuf++; - dest++; - } - } - - -/* -============================================================================= -*/ - -// End of File