/****************************************************************************** * * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ /** ******************************************************************************* * @file * ih264e_cabac_structs.h * * @brief * This file contains structure definitions necessary for cabac encoding * * @author * ittiam * * @remarks * none * ******************************************************************************* */ #ifndef _IH264E_CABAC_STRUCTS_H_ #define _IH264E_CABAC_STRUCTS_H_ /*****************************************************************************/ /* Constant Macros */ /*****************************************************************************/ #define CABAC_INIT_IDC 2 /*****************************************************************************/ /* Structures */ /*****************************************************************************/ /** ******************************************************************************* * @brief typedef for context model ******************************************************************************* */ /* bits 0 to 5 :state bit 6 :mps */ typedef UWORD8 bin_ctxt_model; /** ******************************************************************************* * @brief MB info for cabac ******************************************************************************* */ typedef struct { /* Neighbour availability Variables needed to get CtxtInc, for CABAC */ UWORD8 u1_mb_type; /* !< macroblock type: I/P/B/SI/SP */ UWORD8 u1_cbp; /* !< Coded Block Pattern */ UWORD8 u1_intrapred_chroma_mode; /*************************************************************************/ /* Arrangnment of AC CSBP */ /* bits: b7 b6 b5 b4 b3 b2 b1 b0 */ /* CSBP: V1 V0 U1 U0 Y3 Y2 Y1 Y0 */ /*************************************************************************/ UWORD8 u1_yuv_ac_csbp; /*************************************************************************/ /* Arrangnment of DC CSBP */ /* bits: b7 b6 b5 b4 b3 b2 b1 b0 */ /* CSBP: x x x x x Vdc Udc Ydc */ /*************************************************************************/ UWORD8 u1_yuv_dc_csbp; WORD8 i1_ref_idx[4]; UWORD8 u1_mv[4][4]; } mb_info_ctxt_t; /** ******************************************************************************* * @brief CSBP info for CABAC ******************************************************************************* */ typedef struct { /*************************************************************************/ /* Arrangnment of Luma AC CSBP for leftMb */ /* bits: b7 b6 b5 b4 b3 b2 b1 b0 */ /* CSBP: X X X X Y3 Y2 Y1 Y0 */ /*************************************************************************/ /*************************************************************************/ /* Points either to u1_y_ac_csbp_top_mb or u1_y_ac_csbp_bot_mb */ /*************************************************************************/ UWORD8 u1_y_ac_csbp_top_mb; UWORD8 u1_y_ac_csbp_bot_mb; /*************************************************************************/ /* Arrangnment of Chroma AC CSBP for leftMb */ /* bits: b7 b6 b5 b4 b3 b2 b1 b0 */ /* CSBP: X X X X V1 V0 U1 U0 */ /*************************************************************************/ /*************************************************************************/ /* Points either to u1_uv_ac_csbp_top_mb or u1_uv_ac_csbp_bot_mb */ /*************************************************************************/ UWORD8 u1_uv_ac_csbp_top_mb; UWORD8 u1_uv_ac_csbp_bot_mb; /*************************************************************************/ /* Arrangnment of DC CSBP */ /* bits: b7 b6 b5 b4 b3 b2 b1 b0 */ /* CSBP: x x x x x Vdc Udc Ydc */ /*************************************************************************/ /*************************************************************************/ /* Points either to u1_yuv_dc_csbp_top_mb or u1_yuv_dc_csbp_bot_mb */ /*************************************************************************/ UWORD8 u1_yuv_dc_csbp_top_mb; UWORD8 u1_yuv_dc_csbp_bot_mb; } cab_csbp_t; /** ******************************************************************************* * @brief CABAC Encoding Environment ******************************************************************************* */ typedef struct { /** * cabac interval start L */ UWORD32 u4_code_int_low; /** * cabac interval range R */ UWORD32 u4_code_int_range; /** bytes_outsanding; number of 0xFF bits that occur during renorm * These will be accumulated till the carry bit is knwon */ UWORD32 u4_out_standing_bytes; /** bits generated during renormalization * A byte is put to stream/u4_out_standing_bytes from u4_low(L) when * u4_bits_gen exceeds 8 */ UWORD32 u4_bits_gen; } encoding_envirnoment_t; /** ******************************************************************************* * @brief CABAC Context structure : Variables to handle Cabac ******************************************************************************* */ typedef struct { /** * Base pointer to all the cabac contexts */ bin_ctxt_model au1_cabac_ctxt_table[NUM_CABAC_CTXTS]; /** * left csbp */ cab_csbp_t s_lft_csbp; /** * pointer to Bitstream structure */ bitstrm_t *ps_bitstrm; /** * Pointer to mb_info_ctxt_t map_base */ mb_info_ctxt_t *ps_mb_map_ctxt_inc_base; /** * Pointer to encoding_envirnoment_t */ encoding_envirnoment_t s_cab_enc_env; /* These things need to be updated at each MbLevel */ /** * Prev mb_qp_delta_ctxt */ WORD8 i1_prev_mb_qp_delta_ctxt; /** * Pointer to mb_info_ctxt_t map */ mb_info_ctxt_t *ps_mb_map_ctxt_inc; /** * Pointer to default mb_info_ctxt_t */ mb_info_ctxt_t *ps_def_ctxt_mb_info; /** * Pointer to current mb_info_ctxt_t */ mb_info_ctxt_t *ps_curr_ctxt_mb_info; /** * Pointer to left mb_info_ctxt_t */ mb_info_ctxt_t *ps_left_ctxt_mb_info; /** * Pointer to top mb_info_ctxt_t */ mb_info_ctxt_t *ps_top_ctxt_mb_info; /** * Pointer to csbp structures */ cab_csbp_t *ps_lft_csbp; UWORD8 *pu1_left_y_ac_csbp; UWORD8 *pu1_left_uv_ac_csbp; UWORD8 *pu1_left_yuv_dc_csbp; /**************************************************************************/ /* Ref_idx contexts are stored in the following way */ /* Array Idx 0,1 for reference indices in Forward direction */ /* Array Idx 2,3 for reference indices in backward direction */ /**************************************************************************/ /** * Dimensions for u1_left_ref_ctxt_inc_arr is [2][4] for Mbaff:Top and Bot */ WORD8 i1_left_ref_idx_ctx_inc_arr[2][4]; WORD8 *pi1_left_ref_idx_ctxt_inc; /** * Dimensions for u1_left_mv_ctxt_inc_arr is [2][4][4] for Mbaff case */ UWORD8 u1_left_mv_ctxt_inc_arr[2][4][4]; UWORD8 (*pu1_left_mv_ctxt_inc)[4]; } cabac_ctxt_t; #endif /* _IH264E_CABAC_STRUCTS_H_ */