diff -r 000000000000 -r 951a5db380a0 videoeditorengine/avcedit/src/invtransform.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoeditorengine/avcedit/src/invtransform.cpp Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,199 @@ +/* +* 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: +* +*/ + + +#include "globals.h" +#include "invtransform.h" + + +#ifndef AVC_RECO_BLOCK_ASM + +/* + * + * itrIDCTdequant4x4: + * + * Parameters: + * src Source values + * dest Inverse transformed values + * dequantPtr Dequant coefficients + * qp_per qp/6 + * isDc True if DC is separate + * dcValue Possible DC value + * + * Function: + * Dequantize coefficients and compute approximate 4x4 inverse DCT. + * + * Returns: + * - + */ +void itrIDCTdequant4x4(int src[4][4], int dest[4][4], const int *dequantPtr, + int qp_per, int isDc, int dcValue) +{ + int tmp[4][4]; + int A, B, C, D, E, F; + int i; + int deqc; + + /* + * a = A + B + C + (D>>1) + * b = A + (B>>1) - C - D + * c = A - (B>>1) - C + D + * d = A - B + C - (D>>1) + * => + * E = A + C + * F = B + (D>>1) + * a = E + F + * d = E - F + * E = A - C + * F = (B>>1) - D + * b = E + F + * c = E - F + */ + + A = dcValue; + + for (i = 0; i < 4; i++) { + deqc = (*dequantPtr++) << qp_per; + + if (!isDc) + A = src[i][0] * deqc; + + C = src[i][2] * deqc; + + deqc = (*dequantPtr++) << qp_per; + + B = src[i][1] * deqc; + D = src[i][3] * deqc; + + E = A + C; + F = B + (D>>1); + tmp[i][0] = E + F; + tmp[i][3] = E - F; + E = A - C; + F = (B>>1) - D; + tmp[i][1] = E + F; + tmp[i][2] = E - F; + + isDc = 0; + } + + for (i = 0; i < 4; i++) { + E = tmp[0][i] + tmp[2][i]; + F = tmp[1][i] + (tmp[3][i]>>1); + dest[0][i] = E + F; + dest[3][i] = E - F; + E = tmp[0][i] - tmp[2][i]; + F = (tmp[1][i]>>1) - tmp[3][i]; + dest[1][i] = E + F; + dest[2][i] = E - F; + } +} + +#endif + + +/* + * + * itrIHadaDequant4x4: + * + * Parameters: + * src Source values + * dest Inverse transformed values + * deqc Dequantization coefficient + * + * Function: + * Compute 4x4 inverse Hadamard transform and dequantize coefficients. + * + * Returns: + * - + * + */ +void itrIHadaDequant4x4(int src[4][4], int dest[4][4], int deqc) +{ + int tmp[4][4]; + int E; + int F; + int i; + + for (i = 0; i < 4; i++) { + E = src[i][0] + src[i][2]; + F = src[i][1] + src[i][3]; + tmp[i][0] = E + F; + tmp[i][3] = E - F; + E = src[i][0] - src[i][2]; + F = src[i][1] - src[i][3]; + tmp[i][1] = E + F; + tmp[i][2] = E - F; + } + + for (i = 0; i < 4; i++) { + E = tmp[0][i] + tmp[2][i]; + F = tmp[1][i] + tmp[3][i]; + dest[0][i] = ((E + F) * deqc + 2) >> 2; + dest[3][i] = ((E - F) * deqc + 2) >> 2; + E = tmp[0][i] - tmp[2][i]; + F = tmp[1][i] - tmp[3][i]; + dest[1][i] = ((E + F) * deqc + 2) >> 2; + dest[2][i] = ((E - F) * deqc + 2) >> 2; + } +} + + +/* + * + * itrIDCTdequant2x2: + * + * Parameters: + * src Source values + * dest Inverse transformed values + * deqc Dequantization coefficient + * + * Function: + * Compute 2x2 inverse DCT and dequantize coefficients. + * + * Returns: + * - + * + */ +void itrIDCTdequant2x2(int src[2][2], int dest[2][2], int deqc) +{ + int DDC00 = src[0][0]; + int DDC10 = src[0][1]; + int DDC01 = src[1][0]; + int DDC11 = src[1][1]; + int A, B; + + /* + * DDC(0,0) DDC(1,0) => DC0 DC1 + * DDC(0,1) DDC(1,1) DC2 DC3 + * + * DC0 = (DDC00+DDC10+DDC01+DDC11) + * DC1 = (DDC00-DDC10+DDC01-DDC11) + * DC2 = (DDC00+DDC10-DDC01-DDC11) + * DC3 = (DDC00-DDC10-DDC01+DDC11) + */ + + A = DDC00 + DDC01; + B = DDC10 + DDC11; + dest[0][0] = ((A + B) * deqc) >> 1; + dest[0][1] = ((A - B) * deqc) >> 1; + A = DDC00 - DDC01; + B = DDC10 - DDC11; + dest[1][0] = ((A + B) * deqc) >> 1; + dest[1][1] = ((A - B) * deqc) >> 1; +}