1/* ----------------------------------------------------------------
2 *
3 *
4 * File Name:  omxVCM4P10_TransformDequantChromaDCFromPair.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 Chroma 2x2 DC block
27 */
28
29static void DequantChromaDC2x2(
30     OMX_S16* pDst,
31     OMX_INT QP
32)
33{
34    int Shift = (QP/6)-1 ;
35    int Scale = armVCM4P10_VMatrix[QP%6][0];
36    int i, Value;
37
38    if (Shift >= 0)
39    {
40        for (i=0; i<4; i++)
41        {
42            Value = (pDst[i] * Scale) << Shift;
43            pDst[i] = (OMX_S16)Value;
44        }
45    }
46    else
47    {
48        for (i=0; i<4; i++)
49        {
50            Value = (pDst[i] * Scale) >> 1;
51            pDst[i] = (OMX_S16)Value;
52        }
53    }
54}
55
56
57/*
58 * Description:
59 * Inverse Transform DC 2x2 Coefficients
60 */
61
62static void InvTransformDC2x2(OMX_S16* pData)
63{
64    int c00 = pData[0];
65    int c01 = pData[1];
66    int c10 = pData[2];
67    int c11 = pData[3];
68
69    int d00 = c00 + c01;
70    int d01 = c00 - c01;
71    int d10 = c10 + c11;
72    int d11 = c10 - c11;
73
74    pData[0] = (OMX_S16)(d00 + d10);
75    pData[1] = (OMX_S16)(d01 + d11);
76    pData[2] = (OMX_S16)(d00 - d10);
77    pData[3] = (OMX_S16)(d01 - d11);
78}
79
80
81/**
82 * Function:  omxVCM4P10_TransformDequantChromaDCFromPair   (6.3.4.2.2)
83 *
84 * Description:
85 * Reconstruct the 2x2 ChromaDC block from coefficient-position pair buffer,
86 * perform integer inverse transformation, and dequantization for 2x2 chroma
87 * DC coefficients, and update the pair buffer pointer to next non-empty
88 * block.
89 *
90 * Input Arguments:
91 *
92 *   ppSrc - Double pointer to residual coefficient-position pair buffer
93 *            output by CALVC decoding
94 *   QP - Quantization parameter QpC
95 *
96 * Output Arguments:
97 *
98 *   ppSrc - *ppSrc is updated to the start of next non empty block
99 *   pDst - Pointer to the reconstructed 2x2 ChromaDC coefficients buffer;
100 *            must be aligned on a 4-byte boundary.
101 *
102 * Return Value:
103 *    OMX_Sts_NoErr, if the function runs without error.
104 *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
105 *    -    ppSrc or pDst is NULL.
106 *    -    pDst is not 4-byte aligned.
107 *    -    QP is not in the range of [0-51].
108 *
109 */
110
111OMXResult omxVCM4P10_TransformDequantChromaDCFromPair(
112     const OMX_U8 **ppSrc,
113     OMX_S16* pDst,
114     OMX_INT QP
115 )
116{
117    armRetArgErrIf(ppSrc  == NULL,           OMX_Sts_BadArgErr);
118    armRetArgErrIf(*ppSrc == NULL,           OMX_Sts_BadArgErr);
119    armRetArgErrIf(pDst   == NULL,           OMX_Sts_BadArgErr);
120    armRetArgErrIf(armNot4ByteAligned(pDst), OMX_Sts_BadArgErr);
121    armRetArgErrIf(QP<0,                     OMX_Sts_BadArgErr);
122    armRetArgErrIf(QP>51,                    OMX_Sts_BadArgErr);
123
124    armVCM4P10_UnpackBlock2x2(ppSrc, pDst);
125    InvTransformDC2x2(pDst);
126    DequantChromaDC2x2(pDst, QP);
127
128    return OMX_Sts_NoErr;
129}
130
131/* End of file */
132