/****************************************************************************** * * Copyright (C) 2018 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 ihevce_decomp_pre_intra_structs.h * * \brief * This file contains strcutures of pre_enc_loop pass * * \date * 18/09/2012 * * \author * Ittiam * ****************************************************************************** */ #ifndef _IHEVCE_DECOMP_PRE_INTRA_STRUCTS_H_ #define _IHEVCE_DECOMP_PRE_INTRA_STRUCTS_H_ /*****************************************************************************/ /* Constant Macros */ /*****************************************************************************/ /*For decomposition of every row we need some extra rows above n below that row*/ #define NUM_EXTRA_ROWS_REQ 3 /*Macros for pre intra early decisions*/ #define NUM_MODES 35 #define SAD_NOT_VALID 0xFFFFF #define SET_T_AVAILABLE(x) (x = x | (1 << 8)) #define SET_L_AVAILABLE(x) (x = x | (1 << 7)) #define SET_TL_AVAILABLE(x) (x = x | (1 << 16)) #define SET_TR_AVAILABLE(x) (x = x | (1 << 12)) #define SET_BL_AVAILABLE(x) (x = x | (1 << 3)) #define SET_ALL_AVAILABLE(x) (x = (1 << 8) + (1 << 7) + (1 << 16) + (1 << 12) + (1 << 3)) #define SET_T_UNAVAILABLE(x) (x = x & ~((WORD32)1 << 8)) #define SET_L_UNAVAILABLE(x) (x = x & ~((WORD32)1 << 7)) #define SET_TL_UNAVAILABLE(x) (x = x & ~((WORD32)1 << 16)) #define SET_TR_UNAVAILABLE(x) (x = x & ~((WORD32)1 << 12)) #define SET_BL_UNAVAILABLE(x) (x = x & ~((WORD32)1 << 3)) #define SET_ALL_UNAVAILABLE(x) (x = 0) #define CHECK_T_AVAILABLE(x) ((x & (1 << 8)) >> 8) #define CHECK_L_AVAILABLE(x) ((x & (1 << 7)) >> 7) #define CHECK_TL_AVAILABLE(x) ((x & (1 << 16)) >> 16) #define CHECK_TR_AVAILABLE(x) ((x & (1 << 12)) >> 12) #define CHECK_BL_AVAILABLE(x) ((x & (1 << 3)) >> 3) /* q format for lamba used in the encoder */ #define LAMBDA_Q_SHIFT 8 /*****************************************************************************/ /* Enums */ /*****************************************************************************/ typedef enum { DECOMP_PRE_INTRA_CTXT = 0, DECOMP_PRE_INTRA_THRDS_CTXT, DECOMP_PRE_INTRA_ED_CTXT, /* should always be the last entry */ NUM_DECOMP_PRE_INTRA_MEM_RECS } DECOMP_PRE_INTRA_MEM_TABS_T; /*****************************************************************************/ /* Structure */ /*****************************************************************************/ /** ****************************************************************************** * @brief Context for early intra or inter decision ****************************************************************************** */ typedef struct { /** lambda for cost calculation */ WORD32 lambda; /*pic type*/ WORD32 i4_slice_type; /** * Until what level, intra is evaluated. * 0 - 8 * 1 - 4 * 2 - 2 * 3 - 4 */ WORD32 level; /*Pointer to 4x4 blocks of entire frame */ ihevce_ed_blk_t *ps_ed_pic; /*Pointer to present 4x4 block */ ihevce_ed_blk_t *ps_ed; /*Pointer to ctb level data of entire frame */ ihevce_ed_ctb_l1_t *ps_ed_ctb_l1_pic; /*Pointer to ctb level data of current ctb */ ihevce_ed_ctb_l1_t *ps_ed_ctb_l1; WORD32 left_ctb_intra_modes[20]; WORD32 sad[64 * NUM_MODES]; /*Sum of best SATDs at L1*/ LWORD64 i8_sum_best_satd; /*Sum of best SATDs at L1*/ LWORD64 i8_sum_sq_best_satd; /** Encoder quality preset : See IHEVCE_QUALITY_CONFIG_T for presets */ WORD32 i4_quality_preset; /*following are the changes for reducing the stack memory used by this module. Local variables are copied to context memory */ /** Neighbour flags. Used as local variable in pre_intra_process_row function. Shouldnt be used by other functions */ WORD32 ai4_nbr_flags[64]; /** reference data for four 4x4 blocks. This is used as local variable in ed_calc_8x8_blk */ UWORD8 au1_ref_full_ctb[4][18]; /** reference data for 8x8 block. This is used as local variable in ed_calc_8x8_blk */ UWORD8 au1_ref_8x8[1][33]; /** mode bits costs array. This is used as local variable in ed_calc_8x8_blk */ UWORD16 au2_mode_bits_cost_full_ctb[4][NUM_MODES]; /** reference data for 4x4 block for incomplete ctb proc. Variable local to ed_calc_incomplete_ctb*/ UWORD8 au1_ref_ic_ctb[18]; /** top intra modes for incomplete ctb proc. Variable local to ed_calc_incomplete_ctb*/ WORD32 ai4_top_intra_modes_ic_ctb[20]; /** mode bits cost for incomplete ctb proc. Variable local to ed_calc_incomplete_ctb*/ UWORD16 au2_mode_bits_cost_ic_ctb[NUM_MODES]; /** Pointer to structure containing function pointers of common*/ func_selector_t *ps_func_selector; } ihevce_ed_ctxt_t; //early decision typedef struct { /** Actual Width of this layer */ WORD32 i4_actual_wd; /** Actual height of this layer */ WORD32 i4_actual_ht; /** Padded width of this layer */ WORD32 i4_padded_wd; /** Padded height of this layer */ WORD32 i4_padded_ht; /** input pointer. */ UWORD8 *pu1_inp; /** stride of input buffer */ WORD32 i4_inp_stride; /** Decomposition block height size */ WORD32 i4_decomp_blk_ht; /** Decomposition block width size */ WORD32 i4_decomp_blk_wd; /** Number of blocks in a row */ WORD32 i4_num_col_blks; /** Number of rows in a layer */ WORD32 i4_num_row_blks; WORD32 ai4_curr_row_no[MAX_NUM_CTB_ROWS_FRM]; WORD32 i4_num_rows_processed; } decomp_layer_ctxt_t; typedef struct { /* Number of layers */ WORD32 i4_num_layers; /** Handles for all layers. Entry 0 refers to L0 , 3 refers to L3 */ decomp_layer_ctxt_t as_layers[MAX_NUM_HME_LAYERS]; /** Array for working memory of the thread */ UWORD8 au1_wkg_mem[((MAX_CTB_SIZE >> 1) * (MAX_CTB_SIZE + 2 * NUM_EXTRA_ROWS_REQ))]; /** Pointer for working memory of the thread */ UWORD8 *pu1_wkg_mem; /** Encoder quality preset : See IHEVCE_QUALITY_CONFIG_T for presets */ WORD32 i4_quality_preset; /** ed_ctxt pointer. This memory is re-used across layers now */ ihevce_ed_ctxt_t *ps_ed_ctxt; ihevce_ed_blk_t *ps_layer1_buf; ihevce_ed_blk_t *ps_layer2_buf; ihevce_ed_ctb_l1_t *ps_ed_ctb_l1; /** to store the L0 8x8 cur SATD */ ihevce_8x8_L0_satd_t *ps_layer0_cur_satd; /** to store the L0 8x8 cur mean*/ ihevce_8x8_L0_mean_t *ps_layer0_cur_mean; WORD32 i4_slice_type; WORD32 i4_codec_level; WORD32 ai4_lambda[MAX_NUM_HME_LAYERS]; /* pointer to the structure ps_ctb_analyse in pre_enc_me_ctxt_t */ ctb_analyse_t *ps_ctb_analyse; WORD32 i4_enable_noise_detection; ihevce_ipe_optimised_function_list_t s_ipe_optimised_function_list; ihevce_cmn_opt_func_t s_cmn_opt_func; } ihevce_decomp_pre_intra_ctxt_t; /** ****************************************************************************** * @brief Encode loop master context structure ****************************************************************************** */ typedef struct { /** Array of encode loop structure */ ihevce_decomp_pre_intra_ctxt_t *aps_decomp_pre_intra_thrd_ctxt[MAX_NUM_FRM_PROC_THRDS_PRE_ENC]; /** Number of processing threads created run time */ WORD32 i4_num_proc_thrds; } ihevce_decomp_pre_intra_master_ctxt_t; /*****************************************************************************/ /* Extern Variable Declarations */ /*****************************************************************************/ /*****************************************************************************/ /* Extern Function Declarations */ /*****************************************************************************/ #endif /* _IHEVCE_ENC_LOOP_STRUCTS_H_ */