1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /*------------------------------------------------------------------------------ 18 19 Table of contents 20 21 1. Include headers 22 2. Module defines 23 3. Data types 24 4. Function prototypes 25 26 ------------------------------------------------------------------------------*/ 27 28 #ifndef H264SWDEC_MACROBLOCK_LAYER_H 29 #define H264SWDEC_MACROBLOCK_LAYER_H 30 31 /*------------------------------------------------------------------------------ 32 1. Include headers 33 ------------------------------------------------------------------------------*/ 34 35 #include "basetype.h" 36 #include "h264bsd_stream.h" 37 #include "h264bsd_image.h" 38 #include "h264bsd_dpb.h" 39 40 /*------------------------------------------------------------------------------ 41 2. Module defines 42 ------------------------------------------------------------------------------*/ 43 44 /* Macro to determine if a mb is an intra mb */ 45 #define IS_INTRA_MB(a) ((a).mbType > 5) 46 47 /* Macro to determine if a mb is an I_PCM mb */ 48 #define IS_I_PCM_MB(a) ((a).mbType == 31) 49 50 typedef enum { 51 P_Skip = 0, 52 P_L0_16x16 = 1, 53 P_L0_L0_16x8 = 2, 54 P_L0_L0_8x16 = 3, 55 P_8x8 = 4, 56 P_8x8ref0 = 5, 57 I_4x4 = 6, 58 I_16x16_0_0_0 = 7, 59 I_16x16_1_0_0 = 8, 60 I_16x16_2_0_0 = 9, 61 I_16x16_3_0_0 = 10, 62 I_16x16_0_1_0 = 11, 63 I_16x16_1_1_0 = 12, 64 I_16x16_2_1_0 = 13, 65 I_16x16_3_1_0 = 14, 66 I_16x16_0_2_0 = 15, 67 I_16x16_1_2_0 = 16, 68 I_16x16_2_2_0 = 17, 69 I_16x16_3_2_0 = 18, 70 I_16x16_0_0_1 = 19, 71 I_16x16_1_0_1 = 20, 72 I_16x16_2_0_1 = 21, 73 I_16x16_3_0_1 = 22, 74 I_16x16_0_1_1 = 23, 75 I_16x16_1_1_1 = 24, 76 I_16x16_2_1_1 = 25, 77 I_16x16_3_1_1 = 26, 78 I_16x16_0_2_1 = 27, 79 I_16x16_1_2_1 = 28, 80 I_16x16_2_2_1 = 29, 81 I_16x16_3_2_1 = 30, 82 I_PCM = 31 83 } mbType_e; 84 85 typedef enum { 86 P_L0_8x8 = 0, 87 P_L0_8x4 = 1, 88 P_L0_4x8 = 2, 89 P_L0_4x4 = 3 90 } subMbType_e; 91 92 typedef enum { 93 MB_P_16x16 = 0, 94 MB_P_16x8, 95 MB_P_8x16, 96 MB_P_8x8 97 } mbPartMode_e; 98 99 typedef enum { 100 MB_SP_8x8 = 0, 101 MB_SP_8x4, 102 MB_SP_4x8, 103 MB_SP_4x4 104 } subMbPartMode_e; 105 106 typedef enum { 107 PRED_MODE_INTRA4x4 = 0, 108 PRED_MODE_INTRA16x16 , 109 PRED_MODE_INTER 110 } mbPartPredMode_e; 111 112 /*------------------------------------------------------------------------------ 113 3. Data types 114 ------------------------------------------------------------------------------*/ 115 116 typedef struct 117 { 118 /* MvPrediction16x16 assumes that MVs are 16bits */ 119 i16 hor; 120 i16 ver; 121 } mv_t; 122 123 typedef struct 124 { 125 u32 prevIntra4x4PredModeFlag[16]; 126 u32 remIntra4x4PredMode[16]; 127 u32 intraChromaPredMode; 128 u32 refIdxL0[4]; 129 mv_t mvdL0[4]; 130 } mbPred_t; 131 132 typedef struct 133 { 134 subMbType_e subMbType[4]; 135 u32 refIdxL0[4]; 136 mv_t mvdL0[4][4]; 137 } subMbPred_t; 138 139 typedef struct 140 { 141 #ifdef H264DEC_OMXDL 142 u8 posCoefBuf[27*16*3]; 143 u8 totalCoeff[27]; 144 #else 145 i16 totalCoeff[27]; 146 #endif 147 i32 level[26][16]; 148 u32 coeffMap[24]; 149 } residual_t; 150 151 typedef struct 152 { 153 mbType_e mbType; 154 u32 codedBlockPattern; 155 i32 mbQpDelta; 156 mbPred_t mbPred; 157 subMbPred_t subMbPred; 158 residual_t residual; 159 } macroblockLayer_t; 160 161 typedef struct mbStorage 162 { 163 mbType_e mbType; 164 u32 sliceId; 165 u32 disableDeblockingFilterIdc; 166 i32 filterOffsetA; 167 i32 filterOffsetB; 168 u32 qpY; 169 i32 chromaQpIndexOffset; 170 #ifdef H264DEC_OMXDL 171 u8 totalCoeff[27]; 172 #else 173 i16 totalCoeff[27]; 174 #endif 175 u8 intra4x4PredMode[16]; 176 u32 refPic[4]; 177 u8* refAddr[4]; 178 mv_t mv[16]; 179 u32 decoded; 180 struct mbStorage *mbA; 181 struct mbStorage *mbB; 182 struct mbStorage *mbC; 183 struct mbStorage *mbD; 184 } mbStorage_t; 185 186 /*------------------------------------------------------------------------------ 187 4. Function prototypes 188 ------------------------------------------------------------------------------*/ 189 190 u32 h264bsdDecodeMacroblockLayer(strmData_t *pStrmData, 191 macroblockLayer_t *pMbLayer, mbStorage_t *pMb, u32 sliceType, 192 u32 numRefIdxActive); 193 194 u32 h264bsdNumMbPart(mbType_e mbType); 195 u32 h264bsdNumSubMbPart(subMbType_e subMbType); 196 197 subMbPartMode_e h264bsdSubMbPartMode(subMbType_e subMbType); 198 199 u32 h264bsdDecodeMacroblock(mbStorage_t *pMb, macroblockLayer_t *pMbLayer, 200 image_t *currImage, dpbStorage_t *dpb, i32 *qpY, u32 mbNum, 201 u32 constrainedIntraPredFlag, u8* data); 202 203 u32 h264bsdPredModeIntra16x16(mbType_e mbType); 204 205 mbPartPredMode_e h264bsdMbPartPredMode(mbType_e mbType); 206 #ifdef H264DEC_NEON 207 u32 h264bsdClearMbLayer(macroblockLayer_t *pMbLayer, u32 size); 208 #endif 209 210 #endif /* #ifdef H264SWDEC_MACROBLOCK_LAYER_H */ 211 212 213