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