Home | History | Annotate | Download | only in src
      1 /* ----------------------------------------------------------------
      2  *
      3  *
      4  * File Name:  omxVCM4P10_TransformDequantLumaDCFromPair.c
      5  * OpenMAX DL: v1.0.2
      6  * Revision:   9641
      7  * Date:       Thursday, February 7, 2008
      8  *
      9  * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
     10  *
     11  *
     12  *
     13  * H.264 inverse quantize and transform module
     14  *
     15  */
     16 
     17 #include "omxtypes.h"
     18 #include "armOMX.h"
     19 #include "omxVC.h"
     20 
     21 #include "armCOMM.h"
     22 #include "armVC.h"
     23 
     24 /*
     25  * Description:
     26  * Dequantize Luma DC block
     27  */
     28 
     29 static void DequantLumaDC4x4(
     30      OMX_S16* pDst,
     31      OMX_INT QP
     32 )
     33 {
     34     int Shift = (QP/6)-2 ;
     35     int Scale = armVCM4P10_VMatrix[QP%6][0];
     36     int i, Round, Value;
     37 
     38     if (Shift >= 0)
     39     {
     40         for (i=0; i<16; i++)
     41         {
     42             Value = (pDst[i] * Scale) << Shift;
     43             pDst[i] = (OMX_S16)Value;
     44         }
     45     }
     46     else
     47     {
     48         Shift = -Shift;;
     49         Round = 1<<(Shift-1);
     50 
     51         for (i=0; i<16; i++)
     52         {
     53             Value = (pDst[i] * Scale + Round) >> Shift;
     54             pDst[i] = (OMX_S16)Value;
     55         }
     56     }
     57 }
     58 
     59 
     60 
     61 /*
     62  * Description:
     63  * Inverse Transform DC 4x4 Coefficients
     64  */
     65 static void InvTransformDC4x4(OMX_S16* pData)
     66 {
     67     int i;
     68 
     69     /* Transform rows */
     70     for (i=0; i<16; i+=4)
     71     {
     72         int c0 = pData[i+0];
     73         int c1 = pData[i+1];
     74         int c2 = pData[i+2];
     75         int c3 = pData[i+3];
     76         pData[i+0] = (OMX_S16)(c0+c1+c2+c3);
     77         pData[i+1] = (OMX_S16)(c0+c1-c2-c3);
     78         pData[i+2] = (OMX_S16)(c0-c1-c2+c3);
     79         pData[i+3] = (OMX_S16)(c0-c1+c2-c3);
     80     }
     81 
     82     /* Transform columns */
     83     for (i=0; i<4; i++)
     84     {
     85         int c0 = pData[i+0];
     86         int c1 = pData[i+4];
     87         int c2 = pData[i+8];
     88         int c3 = pData[i+12];
     89         pData[i+0] = (OMX_S16)(c0+c1+c2+c3);
     90         pData[i+4] = (OMX_S16)(c0+c1-c2-c3);
     91         pData[i+8] = (OMX_S16)(c0-c1-c2+c3);
     92         pData[i+12] = (OMX_S16)(c0-c1+c2-c3);
     93     }
     94 }
     95 
     96 
     97 /**
     98  * Function:  omxVCM4P10_TransformDequantLumaDCFromPair   (6.3.4.2.1)
     99  *
    100  * Description:
    101  * Reconstructs the 4x4 LumaDC block from the coefficient-position pair
    102  * buffer, performs integer inverse, and dequantization for 4x4 LumaDC
    103  * coefficients, and updates the pair buffer pointer to the next non-empty
    104  * block.
    105  *
    106  * Input Arguments:
    107  *
    108  *   ppSrc - Double pointer to residual coefficient-position pair buffer
    109  *            output by CALVC decoding
    110  *   QP - Quantization parameter QpY
    111  *
    112  * Output Arguments:
    113  *
    114  *   ppSrc - *ppSrc is updated to the start of next non empty block
    115  *   pDst - Pointer to the reconstructed 4x4 LumaDC coefficients buffer; must
    116  *            be aligned on a 8-byte boundary.
    117  *
    118  * Return Value:
    119  *    OMX_Sts_NoErr, if the function runs without error.
    120  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
    121  *    -    ppSrc or pDst is NULL.
    122  *    -    pDst is not 8 byte aligned.
    123  *    -    QP is not in the range of [0-51].
    124  *
    125  */
    126 
    127 OMXResult omxVCM4P10_TransformDequantLumaDCFromPair(
    128      const OMX_U8 **ppSrc,
    129      OMX_S16* pDst,
    130      OMX_INT QP
    131  )
    132 {
    133     armRetArgErrIf(ppSrc  == NULL,           OMX_Sts_BadArgErr);
    134     armRetArgErrIf(*ppSrc == NULL,           OMX_Sts_BadArgErr);
    135     armRetArgErrIf(pDst   == NULL,           OMX_Sts_BadArgErr);
    136     armRetArgErrIf(armNot8ByteAligned(pDst), OMX_Sts_BadArgErr);
    137     armRetArgErrIf(QP<0,                     OMX_Sts_BadArgErr);
    138     armRetArgErrIf(QP>51,                    OMX_Sts_BadArgErr);
    139 
    140     armVCM4P10_UnpackBlock4x4(ppSrc, pDst);
    141     /*InvTransformDequantLumaDC4x4(pDst, QP);*/
    142     InvTransformDC4x4(pDst);
    143     DequantLumaDC4x4(pDst, QP);
    144 
    145     return OMX_Sts_NoErr;
    146 }
    147 
    148 /* End of file */
    149