1bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* ---------------------------------------------------------------- 2bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * 3bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * 4bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * File Name: armVCM4P10_DecodeCoeffsToPair.c 5bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * OpenMAX DL: v1.0.2 6bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Revision: 9641 7bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Date: Thursday, February 7, 2008 8bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * 9bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. 10bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * 11bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * 12bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * 13bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * H.264 decode coefficients module 14bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * 15bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */ 16bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 17bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef DEBUG_ARMVCM4P10_DECODECOEFFSTOPAIR 18bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#undef DEBUG_ON 19bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#define DEBUG_ON 20bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif 21bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 22bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "omxtypes.h" 23bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "armOMX.h" 24bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "omxVC.h" 25bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 26bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "armCOMM.h" 27bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "armCOMM_Bitstream.h" 28bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "armVCM4P10_CAVLCTables.h" 29bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 30bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* 4x4 DeZigZag table */ 31bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 32bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic const OMX_U8 armVCM4P10_ZigZag[16] = 33bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{ 34bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 35bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}; 36bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 37bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* 38bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description: 39bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * This function perform the work required by the OpenMAX 40bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * DecodeCoeffsToPair function and DecodeChromaDCCoeffsToPair. 41bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Since most of the code is common we share it here. 42bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * 43bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters: 44bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] ppBitStream Double pointer to current byte in bit stream buffer 45bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] pOffset Pointer to current bit position in the byte pointed 46bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * to by *ppBitStream 47bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] sMaxNumCoeff Maximum number of non-zero coefficients in current 48bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * block (4,15 or 16) 49bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] nTable Table number (0 to 4) according to the five columns 50bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * of Table 9-5 in the H.264 spec 51bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out] ppBitStream *ppBitStream is updated after each block is decoded 52bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out] pOffset *pOffset is updated after each block is decoded 53bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out] pNumCoeff Pointer to the number of nonzero coefficients in 54bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * this block 55bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out] ppPosCoefbuf Double pointer to destination residual 56bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * coefficient-position pair buffer 57bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value: 58bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Standard omxError result. See enumeration for possible result codes. 59bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 60bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */ 61bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 62bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMXResult armVCM4P10_DecodeCoeffsToPair( 63bebc99d6fa433c04139294a5057f8439d772dbd9James Dong const OMX_U8** ppBitStream, 64bebc99d6fa433c04139294a5057f8439d772dbd9James Dong OMX_S32* pOffset, 65bebc99d6fa433c04139294a5057f8439d772dbd9James Dong OMX_U8* pNumCoeff, 66bebc99d6fa433c04139294a5057f8439d772dbd9James Dong OMX_U8 **ppPosCoefbuf, 67bebc99d6fa433c04139294a5057f8439d772dbd9James Dong OMX_INT nTable, 68bebc99d6fa433c04139294a5057f8439d772dbd9James Dong OMX_INT sMaxNumCoeff 69bebc99d6fa433c04139294a5057f8439d772dbd9James Dong ) 70bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{ 71bebc99d6fa433c04139294a5057f8439d772dbd9James Dong int CoeffToken, TotalCoeff, TrailingOnes; 72bebc99d6fa433c04139294a5057f8439d772dbd9James Dong int Level, LevelCode, LevelPrefix, LevelSuffix, LevelSuffixSize; 73bebc99d6fa433c04139294a5057f8439d772dbd9James Dong int SuffixLength, Run, ZerosLeft,CoeffNum; 74bebc99d6fa433c04139294a5057f8439d772dbd9James Dong int i, Flags; 75bebc99d6fa433c04139294a5057f8439d772dbd9James Dong OMX_U8 *pPosCoefbuf = *ppPosCoefbuf; 76bebc99d6fa433c04139294a5057f8439d772dbd9James Dong OMX_S16 pLevel[16]; 77bebc99d6fa433c04139294a5057f8439d772dbd9James Dong OMX_U8 pRun[16]; 78bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 79bebc99d6fa433c04139294a5057f8439d772dbd9James Dong CoeffToken = armUnPackVLC32(ppBitStream, pOffset, armVCM4P10_CAVLCCoeffTokenTables[nTable]); 80bebc99d6fa433c04139294a5057f8439d772dbd9James Dong armRetDataErrIf(CoeffToken == ARM_NO_CODEBOOK_INDEX, OMX_Sts_Err); 81bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 82bebc99d6fa433c04139294a5057f8439d772dbd9James Dong TrailingOnes = armVCM4P10_CAVLCTrailingOnes[CoeffToken]; 83bebc99d6fa433c04139294a5057f8439d772dbd9James Dong TotalCoeff = armVCM4P10_CAVLCTotalCoeff[CoeffToken]; 84bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *pNumCoeff = (OMX_U8)TotalCoeff; 85bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 86bebc99d6fa433c04139294a5057f8439d772dbd9James Dong DEBUG_PRINTF_2("TotalCoeff = %d, TrailingOnes = %d\n", TotalCoeff, TrailingOnes); 87bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 88bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (TotalCoeff == 0) 89bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 90bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* Nothing to do */ 91bebc99d6fa433c04139294a5057f8439d772dbd9James Dong return OMX_Sts_NoErr; 92bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 93bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 94bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* Decode trailing ones */ 95bebc99d6fa433c04139294a5057f8439d772dbd9James Dong for (i=TotalCoeff-1; i>=TotalCoeff-TrailingOnes; i--) 96bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 97bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (armGetBits(ppBitStream, pOffset, 1)) 98bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 99bebc99d6fa433c04139294a5057f8439d772dbd9James Dong Level = -1; 100bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 101bebc99d6fa433c04139294a5057f8439d772dbd9James Dong else 102bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 103bebc99d6fa433c04139294a5057f8439d772dbd9James Dong Level = +1; 104bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 105bebc99d6fa433c04139294a5057f8439d772dbd9James Dong pLevel[i] = (OMX_S16)Level; 106bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 107bebc99d6fa433c04139294a5057f8439d772dbd9James Dong DEBUG_PRINTF_2("Level[%d] = %d\n", i, pLevel[i]); 108bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 109bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 110bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* Decode (non zero) level values */ 111bebc99d6fa433c04139294a5057f8439d772dbd9James Dong SuffixLength = 0; 112bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (TotalCoeff>10 && TrailingOnes<3) 113bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 114bebc99d6fa433c04139294a5057f8439d772dbd9James Dong SuffixLength=1; 115bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 116bebc99d6fa433c04139294a5057f8439d772dbd9James Dong for ( ; i>=0; i--) 117bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 118bebc99d6fa433c04139294a5057f8439d772dbd9James Dong LevelPrefix = armUnPackVLC32(ppBitStream, pOffset, armVCM4P10_CAVLCLevelPrefix); 119bebc99d6fa433c04139294a5057f8439d772dbd9James Dong armRetDataErrIf(LevelPrefix == ARM_NO_CODEBOOK_INDEX, OMX_Sts_Err); 120bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 121bebc99d6fa433c04139294a5057f8439d772dbd9James Dong LevelSuffixSize = SuffixLength; 122bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (LevelPrefix==14 && SuffixLength==0) 123bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 124bebc99d6fa433c04139294a5057f8439d772dbd9James Dong LevelSuffixSize = 4; 125bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 126bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (LevelPrefix==15) 127bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 128bebc99d6fa433c04139294a5057f8439d772dbd9James Dong LevelSuffixSize = 12; 129bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 130bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 131bebc99d6fa433c04139294a5057f8439d772dbd9James Dong LevelSuffix = 0; 132bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (LevelSuffixSize > 0) 133bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 134bebc99d6fa433c04139294a5057f8439d772dbd9James Dong LevelSuffix = armGetBits(ppBitStream, pOffset, LevelSuffixSize); 135bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 136bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 137bebc99d6fa433c04139294a5057f8439d772dbd9James Dong LevelCode = (LevelPrefix << SuffixLength) + LevelSuffix; 138bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 139bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 140bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (LevelPrefix==15 && SuffixLength==0) 141bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 142bebc99d6fa433c04139294a5057f8439d772dbd9James Dong LevelCode += 15; 143bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 144bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 145bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* LevelCode = 2*(magnitude-1) + sign */ 146bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 147bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (i==TotalCoeff-1-TrailingOnes && TrailingOnes<3) 148bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 149bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* Level magnitude can't be 1 */ 150bebc99d6fa433c04139294a5057f8439d772dbd9James Dong LevelCode += 2; 151bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 152bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (LevelCode & 1) 153bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 154bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* 2a+1 maps to -a-1 */ 155bebc99d6fa433c04139294a5057f8439d772dbd9James Dong Level = (-LevelCode-1)>>1; 156bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 157bebc99d6fa433c04139294a5057f8439d772dbd9James Dong else 158bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 159bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* 2a+0 maps to +a+1 */ 160bebc99d6fa433c04139294a5057f8439d772dbd9James Dong Level = (LevelCode+2)>>1; 161bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 162bebc99d6fa433c04139294a5057f8439d772dbd9James Dong pLevel[i] = (OMX_S16)Level; 163bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 164bebc99d6fa433c04139294a5057f8439d772dbd9James Dong DEBUG_PRINTF_2("Level[%d] = %d\n", i, pLevel[i]); 165bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 166bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (SuffixLength==0) 167bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 168bebc99d6fa433c04139294a5057f8439d772dbd9James Dong SuffixLength=1; 169bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 170bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if ( ((LevelCode>>1)+1)>(3<<(SuffixLength-1)) && SuffixLength<6 ) 171bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 172bebc99d6fa433c04139294a5057f8439d772dbd9James Dong SuffixLength++; 173bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 174bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 175bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 176bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* Decode run values */ 177bebc99d6fa433c04139294a5057f8439d772dbd9James Dong ZerosLeft = 0; 178bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (TotalCoeff < sMaxNumCoeff) 179bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 180bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* Decode TotalZeros VLC */ 181bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (sMaxNumCoeff==4) 182bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 183bebc99d6fa433c04139294a5057f8439d772dbd9James Dong ZerosLeft = armUnPackVLC32(ppBitStream, pOffset, armVCM4P10_CAVLCTotalZeros2x2Tables[TotalCoeff-1]); 184bebc99d6fa433c04139294a5057f8439d772dbd9James Dong armRetDataErrIf(ZerosLeft ==ARM_NO_CODEBOOK_INDEX , OMX_Sts_Err); 185bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 186bebc99d6fa433c04139294a5057f8439d772dbd9James Dong else 187bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 188bebc99d6fa433c04139294a5057f8439d772dbd9James Dong ZerosLeft = armUnPackVLC32(ppBitStream, pOffset, armVCM4P10_CAVLCTotalZeroTables[TotalCoeff-1]); 189bebc99d6fa433c04139294a5057f8439d772dbd9James Dong armRetDataErrIf(ZerosLeft ==ARM_NO_CODEBOOK_INDEX , OMX_Sts_Err); 190bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 191bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 192bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 193bebc99d6fa433c04139294a5057f8439d772dbd9James Dong DEBUG_PRINTF_1("TotalZeros = %d\n", ZerosLeft); 194bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 195bebc99d6fa433c04139294a5057f8439d772dbd9James Dong CoeffNum=ZerosLeft+TotalCoeff-1; 196bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 197bebc99d6fa433c04139294a5057f8439d772dbd9James Dong for (i=TotalCoeff-1; i>0; i--) 198bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 199bebc99d6fa433c04139294a5057f8439d772dbd9James Dong Run = 0; 200bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (ZerosLeft > 0) 201bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 202bebc99d6fa433c04139294a5057f8439d772dbd9James Dong int Table = ZerosLeft; 203bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (Table > 6) 204bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 205bebc99d6fa433c04139294a5057f8439d772dbd9James Dong Table = 7; 206bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 207bebc99d6fa433c04139294a5057f8439d772dbd9James Dong Run = armUnPackVLC32(ppBitStream, pOffset, armVCM4P10_CAVLCRunBeforeTables[Table-1]); 208bebc99d6fa433c04139294a5057f8439d772dbd9James Dong armRetDataErrIf(Run == ARM_NO_CODEBOOK_INDEX, OMX_Sts_Err); 209bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 210bebc99d6fa433c04139294a5057f8439d772dbd9James Dong pRun[i] = (OMX_U8)Run; 211bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 212bebc99d6fa433c04139294a5057f8439d772dbd9James Dong DEBUG_PRINTF_2("Run[%d] = %d\n", i, pRun[i]); 213bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 214bebc99d6fa433c04139294a5057f8439d772dbd9James Dong ZerosLeft -= Run; 215bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 216bebc99d6fa433c04139294a5057f8439d772dbd9James Dong pRun[0] = (OMX_U8)ZerosLeft; 217bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 218bebc99d6fa433c04139294a5057f8439d772dbd9James Dong DEBUG_PRINTF_1("Run[0] = %d\n", pRun[i]); 219bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 220bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 221bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* Fill in coefficients */ 222bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 223bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (sMaxNumCoeff==15) 224bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 225bebc99d6fa433c04139294a5057f8439d772dbd9James Dong CoeffNum++; /* Skip the DC position */ 226bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 227bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 228bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /*for (i=0;i<TotalCoeff;i++) 229bebc99d6fa433c04139294a5057f8439d772dbd9James Dong CoeffNum += pRun[i]+1;*/ 230bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 231bebc99d6fa433c04139294a5057f8439d772dbd9James Dong for (i=(TotalCoeff-1); i>=0; i--) 232bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 233bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /*CoeffNum += pRun[i]+1;*/ 234bebc99d6fa433c04139294a5057f8439d772dbd9James Dong Level = pLevel[i]; 235bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 236bebc99d6fa433c04139294a5057f8439d772dbd9James Dong DEBUG_PRINTF_2("Coef[%d] = %d\n", CoeffNum, Level); 237bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 238bebc99d6fa433c04139294a5057f8439d772dbd9James Dong Flags = CoeffNum; 239bebc99d6fa433c04139294a5057f8439d772dbd9James Dong CoeffNum -= (pRun[i]+1); 240bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (sMaxNumCoeff>4) 241bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 242bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* Perform 4x4 DeZigZag */ 243bebc99d6fa433c04139294a5057f8439d772dbd9James Dong Flags = armVCM4P10_ZigZag[Flags]; 244bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 245bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (i==0) 246bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 247bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* End of block flag */ 248bebc99d6fa433c04139294a5057f8439d772dbd9James Dong Flags += 0x20; 249bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 250bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (Level<-128 || Level>127) 251bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 252bebc99d6fa433c04139294a5057f8439d772dbd9James Dong /* Overflow flag */ 253bebc99d6fa433c04139294a5057f8439d772dbd9James Dong Flags += 0x10; 254bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 255bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 256bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *pPosCoefbuf++ = (OMX_U8)(Flags); 257bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *pPosCoefbuf++ = (OMX_U8)(Level & 0xFF); 258bebc99d6fa433c04139294a5057f8439d772dbd9James Dong if (Flags & 0x10) 259bebc99d6fa433c04139294a5057f8439d772dbd9James Dong { 260bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *pPosCoefbuf++ = (OMX_U8)(Level>>8); 261bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 262bebc99d6fa433c04139294a5057f8439d772dbd9James Dong } 263bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 264bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *ppPosCoefbuf = pPosCoefbuf; 265bebc99d6fa433c04139294a5057f8439d772dbd9James Dong 266bebc99d6fa433c04139294a5057f8439d772dbd9James Dong return OMX_Sts_NoErr; 267bebc99d6fa433c04139294a5057f8439d772dbd9James Dong} 268