Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2007-2008 ARM Limited
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  *
     16  */
     17 /* ----------------------------------------------------------------
     18  *
     19  *
     20  * File Name:  omxVCM4P10_TransformDequantChromaDCFromPair.c
     21  * OpenMAX DL: v1.0.2
     22  * Revision:   9641
     23  * Date:       Thursday, February 7, 2008
     24  *
     25  *
     26  *
     27  *
     28  * H.264 inverse quantize and transform module
     29  *
     30  */
     31 
     32 #include "omxtypes.h"
     33 #include "armOMX.h"
     34 #include "omxVC.h"
     35 
     36 #include "armCOMM.h"
     37 #include "armVC.h"
     38 
     39 /*
     40  * Description:
     41  * Dequantize Chroma 2x2 DC block
     42  */
     43 
     44 static void DequantChromaDC2x2(
     45      OMX_S16* pDst,
     46      OMX_INT QP
     47 )
     48 {
     49     int Shift = (QP/6)-1 ;
     50     int Scale = armVCM4P10_VMatrix[QP%6][0];
     51     int i, Value;
     52 
     53     if (Shift >= 0)
     54     {
     55         for (i=0; i<4; i++)
     56         {
     57             Value = (pDst[i] * Scale) << Shift;
     58             pDst[i] = (OMX_S16)Value;
     59         }
     60     }
     61     else
     62     {
     63         for (i=0; i<4; i++)
     64         {
     65             Value = (pDst[i] * Scale) >> 1;
     66             pDst[i] = (OMX_S16)Value;
     67         }
     68     }
     69 }
     70 
     71 
     72 /*
     73  * Description:
     74  * Inverse Transform DC 2x2 Coefficients
     75  */
     76 
     77 static void InvTransformDC2x2(OMX_S16* pData)
     78 {
     79     int c00 = pData[0];
     80     int c01 = pData[1];
     81     int c10 = pData[2];
     82     int c11 = pData[3];
     83 
     84     int d00 = c00 + c01;
     85     int d01 = c00 - c01;
     86     int d10 = c10 + c11;
     87     int d11 = c10 - c11;
     88 
     89     pData[0] = (OMX_S16)(d00 + d10);
     90     pData[1] = (OMX_S16)(d01 + d11);
     91     pData[2] = (OMX_S16)(d00 - d10);
     92     pData[3] = (OMX_S16)(d01 - d11);
     93 }
     94 
     95 
     96 /**
     97  * Function:  omxVCM4P10_TransformDequantChromaDCFromPair   (6.3.4.2.2)
     98  *
     99  * Description:
    100  * Reconstruct the 2x2 ChromaDC block from coefficient-position pair buffer,
    101  * perform integer inverse transformation, and dequantization for 2x2 chroma
    102  * DC coefficients, and update the pair buffer pointer to next non-empty
    103  * block.
    104  *
    105  * Input Arguments:
    106  *
    107  *   ppSrc - Double pointer to residual coefficient-position pair buffer
    108  *            output by CALVC decoding
    109  *   QP - Quantization parameter QpC
    110  *
    111  * Output Arguments:
    112  *
    113  *   ppSrc - *ppSrc is updated to the start of next non empty block
    114  *   pDst - Pointer to the reconstructed 2x2 ChromaDC coefficients buffer;
    115  *            must be aligned on a 4-byte boundary.
    116  *
    117  * Return Value:
    118  *    OMX_Sts_NoErr, if the function runs without error.
    119  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
    120  *    -    ppSrc or pDst is NULL.
    121  *    -    pDst is not 4-byte aligned.
    122  *    -    QP is not in the range of [0-51].
    123  *
    124  */
    125 
    126 OMXResult omxVCM4P10_TransformDequantChromaDCFromPair(
    127      const OMX_U8 **ppSrc,
    128      OMX_S16* pDst,
    129      OMX_INT QP
    130  )
    131 {
    132     armRetArgErrIf(ppSrc  == NULL,           OMX_Sts_BadArgErr);
    133     armRetArgErrIf(*ppSrc == NULL,           OMX_Sts_BadArgErr);
    134     armRetArgErrIf(pDst   == NULL,           OMX_Sts_BadArgErr);
    135     armRetArgErrIf(armNot4ByteAligned(pDst), OMX_Sts_BadArgErr);
    136     armRetArgErrIf(QP<0,                     OMX_Sts_BadArgErr);
    137     armRetArgErrIf(QP>51,                    OMX_Sts_BadArgErr);
    138 
    139     armVCM4P10_UnpackBlock2x2(ppSrc, pDst);
    140     InvTransformDC2x2(pDst);
    141     DequantChromaDC2x2(pDst, QP);
    142 
    143     return OMX_Sts_NoErr;
    144 }
    145 
    146 /* End of file */
    147