1bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*
2bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Copyright (C) 2009 The Android Open Source Project
3bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
4bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Licensed under the Apache License, Version 2.0 (the "License");
5bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * you may not use this file except in compliance with the License.
6bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * You may obtain a copy of the License at
7bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
8bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *      http://www.apache.org/licenses/LICENSE-2.0
9bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
10bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Unless required by applicable law or agreed to in writing, software
11bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * distributed under the License is distributed on an "AS IS" BASIS,
12bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * See the License for the specific language governing permissions and
14bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * limitations under the License.
15bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
16bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
17bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
18bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
19bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Table of contents
20bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
21bebc99d6fa433c04139294a5057f8439d772dbd9James Dong     1. Include headers
22bebc99d6fa433c04139294a5057f8439d772dbd9James Dong     2. External compiler flags
23bebc99d6fa433c04139294a5057f8439d772dbd9James Dong     3. Module defines
24bebc99d6fa433c04139294a5057f8439d772dbd9James Dong     4. Local function prototypes
25bebc99d6fa433c04139294a5057f8439d772dbd9James Dong     5. Functions
26bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          h264bsdDecodeMacroblockLayer
27bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          h264bsdMbPartPredMode
28bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          h264bsdNumMbPart
29bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          h264bsdNumSubMbPart
30bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          DecodeMbPred
31bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          DecodeSubMbPred
32bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          DecodeResidual
33bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          DetermineNc
34bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          CbpIntra16x16
35bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          h264bsdPredModeIntra16x16
36bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          h264bsdDecodeMacroblock
37bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          ProcessResidual
38bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          h264bsdSubMbPartMode
39bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
40bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
41bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
42bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
43bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    1. Include headers
44bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
45bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
46bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "h264bsd_macroblock_layer.h"
47bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "h264bsd_slice_header.h"
48bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "h264bsd_util.h"
49bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "h264bsd_vlc.h"
50bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "h264bsd_cavlc.h"
51bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "h264bsd_nal_unit.h"
52bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "h264bsd_neighbour.h"
53bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "h264bsd_transform.h"
54bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "h264bsd_intra_prediction.h"
55bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "h264bsd_inter_prediction.h"
56bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
57bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_OMXDL
58bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "omxtypes.h"
59bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "omxVC.h"
60bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "armVC.h"
61bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif /* H264DEC_OMXDL */
62bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
63bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
64bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    2. External compiler flags
65bebc99d6fa433c04139294a5057f8439d772dbd9James Dong--------------------------------------------------------------------------------
66bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
67bebc99d6fa433c04139294a5057f8439d772dbd9James Dong--------------------------------------------------------------------------------
68bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    3. Module defines
69bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
70bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_OMXDL
71bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic const u32 chromaIndex[8] = { 256, 260, 288, 292, 320, 324, 352, 356 };
72bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic const u32 lumaIndex[16] = {   0,   4,  64,  68,
73bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                     8,  12,  72,  76,
74bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                   128, 132, 192, 196,
75bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                   136, 140, 200, 204 };
76bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
77bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* mapping of dc coefficients array to luma blocks */
78bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic const u32 dcCoeffIndex[16] =
79bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15};
80bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
81bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
82bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    4. Local function prototypes
83bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
84bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
85bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic u32 DecodeMbPred(strmData_t *pStrmData, mbPred_t *pMbPred,
86bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    mbType_e mbType, u32 numRefIdxActive);
87bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic u32 DecodeSubMbPred(strmData_t *pStrmData, subMbPred_t *pSubMbPred,
88bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    mbType_e mbType, u32 numRefIdxActive);
89bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic u32 DecodeResidual(strmData_t *pStrmData, residual_t *pResidual,
90bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    mbStorage_t *pMb, mbType_e mbType, u32 codedBlockPattern);
91bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
92bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_OMXDL
93bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic u32 DetermineNc(mbStorage_t *pMb, u32 blockIndex, u8 *pTotalCoeff);
94bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
95bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic u32 DetermineNc(mbStorage_t *pMb, u32 blockIndex, i16 *pTotalCoeff);
96bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
97bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
98bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic u32 CbpIntra16x16(mbType_e mbType);
99bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_OMXDL
100bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic u32 ProcessIntra4x4Residual(mbStorage_t *pMb, u8 *data, u32 constrainedIntraPred,
101bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    macroblockLayer_t *mbLayer, const u8 **pSrc, image_t *image);
102bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic u32 ProcessChromaResidual(mbStorage_t *pMb, u8 *data, const u8 **pSrc );
103bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic u32 ProcessIntra16x16Residual(mbStorage_t *pMb, u8 *data, u32 constrainedIntraPred,
104bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    u32 intraChromaPredMode, const u8 **pSrc, image_t *image);
105bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
106bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
107bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
108bebc99d6fa433c04139294a5057f8439d772dbd9James Dongstatic u32 ProcessResidual(mbStorage_t *pMb, i32 residualLevel[][16], u32 *);
109bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
110bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
111bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
112bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
113bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function name: h264bsdDecodeMacroblockLayer
114bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
115bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
116bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Parse macroblock specific information from bit stream.
117bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
118bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Inputs:
119bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          pStrmData         pointer to stream data structure
120bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          pMb               pointer to macroblock storage structure
121bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          sliceType         type of the current slice
122bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          numRefIdxActive   maximum reference index
123bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
124bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Outputs:
125bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          pMbLayer          stores the macroblock data parsed from stream
126bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
127bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Returns:
128bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          HANTRO_OK         success
129bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          HANTRO_NOK        end of stream or error in stream
130bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
131bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
132bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
133bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 h264bsdDecodeMacroblockLayer(strmData_t *pStrmData,
134bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    macroblockLayer_t *pMbLayer, mbStorage_t *pMb, u32 sliceType,
135bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 numRefIdxActive)
136bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
137bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
138bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
139bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
140bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 tmp, i, value;
141bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i32 itmp;
142bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    mbPartPredMode_e partMode;
143bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
144bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
145bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
146bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pStrmData);
147bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pMbLayer);
148bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
149bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_NEON
150bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    h264bsdClearMbLayer(pMbLayer, ((sizeof(macroblockLayer_t) + 63) & ~0x3F));
151bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
152bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    H264SwDecMemset(pMbLayer, 0, sizeof(macroblockLayer_t));
153bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
154bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
155bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, &value);
156bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
157bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (IS_I_SLICE(sliceType))
158bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
159bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if ((value + 6) > 31 || tmp != HANTRO_OK)
160bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(HANTRO_NOK);
161bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        pMbLayer->mbType = (mbType_e)(value + 6);
162bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
163bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
164bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
165bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if ((value + 1) > 31 || tmp != HANTRO_OK)
166bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(HANTRO_NOK);
167bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        pMbLayer->mbType = (mbType_e)(value + 1);
168bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
169bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
170bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (pMbLayer->mbType == I_PCM)
171bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
172bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        i32 *level;
173bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        while( !h264bsdIsByteAligned(pStrmData) )
174bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
175bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            /* pcm_alignment_zero_bit */
176bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = h264bsdGetBits(pStrmData, 1);
177bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp)
178bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return(HANTRO_NOK);
179bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
180bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
181bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        level = pMbLayer->residual.level[0];
182bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        for (i = 0; i < 384; i++)
183bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
184bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            value = h264bsdGetBits(pStrmData, 8);
185bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (value == END_OF_STREAM)
186bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return(HANTRO_NOK);
187bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            *level++ = (i32)value;
188bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
189bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
190bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
191bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
192bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        partMode = h264bsdMbPartPredMode(pMbLayer->mbType);
193bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if ( (partMode == PRED_MODE_INTER) &&
194bebc99d6fa433c04139294a5057f8439d772dbd9James Dong             (h264bsdNumMbPart(pMbLayer->mbType) == 4) )
195bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
196bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = DecodeSubMbPred(pStrmData, &pMbLayer->subMbPred,
197bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                pMbLayer->mbType, numRefIdxActive);
198bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
199bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
200bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
201bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = DecodeMbPred(pStrmData, &pMbLayer->mbPred,
202bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                pMbLayer->mbType, numRefIdxActive);
203bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
204bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (tmp != HANTRO_OK)
205bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(tmp);
206bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
207bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (partMode != PRED_MODE_INTRA16x16)
208bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
209bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = h264bsdDecodeExpGolombMapped(pStrmData, &value,
210bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (u32)(partMode == PRED_MODE_INTRA4x4));
211bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp != HANTRO_OK)
212bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return(tmp);
213bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pMbLayer->codedBlockPattern = value;
214bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
215bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
216bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
217bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pMbLayer->codedBlockPattern = CbpIntra16x16(pMbLayer->mbType);
218bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
219bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
220bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if ( pMbLayer->codedBlockPattern ||
221bebc99d6fa433c04139294a5057f8439d772dbd9James Dong             (partMode == PRED_MODE_INTRA16x16) )
222bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
223bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = h264bsdDecodeExpGolombSigned(pStrmData, &itmp);
224bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp != HANTRO_OK || (itmp < -26) || (itmp > 25) )
225bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return(HANTRO_NOK);
226bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pMbLayer->mbQpDelta = itmp;
227bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
228bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = DecodeResidual(pStrmData, &pMbLayer->residual, pMb,
229bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                pMbLayer->mbType, pMbLayer->codedBlockPattern);
230bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
231bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pStrmData->strmBuffReadBits =
232bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (u32)(pStrmData->pStrmCurrPos - pStrmData->pStrmBuffStart) * 8 +
233bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                pStrmData->bitPosInWord;
234bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
235bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp != HANTRO_OK)
236bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return(tmp);
237bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
238bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
239bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
240bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return(HANTRO_OK);
241bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
242bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
243bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
244bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
245bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
246bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: h264bsdMbPartPredMode
247bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
248bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
249bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Returns the prediction mode of a macroblock type
250bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
251bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
252bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
253bebc99d6fa433c04139294a5057f8439d772dbd9James DongmbPartPredMode_e h264bsdMbPartPredMode(mbType_e mbType)
254bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
255bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
256bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
257bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
258bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
259bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
260bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
261bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(mbType <= 31);
262bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
263bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if ((mbType <= P_8x8ref0))
264bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return(PRED_MODE_INTER);
265bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else if (mbType == I_4x4)
266bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return(PRED_MODE_INTRA4x4);
267bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
268bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return(PRED_MODE_INTRA16x16);
269bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
270bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
271bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
272bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
273bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
274bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: h264bsdNumMbPart
275bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
276bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
277bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Returns the amount of macroblock partitions in a macroblock type
278bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
279bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
280bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
281bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 h264bsdNumMbPart(mbType_e mbType)
282bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
283bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
284bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
285bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
286bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
287bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
288bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
289bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(h264bsdMbPartPredMode(mbType) == PRED_MODE_INTER);
290bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
291bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    switch (mbType)
292bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
293bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        case P_L0_16x16:
294bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        case P_Skip:
295bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(1);
296bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
297bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        case P_L0_L0_16x8:
298bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        case P_L0_L0_8x16:
299bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(2);
300bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
301bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        /* P_8x8 or P_8x8ref0 */
302bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        default:
303bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(4);
304bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
305bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
306bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
307bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
308bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
309bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
310bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: h264bsdNumSubMbPart
311bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
312bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
313bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Returns the amount of sub-partitions in a sub-macroblock type
314bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
315bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
316bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
317bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 h264bsdNumSubMbPart(subMbType_e subMbType)
318bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
319bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
320bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
321bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
322bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
323bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
324bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
325bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(subMbType <= P_L0_4x4);
326bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
327bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    switch (subMbType)
328bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
329bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        case P_L0_8x8:
330bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(1);
331bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
332bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        case P_L0_8x4:
333bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        case P_L0_4x8:
334bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(2);
335bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
336bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        /* P_L0_4x4 */
337bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        default:
338bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(4);
339bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
340bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
341bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
342bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
343bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
344bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
345bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: DecodeMbPred
346bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
347bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
348bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Parse macroblock prediction information from bit stream and store
349bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          in 'pMbPred'.
350bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
351bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
352bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
353bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 DecodeMbPred(strmData_t *pStrmData, mbPred_t *pMbPred, mbType_e mbType,
354bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 numRefIdxActive)
355bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
356bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
357bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
358bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
359bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 tmp, i, j, value;
360bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i32 itmp;
361bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
362bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
363bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
364bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pStrmData);
365bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pMbPred);
366bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
367bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    switch (h264bsdMbPartPredMode(mbType))
368bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
369bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        case PRED_MODE_INTER: /* PRED_MODE_INTER */
370bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (numRefIdxActive > 1)
371bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
372bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                for (i = h264bsdNumMbPart(mbType), j = 0; i--;  j++)
373bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                {
374bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    tmp = h264bsdDecodeExpGolombTruncated(pStrmData, &value,
375bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        (u32)(numRefIdxActive > 2));
376bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    if (tmp != HANTRO_OK || value >= numRefIdxActive)
377bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        return(HANTRO_NOK);
378bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
379bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    pMbPred->refIdxL0[j] = value;
380bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                }
381bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
382bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
383bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            for (i = h264bsdNumMbPart(mbType), j = 0; i--;  j++)
384bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
385bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                tmp = h264bsdDecodeExpGolombSigned(pStrmData, &itmp);
386bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                if (tmp != HANTRO_OK)
387bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    return(tmp);
388bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                pMbPred->mvdL0[j].hor = (i16)itmp;
389bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
390bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                tmp = h264bsdDecodeExpGolombSigned(pStrmData, &itmp);
391bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                if (tmp != HANTRO_OK)
392bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    return(tmp);
393bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                pMbPred->mvdL0[j].ver = (i16)itmp;
394bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
395bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            break;
396bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
397bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        case PRED_MODE_INTRA4x4:
398bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            for (itmp = 0, i = 0; itmp < 2; itmp++)
399bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
400bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                value = h264bsdShowBits32(pStrmData);
401bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                tmp = 0;
402bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                for (j = 8; j--; i++)
403bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                {
404bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    pMbPred->prevIntra4x4PredModeFlag[i] =
405bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        value & 0x80000000 ? HANTRO_TRUE : HANTRO_FALSE;
406bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    value <<= 1;
407bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    if (!pMbPred->prevIntra4x4PredModeFlag[i])
408bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    {
409bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        pMbPred->remIntra4x4PredMode[i] = value>>29;
410bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        value <<= 3;
411bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        tmp++;
412bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    }
413bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                }
414bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                if (h264bsdFlushBits(pStrmData, 8 + 3*tmp) == END_OF_STREAM)
415bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    return(HANTRO_NOK);
416bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
417bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            /* fall-through */
418bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
419bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        case PRED_MODE_INTRA16x16:
420bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, &value);
421bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp != HANTRO_OK || value > 3)
422bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return(HANTRO_NOK);
423bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pMbPred->intraChromaPredMode = value;
424bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            break;
425bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
426bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
427bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return(HANTRO_OK);
428bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
429bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
430bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
431bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
432bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
433bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: DecodeSubMbPred
434bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
435bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
436bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Parse sub-macroblock prediction information from bit stream and
437bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          store in 'pMbPred'.
438bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
439bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
440bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
441bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 DecodeSubMbPred(strmData_t *pStrmData, subMbPred_t *pSubMbPred,
442bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    mbType_e mbType, u32 numRefIdxActive)
443bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
444bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
445bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
446bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
447bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 tmp, i, j, value;
448bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i32 itmp;
449bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
450bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
451bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
452bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pStrmData);
453bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pSubMbPred);
454bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(h264bsdMbPartPredMode(mbType) == PRED_MODE_INTER);
455bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
456bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    for (i = 0; i < 4; i++)
457bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
458bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, &value);
459bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (tmp != HANTRO_OK || value > 3)
460bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(HANTRO_NOK);
461bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        pSubMbPred->subMbType[i] = (subMbType_e)value;
462bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
463bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
464bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if ( (numRefIdxActive > 1) && (mbType != P_8x8ref0) )
465bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
466bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        for (i = 0; i < 4; i++)
467bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
468bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = h264bsdDecodeExpGolombTruncated(pStrmData, &value,
469bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (u32)(numRefIdxActive > 2));
470bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp != HANTRO_OK || value >= numRefIdxActive)
471bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return(HANTRO_NOK);
472bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pSubMbPred->refIdxL0[i] = value;
473bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
474bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
475bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
476bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    for (i = 0; i < 4; i++)
477bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
478bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        j = 0;
479bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        for (value = h264bsdNumSubMbPart(pSubMbPred->subMbType[i]);
480bebc99d6fa433c04139294a5057f8439d772dbd9James Dong             value--; j++)
481bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
482bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = h264bsdDecodeExpGolombSigned(pStrmData, &itmp);
483bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp != HANTRO_OK)
484bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return(tmp);
485bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pSubMbPred->mvdL0[i][j].hor = (i16)itmp;
486bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
487bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = h264bsdDecodeExpGolombSigned(pStrmData, &itmp);
488bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp != HANTRO_OK)
489bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return(tmp);
490bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pSubMbPred->mvdL0[i][j].ver = (i16)itmp;
491bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
492bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
493bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
494bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return(HANTRO_OK);
495bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
496bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
497bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
498bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_OMXDL
499bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
500bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
501bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: DecodeResidual
502bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
503bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
504bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Parse residual information from bit stream and store in 'pResidual'.
505bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
506bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
507bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
508bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 DecodeResidual(strmData_t *pStrmData, residual_t *pResidual,
509bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    mbStorage_t *pMb, mbType_e mbType, u32 codedBlockPattern)
510bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
511bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
512bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
513bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
514bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 i, j;
515bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 blockCoded;
516bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 blockIndex;
517bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 is16x16;
518bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_INT nc;
519bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMXResult omxRes;
520bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_U8 *pPosCoefBuf;
521bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
522bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
523bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
524bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
525bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pStrmData);
526bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pResidual);
527bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
528bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    pPosCoefBuf = pResidual->posCoefBuf;
529bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
530bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* luma DC is at index 24 */
531bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (h264bsdMbPartPredMode(mbType) == PRED_MODE_INTRA16x16)
532bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
533bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        nc = (OMX_INT)DetermineNc(pMb, 0, pResidual->totalCoeff);
534bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifndef H264DEC_NEON
535bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        omxRes =  omxVCM4P10_DecodeCoeffsToPairCAVLC(
536bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (const OMX_U8 **) (&pStrmData->pStrmCurrPos),
537bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (OMX_S32*) (&pStrmData->bitPosInWord),
538bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                &pResidual->totalCoeff[24],
539bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                &pPosCoefBuf,
540bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                nc,
541bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                16);
542bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
543bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        omxRes = armVCM4P10_DecodeCoeffsToPair(
544bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (const OMX_U8 **) (&pStrmData->pStrmCurrPos),
545bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (OMX_S32*) (&pStrmData->bitPosInWord),
546bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                &pResidual->totalCoeff[24],
547bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                &pPosCoefBuf,
548bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                nc,
549bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                16);
550bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
551bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (omxRes != OMX_Sts_NoErr)
552bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(HANTRO_NOK);
553bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        is16x16 = HANTRO_TRUE;
554bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
555bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
556bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        is16x16 = HANTRO_FALSE;
557bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
558bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    for (i = 4, blockIndex = 0; i--;)
559bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
560bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        /* luma cbp in bits 0-3 */
561bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        blockCoded = codedBlockPattern & 0x1;
562bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        codedBlockPattern >>= 1;
563bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (blockCoded)
564bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
565bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            for (j = 4; j--; blockIndex++)
566bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
567bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                nc = (OMX_INT)DetermineNc(pMb,blockIndex,pResidual->totalCoeff);
568bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                if (is16x16)
569bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                {
570bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifndef H264DEC_NEON
571bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    omxRes =  omxVCM4P10_DecodeCoeffsToPairCAVLC(
572bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            (const OMX_U8 **) (&pStrmData->pStrmCurrPos),
573bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            (OMX_S32*) (&pStrmData->bitPosInWord),
574bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            &pResidual->totalCoeff[blockIndex],
575bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            &pPosCoefBuf,
576bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            nc,
577bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            15);
578bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
579bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    omxRes =  armVCM4P10_DecodeCoeffsToPair(
580bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            (const OMX_U8 **) (&pStrmData->pStrmCurrPos),
581bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            (OMX_S32*) (&pStrmData->bitPosInWord),
582bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            &pResidual->totalCoeff[blockIndex],
583bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            &pPosCoefBuf,
584bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            nc,
585bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            15);
586bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
587bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                }
588bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                else
589bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                {
590bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifndef H264DEC_NEON
591bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    omxRes =  omxVCM4P10_DecodeCoeffsToPairCAVLC(
592bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            (const OMX_U8 **) (&pStrmData->pStrmCurrPos),
593bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            (OMX_S32*) (&pStrmData->bitPosInWord),
594bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            &pResidual->totalCoeff[blockIndex],
595bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            &pPosCoefBuf,
596bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            nc,
597bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            16);
598bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
599bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    omxRes = armVCM4P10_DecodeCoeffsToPair(
600bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            (const OMX_U8 **) (&pStrmData->pStrmCurrPos),
601bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            (OMX_S32*) (&pStrmData->bitPosInWord),
602bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            &pResidual->totalCoeff[blockIndex],
603bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            &pPosCoefBuf,
604bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            nc,
605bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            16);
606bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
607bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                }
608bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                if (omxRes != OMX_Sts_NoErr)
609bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    return(HANTRO_NOK);
610bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
611bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
612bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
613bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            blockIndex += 4;
614bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
615bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
616bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* chroma DC block are at indices 25 and 26 */
617bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    blockCoded = codedBlockPattern & 0x3;
618bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (blockCoded)
619bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
620bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifndef H264DEC_NEON
621bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        omxRes =  omxVCM4P10_DecodeChromaDcCoeffsToPairCAVLC(
622bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (const OMX_U8**) (&pStrmData->pStrmCurrPos),
623bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (OMX_S32*) (&pStrmData->bitPosInWord),
624bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                &pResidual->totalCoeff[25],
625bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                &pPosCoefBuf);
626bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
627bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        omxRes = armVCM4P10_DecodeCoeffsToPair(
628bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (const OMX_U8**) (&pStrmData->pStrmCurrPos),
629bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (OMX_S32*) (&pStrmData->bitPosInWord),
630bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                &pResidual->totalCoeff[25],
631bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                &pPosCoefBuf,
632bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                17,
633bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                4);
634bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
635bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (omxRes != OMX_Sts_NoErr)
636bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(HANTRO_NOK);
637bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifndef H264DEC_NEON
638bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        omxRes =  omxVCM4P10_DecodeChromaDcCoeffsToPairCAVLC(
639bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (const OMX_U8**) (&pStrmData->pStrmCurrPos),
640bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (OMX_S32*) (&pStrmData->bitPosInWord),
641bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                &pResidual->totalCoeff[26],
642bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                &pPosCoefBuf);
643bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
644bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        omxRes = armVCM4P10_DecodeCoeffsToPair(
645bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (const OMX_U8**) (&pStrmData->pStrmCurrPos),
646bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (OMX_S32*) (&pStrmData->bitPosInWord),
647bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                &pResidual->totalCoeff[26],
648bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                &pPosCoefBuf,
649bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                17,
650bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                4);
651bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
652bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (omxRes != OMX_Sts_NoErr)
653bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(HANTRO_NOK);
654bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
655bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
656bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* chroma AC */
657bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    blockCoded = codedBlockPattern & 0x2;
658bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (blockCoded)
659bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
660bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        for (i = 8; i--;blockIndex++)
661bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
662bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            nc = (OMX_INT)DetermineNc(pMb, blockIndex, pResidual->totalCoeff);
663bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifndef H264DEC_NEON
664bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            omxRes =  omxVCM4P10_DecodeCoeffsToPairCAVLC(
665bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    (const OMX_U8 **) (&pStrmData->pStrmCurrPos),
666bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    (OMX_S32*) (&pStrmData->bitPosInWord),
667bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    &pResidual->totalCoeff[blockIndex],
668bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    &pPosCoefBuf,
669bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    nc,
670bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    15);
671bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
672bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            omxRes =  armVCM4P10_DecodeCoeffsToPair(
673bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    (const OMX_U8 **) (&pStrmData->pStrmCurrPos),
674bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    (OMX_S32*) (&pStrmData->bitPosInWord),
675bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    &pResidual->totalCoeff[blockIndex],
676bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    &pPosCoefBuf,
677bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    nc,
678bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    15);
679bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
680bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (omxRes != OMX_Sts_NoErr)
681bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return(HANTRO_NOK);
682bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
683bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
684bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
685bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return(HANTRO_OK);
686bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
687bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
688bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
689bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
690bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
691bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
692bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: DecodeResidual
693bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
694bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
695bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Parse residual information from bit stream and store in 'pResidual'.
696bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
697bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
698bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
699bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 DecodeResidual(strmData_t *pStrmData, residual_t *pResidual,
700bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    mbStorage_t *pMb, mbType_e mbType, u32 codedBlockPattern)
701bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
702bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
703bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
704bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
705bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 i, j, tmp;
706bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i32 nc;
707bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 blockCoded;
708bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 blockIndex;
709bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 is16x16;
710bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i32 (*level)[16];
711bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
712bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
713bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
714bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pStrmData);
715bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pResidual);
716bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
717bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    level = pResidual->level;
718bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
719bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* luma DC is at index 24 */
720bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (h264bsdMbPartPredMode(mbType) == PRED_MODE_INTRA16x16)
721bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
722bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        nc = (i32)DetermineNc(pMb, 0, pResidual->totalCoeff);
723bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        tmp = h264bsdDecodeResidualBlockCavlc(pStrmData, level[24], nc, 16);
724bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if ((tmp & 0xF) != HANTRO_OK)
725bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(tmp);
726bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        pResidual->totalCoeff[24] = (tmp >> 4) & 0xFF;
727bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        is16x16 = HANTRO_TRUE;
728bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
729bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
730bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        is16x16 = HANTRO_FALSE;
731bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
732bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    for (i = 4, blockIndex = 0; i--;)
733bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
734bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        /* luma cbp in bits 0-3 */
735bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        blockCoded = codedBlockPattern & 0x1;
736bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        codedBlockPattern >>= 1;
737bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (blockCoded)
738bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
739bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            for (j = 4; j--; blockIndex++)
740bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
741bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                nc = (i32)DetermineNc(pMb, blockIndex, pResidual->totalCoeff);
742bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                if (is16x16)
743bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                {
744bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    tmp = h264bsdDecodeResidualBlockCavlc(pStrmData,
745bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        level[blockIndex] + 1, nc, 15);
746bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    pResidual->coeffMap[blockIndex] = tmp >> 15;
747bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                }
748bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                else
749bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                {
750bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    tmp = h264bsdDecodeResidualBlockCavlc(pStrmData,
751bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        level[blockIndex], nc, 16);
752bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    pResidual->coeffMap[blockIndex] = tmp >> 16;
753bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                }
754bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                if ((tmp & 0xF) != HANTRO_OK)
755bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    return(tmp);
756bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                pResidual->totalCoeff[blockIndex] = (tmp >> 4) & 0xFF;
757bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
758bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
759bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
760bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            blockIndex += 4;
761bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
762bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
763bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* chroma DC block are at indices 25 and 26 */
764bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    blockCoded = codedBlockPattern & 0x3;
765bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (blockCoded)
766bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
767bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        tmp = h264bsdDecodeResidualBlockCavlc(pStrmData, level[25], -1, 4);
768bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if ((tmp & 0xF) != HANTRO_OK)
769bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(tmp);
770bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        pResidual->totalCoeff[25] = (tmp >> 4) & 0xFF;
771bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        tmp = h264bsdDecodeResidualBlockCavlc(pStrmData, level[25]+4, -1, 4);
772bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if ((tmp & 0xF) != HANTRO_OK)
773bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(tmp);
774bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        pResidual->totalCoeff[26] = (tmp >> 4) & 0xFF;
775bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
776bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
777bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* chroma AC */
778bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    blockCoded = codedBlockPattern & 0x2;
779bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (blockCoded)
780bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
781bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        for (i = 8; i--;blockIndex++)
782bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
783bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            nc = (i32)DetermineNc(pMb, blockIndex, pResidual->totalCoeff);
784bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = h264bsdDecodeResidualBlockCavlc(pStrmData,
785bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                level[blockIndex] + 1, nc, 15);
786bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if ((tmp & 0xF) != HANTRO_OK)
787bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return(tmp);
788bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pResidual->totalCoeff[blockIndex] = (tmp >> 4) & 0xFF;
789bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pResidual->coeffMap[blockIndex] = (tmp >> 15);
790bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
791bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
792bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
793bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return(HANTRO_OK);
794bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
795bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
796bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
797bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
798bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
799bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
800bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: DetermineNc
801bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
802bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
803bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Returns the nC of a block.
804bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
805bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
806bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_OMXDL
807bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 DetermineNc(mbStorage_t *pMb, u32 blockIndex, u8 *pTotalCoeff)
808bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
809bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 DetermineNc(mbStorage_t *pMb, u32 blockIndex, i16 *pTotalCoeff)
810bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
811bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
812bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*lint -e702 */
813bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
814bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
815bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 tmp;
816bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i32 n;
817bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    const neighbour_t *neighbourA, *neighbourB;
818bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u8 neighbourAindex, neighbourBindex;
819bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
820bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
821bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
822bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(blockIndex < 24);
823bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
824bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* if neighbour block belongs to current macroblock totalCoeff array
825bebc99d6fa433c04139294a5057f8439d772dbd9James Dong     * mbStorage has not been set/updated yet -> use pTotalCoeff */
826bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    neighbourA = h264bsdNeighbour4x4BlockA(blockIndex);
827bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    neighbourB = h264bsdNeighbour4x4BlockB(blockIndex);
828bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    neighbourAindex = neighbourA->index;
829bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    neighbourBindex = neighbourB->index;
830bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (neighbourA->mb == MB_CURR && neighbourB->mb == MB_CURR)
831bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
832bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        n = (pTotalCoeff[neighbourAindex] +
833bebc99d6fa433c04139294a5057f8439d772dbd9James Dong             pTotalCoeff[neighbourBindex] + 1)>>1;
834bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
835bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else if (neighbourA->mb == MB_CURR)
836bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
837bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        n = pTotalCoeff[neighbourAindex];
838bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (h264bsdIsNeighbourAvailable(pMb, pMb->mbB))
839bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
840bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            n = (n + pMb->mbB->totalCoeff[neighbourBindex] + 1) >> 1;
841bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
842bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
843bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else if (neighbourB->mb == MB_CURR)
844bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
845bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        n = pTotalCoeff[neighbourBindex];
846bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (h264bsdIsNeighbourAvailable(pMb, pMb->mbA))
847bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
848bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            n = (n + pMb->mbA->totalCoeff[neighbourAindex] + 1) >> 1;
849bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
850bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
851bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
852bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
853bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        n = tmp = 0;
854bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (h264bsdIsNeighbourAvailable(pMb, pMb->mbA))
855bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
856bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            n = pMb->mbA->totalCoeff[neighbourAindex];
857bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = 1;
858bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
859bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (h264bsdIsNeighbourAvailable(pMb, pMb->mbB))
860bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
861bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp)
862bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                n = (n + pMb->mbB->totalCoeff[neighbourBindex] + 1) >> 1;
863bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            else
864bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                n = pMb->mbB->totalCoeff[neighbourBindex];
865bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
866bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
867bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return((u32)n);
868bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*lint +e702 */
869bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
870bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
871bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
872bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
873bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: CbpIntra16x16
874bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
875bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
876bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Returns the coded block pattern for intra 16x16 macroblock.
877bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
878bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
879bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
880bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 CbpIntra16x16(mbType_e mbType)
881bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
882bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
883bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
884bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
885bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 cbp;
886bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 tmp;
887bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
888bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
889bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
890bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(mbType >= I_16x16_0_0_0 && mbType <= I_16x16_3_2_1);
891bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
892bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (mbType >= I_16x16_0_0_1)
893bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        cbp = 15;
894bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
895bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        cbp = 0;
896bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
897bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* tmp is 0 for I_16x16_0_0_0 mb type */
898bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* ignore lint warning on arithmetic on enum's */
899bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    tmp = /*lint -e(656)*/(mbType - I_16x16_0_0_0) >> 2;
900bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (tmp > 2)
901bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        tmp -= 3;
902bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
903bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    cbp += tmp << 4;
904bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
905bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return(cbp);
906bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
907bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
908bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
909bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
910bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
911bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: h264bsdPredModeIntra16x16
912bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
913bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
914bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Returns the prediction mode for intra 16x16 macroblock.
915bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
916bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
917bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
918bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 h264bsdPredModeIntra16x16(mbType_e mbType)
919bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
920bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
921bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
922bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
923bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 tmp;
924bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
925bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
926bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
927bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(mbType >= I_16x16_0_0_0 && mbType <= I_16x16_3_2_1);
928bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
929bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* tmp is 0 for I_16x16_0_0_0 mb type */
930bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* ignore lint warning on arithmetic on enum's */
931bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    tmp = /*lint -e(656)*/(mbType - I_16x16_0_0_0);
932bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
933bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return(tmp & 0x3);
934bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
935bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
936bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
937bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
938bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
939bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: h264bsdDecodeMacroblock
940bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
941bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
942bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Decode one macroblock and write into output image.
943bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
944bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Inputs:
945bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          pMb           pointer to macroblock specific information
946bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          mbLayer       pointer to current macroblock data from stream
947bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          currImage     pointer to output image
948bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          dpb           pointer to decoded picture buffer
949bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          qpY           pointer to slice QP
950bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          mbNum         current macroblock number
951bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          constrainedIntraPred  flag specifying if neighbouring inter
952bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                macroblocks are used in intra prediction
953bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
954bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Outputs:
955bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          pMb           structure is updated with current macroblock
956bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          currImage     decoded macroblock is written into output image
957bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
958bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Returns:
959bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          HANTRO_OK     success
960bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          HANTRO_NOK    error in macroblock decoding
961bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
962bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
963bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
964bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 h264bsdDecodeMacroblock(mbStorage_t *pMb, macroblockLayer_t *pMbLayer,
965bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    image_t *currImage, dpbStorage_t *dpb, i32 *qpY, u32 mbNum,
966bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 constrainedIntraPredFlag, u8* data)
967bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
968bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
969bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
970bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
971bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 i, tmp;
972bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    mbType_e mbType;
973bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_OMXDL
974bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    const u8 *pSrc;
975bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
976bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
977bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
978bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pMb);
979bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pMbLayer);
980bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(currImage);
981bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(qpY && *qpY < 52);
982bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(mbNum < currImage->width*currImage->height);
983bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
984bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    mbType = pMbLayer->mbType;
985bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    pMb->mbType = mbType;
986bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
987bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    pMb->decoded++;
988bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
989bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    h264bsdSetCurrImageMbPointers(currImage, mbNum);
990bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
991bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (mbType == I_PCM)
992bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
993bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        u8 *pData = (u8*)data;
994bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_OMXDL
995bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        u8 *tot = pMb->totalCoeff;
996bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
997bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        i16 *tot = pMb->totalCoeff;
998bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
999bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        i32 *lev = pMbLayer->residual.level[0];
1000bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1001bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        pMb->qpY = 0;
1002bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1003bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        /* if decoded flag > 1 -> mb has already been successfully decoded and
1004bebc99d6fa433c04139294a5057f8439d772dbd9James Dong         * written to output -> do not write again */
1005bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (pMb->decoded > 1)
1006bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1007bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            for (i = 24; i--;)
1008bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                *tot++ = 16;
1009bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return HANTRO_OK;
1010bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1011bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1012bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        for (i = 24; i--;)
1013bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1014bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            *tot++ = 16;
1015bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            for (tmp = 16; tmp--;)
1016bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                *pData++ = (u8)(*lev++);
1017bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1018bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        h264bsdWriteMacroblock(currImage, (u8*)data);
1019bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1020bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return(HANTRO_OK);
1021bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
1022bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
1023bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
1024bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_OMXDL
1025bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (h264bsdMbPartPredMode(mbType) == PRED_MODE_INTER)
1026bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1027bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = h264bsdInterPrediction(pMb, pMbLayer, dpb, mbNum,
1028bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                currImage, (u8*)data);
1029bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp != HANTRO_OK) return (tmp);
1030bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1031bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
1032bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (mbType != P_Skip)
1033bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1034bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            H264SwDecMemcpy(pMb->totalCoeff,
1035bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            pMbLayer->residual.totalCoeff,
1036bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            27*sizeof(*pMb->totalCoeff));
1037bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1038bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            /* update qpY */
1039bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (pMbLayer->mbQpDelta)
1040bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
1041bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                *qpY = *qpY + pMbLayer->mbQpDelta;
1042bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                if (*qpY < 0) *qpY += 52;
1043bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                else if (*qpY >= 52) *qpY -= 52;
1044bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
1045bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pMb->qpY = (u32)*qpY;
1046bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1047bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_OMXDL
1048bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pSrc = pMbLayer->residual.posCoefBuf;
1049bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1050bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (h264bsdMbPartPredMode(mbType) == PRED_MODE_INTER)
1051bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
1052bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                OMXResult res;
1053bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                u8 *p;
1054bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                u8 *totalCoeff = pMb->totalCoeff;
1055bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1056bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                for (i = 0; i < 16; i++, totalCoeff++)
1057bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                {
1058bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    p = data + lumaIndex[i];
1059bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    if (*totalCoeff)
1060bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    {
1061bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        res = omxVCM4P10_DequantTransformResidualFromPairAndAdd(
1062bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                &pSrc, p, 0, p, 16, 16, *qpY, *totalCoeff);
1063bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        if (res != OMX_Sts_NoErr)
1064bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            return (HANTRO_NOK);
1065bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    }
1066bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                }
1067bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1068bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
1069bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            else if (h264bsdMbPartPredMode(mbType) == PRED_MODE_INTRA4x4)
1070bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
1071bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                tmp = ProcessIntra4x4Residual(pMb,
1072bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                              data,
1073bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                              constrainedIntraPredFlag,
1074bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                              pMbLayer,
1075bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                              &pSrc,
1076bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                              currImage);
1077bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                if (tmp != HANTRO_OK)
1078bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    return (tmp);
1079bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
1080bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            else if (h264bsdMbPartPredMode(mbType) == PRED_MODE_INTRA16x16)
1081bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
1082bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                tmp = ProcessIntra16x16Residual(pMb,
1083bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                        data,
1084bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                        constrainedIntraPredFlag,
1085bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                        pMbLayer->mbPred.intraChromaPredMode,
1086bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                        &pSrc,
1087bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                                        currImage);
1088bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                if (tmp != HANTRO_OK)
1089bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    return (tmp);
1090bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
1091bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1092bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = ProcessChromaResidual(pMb, data, &pSrc);
1093bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1094bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
1095bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = ProcessResidual(pMb, pMbLayer->residual.level,
1096bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                pMbLayer->residual.coeffMap);
1097bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
1098bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp != HANTRO_OK)
1099bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return (tmp);
1100bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1101bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
1102bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1103bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            H264SwDecMemset(pMb->totalCoeff, 0, 27*sizeof(*pMb->totalCoeff));
1104bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            pMb->qpY = (u32)*qpY;
1105bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1106bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_OMXDL
1107bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        /* if decoded flag > 1 -> mb has already been successfully decoded and
1108bebc99d6fa433c04139294a5057f8439d772dbd9James Dong         * written to output -> do not write again */
1109bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (pMb->decoded > 1)
1110bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return HANTRO_OK;
1111bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1112bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        h264bsdWriteMacroblock(currImage, data);
1113bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else
1114bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (h264bsdMbPartPredMode(mbType) != PRED_MODE_INTER)
1115bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1116bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = h264bsdIntraPrediction(pMb, pMbLayer, currImage, mbNum,
1117bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                constrainedIntraPredFlag, (u8*)data);
1118bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp != HANTRO_OK) return (tmp);
1119bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1120bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
1121bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1122bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            tmp = h264bsdInterPrediction(pMb, pMbLayer, dpb, mbNum,
1123bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                currImage, (u8*)data);
1124bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (tmp != HANTRO_OK) return (tmp);
1125bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1126bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif
1127bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
1128bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1129bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return HANTRO_OK;
1130bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
1131bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1132bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1133bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#ifdef H264DEC_OMXDL
1134bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1135bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
1136bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1137bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: ProcessChromaResidual
1138bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1139bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
1140bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Process the residual data of chroma with
1141bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          inverse quantization and inverse transform.
1142bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1143bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
1144bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 ProcessChromaResidual(mbStorage_t *pMb, u8 *data, const u8 **pSrc )
1145bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
1146bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 i;
1147bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 chromaQp;
1148bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i16 *pDc;
1149bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i16 dc[4 + 4] = {0,0,0,0,0,0,0,0};
1150bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u8 *totalCoeff;
1151bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMXResult result;
1152bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u8 *p;
1153bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1154bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* chroma DC processing. First chroma dc block is block with index 25 */
1155bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    chromaQp =
1156bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        h264bsdQpC[CLIP3(0, 51, (i32)pMb->qpY + pMb->chromaQpIndexOffset)];
1157bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1158bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (pMb->totalCoeff[25])
1159bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
1160bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        pDc = dc;
1161bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        result = omxVCM4P10_TransformDequantChromaDCFromPair(
1162bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                pSrc,
1163bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                pDc,
1164bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (i32)chromaQp);
1165bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (result != OMX_Sts_NoErr)
1166bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return (HANTRO_NOK);
1167bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
1168bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (pMb->totalCoeff[26])
1169bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
1170bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        pDc = dc+4;
1171bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        result = omxVCM4P10_TransformDequantChromaDCFromPair(
1172bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                pSrc,
1173bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                pDc,
1174bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                (i32)chromaQp);
1175bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (result != OMX_Sts_NoErr)
1176bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return (HANTRO_NOK);
1177bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
1178bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1179bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    pDc = dc;
1180bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    totalCoeff = pMb->totalCoeff + 16;
1181bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    for (i = 0; i < 8; i++, pDc++, totalCoeff++)
1182bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
1183bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        /* chroma prediction */
1184bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (*totalCoeff || *pDc)
1185bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1186bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            p = data + chromaIndex[i];
1187bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            result = omxVCM4P10_DequantTransformResidualFromPairAndAdd(
1188bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    pSrc,
1189bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    p,
1190bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    pDc,
1191bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    p,
1192bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    8,
1193bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    8,
1194bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    (i32)chromaQp,
1195bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    *totalCoeff);
1196bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (result != OMX_Sts_NoErr)
1197bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return (HANTRO_NOK);
1198bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1199bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
1200bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1201bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return(HANTRO_OK);
1202bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
1203bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1204bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
1205bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1206bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: ProcessIntra16x16Residual
1207bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1208bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
1209bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Process the residual data of luma with
1210bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          inverse quantization and inverse transform.
1211bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1212bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
1213bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 ProcessIntra16x16Residual(mbStorage_t *pMb,
1214bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                              u8 *data,
1215bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                              u32 constrainedIntraPred,
1216bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                              u32 intraChromaPredMode,
1217bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                              const u8** pSrc,
1218bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                              image_t *image)
1219bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
1220bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 i;
1221bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i16 *pDc;
1222bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i16 dc[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1223bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u8 *totalCoeff;
1224bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMXResult result;
1225bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u8 *p;
1226bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1227bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    totalCoeff = pMb->totalCoeff;
1228bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1229bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (totalCoeff[24])
1230bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
1231bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        pDc = dc;
1232bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        result = omxVCM4P10_TransformDequantLumaDCFromPair(
1233bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    pSrc,
1234bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    pDc,
1235bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    (i32)pMb->qpY);
1236bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (result != OMX_Sts_NoErr)
1237bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return (HANTRO_NOK);
1238bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
1239bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* Intra 16x16 pred */
1240bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (h264bsdIntra16x16Prediction(pMb, data, image->luma,
1241bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            image->width*16, constrainedIntraPred) != HANTRO_OK)
1242bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return(HANTRO_NOK);
1243bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    for (i = 0; i < 16; i++, totalCoeff++)
1244bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
1245bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        p = data + lumaIndex[i];
1246bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        pDc = &dc[dcCoeffIndex[i]];
1247bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (*totalCoeff || *pDc)
1248bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1249bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            result = omxVCM4P10_DequantTransformResidualFromPairAndAdd(
1250bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    pSrc,
1251bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    p,
1252bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    pDc,
1253bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    p,
1254bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    16,
1255bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    16,
1256bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    (i32)pMb->qpY,
1257bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    *totalCoeff);
1258bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (result != OMX_Sts_NoErr)
1259bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return (HANTRO_NOK);
1260bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1261bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
1262bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1263bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (h264bsdIntraChromaPrediction(pMb, data + 256,
1264bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                image,
1265bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                intraChromaPredMode,
1266bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                constrainedIntraPred) != HANTRO_OK)
1267bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return(HANTRO_NOK);
1268bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1269bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return HANTRO_OK;
1270bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
1271bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1272bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
1273bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1274bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: ProcessIntra4x4Residual
1275bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1276bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
1277bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Process the residual data of luma with
1278bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          inverse quantization and inverse transform.
1279bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1280bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
1281bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 ProcessIntra4x4Residual(mbStorage_t *pMb,
1282bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            u8 *data,
1283bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            u32 constrainedIntraPred,
1284bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            macroblockLayer_t *mbLayer,
1285bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            const u8 **pSrc,
1286bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                            image_t *image)
1287bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
1288bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 i;
1289bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u8 *totalCoeff;
1290bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMXResult result;
1291bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u8 *p;
1292bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1293bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    totalCoeff = pMb->totalCoeff;
1294bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1295bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    for (i = 0; i < 16; i++, totalCoeff++)
1296bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
1297bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        p = data + lumaIndex[i];
1298bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (h264bsdIntra4x4Prediction(pMb, p, mbLayer, image->luma,
1299bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    image->width*16, constrainedIntraPred, i) != HANTRO_OK)
1300bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return(HANTRO_NOK);
1301bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1302bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (*totalCoeff)
1303bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1304bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            result = omxVCM4P10_DequantTransformResidualFromPairAndAdd(
1305bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    pSrc,
1306bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    p,
1307bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    NULL,
1308bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    p,
1309bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    16,
1310bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    16,
1311bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    (i32)pMb->qpY,
1312bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    *totalCoeff);
1313bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (result != OMX_Sts_NoErr)
1314bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return (HANTRO_NOK);
1315bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1316bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
1317bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1318bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (h264bsdIntraChromaPrediction(pMb, data + 256,
1319bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                image,
1320bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                mbLayer->mbPred.intraChromaPredMode,
1321bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                constrainedIntraPred) != HANTRO_OK)
1322bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return(HANTRO_NOK);
1323bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1324bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return HANTRO_OK;
1325bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
1326bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1327bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#else /* H264DEC_OMXDL */
1328bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1329bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
1330bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1331bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: ProcessResidual
1332bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1333bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
1334bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Process the residual data of one macroblock with
1335bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          inverse quantization and inverse transform.
1336bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1337bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
1338bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1339bebc99d6fa433c04139294a5057f8439d772dbd9James Dongu32 ProcessResidual(mbStorage_t *pMb, i32 residualLevel[][16], u32 *coeffMap)
1340bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
1341bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1342bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
1343bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1344bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 i;
1345bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    u32 chromaQp;
1346bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i32 (*blockData)[16];
1347bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i32 (*blockDc)[16];
1348bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i16 *totalCoeff;
1349bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    i32 *chromaDc;
1350bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    const u32 *dcCoeffIdx;
1351bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1352bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
1353bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1354bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(pMb);
1355bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(residualLevel);
1356bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1357bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* set pointers to DC coefficient blocks */
1358bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    blockDc = residualLevel + 24;
1359bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1360bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    blockData = residualLevel;
1361bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    totalCoeff = pMb->totalCoeff;
1362bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (h264bsdMbPartPredMode(pMb->mbType) == PRED_MODE_INTRA16x16)
1363bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
1364bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if (totalCoeff[24])
1365bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1366bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            h264bsdProcessLumaDc(*blockDc, pMb->qpY);
1367bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1368bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        dcCoeffIdx = dcCoeffIndex;
1369bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1370bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        for (i = 16; i--; blockData++, totalCoeff++, coeffMap++)
1371bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1372bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            /* set dc coefficient of luma block */
1373bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            (*blockData)[0] = (*blockDc)[*dcCoeffIdx++];
1374bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if ((*blockData)[0] || *totalCoeff)
1375bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
1376bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                if (h264bsdProcessBlock(*blockData, pMb->qpY, 1, *coeffMap) !=
1377bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    HANTRO_OK)
1378bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    return(HANTRO_NOK);
1379bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
1380bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            else
1381bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                MARK_RESIDUAL_EMPTY(*blockData);
1382bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1383bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
1384bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
1385bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
1386bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        for (i = 16; i--; blockData++, totalCoeff++, coeffMap++)
1387bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1388bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (*totalCoeff)
1389bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
1390bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                if (h264bsdProcessBlock(*blockData, pMb->qpY, 0, *coeffMap) !=
1391bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    HANTRO_OK)
1392bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    return(HANTRO_NOK);
1393bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
1394bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            else
1395bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                MARK_RESIDUAL_EMPTY(*blockData);
1396bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1397bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
1398bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1399bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    /* chroma DC processing. First chroma dc block is block with index 25 */
1400bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    chromaQp =
1401bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        h264bsdQpC[CLIP3(0, 51, (i32)pMb->qpY + pMb->chromaQpIndexOffset)];
1402bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (pMb->totalCoeff[25] || pMb->totalCoeff[26])
1403bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        h264bsdProcessChromaDc(residualLevel[25], chromaQp);
1404bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    chromaDc = residualLevel[25];
1405bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    for (i = 8; i--; blockData++, totalCoeff++, coeffMap++)
1406bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
1407bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        /* set dc coefficient of chroma block */
1408bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        (*blockData)[0] = *chromaDc++;
1409bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if ((*blockData)[0] || *totalCoeff)
1410bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
1411bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if (h264bsdProcessBlock(*blockData, chromaQp, 1,*coeffMap) !=
1412bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                HANTRO_OK)
1413bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return(HANTRO_NOK);
1414bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
1415bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
1416bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MARK_RESIDUAL_EMPTY(*blockData);
1417bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
1418bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1419bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return(HANTRO_OK);
1420bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
1421bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#endif /* H264DEC_OMXDL */
1422bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1423bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*------------------------------------------------------------------------------
1424bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1425bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Function: h264bsdSubMbPartMode
1426bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1427bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Functional description:
1428bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          Returns the macroblock's sub-partition mode.
1429bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1430bebc99d6fa433c04139294a5057f8439d772dbd9James Dong------------------------------------------------------------------------------*/
1431bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1432bebc99d6fa433c04139294a5057f8439d772dbd9James DongsubMbPartMode_e h264bsdSubMbPartMode(subMbType_e subMbType)
1433bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
1434bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1435bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Variables */
1436bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1437bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1438bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/* Code */
1439bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1440bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    ASSERT(subMbType < 4);
1441bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1442bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return((subMbPartMode_e)subMbType);
1443bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1444bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
1445bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1446bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1447