ih264d_mb_utils.h revision 8d3d303c7942ced6a987a52db8977d768dc3605f
1/******************************************************************************
2 *
3 * Copyright (C) 2015 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*/
20#ifndef _IH264D_MB_UTILS_H_
21#define _IH264D_MB_UTILS_H_
22/*!
23 **************************************************************************
24 * \file ih264d_mb_utils.h
25 *
26 * \brief
27 *    Contains declarations of the utility functions needed to decode MB
28 *
29 * \date
30 *    18/12/2002
31 *
32 * \author  AI
33 **************************************************************************
34 */
35#include "ih264_typedefs.h"
36#include "ih264_macros.h"
37#include "ih264_platform_macros.h"
38#include "ih264d_structs.h"
39
40/*--------------------------------------------------------------------*/
41/* Macros to get raster scan position of a block[8x8] / sub block[4x4]*/
42/*--------------------------------------------------------------------*/
43
44#define GET_BLK_RASTER_POS_X(x)     ((x & 0x01) << 1)
45#define GET_BLK_RASTER_POS_Y(y)     ((y >> 1)   << 1)
46#define GET_SUB_BLK_RASTER_POS_X(x) ((x & 0x01))
47#define GET_SUB_BLK_RASTER_POS_Y(y) ((y >> 1))
48
49/*--------------------------------------------------------------------*/
50/* Masks used in decoding of Macroblock                               */
51/*--------------------------------------------------------------------*/
52
53#define LEFT_MB_AVAILABLE_MASK      0x01
54#define TOP_LEFT_MB_AVAILABLE_MASK  0x02
55#define TOP_MB_AVAILABLE_MASK       0x04
56#define TOP_RIGHT_MB_AVAILABLE_MASK 0x08
57
58#define TOP_RT_SUBBLOCK_MASK_MOD               0xFFF7
59
60#define TOP_RIGHT_DEFAULT_AVAILABLE            0x5750
61#define TOP_RIGHT_TOPR_AVAILABLE               0x0008
62#define TOP_RIGHT_TOP_AVAILABLE                0x0007
63
64#define TOP_LEFT_DEFAULT_AVAILABLE            0xEEE0
65#define TOP_LEFT_TOPL_AVAILABLE               0x0001
66#define TOP_LEFT_TOP_AVAILABLE                0x000E
67#define TOP_LEFT_LEFT_AVAILABLE               0x1110
68
69#define CHECK_MB_MAP(u4_mb_num, mb_map, u4_cond)                                                    \
70{                                                                                                   \
71        UWORD32 u4_bit_number;                                                                      \
72        volatile UWORD8 *pu1_mb_flag;                                                                       \
73                                                                                                    \
74        u4_bit_number = u4_mb_num & 0x07;                                                           \
75        pu1_mb_flag    = (UWORD8 *)mb_map + (u4_mb_num >> 3);                                                       \
76                                                                                                    \
77        u4_cond = CHECKBIT((*pu1_mb_flag), u4_bit_number);                                              \
78}
79
80#define CHECK_MB_MAP_BYTE(u4_mb_num, mb_map, u4_cond)                                               \
81{                                                                                                   \
82        volatile UWORD8 *pu1_mb_flag;                                                               \
83                                                                                                    \
84        pu1_mb_flag    = (UWORD8 *)mb_map + (u4_mb_num );                                           \
85                                                                                                    \
86        u4_cond = (*pu1_mb_flag);                                                                   \
87}
88
89#define UPDATE_MB_MAP(u2_frm_wd_in_mbs, u2_mbx, u2_mby, mb_map, mb_count)                     \
90{                                                                                                   \
91        UWORD32 u4_bit_number;                                                                      \
92        UWORD32 u4_mb_number;                                                                       \
93                                                                                                    \
94        u4_mb_number    = u2_frm_wd_in_mbs * (u2_mby >> u1_mbaff) + u2_mbx;                   \
95                                                                                                    \
96        u4_bit_number = u4_mb_number & 0x07;                                                        \
97        /*                                                                                          \
98         * In case of MbAff, update the mb_map only if the entire MB is done. We can check that     \
99         * by checking if Y is odd, implying that this is the second row in the MbAff MB            \
100         */                                                                                         \
101        SET_BIT(mb_map[u4_mb_number >> 3], u4_bit_number);                                           \
102                                                                                                    \
103        if (1 == u1_mbaff)                                                                          \
104        {                                                                                           \
105            /*                                                                                      \
106             * If MBAFF u4_flag is set, set this MB and the MB just below this.                        \
107             * So, add frame width to the MB number and set that bit.                               \
108             */                                                                                     \
109            /*                                                                                      \
110            u4_mb_number    += u2_frm_wd_in_mbs;                                                  \
111                                                                                                    \
112            u4_bit_number = u4_mb_number & 0x07;                                                    \
113                                                                                                    \
114            SET_BIT(mb_map[u4_mb_number >> 3], u4_bit_number);                                       \
115            */                                                                                      \
116        }                                                                                           \
117                                                                                                    \
118        /*H264_DEC_DEBUG_PRINT("SETBIT: %d\n", u4_mb_number);*/                                     \
119        mb_count++;                                                                                 \
120}
121
122#define UPDATE_MB_MAP_MBNUM(mb_map, u4_mb_number)                                                   \
123{                                                                                                   \
124        UWORD32 u4_bit_number;                                                                      \
125        volatile UWORD8 *pu1_mb_flag;                                                                       \
126                                                                                                    \
127        u4_bit_number = u4_mb_number & 0x07;                                                        \
128        pu1_mb_flag    = (UWORD8 *)mb_map + (u4_mb_number >> 3);                                                        \
129        /*                                                                                          \
130         * In case of MbAff, update the mb_map only if the entire MB is done. We can check that     \
131         * by checking if Y is odd, implying that this is the second row in the MbAff MB            \
132         */                                                                                         \
133        SET_BIT((*pu1_mb_flag), u4_bit_number);                                                          \
134}
135
136#define UPDATE_MB_MAP_MBNUM_BYTE(mb_map, u4_mb_number)                                                  \
137{                                                                                                   \
138        volatile UWORD8 *pu1_mb_flag;                                                                       \
139                                                                                                    \
140        pu1_mb_flag    = (UWORD8 *)mb_map + (u4_mb_number);                                                     \
141        /*                                                                                          \
142         * In case of MbAff, update the mb_map only if the entire MB is done. We can check that     \
143         * by checking if Y is odd, implying that this is the second row in the MbAff MB            \
144         */                                                                                         \
145        (*pu1_mb_flag) = 1;                                                             \
146}
147
148#define UPDATE_SLICE_NUM_MAP(slice_map, u4_mb_number,u2_slice_num)                                                  \
149{                                                                                                   \
150        volatile UWORD16 *pu2_slice_map;                                                               \
151                                                                                                    \
152        pu2_slice_map    = (UWORD16 *)slice_map + (u4_mb_number);                                         \
153        (*pu2_slice_map) = u2_slice_num;                                                              \
154}
155
156#define GET_SLICE_NUM_MAP(slice_map, mb_number,u2_slice_num)                                                  \
157{                                                                                                   \
158        volatile UWORD16 *pu2_slice_map;                                                               \
159                                                                                                    \
160        pu2_slice_map    = (UWORD16 *)slice_map + (mb_number);                                         \
161        u2_slice_num = (*pu2_slice_map) ;                                                               \
162}
163
164
165#define GET_XPOS_PRED(u1_out,pkd_info)                        \
166{                                                               \
167    WORD32 bit_field;                                           \
168    bit_field = pkd_info & 0x3;                                 \
169    u1_out = bit_field;                                       \
170}
171
172
173#define GET_YPOS_PRED(u1_out,pkd_info)                        \
174{                                                               \
175    WORD32 bit_field;                                           \
176    bit_field = pkd_info >> 2;                                  \
177    u1_out = bit_field & 0x3;                                  \
178}
179
180
181
182#define GET_WIDTH_PRED(u1_out,pkd_info)                        \
183{                                                               \
184    WORD32 bit_field;                                           \
185    bit_field = pkd_info >> 4;                                  \
186    bit_field = (bit_field & 0x3) << 1 ;                        \
187    u1_out = (bit_field == 0)?1:bit_field;                       \
188    }
189
190#define GET_HEIGHT_PRED(u1_out,pkd_info)                        \
191{                                                               \
192    WORD32 bit_field;                                           \
193    bit_field = pkd_info >> 6;                                  \
194    bit_field = (bit_field & 0x3) << 1 ;                        \
195    u1_out = (bit_field == 0)?1:bit_field;                      \
196}
197
198/*!
199 **************************************************************************
200 *   \brief   Masks for elements present in the first column but not on the
201 *   first row.
202 **************************************************************************
203 */
204#define FIRST_COL_NOT_FIRST_ROW             0xFAFB
205#define FIRST_ROW_MASK                      0xFFCC
206/*!
207 **************************************************************************
208 *   \brief   Mask for elements presen in the first row but not in the
209 *   last column.
210 **************************************************************************
211 */
212#define FIRST_ROW_NOT_LAST_COL             0xFFEC
213/*!
214 **************************************************************************
215 *   \brief   Mask for elements presen in the first row but not in the
216 *   first column.
217 **************************************************************************
218 */
219#define FIRST_ROW_NOT_FIRST_COL            0xFFCD
220/*!
221 **************************************************************************
222 *   \brief   Masks for the top right subMB of a 4x4 block
223 **************************************************************************
224 */
225#define TOP_RT_SUBBLOCK_MASK                0xFFDF
226/*!
227 **************************************************************************
228 *   \brief   Masks for the top left subMB of a 4x4 block
229 **************************************************************************
230 */
231#define TOP_LT_SUBBLOCK_MASK                0xFFFE
232/*!
233 **************************************************************************
234 *   \brief   Indicates if a subMB has a top right subMB available
235 **************************************************************************
236 */
237#define TOP_RT_SUBBLOCK_MB_MASK  0x5F4C
238
239#define FIRST_COL_MASK           0xFAFA
240
241/*--------------------------------------------------------------------*/
242/* Macros to calculate the current position of a MB wrt picture       */
243/*--------------------------------------------------------------------*/
244#define MB_LUMA_PIC_OFFSET(mb_x,mb_y,frmWidthY)   (((mb_y)*(frmWidthY) + (mb_x))<<4)
245#define MB_CHROMA_PIC_OFFSET(mb_x,mb_y,frmWidthUV) (((mb_y)*(frmWidthUV) + (mb_x))<<3)
246
247/*--------------------------------------------------------------------*/
248/* Macros to calculate the current position of a MB wrt N[ Num coeff] Array */
249/*--------------------------------------------------------------------*/
250#define MB_PARAM_OFFSET(mb_x,mb_y,frmWidthInMbs,u1_mbaff,u1_topmb)  \
251        ((mb_x << u1_mbaff) + (1 - u1_topmb) + (mb_y * frmWidthInMbs))
252
253UWORD32 ih264d_get_mb_info_cavlc_mbaff(dec_struct_t * ps_dec,
254                                       const UWORD16 ui16_curMbAddress,
255                                       dec_mb_info_t * ps_cur_mb_info,
256                                       UWORD32 u4_mbskip_run);
257UWORD32 ih264d_get_mb_info_cavlc_nonmbaff(dec_struct_t * ps_dec,
258                                          const UWORD16 ui16_curMbAddress,
259                                          dec_mb_info_t * ps_cur_mb_info,
260                                          UWORD32 u4_mbskip_run);
261
262UWORD32 ih264d_get_mb_info_cabac_mbaff(dec_struct_t * ps_dec,
263                                       const UWORD16 ui16_curMbAddress,
264                                       dec_mb_info_t * ps_cur_mb_info,
265                                       UWORD32 u4_mbskip_run);
266
267UWORD32 ih264d_get_mb_info_cabac_nonmbaff(dec_struct_t * ps_dec,
268                                          const UWORD16 ui16_curMbAddress,
269                                          dec_mb_info_t * ps_cur_mb_info,
270                                          UWORD32 u4_mbskip_run);
271
272UWORD8 get_cabac_context_non_mbaff(dec_struct_t * ps_dec, UWORD16 u2_mbskip);
273
274UWORD32 ih264d_get_cabac_context_mbaff(dec_struct_t * ps_dec,
275                                       dec_mb_info_t * ps_cur_mb_info,
276                                       UWORD32 u4_mbskip);
277
278WORD32 PutMbToFrame(dec_struct_t * ps_dec);
279void ih264d_get_mbaff_neighbours(dec_struct_t * ps_dec,
280                                 dec_mb_info_t * ps_cur_mb_info,
281                                 UWORD8 uc_curMbFldDecFlag);
282
283void ih264d_update_mbaff_left_nnz(dec_struct_t * ps_dec,
284                                  dec_mb_info_t * ps_cur_mb_info);
285void ih264d_transfer_mb_group_data(dec_struct_t * ps_dec,
286                                   const WORD8 c_numMbs,
287                                   const UWORD8 u1_end_of_row, /* Cur n-Mb End of Row Flag */
288                                   const UWORD8 u1_end_of_row_next /* Next n-Mb End of Row Flag */
289                                   );
290
291//void FillRandomData(UWORD8 *pu1_buf, WORD32 u4_bufSize);
292
293#endif /* _MB_UTILS_H_ */
294