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_QuantInvIntra_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 intra inverse 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_QuantInvIntra_I (6.2.5.3.2) 400c1bc742181ded4930842b46e9507372f0b1b963James Dong * 410c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description: 420c1bc742181ded4930842b46e9507372f0b1b963James Dong * Performs the second inverse quantization mode on an intra/inter coded 430c1bc742181ded4930842b46e9507372f0b1b963James Dong * block. Supports bits_per_pixel = 8. The output coefficients are clipped to 440c1bc742181ded4930842b46e9507372f0b1b963James Dong * the range [-2048, 2047]. 450c1bc742181ded4930842b46e9507372f0b1b963James Dong * 460c1bc742181ded4930842b46e9507372f0b1b963James Dong * Input Arguments: 470c1bc742181ded4930842b46e9507372f0b1b963James Dong * 480c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcDst - pointer to the input (quantized) intra/inter block; must be 490c1bc742181ded4930842b46e9507372f0b1b963James Dong * aligned on a 16-byte boundary. 500c1bc742181ded4930842b46e9507372f0b1b963James Dong * QP - quantization parameter (quantizer_scale) 510c1bc742181ded4930842b46e9507372f0b1b963James Dong * videoComp - video component type of the current block. Takes one of the 520c1bc742181ded4930842b46e9507372f0b1b963James Dong * following flags: OMX_VC_LUMINANCE, OMX_VC_CHROMINANCE (intra 530c1bc742181ded4930842b46e9507372f0b1b963James Dong * version only). 540c1bc742181ded4930842b46e9507372f0b1b963James Dong * shortVideoHeader - binary flag indicating presence of short_video_header 550c1bc742181ded4930842b46e9507372f0b1b963James Dong * (intra version only). 560c1bc742181ded4930842b46e9507372f0b1b963James Dong * 570c1bc742181ded4930842b46e9507372f0b1b963James Dong * Output Arguments: 580c1bc742181ded4930842b46e9507372f0b1b963James Dong * 590c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcDst - pointer to the output (dequantized) intra/inter block 600c1bc742181ded4930842b46e9507372f0b1b963James Dong * 610c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value: 620c1bc742181ded4930842b46e9507372f0b1b963James Dong * 630c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_NoErr - no error 640c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_BadArgErr - bad arguments; one or more of the following is 650c1bc742181ded4930842b46e9507372f0b1b963James Dong * true: 660c1bc742181ded4930842b46e9507372f0b1b963James Dong * - pSrcDst is NULL 670c1bc742181ded4930842b46e9507372f0b1b963James Dong * - QP <= 0 or QP >=31 680c1bc742181ded4930842b46e9507372f0b1b963James Dong * - videoComp is neither OMX_VC_LUMINANCE nor OMX_VC_CHROMINANCE. 690c1bc742181ded4930842b46e9507372f0b1b963James Dong * 700c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 710c1bc742181ded4930842b46e9507372f0b1b963James Dong 720c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult omxVCM4P2_QuantInvIntra_I( 730c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S16 * pSrcDst, 740c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT QP, 750c1bc742181ded4930842b46e9507372f0b1b963James Dong OMXVCM4P2VideoComponent videoComp, 760c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT shortVideoHeader 770c1bc742181ded4930842b46e9507372f0b1b963James Dong) 780c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 790c1bc742181ded4930842b46e9507372f0b1b963James Dong 800c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Initialized to remove compilation error */ 810c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT dcScaler = 0, coeffCount, Sign; 820c1bc742181ded4930842b46e9507372f0b1b963James Dong 830c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Argument error checks */ 840c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(pSrcDst == NULL, OMX_Sts_BadArgErr); 850c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(((QP <= 0) || (QP >= 32)), OMX_Sts_BadArgErr); 860c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(((videoComp != OMX_VC_LUMINANCE) && (videoComp != OMX_VC_CHROMINANCE)), OMX_Sts_BadArgErr); 870c1bc742181ded4930842b46e9507372f0b1b963James Dong 880c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Calculate the DC scaler value */ 890c1bc742181ded4930842b46e9507372f0b1b963James Dong 900c1bc742181ded4930842b46e9507372f0b1b963James Dong /* linear intra DC mode */ 910c1bc742181ded4930842b46e9507372f0b1b963James Dong if(shortVideoHeader) 920c1bc742181ded4930842b46e9507372f0b1b963James Dong { 930c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = 8; 940c1bc742181ded4930842b46e9507372f0b1b963James Dong } 950c1bc742181ded4930842b46e9507372f0b1b963James Dong /* nonlinear intra DC mode */ 960c1bc742181ded4930842b46e9507372f0b1b963James Dong else 970c1bc742181ded4930842b46e9507372f0b1b963James Dong { 980c1bc742181ded4930842b46e9507372f0b1b963James Dong 990c1bc742181ded4930842b46e9507372f0b1b963James Dong if (videoComp == OMX_VC_LUMINANCE) 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong if (QP >= 1 && QP <= 4) 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1030c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = 8; 1040c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (QP >= 5 && QP <= 8) 1060c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = 2 * QP; 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1090c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (QP >= 9 && QP <= 24) 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = QP + 8; 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1130c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = (2 * QP) - 16; 1160c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1180c1bc742181ded4930842b46e9507372f0b1b963James Dong 1190c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (videoComp == OMX_VC_CHROMINANCE) 1200c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1210c1bc742181ded4930842b46e9507372f0b1b963James Dong if (QP >= 1 && QP <= 4) 1220c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1230c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = 8; 1240c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1250c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (QP >= 5 && QP <= 24) 1260c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1270c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = (QP + 13)/2; 1280c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1290c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1300c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1310c1bc742181ded4930842b46e9507372f0b1b963James Dong dcScaler = QP - 6; 1320c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1330c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1340c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1350c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Dequant the DC value, this applies to both the methods */ 1360c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[0] = pSrcDst[0] * dcScaler; 1370c1bc742181ded4930842b46e9507372f0b1b963James Dong 1380c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Saturate */ 1390c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[0] = armClip (-2048, 2047, pSrcDst[0]); 1400c1bc742181ded4930842b46e9507372f0b1b963James Dong 1410c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Second Inverse quantisation method */ 1420c1bc742181ded4930842b46e9507372f0b1b963James Dong for (coeffCount = 1; coeffCount < 64; coeffCount++) 1430c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1440c1bc742181ded4930842b46e9507372f0b1b963James Dong /* check sign */ 1450c1bc742181ded4930842b46e9507372f0b1b963James Dong Sign = armSignCheck (pSrcDst[coeffCount]); 1460c1bc742181ded4930842b46e9507372f0b1b963James Dong 1470c1bc742181ded4930842b46e9507372f0b1b963James Dong if (QP & 0x1) 1480c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1490c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = (2* armAbs(pSrcDst[coeffCount]) + 1) * QP; 1500c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] *= Sign; 1510c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1520c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1530c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1540c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = 1550c1bc742181ded4930842b46e9507372f0b1b963James Dong (2* armAbs(pSrcDst[coeffCount]) + 1) * QP - 1; 1560c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] *= Sign; 1570c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1580c1bc742181ded4930842b46e9507372f0b1b963James Dong 1590c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Saturate */ 1600c1bc742181ded4930842b46e9507372f0b1b963James Dong pSrcDst[coeffCount] = armClip (-2048, 2047, pSrcDst[coeffCount]); 1610c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1620c1bc742181ded4930842b46e9507372f0b1b963James Dong return OMX_Sts_NoErr; 1630c1bc742181ded4930842b46e9507372f0b1b963James Dong 1640c1bc742181ded4930842b46e9507372f0b1b963James Dong} 1650c1bc742181ded4930842b46e9507372f0b1b963James Dong 1660c1bc742181ded4930842b46e9507372f0b1b963James Dong/* End of file */ 1670c1bc742181ded4930842b46e9507372f0b1b963James Dong 1680c1bc742181ded4930842b46e9507372f0b1b963James Dong 169