omxVCM4P10_TransformDequantLumaDCFromPair.c revision 78e52bfac041d71ce53b5b13c2abf78af742b09d
10b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/*
20b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Copyright (C) 2007-2008 ARM Limited
30b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *
40b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
50b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * you may not use this file except in compliance with the License.
60b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * You may obtain a copy of the License at
70b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *
80b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
90b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *
100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Unless required by applicable law or agreed to in writing, software
110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * See the License for the specific language governing permissions and
140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * limitations under the License.
150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *
160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten */
170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/* ----------------------------------------------------------------
180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *
19979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten *
20979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten * File Name:  omxVCM4P10_TransformDequantLumaDCFromPair.c
21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * OpenMAX DL: v1.0.2
22daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten * Revision:   9641
23daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten * Date:       Thursday, February 7, 2008
240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *
25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *
26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *
27a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten *
28928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten * H.264 inverse quantize and transform module
29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *
30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten */
31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#include "omxtypes.h"
33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#include "armOMX.h"
34c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#include "omxVC.h"
35c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
36c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#include "armCOMM.h"
37c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#include "armVC.h"
38c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
39c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten/*
40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * Description:
41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * Dequantize Luma DC block
42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten */
43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic void DequantLumaDC4x4(
45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten     OMX_S16* pDst,
46f51dba65751107c930759938775b75531ec1f330Glenn Kasten     OMX_INT QP
47f51dba65751107c930759938775b75531ec1f330Glenn Kasten)
48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten{
49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    int Shift = (QP/6)-2 ;
50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    int Scale = armVCM4P10_VMatrix[QP%6][0];
51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    int i, Round, Value;
527a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
537a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    if (Shift >= 0)
547a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {
55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        for (i=0; i<16; i++)
56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        {
570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten            Value = (pDst[i] * Scale) << Shift;
580b167267bda99b68346045ccab14e810121d5de4Glenn Kasten            pDst[i] = (OMX_S16)Value;
59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
60daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    }
61daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    else
620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    {
63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        Shift = -Shift;;
64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        Round = 1<<(Shift-1);
65a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten
66928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten        for (i=0; i<16; i++)
67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        {
68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            Value = (pDst[i] * Scale + Round) >> Shift;
69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            pDst[i] = (OMX_S16)Value;
70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
72c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten}
73c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
74c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
75c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
76c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten/*
77c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten * Description:
78ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * Inverse Transform DC 4x4 Coefficients
79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten */
80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic void InvTransformDC4x4(OMX_S16* pData)
81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten{
82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    int i;
83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
84f51dba65751107c930759938775b75531ec1f330Glenn Kasten    /* Transform rows */
85f51dba65751107c930759938775b75531ec1f330Glenn Kasten    for (i=0; i<16; i+=4)
86ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    {
87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        int c0 = pData[i+0];
88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        int c1 = pData[i+1];
89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        int c2 = pData[i+2];
907a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        int c3 = pData[i+3];
917a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        pData[i+0] = (OMX_S16)(c0+c1+c2+c3);
927a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        pData[i+1] = (OMX_S16)(c0+c1-c2-c3);
93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        pData[i+2] = (OMX_S16)(c0-c1-c2+c3);
94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        pData[i+3] = (OMX_S16)(c0-c1+c2-c3);
950b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    }
960b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    /* Transform columns */
980b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    for (i=0; i<4; i++)
990b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    {
1000b167267bda99b68346045ccab14e810121d5de4Glenn Kasten        int c0 = pData[i+0];
1010b167267bda99b68346045ccab14e810121d5de4Glenn Kasten        int c1 = pData[i+4];
102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        int c2 = pData[i+8];
103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        int c3 = pData[i+12];
104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        pData[i+0] = (OMX_S16)(c0+c1+c2+c3);
105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        pData[i+4] = (OMX_S16)(c0+c1-c2-c3);
106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        pData[i+8] = (OMX_S16)(c0-c1-c2+c3);
107ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        pData[i+12] = (OMX_S16)(c0-c1+c2-c3);
108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
110c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten/**
113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * Function:  omxVCM4P10_TransformDequantLumaDCFromPair   (6.3.4.2.1)
114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *
115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * Description:
116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * Reconstructs the 4x4 LumaDC block from the coefficient-position pair
117ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * buffer, performs integer inverse, and dequantization for 4x4 LumaDC
118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * coefficients, and updates the pair buffer pointer to the next non-empty
119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * block.
120b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten *
121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * Input Arguments:
122daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten *
123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *   ppSrc - Double pointer to residual coefficient-position pair buffer
124a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten *            output by CALVC decoding
125a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten *   QP - Quantization parameter QpY
126a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten *
127a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten * Output Arguments:
128a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten *
129a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten *   ppSrc - *ppSrc is updated to the start of next non empty block
130a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten *   pDst - Pointer to the reconstructed 4x4 LumaDC coefficients buffer; must
131a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten *            be aligned on a 8-byte boundary.
132a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten *
133a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten * Return Value:
134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *    OMX_Sts_NoErr, if the function runs without error.
135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
136a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten *    -    ppSrc or pDst is NULL.
137f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten *    -    pDst is not 8 byte aligned.
138f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten *    -    QP is not in the range of [0-51].
139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *
140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten */
141daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
142a9a70a4451545034c9263dd55b181f2912534c37Glenn KastenOMXResult omxVCM4P10_TransformDequantLumaDCFromPair(
143a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten     const OMX_U8 **ppSrc,
144a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten     OMX_S16* pDst,
145a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten     OMX_INT QP
146a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten )
147a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{
148a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    armRetArgErrIf(ppSrc  == NULL,           OMX_Sts_BadArgErr);
149a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    armRetArgErrIf(*ppSrc == NULL,           OMX_Sts_BadArgErr);
150a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    armRetArgErrIf(pDst   == NULL,           OMX_Sts_BadArgErr);
151a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    armRetArgErrIf(armNot8ByteAligned(pDst), OMX_Sts_BadArgErr);
152a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    armRetArgErrIf(QP<0,                     OMX_Sts_BadArgErr);
153a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    armRetArgErrIf(QP>51,                    OMX_Sts_BadArgErr);
154a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten
155a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    armVCM4P10_UnpackBlock4x4(ppSrc, pDst);
156a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    /*InvTransformDequantLumaDC4x4(pDst, QP);*/
157a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    InvTransformDC4x4(pDst);
158a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    DequantLumaDC4x4(pDst, QP);
159a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten
160a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    return OMX_Sts_NoErr;
161a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten}
162a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten
163a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten/* End of file */
164a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten