1 /******************************************************************************
2  *
3  * Copyright (C) 2018 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 /*!
21 ******************************************************************************
22 * \file ihevce_ipe_pass.h
23 *
24 * \brief
25 *    This file contains interface defination of Encode loop pass function
26 *
27 * \date
28 *    18/09/2012
29 *
30 * \author
31 *    Ittiam
32 *
33 ******************************************************************************
34 */
35 
36 #ifndef _IHEVCE_IPE_PASS_H_
37 #define _IHEVCE_IPE_PASS_H_
38 
39 /*****************************************************************************/
40 /* Constant Macros                                                           */
41 /*****************************************************************************/
42 #define IPE_TEST_DBG_L0 0
43 #define IPE_TEST_DBG_L1 0
44 #define IPE_TEST_DBG_L2 0
45 #define IPE_TEST_DBG_L3 0
46 #define IPE_TEST_DBG_L4 0
47 
48 #define IPE_ME_DBG_L0 0
49 #define IPE_ME_DBG_L1 0
50 
51 #define INTRA_PART_DBG 0  // Dump Debug Information related to intra partitioning
52 
53 #define INTRA_NON_CTB_PIC_DBG 0
54 
55 #define IPE_MODE_MAP_DBG 0
56 
57 #define FAST_INTRA_8421_MODES_ENABLE 1
58 
59 #define FAST_PART_WITH_OPTION_4 1
60 
61 #define IPE_SAD_TYPE 0 /* 0 => Hadamard SAD, 1 => full SAD */
62 #define IPE_STEP_SIZE 1 /* Intra Prediction Mode Step Size During Analysis */
63 #define LAMBDA_DIV_FACTOR 1
64 
65 /*satd/q_scale is accumualted cu level*/
66 #define SATD_BY_ACT_Q_FAC 10
67 
68 /** defines the ratio of bits generated per cabac bin in Q8 format */
69 #define CABAC_BITS_PER_BIN 192
70 
71 /** define modulation factor for qp modulation */
72 #define INTRA_QP_MOD_FACTOR_NUM 16
73 #define INTER_QP_MOD_FACTOR_NUM 4
74 #define QP_MOD_FACTOR_DEN 2
75 
76 /*****************************************************************************/
77 /* Function Macros                                                           */
78 /*****************************************************************************/
79 
80 /*****************************************************************************/
81 /* Typedefs                                                                  */
82 /*****************************************************************************/
83 
84 /*****************************************************************************/
85 /* Enums                                                                     */
86 /*****************************************************************************/
87 typedef enum
88 {
89     CU_1TU = 0,
90     CU_4TU,
91     SUB_CU_1TU,
92     SUB_CU_4TU
93 } IPE_CU_TU_SPLIT_PATTERN;
94 
95 /*****************************************************************************/
96 /* Structure                                                                 */
97 /*****************************************************************************/
98 
99 /*****************************************************************************/
100 /* Extern Variable Declarations                                              */
101 /*****************************************************************************/
102 
103 /*****************************************************************************/
104 /* Extern Function Declarations                                              */
105 /*****************************************************************************/
106 WORD32 ihevce_ipe_get_num_mem_recs(void);
107 
108 WORD32
109     ihevce_ipe_get_mem_recs(iv_mem_rec_t *ps_mem_tab, WORD32 i4_num_proc_thrds, WORD32 i4_mem_space);
110 
111 void *ihevce_ipe_init(
112     iv_mem_rec_t *ps_mem_tab,
113     ihevce_static_cfg_params_t *ps_init_prms,
114     WORD32 i4_num_proc_thrds,
115     WORD32 i4_ref_id,
116     func_selector_t *ps_func_selector,
117     rc_quant_t *ps_rc_quant_ctxt,
118     WORD32 i4_resolution_id,
119     UWORD8 u1_is_popcnt_available);
120 
121 void ihevce_intra_pred_ref_filtering(UWORD8 *pu1_src, WORD32 nt, UWORD8 *pu1_dst);
122 void ihevce_intra_pred_ref_filtering(UWORD8 *pu1_src, WORD32 nt, UWORD8 *pu1_dst);
123 
124 UWORD32 ihevce_ipe_pass_satd(WORD16 *pi2_coeff, WORD32 coeff_stride, WORD32 trans_size);
125 
126 void ihevce_ipe_process(
127     void *pv_ctxt,
128     frm_ctb_ctxt_t *ps_frm_ctb_prms,
129     frm_lambda_ctxt_t *ps_frm_lamda,
130     ihevce_lap_enc_buf_t *ps_curr_inp,
131     pre_enc_L0_ipe_encloop_ctxt_t *ps_L0_IPE_curr_out_pre_enc,
132     ctb_analyse_t *ps_ctb_out,
133     //cu_analyse_t     *ps_cu_out,
134     ipe_l0_ctb_analyse_for_me_t *ps_ipe_ctb_out,
135     void *pv_multi_thrd_ctxt,
136     WORD32 slice_type,
137     ihevce_ed_blk_t *ps_ed_pic_l1,
138     ihevce_ed_blk_t *ps_ed_pic_l2,
139     ihevce_ed_ctb_l1_t *ps_ed_ctb_l1_pic,
140     WORD32 thrd_id,
141     WORD32 i4_ping_pong);
142 
143 void ihevce_populate_ipe_ol_cu_lambda_prms(
144     void *pv_ctxt,
145     frm_lambda_ctxt_t *ps_frm_lamda,
146     WORD32 i4_slice_type,
147     WORD32 i4_temporal_lyr_id,
148     WORD32 i4_lambda_type);
149 
150 void ihevce_get_ipe_ol_cu_lambda_prms(void *pv_ctxt, WORD32 i4_cur_cu_qp);
151 
152 void ihevce_populate_ipe_frame_init(
153     void *pv_ctxt,
154     ihevce_static_cfg_params_t *ps_stat_prms,
155     WORD32 i4_curr_frm_qp,
156     WORD32 i4_slice_type,
157     WORD32 i4_thrd_id,
158     pre_enc_me_ctxt_t *ps_curr_out,
159     WORD8 i1_cu_qp_delta_enabled_flag,
160     rc_quant_t *ps_rc_quant_ctxt,
161     WORD32 i4_quality_preset,
162     WORD32 i4_temporal_lyr_id,
163     ihevce_lap_output_params_t *ps_lap_out);
164 
165 LWORD64 ihevce_ipe_get_frame_intra_satd_cost(
166     void *pv_ctxt,
167     LWORD64 *pi8_frame_satd_by_qpmod,
168     LWORD64 *pi8_frame_acc_mode_bits_cost,
169     LWORD64 *pi8_frame_acc_activity_factor,
170     LWORD64 *pi8_frame_l0_acc_satd);
171 #endif /* _IHEVCE_IPE_PASS_H_ */
172