armVCM4P10_DecodeCoeffsToPair.c revision 78e52bfac041d71ce53b5b13c2abf78af742b09d
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 * 200c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name: armVCM4P10_DecodeCoeffsToPair.c 210c1bc742181ded4930842b46e9507372f0b1b963James Dong * OpenMAX DL: v1.0.2 220c1bc742181ded4930842b46e9507372f0b1b963James Dong * Revision: 9641 230c1bc742181ded4930842b46e9507372f0b1b963James Dong * Date: Thursday, February 7, 2008 240c1bc742181ded4930842b46e9507372f0b1b963James Dong * 250c1bc742181ded4930842b46e9507372f0b1b963James Dong * 260c1bc742181ded4930842b46e9507372f0b1b963James Dong * 270c1bc742181ded4930842b46e9507372f0b1b963James Dong * 280c1bc742181ded4930842b46e9507372f0b1b963James Dong * H.264 decode coefficients module 290c1bc742181ded4930842b46e9507372f0b1b963James Dong * 300c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 310c1bc742181ded4930842b46e9507372f0b1b963James Dong 320c1bc742181ded4930842b46e9507372f0b1b963James Dong#ifdef DEBUG_ARMVCM4P10_DECODECOEFFSTOPAIR 330c1bc742181ded4930842b46e9507372f0b1b963James Dong#undef DEBUG_ON 340c1bc742181ded4930842b46e9507372f0b1b963James Dong#define DEBUG_ON 350c1bc742181ded4930842b46e9507372f0b1b963James Dong#endif 360c1bc742181ded4930842b46e9507372f0b1b963James Dong 370c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxtypes.h" 380c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armOMX.h" 390c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxVC.h" 400c1bc742181ded4930842b46e9507372f0b1b963James Dong 410c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM.h" 420c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM_Bitstream.h" 430c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armVCM4P10_CAVLCTables.h" 440c1bc742181ded4930842b46e9507372f0b1b963James Dong 450c1bc742181ded4930842b46e9507372f0b1b963James Dong/* 4x4 DeZigZag table */ 460c1bc742181ded4930842b46e9507372f0b1b963James Dong 470c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const OMX_U8 armVCM4P10_ZigZag[16] = 480c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 490c1bc742181ded4930842b46e9507372f0b1b963James Dong 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 500c1bc742181ded4930842b46e9507372f0b1b963James Dong}; 510c1bc742181ded4930842b46e9507372f0b1b963James Dong 520c1bc742181ded4930842b46e9507372f0b1b963James Dong/* 530c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description: 540c1bc742181ded4930842b46e9507372f0b1b963James Dong * This function perform the work required by the OpenMAX 550c1bc742181ded4930842b46e9507372f0b1b963James Dong * DecodeCoeffsToPair function and DecodeChromaDCCoeffsToPair. 560c1bc742181ded4930842b46e9507372f0b1b963James Dong * Since most of the code is common we share it here. 570c1bc742181ded4930842b46e9507372f0b1b963James Dong * 580c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters: 590c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] ppBitStream Double pointer to current byte in bit stream buffer 600c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] pOffset Pointer to current bit position in the byte pointed 610c1bc742181ded4930842b46e9507372f0b1b963James Dong * to by *ppBitStream 620c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] sMaxNumCoeff Maximum number of non-zero coefficients in current 630c1bc742181ded4930842b46e9507372f0b1b963James Dong * block (4,15 or 16) 640c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] nTable Table number (0 to 4) according to the five columns 650c1bc742181ded4930842b46e9507372f0b1b963James Dong * of Table 9-5 in the H.264 spec 660c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] ppBitStream *ppBitStream is updated after each block is decoded 670c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] pOffset *pOffset is updated after each block is decoded 680c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] pNumCoeff Pointer to the number of nonzero coefficients in 690c1bc742181ded4930842b46e9507372f0b1b963James Dong * this block 700c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] ppPosCoefbuf Double pointer to destination residual 710c1bc742181ded4930842b46e9507372f0b1b963James Dong * coefficient-position pair buffer 720c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value: 730c1bc742181ded4930842b46e9507372f0b1b963James Dong * Standard omxError result. See enumeration for possible result codes. 740c1bc742181ded4930842b46e9507372f0b1b963James Dong 750c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 760c1bc742181ded4930842b46e9507372f0b1b963James Dong 770c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult armVCM4P10_DecodeCoeffsToPair( 780c1bc742181ded4930842b46e9507372f0b1b963James Dong const OMX_U8** ppBitStream, 790c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S32* pOffset, 800c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8* pNumCoeff, 810c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 **ppPosCoefbuf, 820c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT nTable, 830c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT sMaxNumCoeff 840c1bc742181ded4930842b46e9507372f0b1b963James Dong ) 850c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 860c1bc742181ded4930842b46e9507372f0b1b963James Dong int CoeffToken, TotalCoeff, TrailingOnes; 870c1bc742181ded4930842b46e9507372f0b1b963James Dong int Level, LevelCode, LevelPrefix, LevelSuffix, LevelSuffixSize; 880c1bc742181ded4930842b46e9507372f0b1b963James Dong int SuffixLength, Run, ZerosLeft,CoeffNum; 890c1bc742181ded4930842b46e9507372f0b1b963James Dong int i, Flags; 900c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 *pPosCoefbuf = *ppPosCoefbuf; 910c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S16 pLevel[16]; 920c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 pRun[16]; 930c1bc742181ded4930842b46e9507372f0b1b963James Dong 940c1bc742181ded4930842b46e9507372f0b1b963James Dong CoeffToken = armUnPackVLC32(ppBitStream, pOffset, armVCM4P10_CAVLCCoeffTokenTables[nTable]); 950c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetDataErrIf(CoeffToken == ARM_NO_CODEBOOK_INDEX, OMX_Sts_Err); 960c1bc742181ded4930842b46e9507372f0b1b963James Dong 970c1bc742181ded4930842b46e9507372f0b1b963James Dong TrailingOnes = armVCM4P10_CAVLCTrailingOnes[CoeffToken]; 980c1bc742181ded4930842b46e9507372f0b1b963James Dong TotalCoeff = armVCM4P10_CAVLCTotalCoeff[CoeffToken]; 990c1bc742181ded4930842b46e9507372f0b1b963James Dong *pNumCoeff = (OMX_U8)TotalCoeff; 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong DEBUG_PRINTF_2("TotalCoeff = %d, TrailingOnes = %d\n", TotalCoeff, TrailingOnes); 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong 1030c1bc742181ded4930842b46e9507372f0b1b963James Dong if (TotalCoeff == 0) 1040c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Nothing to do */ 1060c1bc742181ded4930842b46e9507372f0b1b963James Dong return OMX_Sts_NoErr; 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong 1090c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Decode trailing ones */ 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i=TotalCoeff-1; i>=TotalCoeff-TrailingOnes; i--) 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong if (armGetBits(ppBitStream, pOffset, 1)) 1130c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong Level = -1; 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1160c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1180c1bc742181ded4930842b46e9507372f0b1b963James Dong Level = +1; 1190c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1200c1bc742181ded4930842b46e9507372f0b1b963James Dong pLevel[i] = (OMX_S16)Level; 1210c1bc742181ded4930842b46e9507372f0b1b963James Dong 1220c1bc742181ded4930842b46e9507372f0b1b963James Dong DEBUG_PRINTF_2("Level[%d] = %d\n", i, pLevel[i]); 1230c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1240c1bc742181ded4930842b46e9507372f0b1b963James Dong 1250c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Decode (non zero) level values */ 1260c1bc742181ded4930842b46e9507372f0b1b963James Dong SuffixLength = 0; 1270c1bc742181ded4930842b46e9507372f0b1b963James Dong if (TotalCoeff>10 && TrailingOnes<3) 1280c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1290c1bc742181ded4930842b46e9507372f0b1b963James Dong SuffixLength=1; 1300c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1310c1bc742181ded4930842b46e9507372f0b1b963James Dong for ( ; i>=0; i--) 1320c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1330c1bc742181ded4930842b46e9507372f0b1b963James Dong LevelPrefix = armUnPackVLC32(ppBitStream, pOffset, armVCM4P10_CAVLCLevelPrefix); 1340c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetDataErrIf(LevelPrefix == ARM_NO_CODEBOOK_INDEX, OMX_Sts_Err); 1350c1bc742181ded4930842b46e9507372f0b1b963James Dong 1360c1bc742181ded4930842b46e9507372f0b1b963James Dong LevelSuffixSize = SuffixLength; 1370c1bc742181ded4930842b46e9507372f0b1b963James Dong if (LevelPrefix==14 && SuffixLength==0) 1380c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1390c1bc742181ded4930842b46e9507372f0b1b963James Dong LevelSuffixSize = 4; 1400c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1410c1bc742181ded4930842b46e9507372f0b1b963James Dong if (LevelPrefix==15) 1420c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1430c1bc742181ded4930842b46e9507372f0b1b963James Dong LevelSuffixSize = 12; 1440c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1450c1bc742181ded4930842b46e9507372f0b1b963James Dong 1460c1bc742181ded4930842b46e9507372f0b1b963James Dong LevelSuffix = 0; 1470c1bc742181ded4930842b46e9507372f0b1b963James Dong if (LevelSuffixSize > 0) 1480c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1490c1bc742181ded4930842b46e9507372f0b1b963James Dong LevelSuffix = armGetBits(ppBitStream, pOffset, LevelSuffixSize); 1500c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1510c1bc742181ded4930842b46e9507372f0b1b963James Dong 1520c1bc742181ded4930842b46e9507372f0b1b963James Dong LevelCode = (LevelPrefix << SuffixLength) + LevelSuffix; 1530c1bc742181ded4930842b46e9507372f0b1b963James Dong 1540c1bc742181ded4930842b46e9507372f0b1b963James Dong 1550c1bc742181ded4930842b46e9507372f0b1b963James Dong if (LevelPrefix==15 && SuffixLength==0) 1560c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1570c1bc742181ded4930842b46e9507372f0b1b963James Dong LevelCode += 15; 1580c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1590c1bc742181ded4930842b46e9507372f0b1b963James Dong 1600c1bc742181ded4930842b46e9507372f0b1b963James Dong /* LevelCode = 2*(magnitude-1) + sign */ 1610c1bc742181ded4930842b46e9507372f0b1b963James Dong 1620c1bc742181ded4930842b46e9507372f0b1b963James Dong if (i==TotalCoeff-1-TrailingOnes && TrailingOnes<3) 1630c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1640c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Level magnitude can't be 1 */ 1650c1bc742181ded4930842b46e9507372f0b1b963James Dong LevelCode += 2; 1660c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1670c1bc742181ded4930842b46e9507372f0b1b963James Dong if (LevelCode & 1) 1680c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1690c1bc742181ded4930842b46e9507372f0b1b963James Dong /* 2a+1 maps to -a-1 */ 1700c1bc742181ded4930842b46e9507372f0b1b963James Dong Level = (-LevelCode-1)>>1; 1710c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1720c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1730c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1740c1bc742181ded4930842b46e9507372f0b1b963James Dong /* 2a+0 maps to +a+1 */ 1750c1bc742181ded4930842b46e9507372f0b1b963James Dong Level = (LevelCode+2)>>1; 1760c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1770c1bc742181ded4930842b46e9507372f0b1b963James Dong pLevel[i] = (OMX_S16)Level; 1780c1bc742181ded4930842b46e9507372f0b1b963James Dong 1790c1bc742181ded4930842b46e9507372f0b1b963James Dong DEBUG_PRINTF_2("Level[%d] = %d\n", i, pLevel[i]); 1800c1bc742181ded4930842b46e9507372f0b1b963James Dong 1810c1bc742181ded4930842b46e9507372f0b1b963James Dong if (SuffixLength==0) 1820c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1830c1bc742181ded4930842b46e9507372f0b1b963James Dong SuffixLength=1; 1840c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1850c1bc742181ded4930842b46e9507372f0b1b963James Dong if ( ((LevelCode>>1)+1)>(3<<(SuffixLength-1)) && SuffixLength<6 ) 1860c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1870c1bc742181ded4930842b46e9507372f0b1b963James Dong SuffixLength++; 1880c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1890c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1900c1bc742181ded4930842b46e9507372f0b1b963James Dong 1910c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Decode run values */ 1920c1bc742181ded4930842b46e9507372f0b1b963James Dong ZerosLeft = 0; 1930c1bc742181ded4930842b46e9507372f0b1b963James Dong if (TotalCoeff < sMaxNumCoeff) 1940c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1950c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Decode TotalZeros VLC */ 1960c1bc742181ded4930842b46e9507372f0b1b963James Dong if (sMaxNumCoeff==4) 1970c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1980c1bc742181ded4930842b46e9507372f0b1b963James Dong ZerosLeft = armUnPackVLC32(ppBitStream, pOffset, armVCM4P10_CAVLCTotalZeros2x2Tables[TotalCoeff-1]); 1990c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetDataErrIf(ZerosLeft ==ARM_NO_CODEBOOK_INDEX , OMX_Sts_Err); 2000c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2010c1bc742181ded4930842b46e9507372f0b1b963James Dong else 2020c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2030c1bc742181ded4930842b46e9507372f0b1b963James Dong ZerosLeft = armUnPackVLC32(ppBitStream, pOffset, armVCM4P10_CAVLCTotalZeroTables[TotalCoeff-1]); 2040c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetDataErrIf(ZerosLeft ==ARM_NO_CODEBOOK_INDEX , OMX_Sts_Err); 2050c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2060c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2070c1bc742181ded4930842b46e9507372f0b1b963James Dong 2080c1bc742181ded4930842b46e9507372f0b1b963James Dong DEBUG_PRINTF_1("TotalZeros = %d\n", ZerosLeft); 2090c1bc742181ded4930842b46e9507372f0b1b963James Dong 2100c1bc742181ded4930842b46e9507372f0b1b963James Dong CoeffNum=ZerosLeft+TotalCoeff-1; 2110c1bc742181ded4930842b46e9507372f0b1b963James Dong 2120c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i=TotalCoeff-1; i>0; i--) 2130c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2140c1bc742181ded4930842b46e9507372f0b1b963James Dong Run = 0; 2150c1bc742181ded4930842b46e9507372f0b1b963James Dong if (ZerosLeft > 0) 2160c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2170c1bc742181ded4930842b46e9507372f0b1b963James Dong int Table = ZerosLeft; 2180c1bc742181ded4930842b46e9507372f0b1b963James Dong if (Table > 6) 2190c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2200c1bc742181ded4930842b46e9507372f0b1b963James Dong Table = 7; 2210c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2220c1bc742181ded4930842b46e9507372f0b1b963James Dong Run = armUnPackVLC32(ppBitStream, pOffset, armVCM4P10_CAVLCRunBeforeTables[Table-1]); 2230c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetDataErrIf(Run == ARM_NO_CODEBOOK_INDEX, OMX_Sts_Err); 2240c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2250c1bc742181ded4930842b46e9507372f0b1b963James Dong pRun[i] = (OMX_U8)Run; 2260c1bc742181ded4930842b46e9507372f0b1b963James Dong 2270c1bc742181ded4930842b46e9507372f0b1b963James Dong DEBUG_PRINTF_2("Run[%d] = %d\n", i, pRun[i]); 2280c1bc742181ded4930842b46e9507372f0b1b963James Dong 2290c1bc742181ded4930842b46e9507372f0b1b963James Dong ZerosLeft -= Run; 2300c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2310c1bc742181ded4930842b46e9507372f0b1b963James Dong pRun[0] = (OMX_U8)ZerosLeft; 2320c1bc742181ded4930842b46e9507372f0b1b963James Dong 2330c1bc742181ded4930842b46e9507372f0b1b963James Dong DEBUG_PRINTF_1("Run[0] = %d\n", pRun[i]); 2340c1bc742181ded4930842b46e9507372f0b1b963James Dong 2350c1bc742181ded4930842b46e9507372f0b1b963James Dong 2360c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Fill in coefficients */ 2370c1bc742181ded4930842b46e9507372f0b1b963James Dong 2380c1bc742181ded4930842b46e9507372f0b1b963James Dong if (sMaxNumCoeff==15) 2390c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2400c1bc742181ded4930842b46e9507372f0b1b963James Dong CoeffNum++; /* Skip the DC position */ 2410c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2420c1bc742181ded4930842b46e9507372f0b1b963James Dong 2430c1bc742181ded4930842b46e9507372f0b1b963James Dong /*for (i=0;i<TotalCoeff;i++) 2440c1bc742181ded4930842b46e9507372f0b1b963James Dong CoeffNum += pRun[i]+1;*/ 2450c1bc742181ded4930842b46e9507372f0b1b963James Dong 2460c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i=(TotalCoeff-1); i>=0; i--) 2470c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2480c1bc742181ded4930842b46e9507372f0b1b963James Dong /*CoeffNum += pRun[i]+1;*/ 2490c1bc742181ded4930842b46e9507372f0b1b963James Dong Level = pLevel[i]; 2500c1bc742181ded4930842b46e9507372f0b1b963James Dong 2510c1bc742181ded4930842b46e9507372f0b1b963James Dong DEBUG_PRINTF_2("Coef[%d] = %d\n", CoeffNum, Level); 2520c1bc742181ded4930842b46e9507372f0b1b963James Dong 2530c1bc742181ded4930842b46e9507372f0b1b963James Dong Flags = CoeffNum; 2540c1bc742181ded4930842b46e9507372f0b1b963James Dong CoeffNum -= (pRun[i]+1); 2550c1bc742181ded4930842b46e9507372f0b1b963James Dong if (sMaxNumCoeff>4) 2560c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2570c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Perform 4x4 DeZigZag */ 2580c1bc742181ded4930842b46e9507372f0b1b963James Dong Flags = armVCM4P10_ZigZag[Flags]; 2590c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2600c1bc742181ded4930842b46e9507372f0b1b963James Dong if (i==0) 2610c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2620c1bc742181ded4930842b46e9507372f0b1b963James Dong /* End of block flag */ 2630c1bc742181ded4930842b46e9507372f0b1b963James Dong Flags += 0x20; 2640c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2650c1bc742181ded4930842b46e9507372f0b1b963James Dong if (Level<-128 || Level>127) 2660c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2670c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Overflow flag */ 2680c1bc742181ded4930842b46e9507372f0b1b963James Dong Flags += 0x10; 2690c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2700c1bc742181ded4930842b46e9507372f0b1b963James Dong 2710c1bc742181ded4930842b46e9507372f0b1b963James Dong *pPosCoefbuf++ = (OMX_U8)(Flags); 2720c1bc742181ded4930842b46e9507372f0b1b963James Dong *pPosCoefbuf++ = (OMX_U8)(Level & 0xFF); 2730c1bc742181ded4930842b46e9507372f0b1b963James Dong if (Flags & 0x10) 2740c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2750c1bc742181ded4930842b46e9507372f0b1b963James Dong *pPosCoefbuf++ = (OMX_U8)(Level>>8); 2760c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2770c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2780c1bc742181ded4930842b46e9507372f0b1b963James Dong 2790c1bc742181ded4930842b46e9507372f0b1b963James Dong *ppPosCoefbuf = pPosCoefbuf; 2800c1bc742181ded4930842b46e9507372f0b1b963James Dong 2810c1bc742181ded4930842b46e9507372f0b1b963James Dong return OMX_Sts_NoErr; 2820c1bc742181ded4930842b46e9507372f0b1b963James Dong} 283