178e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar/* 278e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Copyright (C) 2007-2008 ARM Limited 378e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * 478e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License"); 578e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * you may not use this file except in compliance with the License. 678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * You may obtain a copy of the License at 778e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * 878e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * http://www.apache.org/licenses/LICENSE-2.0 978e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * 1078e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Unless required by applicable law or agreed to in writing, software 1178e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS, 1278e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1378e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * See the License for the specific language governing permissions and 1478e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * limitations under the License. 1578e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * 1678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar */ 170c1bc742181ded4930842b46e9507372f0b1b963James Dong/** 180c1bc742181ded4930842b46e9507372f0b1b963James Dong * 190c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name: omxVCM4P2_QuantInter_I.c 200c1bc742181ded4930842b46e9507372f0b1b963James Dong * OpenMAX DL: v1.0.2 210c1bc742181ded4930842b46e9507372f0b1b963James Dong * Revision: 9641 220c1bc742181ded4930842b46e9507372f0b1b963James Dong * Date: Thursday, February 7, 2008 230c1bc742181ded4930842b46e9507372f0b1b963James Dong * 240c1bc742181ded4930842b46e9507372f0b1b963James Dong * 250c1bc742181ded4930842b46e9507372f0b1b963James Dong * 260c1bc742181ded4930842b46e9507372f0b1b963James Dong * 270c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description: 280c1bc742181ded4930842b46e9507372f0b1b963James Dong * Contains modules for inter Quantization 290c1bc742181ded4930842b46e9507372f0b1b963James Dong * 300c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 310c1bc742181ded4930842b46e9507372f0b1b963James Dong 320c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxtypes.h" 330c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armOMX.h" 340c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxVC.h" 350c1bc742181ded4930842b46e9507372f0b1b963James Dong 360c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM.h" 370c1bc742181ded4930842b46e9507372f0b1b963James Dong 380c1bc742181ded4930842b46e9507372f0b1b963James Dong/** 390c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: omxVCM4P2_QuantInter_I (6.2.4.4.3) 400c1bc742181ded4930842b46e9507372f0b1b963James Dong * 410c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description: 420c1bc742181ded4930842b46e9507372f0b1b963James Dong * Performs quantization on an inter coefficient block; supports 430c1bc742181ded4930842b46e9507372f0b1b963James Dong * bits_per_pixel == 8. 440c1bc742181ded4930842b46e9507372f0b1b963James Dong * 450c1bc742181ded4930842b46e9507372f0b1b963James Dong * Input Arguments: 460c1bc742181ded4930842b46e9507372f0b1b963James Dong * 470c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcDst - pointer to the input inter block coefficients; must be aligned 480c1bc742181ded4930842b46e9507372f0b1b963James Dong * on a 16-byte boundary. 490c1bc742181ded4930842b46e9507372f0b1b963James Dong * QP - quantization parameter (quantizer_scale) 500c1bc742181ded4930842b46e9507372f0b1b963James Dong * shortVideoHeader - binary flag indicating presence of short_video_header; 510c1bc742181ded4930842b46e9507372f0b1b963James Dong * shortVideoHeader==1 selects linear intra DC mode, and 520c1bc742181ded4930842b46e9507372f0b1b963James Dong * shortVideoHeader==0 selects non linear intra DC mode. 530c1bc742181ded4930842b46e9507372f0b1b963James Dong * 540c1bc742181ded4930842b46e9507372f0b1b963James Dong * Output Arguments: 550c1bc742181ded4930842b46e9507372f0b1b963James Dong * 560c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcDst - pointer to the output (quantized) interblock coefficients. 570c1bc742181ded4930842b46e9507372f0b1b963James Dong * When shortVideoHeader==1, AC coefficients are saturated on the 580c1bc742181ded4930842b46e9507372f0b1b963James Dong * interval [-127, 127], and DC coefficients are saturated on the 590c1bc742181ded4930842b46e9507372f0b1b963James Dong * interval [1, 254]. When shortVideoHeader==0, AC coefficients 600c1bc742181ded4930842b46e9507372f0b1b963James Dong * are saturated on the interval [-2047, 2047]. 610c1bc742181ded4930842b46e9507372f0b1b963James Dong * 620c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value: 630c1bc742181ded4930842b46e9507372f0b1b963James Dong * 640c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_NoErr - no error 650c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_BadArgErr - bad arguments: 660c1bc742181ded4930842b46e9507372f0b1b963James Dong * - pSrcDst is NULL. 670c1bc742181ded4930842b46e9507372f0b1b963James Dong * - QP <= 0 or QP >= 32. 680c1bc742181ded4930842b46e9507372f0b1b963James Dong * 690c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 700c1bc742181ded4930842b46e9507372f0b1b963James Dong 710c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult omxVCM4P2_QuantInter_I( 720c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S16 * pSrcDst, 730c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 QP, 740c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT shortVideoHeader 750c1bc742181ded4930842b46e9507372f0b1b963James Dong) 760c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 770c1bc742181ded4930842b46e9507372f0b1b963James Dong 780c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Definitions and Initializations*/ 790c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT coeffCount; 800c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT fSign; 810c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT maxClpAC = 0, minClpAC = 0; 820c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT maxClpDC = 0, minClpDC = 0; 830c1bc742181ded4930842b46e9507372f0b1b963James Dong 840c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Argument error checks */ 850c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(pSrcDst == NULL, OMX_Sts_BadArgErr); 860c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(((QP <= 0) || (QP >= 32)), OMX_Sts_BadArgErr); 870c1bc742181ded4930842b46e9507372f0b1b963James Dong /* One argument check is delayed until we have ascertained that */ 880c1bc742181ded4930842b46e9507372f0b1b963James Dong /* pQMatrix is not NULL. */ 890c1bc742181ded4930842b46e9507372f0b1b963James Dong 900c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Set the Clip Range based on SVH on/off */ 910c1bc742181ded4930842b46e9507372f0b1b963James Dong if(shortVideoHeader == 1) 920c1bc742181ded4930842b46e9507372f0b1b963James Dong { 930c1bc742181ded4930842b46e9507372f0b1b963James Dong maxClpDC = 254; 940c1bc742181ded4930842b46e9507372f0b1b963James Dong minClpDC = 1; 950c1bc742181ded4930842b46e9507372f0b1b963James Dong maxClpAC = 127; 960c1bc742181ded4930842b46e9507372f0b1b963James Dong minClpAC = -127; 970c1bc742181ded4930842b46e9507372f0b1b963James Dong } 980c1bc742181ded4930842b46e9507372f0b1b963James Dong else 990c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong maxClpDC = 2047; 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong minClpDC = -2047; 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong maxClpAC = 2047; 1030c1bc742181ded4930842b46e9507372f0b1b963James Dong minClpAC = -2047; 1040c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong 1060c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Second Inverse quantisation method */ 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong for (coeffCount = 0; coeffCount < 64; coeffCount++) 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1090c1bc742181ded4930842b46e9507372f0b1b963James Dong fSign = armSignCheck (pSrcDst[coeffCount]); 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = (armAbs(pSrcDst[coeffCount]) 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong - (QP/2))/(2 * QP); 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] *= fSign; 1130c1bc742181ded4930842b46e9507372f0b1b963James Dong 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Clip */ 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong if (coeffCount == 0) 1160c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = 1180c1bc742181ded4930842b46e9507372f0b1b963James Dong (OMX_S16) armClip (minClpDC, maxClpDC, pSrcDst[coeffCount]); 1190c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1200c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1210c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1220c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = 1230c1bc742181ded4930842b46e9507372f0b1b963James Dong (OMX_S16) armClip (minClpAC, maxClpAC, pSrcDst[coeffCount]); 1240c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1250c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1260c1bc742181ded4930842b46e9507372f0b1b963James Dong return OMX_Sts_NoErr; 1270c1bc742181ded4930842b46e9507372f0b1b963James Dong 1280c1bc742181ded4930842b46e9507372f0b1b963James Dong} 1290c1bc742181ded4930842b46e9507372f0b1b963James Dong 1300c1bc742181ded4930842b46e9507372f0b1b963James Dong/* End of file */ 1310c1bc742181ded4930842b46e9507372f0b1b963James Dong 1320c1bc742181ded4930842b46e9507372f0b1b963James Dong 133