10c1bc742181ded4930842b46e9507372f0b1b963James Dong/** 20c1bc742181ded4930842b46e9507372f0b1b963James Dong * 30c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name: omxVCM4P2_QuantIntra_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 intra 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 * Function: omxVCM4P2_QuantIntra_I (6.2.4.4.2) 240c1bc742181ded4930842b46e9507372f0b1b963James Dong * 250c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description: 260c1bc742181ded4930842b46e9507372f0b1b963James Dong * Performs quantization on intra block coefficients. This function supports 270c1bc742181ded4930842b46e9507372f0b1b963James Dong * bits_per_pixel == 8. 280c1bc742181ded4930842b46e9507372f0b1b963James Dong * 290c1bc742181ded4930842b46e9507372f0b1b963James Dong * Input Arguments: 300c1bc742181ded4930842b46e9507372f0b1b963James Dong * 310c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcDst - pointer to the input intra block coefficients; must be aligned 320c1bc742181ded4930842b46e9507372f0b1b963James Dong * on a 16-byte boundary. 330c1bc742181ded4930842b46e9507372f0b1b963James Dong * QP - quantization parameter (quantizer_scale). 340c1bc742181ded4930842b46e9507372f0b1b963James Dong * blockIndex - block index indicating the component type and position, 350c1bc742181ded4930842b46e9507372f0b1b963James Dong * valid in the range 0 to 5, as defined in [ISO14496-2], subclause 360c1bc742181ded4930842b46e9507372f0b1b963James Dong * 6.1.3.8. 370c1bc742181ded4930842b46e9507372f0b1b963James Dong * shortVideoHeader - binary flag indicating presence of 380c1bc742181ded4930842b46e9507372f0b1b963James Dong * short_video_header; shortVideoHeader==1 selects linear intra DC 390c1bc742181ded4930842b46e9507372f0b1b963James Dong * mode, and shortVideoHeader==0 selects non linear intra DC mode. 400c1bc742181ded4930842b46e9507372f0b1b963James Dong * 410c1bc742181ded4930842b46e9507372f0b1b963James Dong * Output Arguments: 420c1bc742181ded4930842b46e9507372f0b1b963James Dong * 430c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcDst - pointer to the output (quantized) interblock coefficients. 440c1bc742181ded4930842b46e9507372f0b1b963James Dong * When shortVideoHeader==1, AC coefficients are saturated on the 450c1bc742181ded4930842b46e9507372f0b1b963James Dong * interval [-127, 127], and DC coefficients are saturated on the 460c1bc742181ded4930842b46e9507372f0b1b963James Dong * interval [1, 254]. When shortVideoHeader==0, AC coefficients 470c1bc742181ded4930842b46e9507372f0b1b963James Dong * are saturated on the interval [-2047, 2047]. 480c1bc742181ded4930842b46e9507372f0b1b963James Dong * 490c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value: 500c1bc742181ded4930842b46e9507372f0b1b963James Dong * 510c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_NoErr - no error 520c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_BadArgErr - bad arguments: 530c1bc742181ded4930842b46e9507372f0b1b963James Dong * - pSrcDst is NULL. 540c1bc742181ded4930842b46e9507372f0b1b963James Dong * - blockIndex < 0 or blockIndex >= 10 550c1bc742181ded4930842b46e9507372f0b1b963James Dong * - QP <= 0 or QP >= 32. 560c1bc742181ded4930842b46e9507372f0b1b963James Dong * 570c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 580c1bc742181ded4930842b46e9507372f0b1b963James Dong 590c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult omxVCM4P2_QuantIntra_I( 600c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S16 * pSrcDst, 610c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 QP, 620c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT blockIndex, 630c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT shortVideoHeader 640c1bc742181ded4930842b46e9507372f0b1b963James Dong ) 650c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 660c1bc742181ded4930842b46e9507372f0b1b963James Dong 670c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Definitions and Initializations*/ 680c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Initialized to remove compilation error */ 690c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT dcScaler = 0, coeffCount,fSign; 700c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT maxClpAC, minClpAC; 710c1bc742181ded4930842b46e9507372f0b1b963James Dong 720c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Argument error checks */ 730c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(pSrcDst == NULL, OMX_Sts_BadArgErr); 740c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(((blockIndex < 0) || (blockIndex >= 10)), OMX_Sts_BadArgErr); 750c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(((QP <= 0) || (QP >= 32)), OMX_Sts_BadArgErr); 760c1bc742181ded4930842b46e9507372f0b1b963James Dong /* One argument check is delayed until we have ascertained that */ 770c1bc742181ded4930842b46e9507372f0b1b963James Dong /* pQMatrix is not NULL. */ 780c1bc742181ded4930842b46e9507372f0b1b963James Dong 790c1bc742181ded4930842b46e9507372f0b1b963James Dong 800c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Set the Clip Range based on SVH on/off */ 810c1bc742181ded4930842b46e9507372f0b1b963James Dong if(shortVideoHeader == 1) 820c1bc742181ded4930842b46e9507372f0b1b963James Dong { 830c1bc742181ded4930842b46e9507372f0b1b963James Dong maxClpAC = 127; 840c1bc742181ded4930842b46e9507372f0b1b963James Dong minClpAC = -127; 850c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = 8; 860c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Dequant the DC value, this applies to both the methods */ 870c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[0] = armIntDivAwayFromZero (pSrcDst[0], dcScaler); 880c1bc742181ded4930842b46e9507372f0b1b963James Dong 890c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Clip between 1 and 254 */ 900c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[0] = (OMX_S16) armClip (1, 254, pSrcDst[0]); 910c1bc742181ded4930842b46e9507372f0b1b963James Dong } 920c1bc742181ded4930842b46e9507372f0b1b963James Dong else 930c1bc742181ded4930842b46e9507372f0b1b963James Dong { 940c1bc742181ded4930842b46e9507372f0b1b963James Dong maxClpAC = 2047; 950c1bc742181ded4930842b46e9507372f0b1b963James Dong minClpAC = -2047; 960c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Calculate the DC scaler value */ 970c1bc742181ded4930842b46e9507372f0b1b963James Dong if ((blockIndex < 4) || (blockIndex > 5)) 980c1bc742181ded4930842b46e9507372f0b1b963James Dong { 990c1bc742181ded4930842b46e9507372f0b1b963James Dong if (QP >= 1 && QP <= 4) 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = 8; 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1030c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (QP >= 5 && QP <= 8) 1040c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = 2 * QP; 1060c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (QP >= 9 && QP <= 24) 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1090c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = QP + 8; 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1130c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = (2 * QP) - 16; 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1160c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (blockIndex < 6) 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1180c1bc742181ded4930842b46e9507372f0b1b963James Dong if (QP >= 1 && QP <= 4) 1190c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1200c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = 8; 1210c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1220c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (QP >= 5 && QP <= 24) 1230c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1240c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = (QP + 13)/2; 1250c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1260c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1270c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1280c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = QP - 6; 1290c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1300c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1310c1bc742181ded4930842b46e9507372f0b1b963James Dong 1320c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Dequant the DC value, this applies to both the methods */ 1330c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[0] = armIntDivAwayFromZero (pSrcDst[0], dcScaler); 1340c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1350c1bc742181ded4930842b46e9507372f0b1b963James Dong 1360c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Second Inverse quantisation method */ 1370c1bc742181ded4930842b46e9507372f0b1b963James Dong for (coeffCount = 1; coeffCount < 64; coeffCount++) 1380c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1390c1bc742181ded4930842b46e9507372f0b1b963James Dong fSign = armSignCheck (pSrcDst[coeffCount]); 1400c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = armAbs(pSrcDst[coeffCount])/(2 * QP); 1410c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] *= fSign; 1420c1bc742181ded4930842b46e9507372f0b1b963James Dong 1430c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Clip */ 1440c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = 1450c1bc742181ded4930842b46e9507372f0b1b963James Dong (OMX_S16) armClip (minClpAC, maxClpAC, pSrcDst[coeffCount]); 1460c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1470c1bc742181ded4930842b46e9507372f0b1b963James Dong return OMX_Sts_NoErr; 1480c1bc742181ded4930842b46e9507372f0b1b963James Dong 1490c1bc742181ded4930842b46e9507372f0b1b963James Dong} 1500c1bc742181ded4930842b46e9507372f0b1b963James Dong 1510c1bc742181ded4930842b46e9507372f0b1b963James Dong/* End of file */ 1520c1bc742181ded4930842b46e9507372f0b1b963James Dong 1530c1bc742181ded4930842b46e9507372f0b1b963James Dong 154