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