10c1bc742181ded4930842b46e9507372f0b1b963James Dong/* 20c1bc742181ded4930842b46e9507372f0b1b963James Dong * Copyright (C) 2009 The Android Open Source Project 30c1bc742181ded4930842b46e9507372f0b1b963James Dong * 40c1bc742181ded4930842b46e9507372f0b1b963James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 50c1bc742181ded4930842b46e9507372f0b1b963James Dong * you may not use this file except in compliance with the License. 60c1bc742181ded4930842b46e9507372f0b1b963James Dong * You may obtain a copy of the License at 70c1bc742181ded4930842b46e9507372f0b1b963James Dong * 80c1bc742181ded4930842b46e9507372f0b1b963James Dong * http://www.apache.org/licenses/LICENSE-2.0 90c1bc742181ded4930842b46e9507372f0b1b963James Dong * 100c1bc742181ded4930842b46e9507372f0b1b963James Dong * Unless required by applicable law or agreed to in writing, software 110c1bc742181ded4930842b46e9507372f0b1b963James Dong * distributed under the License is distributed on an "AS IS" BASIS, 120c1bc742181ded4930842b46e9507372f0b1b963James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130c1bc742181ded4930842b46e9507372f0b1b963James Dong * See the License for the specific language governing permissions and 140c1bc742181ded4930842b46e9507372f0b1b963James Dong * limitations under the License. 150c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 160c1bc742181ded4930842b46e9507372f0b1b963James Dong 170c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 180c1bc742181ded4930842b46e9507372f0b1b963James Dong 190c1bc742181ded4930842b46e9507372f0b1b963James Dong Table of contents 200c1bc742181ded4930842b46e9507372f0b1b963James Dong 210c1bc742181ded4930842b46e9507372f0b1b963James Dong 1. Include headers 220c1bc742181ded4930842b46e9507372f0b1b963James Dong 2. Module defines 230c1bc742181ded4930842b46e9507372f0b1b963James Dong 3. Data types 240c1bc742181ded4930842b46e9507372f0b1b963James Dong 4. Function prototypes 250c1bc742181ded4930842b46e9507372f0b1b963James Dong 260c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 270c1bc742181ded4930842b46e9507372f0b1b963James Dong 280c1bc742181ded4930842b46e9507372f0b1b963James Dong#ifndef H264SWDEC_MACROBLOCK_LAYER_H 290c1bc742181ded4930842b46e9507372f0b1b963James Dong#define H264SWDEC_MACROBLOCK_LAYER_H 300c1bc742181ded4930842b46e9507372f0b1b963James Dong 310c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 320c1bc742181ded4930842b46e9507372f0b1b963James Dong 1. Include headers 330c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 340c1bc742181ded4930842b46e9507372f0b1b963James Dong 350c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "basetype.h" 360c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_stream.h" 370c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_image.h" 380c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_dpb.h" 390c1bc742181ded4930842b46e9507372f0b1b963James Dong 400c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 410c1bc742181ded4930842b46e9507372f0b1b963James Dong 2. Module defines 420c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 430c1bc742181ded4930842b46e9507372f0b1b963James Dong 440c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Macro to determine if a mb is an intra mb */ 450c1bc742181ded4930842b46e9507372f0b1b963James Dong#define IS_INTRA_MB(a) ((a).mbType > 5) 460c1bc742181ded4930842b46e9507372f0b1b963James Dong 470c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Macro to determine if a mb is an I_PCM mb */ 480c1bc742181ded4930842b46e9507372f0b1b963James Dong#define IS_I_PCM_MB(a) ((a).mbType == 31) 490c1bc742181ded4930842b46e9507372f0b1b963James Dong 500c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef enum { 510c1bc742181ded4930842b46e9507372f0b1b963James Dong P_Skip = 0, 520c1bc742181ded4930842b46e9507372f0b1b963James Dong P_L0_16x16 = 1, 530c1bc742181ded4930842b46e9507372f0b1b963James Dong P_L0_L0_16x8 = 2, 540c1bc742181ded4930842b46e9507372f0b1b963James Dong P_L0_L0_8x16 = 3, 550c1bc742181ded4930842b46e9507372f0b1b963James Dong P_8x8 = 4, 560c1bc742181ded4930842b46e9507372f0b1b963James Dong P_8x8ref0 = 5, 570c1bc742181ded4930842b46e9507372f0b1b963James Dong I_4x4 = 6, 580c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_0_0_0 = 7, 590c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_1_0_0 = 8, 600c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_2_0_0 = 9, 610c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_3_0_0 = 10, 620c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_0_1_0 = 11, 630c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_1_1_0 = 12, 640c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_2_1_0 = 13, 650c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_3_1_0 = 14, 660c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_0_2_0 = 15, 670c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_1_2_0 = 16, 680c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_2_2_0 = 17, 690c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_3_2_0 = 18, 700c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_0_0_1 = 19, 710c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_1_0_1 = 20, 720c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_2_0_1 = 21, 730c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_3_0_1 = 22, 740c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_0_1_1 = 23, 750c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_1_1_1 = 24, 760c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_2_1_1 = 25, 770c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_3_1_1 = 26, 780c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_0_2_1 = 27, 790c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_1_2_1 = 28, 800c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_2_2_1 = 29, 810c1bc742181ded4930842b46e9507372f0b1b963James Dong I_16x16_3_2_1 = 30, 820c1bc742181ded4930842b46e9507372f0b1b963James Dong I_PCM = 31 830c1bc742181ded4930842b46e9507372f0b1b963James Dong} mbType_e; 840c1bc742181ded4930842b46e9507372f0b1b963James Dong 850c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef enum { 860c1bc742181ded4930842b46e9507372f0b1b963James Dong P_L0_8x8 = 0, 870c1bc742181ded4930842b46e9507372f0b1b963James Dong P_L0_8x4 = 1, 880c1bc742181ded4930842b46e9507372f0b1b963James Dong P_L0_4x8 = 2, 890c1bc742181ded4930842b46e9507372f0b1b963James Dong P_L0_4x4 = 3 900c1bc742181ded4930842b46e9507372f0b1b963James Dong} subMbType_e; 910c1bc742181ded4930842b46e9507372f0b1b963James Dong 920c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef enum { 930c1bc742181ded4930842b46e9507372f0b1b963James Dong MB_P_16x16 = 0, 940c1bc742181ded4930842b46e9507372f0b1b963James Dong MB_P_16x8, 950c1bc742181ded4930842b46e9507372f0b1b963James Dong MB_P_8x16, 960c1bc742181ded4930842b46e9507372f0b1b963James Dong MB_P_8x8 970c1bc742181ded4930842b46e9507372f0b1b963James Dong} mbPartMode_e; 980c1bc742181ded4930842b46e9507372f0b1b963James Dong 990c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef enum { 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong MB_SP_8x8 = 0, 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong MB_SP_8x4, 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong MB_SP_4x8, 1030c1bc742181ded4930842b46e9507372f0b1b963James Dong MB_SP_4x4 1040c1bc742181ded4930842b46e9507372f0b1b963James Dong} subMbPartMode_e; 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong 1060c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef enum { 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong PRED_MODE_INTRA4x4 = 0, 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong PRED_MODE_INTRA16x16 , 1090c1bc742181ded4930842b46e9507372f0b1b963James Dong PRED_MODE_INTER 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong} mbPartPredMode_e; 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 1130c1bc742181ded4930842b46e9507372f0b1b963James Dong 3. Data types 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong 1160c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef struct 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 1180c1bc742181ded4930842b46e9507372f0b1b963James Dong /* MvPrediction16x16 assumes that MVs are 16bits */ 1190c1bc742181ded4930842b46e9507372f0b1b963James Dong i16 hor; 1200c1bc742181ded4930842b46e9507372f0b1b963James Dong i16 ver; 1210c1bc742181ded4930842b46e9507372f0b1b963James Dong} mv_t; 1220c1bc742181ded4930842b46e9507372f0b1b963James Dong 1230c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef struct 1240c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 1250c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 prevIntra4x4PredModeFlag[16]; 1260c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 remIntra4x4PredMode[16]; 1270c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 intraChromaPredMode; 1280c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 refIdxL0[4]; 1290c1bc742181ded4930842b46e9507372f0b1b963James Dong mv_t mvdL0[4]; 1300c1bc742181ded4930842b46e9507372f0b1b963James Dong} mbPred_t; 1310c1bc742181ded4930842b46e9507372f0b1b963James Dong 1320c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef struct 1330c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 1340c1bc742181ded4930842b46e9507372f0b1b963James Dong subMbType_e subMbType[4]; 1350c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 refIdxL0[4]; 1360c1bc742181ded4930842b46e9507372f0b1b963James Dong mv_t mvdL0[4][4]; 1370c1bc742181ded4930842b46e9507372f0b1b963James Dong} subMbPred_t; 1380c1bc742181ded4930842b46e9507372f0b1b963James Dong 1390c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef struct 1400c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 1410c1bc742181ded4930842b46e9507372f0b1b963James Dong#ifdef H264DEC_OMXDL 1420c1bc742181ded4930842b46e9507372f0b1b963James Dong u8 posCoefBuf[27*16*3]; 1430c1bc742181ded4930842b46e9507372f0b1b963James Dong u8 totalCoeff[27]; 1440c1bc742181ded4930842b46e9507372f0b1b963James Dong#else 1450c1bc742181ded4930842b46e9507372f0b1b963James Dong i16 totalCoeff[27]; 1460c1bc742181ded4930842b46e9507372f0b1b963James Dong#endif 1470c1bc742181ded4930842b46e9507372f0b1b963James Dong i32 level[26][16]; 1480c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 coeffMap[24]; 1490c1bc742181ded4930842b46e9507372f0b1b963James Dong} residual_t; 1500c1bc742181ded4930842b46e9507372f0b1b963James Dong 1510c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef struct 1520c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 1530c1bc742181ded4930842b46e9507372f0b1b963James Dong mbType_e mbType; 1540c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 codedBlockPattern; 1550c1bc742181ded4930842b46e9507372f0b1b963James Dong i32 mbQpDelta; 1560c1bc742181ded4930842b46e9507372f0b1b963James Dong mbPred_t mbPred; 1570c1bc742181ded4930842b46e9507372f0b1b963James Dong subMbPred_t subMbPred; 1580c1bc742181ded4930842b46e9507372f0b1b963James Dong residual_t residual; 1590c1bc742181ded4930842b46e9507372f0b1b963James Dong} macroblockLayer_t; 1600c1bc742181ded4930842b46e9507372f0b1b963James Dong 1610c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef struct mbStorage 1620c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 1630c1bc742181ded4930842b46e9507372f0b1b963James Dong mbType_e mbType; 1640c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 sliceId; 1650c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 disableDeblockingFilterIdc; 1660c1bc742181ded4930842b46e9507372f0b1b963James Dong i32 filterOffsetA; 1670c1bc742181ded4930842b46e9507372f0b1b963James Dong i32 filterOffsetB; 1680c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 qpY; 1690c1bc742181ded4930842b46e9507372f0b1b963James Dong i32 chromaQpIndexOffset; 1700c1bc742181ded4930842b46e9507372f0b1b963James Dong#ifdef H264DEC_OMXDL 1710c1bc742181ded4930842b46e9507372f0b1b963James Dong u8 totalCoeff[27]; 1720c1bc742181ded4930842b46e9507372f0b1b963James Dong#else 1730c1bc742181ded4930842b46e9507372f0b1b963James Dong i16 totalCoeff[27]; 1740c1bc742181ded4930842b46e9507372f0b1b963James Dong#endif 1750c1bc742181ded4930842b46e9507372f0b1b963James Dong u8 intra4x4PredMode[16]; 1760c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 refPic[4]; 1770c1bc742181ded4930842b46e9507372f0b1b963James Dong u8* refAddr[4]; 1780c1bc742181ded4930842b46e9507372f0b1b963James Dong mv_t mv[16]; 1790c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 decoded; 1800c1bc742181ded4930842b46e9507372f0b1b963James Dong struct mbStorage *mbA; 1810c1bc742181ded4930842b46e9507372f0b1b963James Dong struct mbStorage *mbB; 1820c1bc742181ded4930842b46e9507372f0b1b963James Dong struct mbStorage *mbC; 1830c1bc742181ded4930842b46e9507372f0b1b963James Dong struct mbStorage *mbD; 1840c1bc742181ded4930842b46e9507372f0b1b963James Dong} mbStorage_t; 1850c1bc742181ded4930842b46e9507372f0b1b963James Dong 1860c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 1870c1bc742181ded4930842b46e9507372f0b1b963James Dong 4. Function prototypes 1880c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 1890c1bc742181ded4930842b46e9507372f0b1b963James Dong 1900c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdDecodeMacroblockLayer(strmData_t *pStrmData, 1910c1bc742181ded4930842b46e9507372f0b1b963James Dong macroblockLayer_t *pMbLayer, mbStorage_t *pMb, u32 sliceType, 1920c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 numRefIdxActive); 1930c1bc742181ded4930842b46e9507372f0b1b963James Dong 1940c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdNumMbPart(mbType_e mbType); 1950c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdNumSubMbPart(subMbType_e subMbType); 1960c1bc742181ded4930842b46e9507372f0b1b963James Dong 1970c1bc742181ded4930842b46e9507372f0b1b963James DongsubMbPartMode_e h264bsdSubMbPartMode(subMbType_e subMbType); 1980c1bc742181ded4930842b46e9507372f0b1b963James Dong 1990c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdDecodeMacroblock(mbStorage_t *pMb, macroblockLayer_t *pMbLayer, 2000c1bc742181ded4930842b46e9507372f0b1b963James Dong image_t *currImage, dpbStorage_t *dpb, i32 *qpY, u32 mbNum, 2010c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 constrainedIntraPredFlag, u8* data); 2020c1bc742181ded4930842b46e9507372f0b1b963James Dong 2030c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdPredModeIntra16x16(mbType_e mbType); 2040c1bc742181ded4930842b46e9507372f0b1b963James Dong 2050c1bc742181ded4930842b46e9507372f0b1b963James DongmbPartPredMode_e h264bsdMbPartPredMode(mbType_e mbType); 2060c1bc742181ded4930842b46e9507372f0b1b963James Dong#ifdef H264DEC_NEON 2070c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdClearMbLayer(macroblockLayer_t *pMbLayer, u32 size); 2080c1bc742181ded4930842b46e9507372f0b1b963James Dong#endif 2090c1bc742181ded4930842b46e9507372f0b1b963James Dong 2100c1bc742181ded4930842b46e9507372f0b1b963James Dong#endif /* #ifdef H264SWDEC_MACROBLOCK_LAYER_H */ 2110c1bc742181ded4930842b46e9507372f0b1b963James Dong 2120c1bc742181ded4930842b46e9507372f0b1b963James Dong 213