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  * File Name:  omxVCM4P10_TransformQuant_ChromaDC.c
     20  * OpenMAX DL: v1.0.2
     21  * Revision:   9641
     22  * Date:       Thursday, February 7, 2008
     23  *
     24  *
     25  *
     26  * Description:
     27  * This function will calculate 4x4 hadamard transform of chroma DC
     28  * coefficients and quantization
     29  *
     30  */
     31 
     32 #include "omxtypes.h"
     33 #include "armOMX.h"
     34 #include "omxVC.h"
     35 
     36 #include "armVC.h"
     37 #include "armCOMM.h"
     38 
     39 /**
     40  * Function:  omxVCM4P10_TransformQuant_ChromaDC   (6.3.5.6.1)
     41  *
     42  * Description:
     43  * This function performs 2x2 Hadamard transform of chroma DC coefficients
     44  * and then quantizes the coefficients.
     45  *
     46  * Input Arguments:
     47  *
     48  *   pSrcDst - Pointer to the 2x2 array of chroma DC coefficients.  8-byte
     49  *            alignment required.
     50  *   iQP - Quantization parameter; must be in the range [0,51].
     51  *   bIntra - Indicate whether this is an INTRA block. 1-INTRA, 0-INTER
     52  *
     53  * Output Arguments:
     54  *
     55  *   pSrcDst - Pointer to transformed and quantized coefficients.  8-byte
     56  *            alignment required.
     57  *
     58  * Return Value:
     59  *
     60  *    OMX_Sts_NoErr - no error
     61  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
     62  *              conditions are true:
     63  *    -    at least one of the following pointers is NULL:
     64  *             pSrcDst
     65  *    -    pSrcDst is not aligned on an 8-byte boundary
     66  *
     67  */
     68 OMXResult omxVCM4P10_TransformQuant_ChromaDC(
     69 	OMX_S16* 	pSrcDst,
     70 	OMX_U32		iQP,
     71 	OMX_U8		bIntra
     72 )
     73 {
     74     OMX_INT     i, j;
     75     OMX_S32     m[2][2];
     76     OMX_S32     Value;
     77     OMX_S32     QbitsPlusOne, Two_f, MF00;
     78 
     79     /* Check for argument error */
     80     armRetArgErrIf(pSrcDst == NULL, OMX_Sts_BadArgErr);
     81     armRetArgErrIf(armNot8ByteAligned(pSrcDst), OMX_Sts_BadArgErr);
     82     armRetArgErrIf(iQP > 51, OMX_Sts_BadArgErr);
     83 
     84     /* Hadamard Transform for 2x2 block */
     85     m[0][0] = pSrcDst[0] + pSrcDst[1] +  pSrcDst[2] + pSrcDst[3];
     86     m[0][1] = pSrcDst[0] - pSrcDst[1] +  pSrcDst[2] - pSrcDst[3];
     87     m[1][0] = pSrcDst[0] + pSrcDst[1] -  pSrcDst[2] - pSrcDst[3];
     88     m[1][1] = pSrcDst[0] - pSrcDst[1] -  pSrcDst[2] + pSrcDst[3];
     89 
     90     /* Quantization */
     91     QbitsPlusOne = ARM_M4P10_Q_OFFSET + 1 + (iQP / 6); /*floor (QP/6)*/
     92     MF00 = armVCM4P10_MFMatrix [iQP % 6][0];
     93 
     94     Two_f = (1 << QbitsPlusOne) / (bIntra ? 3 : 6); /* 3->INTRA, 6->INTER */
     95 
     96     /* Scaling */
     97     for (j = 0; j < 2; j++)
     98     {
     99         for (i = 0; i < 2; i++)
    100         {
    101             Value = (armAbs(m[j][i]) * MF00 + Two_f) >> QbitsPlusOne;
    102             pSrcDst[j * 2 + i] = (OMX_S16)((m[j][i] < 0) ? -Value : Value);
    103         }
    104     }
    105 
    106     return OMX_Sts_NoErr;
    107 }
    108 
    109 /*****************************************************************************
    110  *                              END OF FILE
    111  *****************************************************************************/
    112 
    113