10c1bc742181ded4930842b46e9507372f0b1b963James Dong/** 20c1bc742181ded4930842b46e9507372f0b1b963James Dong * 30c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name: omxVCM4P2_QuantInvInter_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 inverse 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/** 250c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: omxVCM4P2_QuantInvInter_I (6.2.5.3.2) 260c1bc742181ded4930842b46e9507372f0b1b963James Dong * 270c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description: 280c1bc742181ded4930842b46e9507372f0b1b963James Dong * Performs the second inverse quantization mode on an intra/inter coded 290c1bc742181ded4930842b46e9507372f0b1b963James Dong * block. Supports bits_per_pixel = 8. The output coefficients are clipped to 300c1bc742181ded4930842b46e9507372f0b1b963James Dong * the range [-2048, 2047]. 310c1bc742181ded4930842b46e9507372f0b1b963James Dong * 320c1bc742181ded4930842b46e9507372f0b1b963James Dong * Input Arguments: 330c1bc742181ded4930842b46e9507372f0b1b963James Dong * 340c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcDst - pointer to the input (quantized) intra/inter block; must be 350c1bc742181ded4930842b46e9507372f0b1b963James Dong * aligned on a 16-byte boundary. 360c1bc742181ded4930842b46e9507372f0b1b963James Dong * QP - quantization parameter (quantizer_scale) 370c1bc742181ded4930842b46e9507372f0b1b963James Dong * videoComp - video component type of the current block. Takes one of the 380c1bc742181ded4930842b46e9507372f0b1b963James Dong * following flags: OMX_VC_LUMINANCE, OMX_VC_CHROMINANCE (intra 390c1bc742181ded4930842b46e9507372f0b1b963James Dong * version only). 400c1bc742181ded4930842b46e9507372f0b1b963James Dong * shortVideoHeader - binary flag indicating presence of short_video_header 410c1bc742181ded4930842b46e9507372f0b1b963James Dong * (intra version only). 420c1bc742181ded4930842b46e9507372f0b1b963James Dong * 430c1bc742181ded4930842b46e9507372f0b1b963James Dong * Output Arguments: 440c1bc742181ded4930842b46e9507372f0b1b963James Dong * 450c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcDst - pointer to the output (dequantized) intra/inter block 460c1bc742181ded4930842b46e9507372f0b1b963James Dong * 470c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value: 480c1bc742181ded4930842b46e9507372f0b1b963James Dong * 490c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_NoErr - no error 500c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_BadArgErr - bad arguments; one or more of the following is 510c1bc742181ded4930842b46e9507372f0b1b963James Dong * true: 520c1bc742181ded4930842b46e9507372f0b1b963James Dong * - pSrcDst is NULL 530c1bc742181ded4930842b46e9507372f0b1b963James Dong * - QP <= 0 or QP >=31 540c1bc742181ded4930842b46e9507372f0b1b963James Dong * - videoComp is neither OMX_VC_LUMINANCE nor OMX_VC_CHROMINANCE. 550c1bc742181ded4930842b46e9507372f0b1b963James Dong * 560c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 570c1bc742181ded4930842b46e9507372f0b1b963James Dong 580c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult omxVCM4P2_QuantInvInter_I( 590c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S16 * pSrcDst, 600c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT QP 610c1bc742181ded4930842b46e9507372f0b1b963James Dong ) 620c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 630c1bc742181ded4930842b46e9507372f0b1b963James Dong 640c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT coeffCount, Sign; 650c1bc742181ded4930842b46e9507372f0b1b963James Dong 660c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Argument error checks */ 670c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(pSrcDst == NULL, OMX_Sts_BadArgErr); 680c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(((QP <= 0) || (QP >= 32)), OMX_Sts_BadArgErr); 690c1bc742181ded4930842b46e9507372f0b1b963James Dong 700c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Second Inverse quantisation method */ 710c1bc742181ded4930842b46e9507372f0b1b963James Dong for (coeffCount = 0; coeffCount < 64; coeffCount++) 720c1bc742181ded4930842b46e9507372f0b1b963James Dong { 730c1bc742181ded4930842b46e9507372f0b1b963James Dong /* check sign */ 740c1bc742181ded4930842b46e9507372f0b1b963James Dong Sign = armSignCheck (pSrcDst[coeffCount]); 750c1bc742181ded4930842b46e9507372f0b1b963James Dong 760c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Quantize the coeff */ 770c1bc742181ded4930842b46e9507372f0b1b963James Dong if (QP & 0x1) 780c1bc742181ded4930842b46e9507372f0b1b963James Dong { 790c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = (2* armAbs(pSrcDst[coeffCount]) + 1) * QP; 800c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] *= Sign; 810c1bc742181ded4930842b46e9507372f0b1b963James Dong } 820c1bc742181ded4930842b46e9507372f0b1b963James Dong else 830c1bc742181ded4930842b46e9507372f0b1b963James Dong { 840c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = (2* armAbs(pSrcDst[coeffCount]) + 1) 850c1bc742181ded4930842b46e9507372f0b1b963James Dong * QP - 1; 860c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] *= Sign; 870c1bc742181ded4930842b46e9507372f0b1b963James Dong } 880c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Saturate */ 890c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = armClip (-2048, 2047, pSrcDst[coeffCount]); 900c1bc742181ded4930842b46e9507372f0b1b963James Dong } 910c1bc742181ded4930842b46e9507372f0b1b963James Dong return OMX_Sts_NoErr; 920c1bc742181ded4930842b46e9507372f0b1b963James Dong} 930c1bc742181ded4930842b46e9507372f0b1b963James Dong 940c1bc742181ded4930842b46e9507372f0b1b963James Dong/* End of file */ 950c1bc742181ded4930842b46e9507372f0b1b963James Dong 960c1bc742181ded4930842b46e9507372f0b1b963James Dong 97