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