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