| /****************************************************************************** |
| * |
| * 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_lap_enc_structs.h |
| * |
| * \brief |
| * This file contains structure definations shared between Encoder and LAP |
| * |
| * \date |
| * 18/09/2012 |
| * |
| * \author |
| * Ittiam |
| * |
| ****************************************************************************** |
| */ |
| |
| #ifndef _IHEVCE_LAP_ENC_STRUCTS_H_ |
| #define _IHEVCE_LAP_ENC_STRUCTS_H_ |
| |
| /*****************************************************************************/ |
| /* Constant Macros */ |
| /*****************************************************************************/ |
| #define MAX_NUM_BUFS_LAP_ENC 15 |
| #define MAX_REF_PICS 16 |
| #define MAX_PICS_FOR_SGI 16 /*max pics to be hold for Sub-Gop Interleave*/ |
| #define MAX_DUPLICATE_ENTRIES_IN_REF_LIST 2 |
| #define MAX_LAP_WINDOW_SIZE 60 |
| #define MAX_SUB_GOP_SIZE 16 |
| #define MAX_SCENE_NUM 30 |
| #define INIT_HEVCE_QP_RC (-300) |
| #define MAX_TEMPORAL_LAYERS 3 |
| #define NUM_LAP2_LOOK_AHEAD 120 |
| |
| #define INFINITE_GOP_CDR_TIME_S 3 |
| #define FRAME_PARALLEL_LVL 0 |
| #define NUM_SG_INTERLEAVED (1 + FRAME_PARALLEL_LVL) |
| |
| //#define MAX_NUM_ENC_LOOP_PARALLEL ((1 << FRAME_PARALLEL_LVL) + 2) |
| //#define MAX_NUM_ME_PARALLEL ((1 << FRAME_PARALLEL_LVL) + 2) |
| #define MAX_NUM_ENC_LOOP_PARALLEL 1 |
| #define MAX_NUM_ME_PARALLEL 1 |
| #define DIST_MODE_3_NON_REF_B 0 // disabled for normal cases |
| |
| #define DENOM_DEFAULT 7 |
| #define WGHT_DEFAULT (1 << DENOM_DEFAULT) |
| |
| #define MAX_NON_REF_B_PICS_IN_QUEUE_SGI MAX_PICS_FOR_SGI //ELP_RC |
| |
| /*minimum stagger in non sequential operation*/ |
| #define MIN_L1_L0_STAGGER_NON_SEQ 1 |
| |
| /* Enable or disable Psedo presets*/ |
| #undef PSEUDO_PRESETS |
| |
| /** |
| ******************************************************************************* |
| @brief Ivalid POC value since negative POCs are also valid as per syntax |
| ******************************************************************************* |
| */ |
| #define INVALID_POC -16384 |
| /*****************************************************************************/ |
| /* Function Macros */ |
| /*****************************************************************************/ |
| |
| /*****************************************************************************/ |
| /* Typedefs */ |
| /*****************************************************************************/ |
| |
| /*****************************************************************************/ |
| /* Enums */ |
| /*****************************************************************************/ |
| /* Scenetype enums */ |
| typedef enum SCENE_TYPE_E |
| { |
| SCENE_TYPE_NORMAL = 0, |
| SCENE_TYPE_SCENE_CUT, |
| SCENE_TYPE_FLASH, |
| SCENE_TYPE_FADE_IN, |
| SCENE_TYPE_FADE_OUT, |
| SCENE_TYPE_DISSOLVE, |
| SCENE_TYPE_PAUSE_TO_RESUME, |
| MAX_NUM_SCENE_TYPES |
| } SCENE_TYPE_E; |
| /*****************************************************************************/ |
| /* Structure */ |
| /*****************************************************************************/ |
| |
| /** |
| ****************************************************************************** |
| * @brief Logo structure |
| ****************************************************************************** |
| */ |
| |
| typedef struct |
| { |
| /** i4_is_logo_on : Specifies if logo is on or off */ |
| WORD32 i4_is_logo_on; |
| |
| /** logo_width : Width of the logo in pixels */ |
| WORD32 logo_width; |
| |
| /** logo_height : Width of the logo in pixels */ |
| WORD32 logo_height; |
| |
| /** logo_x_offset : horizontal offset for logo from the right end of pic */ |
| WORD32 logo_x_offset; |
| |
| /** logo_y_offset : vertical offset for logo from the bottom end of pic */ |
| WORD32 logo_y_offset; |
| |
| } ihevce_logo_attrs_t; |
| |
| typedef struct |
| { |
| /** |
| * Input YUV buffers pointers and related parameters |
| */ |
| ihevce_lap_params_t s_lap_params; |
| |
| /** Width of input luma */ |
| WORD32 i4_width; |
| |
| /** Height of input luma */ |
| WORD32 i4_height; |
| |
| /** Max closed gop period : Max spacing between IDR frames */ |
| WORD32 i4_max_closed_gop_period; |
| |
| /** Min closed gop period : Min spacing between IDR frames */ |
| WORD32 i4_min_closed_gop_period; |
| |
| /** Max CRA open gop period: Max spacing between CRA frames */ |
| WORD32 i4_max_cra_open_gop_period; |
| |
| /** Max i open gop period: Max spacing between I frames */ |
| WORD32 i4_max_i_open_gop_period; |
| |
| /** limits Max gopsize = 2 ^ i4_max_temporal_layers - 1 */ |
| WORD32 i4_max_temporal_layers; |
| |
| /** Minimum temporal ID from which B-pictures are coded; Tid=1 (default) 0 (no B) */ |
| WORD32 i4_min_temporal_id_for_b; |
| |
| /** Maximum number of reference frames */ |
| WORD32 i4_max_reference_frames; |
| |
| /** Interlace field */ |
| WORD32 i4_src_interlace_field; |
| |
| /* Frame rate*/ |
| WORD32 i4_frame_rate; |
| |
| /** Enable Logo flag */ |
| WORD32 i4_enable_logo; |
| |
| /** Bit Depth */ |
| WORD32 i4_internal_bit_depth; |
| |
| WORD32 i4_input_bit_depth; |
| |
| /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */ |
| UWORD8 u1_chroma_array_type; |
| |
| WORD32 ai4_quality_preset[IHEVCE_MAX_NUM_RESOLUTIONS]; |
| |
| WORD32 i4_rc_pass_num; |
| |
| /* If enable, enables blu ray compatibility of op*/ |
| WORD32 i4_blu_ray_spec; |
| |
| IV_ARCH_T e_arch_type; |
| |
| UWORD8 u1_is_popcnt_available; |
| |
| WORD32 i4_mres_single_out; |
| |
| WORD32 i4_luma_size_copy_src_logo; |
| |
| } ihevce_lap_static_params_t; |
| |
| /** |
| * @biref luma and chroma weight and offset container structure |
| */ |
| typedef struct |
| { |
| /** |
| * flag to control the weighted pred for luma component of |
| * this reference frame |
| * Range [0 : 1] |
| */ |
| UWORD8 u1_luma_weight_enable_flag; |
| |
| /** |
| * flag to control the weighted pred for chroma component of |
| * this reference frame |
| * Range [0 : 1] |
| */ |
| UWORD8 u1_chroma_weight_enable_flag; |
| |
| /** |
| * luma weight factor for a reference frame, |
| * Range [0 : 128] |
| * Default = 1 << as_wght_offst |
| */ |
| WORD16 i2_luma_weight; |
| |
| /** |
| * luma offset to be added after weighing for reference frame |
| * Range [-128 : 127] |
| * Default = 0 |
| */ |
| WORD16 i2_luma_offset; |
| |
| /** |
| * chroma weight factor for a reference frame, Default = 1 |
| */ |
| WORD16 i2_cb_weight; |
| |
| /** |
| * chroma offset to be added after weighing for reference frame, Default = 0 |
| */ |
| WORD16 i2_cb_offset; |
| |
| /** |
| * chroma weight factor for a reference frame, Default = 1 |
| */ |
| WORD16 i2_cr_weight; |
| |
| /** |
| * chroma offset to be added after weighing for reference frame, Default = 0 |
| */ |
| WORD16 i2_cr_offset; |
| |
| } ihevce_wght_offst_t; |
| |
| /** |
| * @biref defines the attributes of a reference picture |
| */ |
| typedef struct |
| { |
| /** |
| * weighted prediction attribute for each duplicate entry of a ref pic |
| * Note : Duplicate entries help in using same reference with different |
| * weights and offsets. Example being partial flashes in scence |
| */ |
| ihevce_wght_offst_t as_wght_off[MAX_DUPLICATE_ENTRIES_IN_REF_LIST]; |
| |
| /** |
| * delta POC of reference frame w.r.t current Picture POC, |
| */ |
| WORD32 i4_ref_pic_delta_poc; |
| |
| /** |
| * flag indicating if this reference frame is to be used as |
| * reference by current picture |
| * shall be 0 or 1 |
| */ |
| WORD32 i4_used_by_cur_pic_flag; |
| |
| /** |
| * Indicates the number of duplicate entries of a reference picture |
| * in the reference picture list. A reference picture may see multiple |
| * entries in the reference picture list, since that allows the LAP to |
| * assign multiple weighting related parameters to a single reference picture. |
| * Range [1, MAX_DUPLICATE_ENTRIES_IN_REF_LIST] |
| * |
| * Used only when weighted prediction is enabled |
| * |
| */ |
| WORD32 i4_num_duplicate_entries_in_ref_list; |
| |
| } ihevce_ref_pic_attrs_t; |
| |
| /* @brief IV_YUV_BUF_T: This structure defines attributes |
| * for the input yuv used in enc and lap buffer |
| */ |
| typedef struct |
| { |
| /** i4_size of the structure */ |
| WORD32 i4_size; |
| |
| /** Pointer to Luma (Y) Buffer */ |
| void *pv_y_buf; |
| |
| /** Pointer to Chroma (Cb) Buffer */ |
| void *pv_u_buf; |
| |
| /** Pointer to Chroma (Cr) Buffer */ |
| void *pv_v_buf; |
| |
| /** Width of the Luma (Y) Buffer in pixels */ |
| WORD32 i4_y_wd; |
| |
| /** Height of the Luma (Y) Buffer in pixels */ |
| WORD32 i4_y_ht; |
| |
| /** Stride/Pitch of the Luma (Y) Buffer */ |
| WORD32 i4_y_strd; |
| |
| /** Luma Process start offset : x dir. */ |
| WORD32 i4_start_offset_x; |
| |
| /** Luma Process start offset : y dir. */ |
| WORD32 i4_start_offset_y; |
| |
| /** Width of the Chroma (Cb / Cr) Buffer in pixels */ |
| WORD32 i4_uv_wd; |
| |
| /** Height of the Chroma (Cb / Cr) Buffer in pixels */ |
| WORD32 i4_uv_ht; |
| |
| /** Stride/Pitch of the Chroma (Cb / Cr) Buffer */ |
| WORD32 i4_uv_strd; |
| |
| } iv_enc_yuv_buf_t; |
| |
| typedef struct |
| { |
| /** i4_size of the structure */ |
| WORD32 i4_size; |
| |
| /** Pointer to Luma (Y) Buffer */ |
| void *pv_y_buf; |
| |
| /** Pointer to Chroma (Cb) Buffer */ |
| void *pv_u_buf; |
| |
| /** Pointer to Chroma (Cr) Buffer */ |
| void *pv_v_buf; |
| |
| } iv_enc_yuv_buf_src_t; |
| |
| typedef struct |
| { |
| /*********** common params for both lap_out and rc_lap_out ****************/ |
| |
| /* hevc pic types : IDR/CDR/I/P/B etc */ |
| WORD32 i4_pic_type; |
| /* picture order count */ |
| WORD32 i4_poc; |
| /* temporal layer of the current picture */ |
| WORD32 i4_temporal_lyr_id; |
| /** |
| * indicates if the current frame is reference pic |
| * 0 : not ref pic |
| * 1 : ref pic at lower layers (w.r.t to highest layer id) |
| * 2 : ref pic at highest temporal layer id layer |
| */ |
| WORD32 i4_is_ref_pic; |
| /** |
| * Scene type such as Scene Cut, fade in/ out, dissolve, flash etc |
| * enum used is IHEVCE_SCENE_TYPE |
| */ |
| WORD32 i4_scene_type; |
| /** |
| * Scene number helps to identify the reference frames |
| * for the current frame of same scene and |
| * also it can be used to reset the RC model |
| * for each layer whenever scene cut happens |
| */ |
| UWORD32 u4_scene_num; |
| /*display order num*/ |
| WORD32 i4_display_num; |
| |
| WORD32 i4_quality_preset; |
| |
| /*********** parameters specific to lap_out structure **************/ |
| /* cra pic type flag */ |
| WORD32 i4_is_cra_pic; |
| /** IDR GOP number */ |
| WORD32 i4_idr_gop_num; |
| /** weighted prediction enable flag */ |
| WORD8 i1_weighted_pred_flag; |
| /** weighted bipred enable flag */ |
| WORD8 i1_weighted_bipred_flag; |
| /* number of references for current pic */ |
| WORD32 i4_num_ref_pics; |
| /** |
| * common denominator used for luma weights across all ref pics |
| * Default = 0, Shall be in the range [0:7] |
| */ |
| WORD32 i4_log2_luma_wght_denom; |
| /** |
| * common denominator used for chroma weights across all ref pics |
| * Default = 0, Shall be in the range [0:7] |
| */ |
| WORD32 i4_log2_chroma_wght_denom; |
| /* ref pics to str current Picture POC */ |
| ihevce_ref_pic_attrs_t as_ref_pics[MAX_REF_PICS]; |
| /* Structure for the ITTIAM logo */ |
| ihevce_logo_attrs_t s_logo_ctxt; |
| /* first field flag */ |
| WORD32 i4_first_field; |
| /* associated IRAP poc */ |
| WORD32 i4_assoc_IRAP_poc; |
| WORD32 i4_is_prev_pic_in_Tid0_same_scene; |
| |
| WORD32 i4_is_I_in_any_field; |
| WORD32 i4_used; |
| |
| WORD32 i4_end_flag; |
| WORD32 i4_force_idr_flag; |
| WORD32 i4_out_flush_flag; |
| WORD32 i4_first_frm_new_res; |
| |
| /***** Spatial QP offset related *****/ |
| float f_strength; |
| |
| long double ld_curr_frame_8x8_log_avg[2]; |
| long double ld_curr_frame_16x16_log_avg[3]; |
| long double ld_curr_frame_32x32_log_avg[3]; |
| |
| LWORD64 i8_curr_frame_8x8_avg_act[2]; |
| LWORD64 i8_curr_frame_16x16_avg_act[3]; |
| LWORD64 i8_curr_frame_32x32_avg_act[3]; |
| |
| WORD32 i4_i_pic_lamda_offset; |
| |
| double f_i_pic_lamda_modifier; |
| |
| WORD32 i4_curr_frm_qp; |
| |
| iv_enc_yuv_buf_t s_input_buf; |
| |
| /** Frame - level L0 satd accum*/ |
| LWORD64 i8_frame_l0_acc_satd; |
| |
| /* Frame - level L1 Activity factor */ |
| LWORD64 i8_frame_level_activity_fact; |
| /*bits esimated for frame calulated for sub pic rc bit control */ |
| WORD32 ai4_frame_bits_estimated[IHEVCE_MAX_NUM_BITRATES]; |
| float f_pred_factor; |
| |
| } ihevce_lap_output_params_t; |
| |
| /** |
| ****************************************************************************** |
| * @brief Encoder and LAP I/O structutre |
| * s_input_buf : input buffer will be populated by applciation |
| * when LAP gets this buffer only input will be populated |
| * During the time of seeting the encode order for current buffer |
| * LAP should populate the s_lap_out structure. |
| ****************************************************************************** |
| */ |
| typedef struct |
| { |
| /** |
| * Input YUV buffers pointers and related parameters |
| */ |
| iv_input_data_ctrl_buffs_t s_input_buf; |
| |
| /** |
| * Following parameters are output of LAP |
| * for the current buffer to be encoded |
| */ |
| ihevce_lap_output_params_t s_lap_out; |
| /** |
| * Following parameters are output of LAP |
| * for the current buffer to be encoded, |
| * which are RC specific parameters |
| */ |
| rc_lap_out_params_t s_rc_lap_out; |
| |
| /** |
| * Following parameters are context of LAP QUEUE |
| */ |
| frame_info_t s_frame_info; |
| } ihevce_lap_enc_buf_t; |
| |
| /*****************************************************************************/ |
| /* Extern Variable Declarations */ |
| /*****************************************************************************/ |
| |
| /*****************************************************************************/ |
| /* Extern Function Declarations */ |
| /*****************************************************************************/ |
| |
| #endif /* _IHEVCE_LAP_ENC_STRUCTS_H_ */ |