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