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