10c1bc742181ded4930842b46e9507372f0b1b963James Dong/** 20c1bc742181ded4930842b46e9507372f0b1b963James Dong * 30c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name: omxVCM4P2_QuantInter_I.c 40c1bc742181ded4930842b46e9507372f0b1b963James Dong * OpenMAX DL: v1.0.2 50c1bc742181ded4930842b46e9507372f0b1b963James Dong * Revision: 9641 60c1bc742181ded4930842b46e9507372f0b1b963James Dong * Date: Thursday, February 7, 2008 70c1bc742181ded4930842b46e9507372f0b1b963James Dong * 80c1bc742181ded4930842b46e9507372f0b1b963James Dong * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. 90c1bc742181ded4930842b46e9507372f0b1b963James Dong * 100c1bc742181ded4930842b46e9507372f0b1b963James Dong * 110c1bc742181ded4930842b46e9507372f0b1b963James Dong * 120c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description: 130c1bc742181ded4930842b46e9507372f0b1b963James Dong * Contains modules for inter Quantization 140c1bc742181ded4930842b46e9507372f0b1b963James Dong * 150c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 160c1bc742181ded4930842b46e9507372f0b1b963James Dong 170c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxtypes.h" 180c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armOMX.h" 190c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxVC.h" 200c1bc742181ded4930842b46e9507372f0b1b963James Dong 210c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM.h" 220c1bc742181ded4930842b46e9507372f0b1b963James Dong 230c1bc742181ded4930842b46e9507372f0b1b963James Dong/** 240c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: omxVCM4P2_QuantInter_I (6.2.4.4.3) 250c1bc742181ded4930842b46e9507372f0b1b963James Dong * 260c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description: 270c1bc742181ded4930842b46e9507372f0b1b963James Dong * Performs quantization on an inter coefficient block; supports 280c1bc742181ded4930842b46e9507372f0b1b963James Dong * bits_per_pixel == 8. 290c1bc742181ded4930842b46e9507372f0b1b963James Dong * 300c1bc742181ded4930842b46e9507372f0b1b963James Dong * Input Arguments: 310c1bc742181ded4930842b46e9507372f0b1b963James Dong * 320c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcDst - pointer to the input inter block coefficients; must be aligned 330c1bc742181ded4930842b46e9507372f0b1b963James Dong * on a 16-byte boundary. 340c1bc742181ded4930842b46e9507372f0b1b963James Dong * QP - quantization parameter (quantizer_scale) 350c1bc742181ded4930842b46e9507372f0b1b963James Dong * shortVideoHeader - binary flag indicating presence of short_video_header; 360c1bc742181ded4930842b46e9507372f0b1b963James Dong * shortVideoHeader==1 selects linear intra DC mode, and 370c1bc742181ded4930842b46e9507372f0b1b963James Dong * shortVideoHeader==0 selects non linear intra DC mode. 380c1bc742181ded4930842b46e9507372f0b1b963James Dong * 390c1bc742181ded4930842b46e9507372f0b1b963James Dong * Output Arguments: 400c1bc742181ded4930842b46e9507372f0b1b963James Dong * 410c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcDst - pointer to the output (quantized) interblock coefficients. 420c1bc742181ded4930842b46e9507372f0b1b963James Dong * When shortVideoHeader==1, AC coefficients are saturated on the 430c1bc742181ded4930842b46e9507372f0b1b963James Dong * interval [-127, 127], and DC coefficients are saturated on the 440c1bc742181ded4930842b46e9507372f0b1b963James Dong * interval [1, 254]. When shortVideoHeader==0, AC coefficients 450c1bc742181ded4930842b46e9507372f0b1b963James Dong * are saturated on the interval [-2047, 2047]. 460c1bc742181ded4930842b46e9507372f0b1b963James Dong * 470c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value: 480c1bc742181ded4930842b46e9507372f0b1b963James Dong * 490c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_NoErr - no error 500c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_BadArgErr - bad arguments: 510c1bc742181ded4930842b46e9507372f0b1b963James Dong * - pSrcDst is NULL. 520c1bc742181ded4930842b46e9507372f0b1b963James Dong * - QP <= 0 or QP >= 32. 530c1bc742181ded4930842b46e9507372f0b1b963James Dong * 540c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 550c1bc742181ded4930842b46e9507372f0b1b963James Dong 560c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult omxVCM4P2_QuantInter_I( 570c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S16 * pSrcDst, 580c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 QP, 590c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT shortVideoHeader 600c1bc742181ded4930842b46e9507372f0b1b963James Dong) 610c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 620c1bc742181ded4930842b46e9507372f0b1b963James Dong 630c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Definitions and Initializations*/ 640c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT coeffCount; 650c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT fSign; 660c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT maxClpAC = 0, minClpAC = 0; 670c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT maxClpDC = 0, minClpDC = 0; 680c1bc742181ded4930842b46e9507372f0b1b963James Dong 690c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Argument error checks */ 700c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(pSrcDst == NULL, OMX_Sts_BadArgErr); 710c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(((QP <= 0) || (QP >= 32)), OMX_Sts_BadArgErr); 720c1bc742181ded4930842b46e9507372f0b1b963James Dong /* One argument check is delayed until we have ascertained that */ 730c1bc742181ded4930842b46e9507372f0b1b963James Dong /* pQMatrix is not NULL. */ 740c1bc742181ded4930842b46e9507372f0b1b963James Dong 750c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Set the Clip Range based on SVH on/off */ 760c1bc742181ded4930842b46e9507372f0b1b963James Dong if(shortVideoHeader == 1) 770c1bc742181ded4930842b46e9507372f0b1b963James Dong { 780c1bc742181ded4930842b46e9507372f0b1b963James Dong maxClpDC = 254; 790c1bc742181ded4930842b46e9507372f0b1b963James Dong minClpDC = 1; 800c1bc742181ded4930842b46e9507372f0b1b963James Dong maxClpAC = 127; 810c1bc742181ded4930842b46e9507372f0b1b963James Dong minClpAC = -127; 820c1bc742181ded4930842b46e9507372f0b1b963James Dong } 830c1bc742181ded4930842b46e9507372f0b1b963James Dong else 840c1bc742181ded4930842b46e9507372f0b1b963James Dong { 850c1bc742181ded4930842b46e9507372f0b1b963James Dong maxClpDC = 2047; 860c1bc742181ded4930842b46e9507372f0b1b963James Dong minClpDC = -2047; 870c1bc742181ded4930842b46e9507372f0b1b963James Dong maxClpAC = 2047; 880c1bc742181ded4930842b46e9507372f0b1b963James Dong minClpAC = -2047; 890c1bc742181ded4930842b46e9507372f0b1b963James Dong } 900c1bc742181ded4930842b46e9507372f0b1b963James Dong 910c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Second Inverse quantisation method */ 920c1bc742181ded4930842b46e9507372f0b1b963James Dong for (coeffCount = 0; coeffCount < 64; coeffCount++) 930c1bc742181ded4930842b46e9507372f0b1b963James Dong { 940c1bc742181ded4930842b46e9507372f0b1b963James Dong fSign = armSignCheck (pSrcDst[coeffCount]); 950c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = (armAbs(pSrcDst[coeffCount]) 960c1bc742181ded4930842b46e9507372f0b1b963James Dong - (QP/2))/(2 * QP); 970c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] *= fSign; 980c1bc742181ded4930842b46e9507372f0b1b963James Dong 990c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Clip */ 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong if (coeffCount == 0) 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = 1030c1bc742181ded4930842b46e9507372f0b1b963James Dong (OMX_S16) armClip (minClpDC, maxClpDC, pSrcDst[coeffCount]); 1040c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1060c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong (OMX_S16) armClip (minClpAC, maxClpAC, pSrcDst[coeffCount]); 1090c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong return OMX_Sts_NoErr; 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong 1130c1bc742181ded4930842b46e9507372f0b1b963James Dong} 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong/* End of file */ 1160c1bc742181ded4930842b46e9507372f0b1b963James Dong 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong 118