aosp12/external/libhevc/encoder/ihevce_lap_enc_structs.h

496 lines
14 KiB
C

/******************************************************************************
*
* 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 25
#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
#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_ */