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 253 UWORD32 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); 257 UWORD32 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 262 UWORD32 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 267 UWORD32 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 272 UWORD8 get_cabac_context_non_mbaff(dec_struct_t * ps_dec, UWORD16 u2_mbskip); 273 274 UWORD32 ih264d_get_cabac_context_mbaff(dec_struct_t * ps_dec, 275 dec_mb_info_t * ps_cur_mb_info, 276 UWORD32 u4_mbskip); 277 278 WORD32 PutMbToFrame(dec_struct_t * ps_dec); 279 void ih264d_get_mbaff_neighbours(dec_struct_t * ps_dec, 280 dec_mb_info_t * ps_cur_mb_info, 281 UWORD8 uc_curMbFldDecFlag); 282 283 void ih264d_update_mbaff_left_nnz(dec_struct_t * ps_dec, 284 dec_mb_info_t * ps_cur_mb_info); 285 void ih264d_transfer_mb_group_data(dec_struct_t * ps_dec, 286 const UWORD8 u1_num_mbs, 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