videoeditorengine/avcedit/src/invtransform.cpp
branchRCL_3
changeset 3 e0b5df5c0969
parent 0 951a5db380a0
child 7 4c409de21d23
equal deleted inserted replaced
0:951a5db380a0 3:e0b5df5c0969
     1 /*
       
     2 * Copyright (c) 2010 Ixonos Plc.
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - Initial contribution
       
    11 *
       
    12 * Contributors:
       
    13 * Ixonos Plc
       
    14 *
       
    15 * Description:
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 #include "globals.h"
       
    21 #include "invtransform.h"
       
    22 
       
    23 
       
    24 #ifndef AVC_RECO_BLOCK_ASM
       
    25 
       
    26 /*
       
    27  *
       
    28  * itrIDCTdequant4x4:
       
    29  *
       
    30  * Parameters:
       
    31  *      src                   Source values
       
    32  *      dest                  Inverse transformed values
       
    33  *      dequantPtr            Dequant coefficients
       
    34  *      qp_per                qp/6
       
    35  *      isDc                  True if DC is separate
       
    36  *      dcValue               Possible DC value
       
    37  *
       
    38  * Function:
       
    39  *      Dequantize coefficients and compute approximate 4x4 inverse DCT.
       
    40  *
       
    41  * Returns:
       
    42  *      -
       
    43  */
       
    44 void itrIDCTdequant4x4(int src[4][4], int dest[4][4], const int *dequantPtr,
       
    45                        int qp_per, int isDc, int dcValue)
       
    46 {
       
    47   int tmp[4][4];
       
    48   int A, B, C, D, E, F;
       
    49   int i;
       
    50   int deqc;
       
    51 
       
    52   /*
       
    53    *  a = A + B + C + (D>>1)
       
    54    *  b = A + (B>>1) - C - D
       
    55    *  c = A - (B>>1) - C + D
       
    56    *  d = A - B + C - (D>>1)
       
    57    *   =>
       
    58    *  E = A + C
       
    59    *  F = B +  (D>>1)
       
    60    *  a = E + F
       
    61    *  d = E - F
       
    62    *  E = A - C
       
    63    *  F = (B>>1) - D
       
    64    *  b = E + F
       
    65    *  c = E - F
       
    66    */
       
    67 
       
    68   A = dcValue;
       
    69 
       
    70   for (i = 0; i < 4; i++) {
       
    71     deqc = (*dequantPtr++) << qp_per;
       
    72 
       
    73     if (!isDc)
       
    74       A = src[i][0] * deqc;
       
    75 
       
    76     C = src[i][2] * deqc;
       
    77 
       
    78     deqc = (*dequantPtr++) << qp_per;
       
    79 
       
    80     B = src[i][1] * deqc;
       
    81     D = src[i][3] * deqc;
       
    82 
       
    83     E = A +  C;
       
    84     F = B + (D>>1);
       
    85     tmp[i][0] = E + F;
       
    86     tmp[i][3] = E - F;
       
    87     E =  A     - C;
       
    88     F = (B>>1) - D;
       
    89     tmp[i][1] = E + F;
       
    90     tmp[i][2] = E - F;
       
    91 
       
    92     isDc = 0;
       
    93   }
       
    94 
       
    95   for (i = 0; i < 4; i++) {
       
    96     E = tmp[0][i] +  tmp[2][i];
       
    97     F = tmp[1][i] + (tmp[3][i]>>1);
       
    98     dest[0][i] = E + F;
       
    99     dest[3][i] = E - F;
       
   100     E =  tmp[0][i]     - tmp[2][i];
       
   101     F = (tmp[1][i]>>1) - tmp[3][i];
       
   102     dest[1][i] = E + F;
       
   103     dest[2][i] = E - F;
       
   104   }
       
   105 }
       
   106 
       
   107 #endif
       
   108 
       
   109 
       
   110 /*
       
   111  *
       
   112  * itrIHadaDequant4x4:
       
   113  *
       
   114  * Parameters:
       
   115  *      src                   Source values
       
   116  *      dest                  Inverse transformed values
       
   117  *      deqc                  Dequantization coefficient
       
   118  *
       
   119  * Function:
       
   120  *      Compute 4x4 inverse Hadamard transform and dequantize coefficients.
       
   121  *
       
   122  * Returns:
       
   123  *      -
       
   124  *
       
   125  */
       
   126 void itrIHadaDequant4x4(int src[4][4], int dest[4][4], int deqc)
       
   127 {
       
   128   int tmp[4][4];
       
   129   int E;
       
   130   int F;
       
   131   int i;
       
   132 
       
   133   for (i = 0; i < 4; i++) {
       
   134     E = src[i][0] + src[i][2];
       
   135     F = src[i][1] + src[i][3];
       
   136     tmp[i][0] = E + F;
       
   137     tmp[i][3] = E - F;
       
   138     E = src[i][0] - src[i][2];
       
   139     F = src[i][1] - src[i][3];
       
   140     tmp[i][1] = E + F;
       
   141     tmp[i][2] = E - F;
       
   142   }
       
   143 
       
   144   for (i = 0; i < 4; i++) {
       
   145     E = tmp[0][i] + tmp[2][i];
       
   146     F = tmp[1][i] + tmp[3][i];
       
   147     dest[0][i] = ((E + F) * deqc + 2) >> 2;
       
   148     dest[3][i] = ((E - F) * deqc + 2) >> 2;
       
   149     E = tmp[0][i] - tmp[2][i];
       
   150     F = tmp[1][i] - tmp[3][i];
       
   151     dest[1][i] = ((E + F) * deqc + 2) >> 2;
       
   152     dest[2][i] = ((E - F) * deqc + 2) >> 2;
       
   153   }
       
   154 }
       
   155 
       
   156 
       
   157 /*
       
   158  *
       
   159  * itrIDCTdequant2x2:
       
   160  *
       
   161  * Parameters:
       
   162  *      src                   Source values
       
   163  *      dest                  Inverse transformed values
       
   164  *      deqc                  Dequantization coefficient
       
   165  *
       
   166  * Function:
       
   167  *      Compute 2x2 inverse DCT and dequantize coefficients.
       
   168  *
       
   169  * Returns:
       
   170  *      -
       
   171  *
       
   172  */
       
   173 void itrIDCTdequant2x2(int src[2][2], int dest[2][2], int deqc)
       
   174 {
       
   175   int DDC00 = src[0][0];
       
   176   int DDC10 = src[0][1];
       
   177   int DDC01 = src[1][0];
       
   178   int DDC11 = src[1][1];
       
   179   int A, B;
       
   180 
       
   181   /*
       
   182    *  DDC(0,0) DDC(1,0)  =>  DC0 DC1
       
   183    *  DDC(0,1) DDC(1,1)      DC2 DC3
       
   184    *
       
   185    *  DC0 = (DDC00+DDC10+DDC01+DDC11)
       
   186    *  DC1 = (DDC00-DDC10+DDC01-DDC11)
       
   187    *  DC2 = (DDC00+DDC10-DDC01-DDC11)
       
   188    *  DC3 = (DDC00-DDC10-DDC01+DDC11)
       
   189    */
       
   190 
       
   191   A = DDC00 + DDC01;
       
   192   B = DDC10 + DDC11;
       
   193   dest[0][0] = ((A + B) * deqc) >> 1;
       
   194   dest[0][1] = ((A - B) * deqc) >> 1;
       
   195   A = DDC00 - DDC01;
       
   196   B = DDC10 - DDC11;
       
   197   dest[1][0] = ((A + B) * deqc) >> 1;
       
   198   dest[1][1] = ((A - B) * deqc) >> 1;
       
   199 }