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