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 
DequantChromaDC2x2(OMX_S16 * pDst,OMX_INT QP)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 
InvTransformDC2x2(OMX_S16 * pData)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 
omxVCM4P10_TransformDequantChromaDCFromPair(const OMX_U8 ** ppSrc,OMX_S16 * pDst,OMX_INT QP)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