1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar *****************************************************************************
18*c83a76b0SSuyog Pawar * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar
21*c83a76b0SSuyog Pawar /**
22*c83a76b0SSuyog Pawar ******************************************************************************
23*c83a76b0SSuyog Pawar * @file ihevce_rc_interface.c
24*c83a76b0SSuyog Pawar *
25*c83a76b0SSuyog Pawar * @brief
26*c83a76b0SSuyog Pawar * This file contains function definitions for rc api interface
27*c83a76b0SSuyog Pawar *
28*c83a76b0SSuyog Pawar * @author
29*c83a76b0SSuyog Pawar * Ittiam
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * List of Functions
32*c83a76b0SSuyog Pawar * <TODO: Update this>
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar ******************************************************************************
35*c83a76b0SSuyog Pawar */
36*c83a76b0SSuyog Pawar
37*c83a76b0SSuyog Pawar /*****************************************************************************/
38*c83a76b0SSuyog Pawar /* File Includes */
39*c83a76b0SSuyog Pawar /*****************************************************************************/
40*c83a76b0SSuyog Pawar
41*c83a76b0SSuyog Pawar /* System include files */
42*c83a76b0SSuyog Pawar #include <stdio.h>
43*c83a76b0SSuyog Pawar #include <string.h>
44*c83a76b0SSuyog Pawar #include <stdlib.h>
45*c83a76b0SSuyog Pawar #include <assert.h>
46*c83a76b0SSuyog Pawar #include <stdarg.h>
47*c83a76b0SSuyog Pawar #include <math.h>
48*c83a76b0SSuyog Pawar
49*c83a76b0SSuyog Pawar /* User include files */
50*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
51*c83a76b0SSuyog Pawar #include "itt_video_api.h"
52*c83a76b0SSuyog Pawar #include "ihevce_api.h"
53*c83a76b0SSuyog Pawar
54*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
55*c83a76b0SSuyog Pawar #include "rc_frame_info_collector.h"
56*c83a76b0SSuyog Pawar #include "rc_look_ahead_params.h"
57*c83a76b0SSuyog Pawar #include "mem_req_and_acq.h"
58*c83a76b0SSuyog Pawar #include "rate_control_api.h"
59*c83a76b0SSuyog Pawar #include "var_q_operator.h"
60*c83a76b0SSuyog Pawar
61*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
62*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
63*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
64*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
65*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
66*c83a76b0SSuyog Pawar #include "ihevc_deblk.h"
67*c83a76b0SSuyog Pawar #include "ihevc_itrans_recon.h"
68*c83a76b0SSuyog Pawar #include "ihevc_chroma_itrans_recon.h"
69*c83a76b0SSuyog Pawar #include "ihevc_chroma_intra_pred.h"
70*c83a76b0SSuyog Pawar #include "ihevc_intra_pred.h"
71*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
72*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
73*c83a76b0SSuyog Pawar #include "ihevc_padding.h"
74*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
75*c83a76b0SSuyog Pawar #include "ihevc_sao.h"
76*c83a76b0SSuyog Pawar #include "ihevc_resi_trans.h"
77*c83a76b0SSuyog Pawar #include "ihevc_quant_iquant_ssd.h"
78*c83a76b0SSuyog Pawar
79*c83a76b0SSuyog Pawar #include "ihevce_defs.h"
80*c83a76b0SSuyog Pawar #include "ihevce_hle_interface.h"
81*c83a76b0SSuyog Pawar #include "ihevce_lap_enc_structs.h"
82*c83a76b0SSuyog Pawar #include "ihevce_lap_interface.h"
83*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_structs.h"
84*c83a76b0SSuyog Pawar #include "ihevce_me_common_defs.h"
85*c83a76b0SSuyog Pawar #include "ihevce_had_satd.h"
86*c83a76b0SSuyog Pawar #include "ihevce_function_selector.h"
87*c83a76b0SSuyog Pawar #include "ihevce_enc_structs.h"
88*c83a76b0SSuyog Pawar #include "ihevce_cmn_utils_instr_set_router.h"
89*c83a76b0SSuyog Pawar #include "hme_datatype.h"
90*c83a76b0SSuyog Pawar #include "hme_interface.h"
91*c83a76b0SSuyog Pawar #include "hme_common_defs.h"
92*c83a76b0SSuyog Pawar #include "hme_defs.h"
93*c83a76b0SSuyog Pawar #include "ihevce_rc_enc_structs.h"
94*c83a76b0SSuyog Pawar #include "ihevce_rc_structs.h"
95*c83a76b0SSuyog Pawar #include "ihevce_rc_interface.h"
96*c83a76b0SSuyog Pawar #include "ihevce_frame_process_utils.h"
97*c83a76b0SSuyog Pawar
98*c83a76b0SSuyog Pawar /*****************************************************************************/
99*c83a76b0SSuyog Pawar /* Constant Macros */
100*c83a76b0SSuyog Pawar /*****************************************************************************/
101*c83a76b0SSuyog Pawar #define USE_USER_FIRST_FRAME_QP 0
102*c83a76b0SSuyog Pawar #define DEBUG_PRINT 0
103*c83a76b0SSuyog Pawar #define DETERMINISTIC_RC 1
104*c83a76b0SSuyog Pawar #define USE_QP_OFFSET_POST_SCD 1
105*c83a76b0SSuyog Pawar #define USE_SQRT 0
106*c83a76b0SSuyog Pawar #define K_SCALING_FACTOR 8
107*c83a76b0SSuyog Pawar #define ENABLE_2_PASS_BIT_ALLOC_FRM_1ST 0
108*c83a76b0SSuyog Pawar
109*c83a76b0SSuyog Pawar #define VBV_THRSH_I_PIC_DELTA_QP_1 (0.85)
110*c83a76b0SSuyog Pawar #define VBV_THRSH_I_PIC_DELTA_QP_2 (0.75)
111*c83a76b0SSuyog Pawar #define VBV_THRSH_P_PIC_DELTA_QP_1 (0.80)
112*c83a76b0SSuyog Pawar #define VBV_THRSH_P_PIC_DELTA_QP_2 (0.70)
113*c83a76b0SSuyog Pawar #define VBV_THRSH_BR_PIC_DELTA_QP_1 (0.75)
114*c83a76b0SSuyog Pawar #define VBV_THRSH_BR_PIC_DELTA_QP_2 (0.65)
115*c83a76b0SSuyog Pawar #define VBV_THRSH_BNR_PIC_DELTA_QP_1 (0.75)
116*c83a76b0SSuyog Pawar #define VBV_THRSH_BNR_PIC_DELTA_QP_2 (0.65)
117*c83a76b0SSuyog Pawar #define VBV_THRSH_DELTA_QP (0.6)
118*c83a76b0SSuyog Pawar
119*c83a76b0SSuyog Pawar #define VBV_THRSH_FRM_PRLL_I_PIC_DELTA_QP_1 (0.70)
120*c83a76b0SSuyog Pawar #define VBV_THRSH_FRM_PRLL_I_PIC_DELTA_QP_2 (0.60)
121*c83a76b0SSuyog Pawar #define VBV_THRSH_FRM_PRLL_P_PIC_DELTA_QP_1 (0.65)
122*c83a76b0SSuyog Pawar #define VBV_THRSH_FRM_PRLL_P_PIC_DELTA_QP_2 (0.55)
123*c83a76b0SSuyog Pawar #define VBV_THRSH_FRM_PRLL_BR_PIC_DELTA_QP_1 (0.60)
124*c83a76b0SSuyog Pawar #define VBV_THRSH_FRM_PRLL_BR_PIC_DELTA_QP_2 (0.50)
125*c83a76b0SSuyog Pawar #define VBV_THRSH_FRM_PRLL_BNR_PIC_DELTA_QP_1 (0.60)
126*c83a76b0SSuyog Pawar #define VBV_THRSH_FRM_PRLL_BNR_PIC_DELTA_QP_2 (0.50)
127*c83a76b0SSuyog Pawar #define VBV_THRSH_FRM_PRLL_DELTA_QP (0.45)
128*c83a76b0SSuyog Pawar
129*c83a76b0SSuyog Pawar #define TRACE_SUPPORT 0
130*c83a76b0SSuyog Pawar
131*c83a76b0SSuyog Pawar /*****************************************************************************/
132*c83a76b0SSuyog Pawar /* Globals */
133*c83a76b0SSuyog Pawar /*****************************************************************************/
134*c83a76b0SSuyog Pawar
135*c83a76b0SSuyog Pawar /*
136*c83a76b0SSuyog Pawar Modified bpp vs nor satd/act/qp :
137*c83a76b0SSuyog Pawar =================================
138*c83a76b0SSuyog Pawar
139*c83a76b0SSuyog Pawar Prestine Quality
140*c83a76b0SSuyog Pawar -----------------
141*c83a76b0SSuyog Pawar 480p y = -0.1331x3 - 0.0589x2 + 2.5091x - 0.0626
142*c83a76b0SSuyog Pawar 720p y = -0.3603x3 + 0.4504x2 + 2.2056x - 0.0411
143*c83a76b0SSuyog Pawar 1080p y = -0.7085x3 + 0.9743x2 + 1.939x - 0.0238
144*c83a76b0SSuyog Pawar 2160p y = -1.2447x3 + 2.1218x2 + 1.4995x - 0.0108
145*c83a76b0SSuyog Pawar
146*c83a76b0SSuyog Pawar High Quality
147*c83a76b0SSuyog Pawar -------------
148*c83a76b0SSuyog Pawar 480p y = -0.1348x3 - 0.0557x2 + 2.5055x - 0.0655
149*c83a76b0SSuyog Pawar 720p y = -0.0811x3 + 0.1988x2 + 1.246x - 0.0385
150*c83a76b0SSuyog Pawar 1080p y = -0.74x3 + 1.0552x2 + 1.8942x - 0.0251
151*c83a76b0SSuyog Pawar 2160p y = -1.3851x3 + 2.3372x2 + 1.4255x - 0.0113
152*c83a76b0SSuyog Pawar
153*c83a76b0SSuyog Pawar Medium Speed
154*c83a76b0SSuyog Pawar -------------
155*c83a76b0SSuyog Pawar 480p y = -0.143x3 - 0.0452x2 + 2.5581x - 0.0765
156*c83a76b0SSuyog Pawar 720p y = -0.3997x3 + 0.542x2 + 2.201x - 0.0507
157*c83a76b0SSuyog Pawar 1080p y = -0.816x3 + 1.2048x2 + 1.8689x - 0.0298
158*c83a76b0SSuyog Pawar 2160p y = -1.5169x3 + 2.5857x2 + 1.3478x - 0.0126
159*c83a76b0SSuyog Pawar
160*c83a76b0SSuyog Pawar High Speed
161*c83a76b0SSuyog Pawar -----------
162*c83a76b0SSuyog Pawar 480p y = -0.1472x3 - 0.0341x2 + 2.5605x - 0.0755
163*c83a76b0SSuyog Pawar 720p y = -0.3967x3 + 0.526x2 + 2.2228x - 0.0504
164*c83a76b0SSuyog Pawar 1080p y = -0.8008x3 + 1.1713x2 + 1.8897x - 0.0297
165*c83a76b0SSuyog Pawar 2160p y = -1.503x3 + 2.576x2 + 1.3476x - 0.0123
166*c83a76b0SSuyog Pawar
167*c83a76b0SSuyog Pawar Extreme Speed
168*c83a76b0SSuyog Pawar --------------
169*c83a76b0SSuyog Pawar 480p y = -0.1379x3 - 0.059x2 + 2.5716x - 0.0756
170*c83a76b0SSuyog Pawar 720p y = -0.3938x3 + 0.521x2 + 2.2239x - 0.0505
171*c83a76b0SSuyog Pawar 1080p y = -0.8041x3 + 1.1725x2 + 1.8874x - 0.0293
172*c83a76b0SSuyog Pawar 2160p y = -1.4863x3 + 2.556x2 + 1.344x - 0.0122
173*c83a76b0SSuyog Pawar
174*c83a76b0SSuyog Pawar */
175*c83a76b0SSuyog Pawar
176*c83a76b0SSuyog Pawar const double g_offline_i_model_coeff[20][4] = {
177*c83a76b0SSuyog Pawar
178*c83a76b0SSuyog Pawar /*ultra_HD*/
179*c83a76b0SSuyog Pawar { -1.2447, 2.1218, 1.4995, -0.0108 }, /*Prestine quality*/
180*c83a76b0SSuyog Pawar { -1.3851, 2.3372, 1.4255, -0.0113 }, /*High quality*/
181*c83a76b0SSuyog Pawar { -1.5169, 2.5857, 1.3478, -0.0126 }, /*Medium speed*/
182*c83a76b0SSuyog Pawar { -1.503, 2.576, 1.3476, -0.0123 }, /*high speed*/
183*c83a76b0SSuyog Pawar { -1.4863, 2.556, 1.344, -0.0122 }, /*Extreme Speed*/
184*c83a76b0SSuyog Pawar
185*c83a76b0SSuyog Pawar /*Full HD*/
186*c83a76b0SSuyog Pawar { -0.7085, 0.9743, 1.939, -0.0238 }, /*Prestine quality*/
187*c83a76b0SSuyog Pawar { -0.74, 1.0552, 1.8942, -0.0251 }, /*High quality*/
188*c83a76b0SSuyog Pawar { -0.816, 1.2048, 1.8689, -0.0298 }, /*Medium speed*/
189*c83a76b0SSuyog Pawar { -0.8008, 1.1713, 1.8897, -0.0297 }, /*high speed*/
190*c83a76b0SSuyog Pawar { -0.8041, 1.1725, 1.8874, -0.0293 }, /*Extreme Speed*/
191*c83a76b0SSuyog Pawar
192*c83a76b0SSuyog Pawar /*720p*/
193*c83a76b0SSuyog Pawar { -0.3603, 0.4504, 2.2056, -0.0411 }, /*Prestine quality*/
194*c83a76b0SSuyog Pawar // {-0.0811, 0.1988, 1.246, - 0.0385},/*High quality*/
195*c83a76b0SSuyog Pawar { -0.3997, 0.542, 2.201, -0.0507 },
196*c83a76b0SSuyog Pawar { -0.3997, 0.542, 2.201, -0.0507 }, /*Medium speed*/
197*c83a76b0SSuyog Pawar { -0.3967, 0.526, 2.2228, -0.0504 }, /*high speed*/
198*c83a76b0SSuyog Pawar { -0.3938, 0.521, 2.2239, -0.0505 }, /*Extreme Speed*/
199*c83a76b0SSuyog Pawar
200*c83a76b0SSuyog Pawar /*SD*/
201*c83a76b0SSuyog Pawar { -0.1331, -0.0589, 2.5091, -0.0626 }, /*Prestine quality*/
202*c83a76b0SSuyog Pawar { -0.1348, -0.0557, 2.5055, -0.0655 }, /*High quality*/
203*c83a76b0SSuyog Pawar { -0.143, -0.0452, 2.5581, -0.0765 }, /*Medium speed*/
204*c83a76b0SSuyog Pawar { -0.1472, -0.0341, 2.5605, -0.0755 }, /*high speed*/
205*c83a76b0SSuyog Pawar { -0.1379, -0.059, 2.5716, -0.0756 } /*Extreme Speed*/
206*c83a76b0SSuyog Pawar
207*c83a76b0SSuyog Pawar };
208*c83a76b0SSuyog Pawar
209*c83a76b0SSuyog Pawar /*****************************************************************************/
210*c83a76b0SSuyog Pawar /* Function Declarations */
211*c83a76b0SSuyog Pawar /*****************************************************************************/
212*c83a76b0SSuyog Pawar
213*c83a76b0SSuyog Pawar picture_type_e ihevce_rc_conv_pic_type(
214*c83a76b0SSuyog Pawar IV_PICTURE_CODING_TYPE_T pic_type,
215*c83a76b0SSuyog Pawar WORD32 i4_field_pic,
216*c83a76b0SSuyog Pawar WORD32 i4_temporal_layer_id,
217*c83a76b0SSuyog Pawar WORD32 i4_is_bottom_field,
218*c83a76b0SSuyog Pawar WORD32 i4_top_field_first);
219*c83a76b0SSuyog Pawar
220*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_scaled_mpeg2_qp(WORD32 i4_frame_qp, rc_quant_t *ps_rc_quant_ctxt);
221*c83a76b0SSuyog Pawar
222*c83a76b0SSuyog Pawar static WORD32 ihevce_get_offline_index(rc_context_t *ps_rc_ctxt, WORD32 i4_num_pels_in_frame);
223*c83a76b0SSuyog Pawar
224*c83a76b0SSuyog Pawar static void ihevce_rc_get_pic_param(
225*c83a76b0SSuyog Pawar picture_type_e rc_pic_type, WORD32 *pi4_tem_lyr, WORD32 *pi4_is_bottom_field);
226*c83a76b0SSuyog Pawar
227*c83a76b0SSuyog Pawar static double ihevce_get_frame_lambda_modifier(
228*c83a76b0SSuyog Pawar WORD8 slice_type,
229*c83a76b0SSuyog Pawar WORD32 i4_rc_temporal_lyr_id,
230*c83a76b0SSuyog Pawar WORD32 i4_first_field,
231*c83a76b0SSuyog Pawar WORD32 i4_rc_is_ref_pic,
232*c83a76b0SSuyog Pawar WORD32 i4_num_b_frms);
233*c83a76b0SSuyog Pawar
234*c83a76b0SSuyog Pawar static WORD32 ihevce_clip_min_max_qp(
235*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt,
236*c83a76b0SSuyog Pawar WORD32 i4_hevc_frame_qp,
237*c83a76b0SSuyog Pawar picture_type_e rc_pic_type,
238*c83a76b0SSuyog Pawar WORD32 i4_rc_temporal_lyr_id);
239*c83a76b0SSuyog Pawar
240*c83a76b0SSuyog Pawar WORD32 ihevce_ebf_based_rc_correction_to_avoid_overflow(
241*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt, rc_lap_out_params_t *ps_rc_lap_out, WORD32 *pi4_tot_bits_estimated);
242*c83a76b0SSuyog Pawar
243*c83a76b0SSuyog Pawar /*****************************************************************************/
244*c83a76b0SSuyog Pawar /* Function Definitions */
245*c83a76b0SSuyog Pawar /*****************************************************************************/
246*c83a76b0SSuyog Pawar
247*c83a76b0SSuyog Pawar /*!
248*c83a76b0SSuyog Pawar ************************************************************************
249*c83a76b0SSuyog Pawar * @brief
250*c83a76b0SSuyog Pawar * return number of records used by RC
251*c83a76b0SSuyog Pawar ************************************************************************
252*c83a76b0SSuyog Pawar */
ihevce_rc_get_num_mem_recs(void)253*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_num_mem_recs(void)
254*c83a76b0SSuyog Pawar {
255*c83a76b0SSuyog Pawar WORD32 i4_num_rc_mem_tab = 0;
256*c83a76b0SSuyog Pawar
257*c83a76b0SSuyog Pawar /*get the number of memtab request from RC*/
258*c83a76b0SSuyog Pawar rate_control_handle ps_rate_control_api;
259*c83a76b0SSuyog Pawar itt_memtab_t *ps_memtab = NULL;
260*c83a76b0SSuyog Pawar i4_num_rc_mem_tab =
261*c83a76b0SSuyog Pawar rate_control_num_fill_use_free_memtab(&ps_rate_control_api, ps_memtab, GET_NUM_MEMTAB);
262*c83a76b0SSuyog Pawar
263*c83a76b0SSuyog Pawar return ((NUM_RC_MEM_RECS + i4_num_rc_mem_tab));
264*c83a76b0SSuyog Pawar }
265*c83a76b0SSuyog Pawar
266*c83a76b0SSuyog Pawar /*!
267*c83a76b0SSuyog Pawar ************************************************************************
268*c83a76b0SSuyog Pawar * @brief
269*c83a76b0SSuyog Pawar * return each record attributes of RC
270*c83a76b0SSuyog Pawar ************************************************************************
271*c83a76b0SSuyog Pawar */
ihevce_rc_get_mem_recs(iv_mem_rec_t * ps_mem_tab,ihevce_static_cfg_params_t * ps_init_prms,WORD32 mem_space,ihevce_sys_api_t * ps_sys_api)272*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_mem_recs(
273*c83a76b0SSuyog Pawar iv_mem_rec_t *ps_mem_tab,
274*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *ps_init_prms,
275*c83a76b0SSuyog Pawar WORD32 mem_space,
276*c83a76b0SSuyog Pawar ihevce_sys_api_t *ps_sys_api)
277*c83a76b0SSuyog Pawar {
278*c83a76b0SSuyog Pawar float f_temp;
279*c83a76b0SSuyog Pawar WORD32 i4_temp_size;
280*c83a76b0SSuyog Pawar WORD32 i4_num_memtab = 0;
281*c83a76b0SSuyog Pawar WORD32 i4_num_rc_mem_tab, i;
282*c83a76b0SSuyog Pawar rate_control_handle ps_rate_control_api;
283*c83a76b0SSuyog Pawar itt_memtab_t *ps_itt_memtab = NULL;
284*c83a76b0SSuyog Pawar itt_memtab_t as_rc_mem_tab[30];
285*c83a76b0SSuyog Pawar
286*c83a76b0SSuyog Pawar /*memory requirements to store RC context */
287*c83a76b0SSuyog Pawar ps_mem_tab[RC_CTXT].i4_mem_size = sizeof(rc_context_t);
288*c83a76b0SSuyog Pawar //DBG_PRINTF("size of RC context = %d\n",sizeof(rc_context_t));
289*c83a76b0SSuyog Pawar ps_mem_tab[RC_CTXT].e_mem_type = (IV_MEM_TYPE_T)mem_space;
290*c83a76b0SSuyog Pawar
291*c83a76b0SSuyog Pawar ps_mem_tab[RC_CTXT].i4_mem_alignment = 64;
292*c83a76b0SSuyog Pawar
293*c83a76b0SSuyog Pawar (void)ps_sys_api;
294*c83a76b0SSuyog Pawar //i4_temp_size = (51 + ((ps_init_prms->s_src_prms.i4_bit_depth - 8) * 6));
295*c83a76b0SSuyog Pawar i4_temp_size = (51 + ((ps_init_prms->s_tgt_lyr_prms.i4_internal_bit_depth - 8) * 6));
296*c83a76b0SSuyog Pawar
297*c83a76b0SSuyog Pawar ps_mem_tab[RC_QP_TO_QSCALE].i4_mem_size = (i4_temp_size + 1) * 4;
298*c83a76b0SSuyog Pawar ps_mem_tab[RC_QP_TO_QSCALE].e_mem_type = (IV_MEM_TYPE_T)mem_space;
299*c83a76b0SSuyog Pawar ps_mem_tab[RC_QP_TO_QSCALE].i4_mem_alignment = 64;
300*c83a76b0SSuyog Pawar
301*c83a76b0SSuyog Pawar ps_mem_tab[RC_QP_TO_QSCALE_Q_FACTOR].i4_mem_size = (i4_temp_size + 1) * 4;
302*c83a76b0SSuyog Pawar ps_mem_tab[RC_QP_TO_QSCALE_Q_FACTOR].e_mem_type = (IV_MEM_TYPE_T)mem_space;
303*c83a76b0SSuyog Pawar ps_mem_tab[RC_QP_TO_QSCALE_Q_FACTOR].i4_mem_alignment = 64;
304*c83a76b0SSuyog Pawar
305*c83a76b0SSuyog Pawar f_temp = (float)(51 + ((ps_init_prms->s_tgt_lyr_prms.i4_internal_bit_depth - 8) * 6));
306*c83a76b0SSuyog Pawar f_temp = ((float)(f_temp - 4) / 6);
307*c83a76b0SSuyog Pawar i4_temp_size = (WORD32)((float)pow(2, f_temp) + 0.5);
308*c83a76b0SSuyog Pawar i4_temp_size = (i4_temp_size << 3); // Q3 format is mantained for accuarate calc at lower qp
309*c83a76b0SSuyog Pawar
310*c83a76b0SSuyog Pawar ps_mem_tab[RC_QSCALE_TO_QP].i4_mem_size = (i4_temp_size + 1) * sizeof(UWORD32);
311*c83a76b0SSuyog Pawar ps_mem_tab[RC_QSCALE_TO_QP].e_mem_type = (IV_MEM_TYPE_T)mem_space;
312*c83a76b0SSuyog Pawar ps_mem_tab[RC_QSCALE_TO_QP].i4_mem_alignment = 64;
313*c83a76b0SSuyog Pawar
314*c83a76b0SSuyog Pawar /*memory requirements to store RC context */
315*c83a76b0SSuyog Pawar ps_mem_tab[RC_MULTI_PASS_GOP_STAT].i4_mem_size = sizeof(gop_level_stat_t);
316*c83a76b0SSuyog Pawar ps_mem_tab[RC_MULTI_PASS_GOP_STAT].e_mem_type = (IV_MEM_TYPE_T)mem_space;
317*c83a76b0SSuyog Pawar ps_mem_tab[RC_MULTI_PASS_GOP_STAT].i4_mem_alignment = 64;
318*c83a76b0SSuyog Pawar
319*c83a76b0SSuyog Pawar i4_num_rc_mem_tab =
320*c83a76b0SSuyog Pawar rate_control_num_fill_use_free_memtab(&ps_rate_control_api, ps_itt_memtab, GET_NUM_MEMTAB);
321*c83a76b0SSuyog Pawar
322*c83a76b0SSuyog Pawar i4_num_memtab =
323*c83a76b0SSuyog Pawar rate_control_num_fill_use_free_memtab(&ps_rate_control_api, as_rc_mem_tab, FILL_MEMTAB);
324*c83a76b0SSuyog Pawar
325*c83a76b0SSuyog Pawar for(i = 0; i < i4_num_memtab; i++)
326*c83a76b0SSuyog Pawar {
327*c83a76b0SSuyog Pawar ps_mem_tab[i + NUM_RC_MEM_RECS].i4_mem_size = as_rc_mem_tab[i].u4_size;
328*c83a76b0SSuyog Pawar ps_mem_tab[i + NUM_RC_MEM_RECS].i4_mem_alignment = as_rc_mem_tab[i].i4_alignment;
329*c83a76b0SSuyog Pawar ps_mem_tab[i + NUM_RC_MEM_RECS].e_mem_type = (IV_MEM_TYPE_T)mem_space;
330*c83a76b0SSuyog Pawar }
331*c83a76b0SSuyog Pawar return (i4_num_memtab + NUM_RC_MEM_RECS);
332*c83a76b0SSuyog Pawar }
333*c83a76b0SSuyog Pawar
334*c83a76b0SSuyog Pawar /**
335*c83a76b0SSuyog Pawar ******************************************************************************
336*c83a76b0SSuyog Pawar *
337*c83a76b0SSuyog Pawar * @brief Initilizes the rate control module
338*c83a76b0SSuyog Pawar *
339*c83a76b0SSuyog Pawar * @par Description
340*c83a76b0SSuyog Pawar *
341*c83a76b0SSuyog Pawar * @param[inout] ps_mem_tab
342*c83a76b0SSuyog Pawar * pointer to memory descriptors table
343*c83a76b0SSuyog Pawar *
344*c83a76b0SSuyog Pawar * @param[in] ps_init_prms
345*c83a76b0SSuyog Pawar * Create time static parameters
346*c83a76b0SSuyog Pawar *
347*c83a76b0SSuyog Pawar * @return void
348*c83a76b0SSuyog Pawar *
349*c83a76b0SSuyog Pawar ******************************************************************************
350*c83a76b0SSuyog Pawar */
ihevce_rc_mem_init(iv_mem_rec_t * ps_mem_tab,ihevce_static_cfg_params_t * ps_init_prms,WORD32 i4_bitrate_instance_id,rc_quant_t * ps_rc_quant,WORD32 i4_resolution_id,WORD32 i4_look_ahead_frames_in_first_pass)351*c83a76b0SSuyog Pawar void *ihevce_rc_mem_init(
352*c83a76b0SSuyog Pawar iv_mem_rec_t *ps_mem_tab,
353*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *ps_init_prms,
354*c83a76b0SSuyog Pawar WORD32 i4_bitrate_instance_id,
355*c83a76b0SSuyog Pawar rc_quant_t *ps_rc_quant,
356*c83a76b0SSuyog Pawar WORD32 i4_resolution_id,
357*c83a76b0SSuyog Pawar WORD32 i4_look_ahead_frames_in_first_pass)
358*c83a76b0SSuyog Pawar {
359*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt;
360*c83a76b0SSuyog Pawar WORD32 i4_num_memtab, i, j, i4_avg_bitrate, u4_buf_size;
361*c83a76b0SSuyog Pawar WORD32 i4_cdr_period = 0, i4_idr_period = 0;
362*c83a76b0SSuyog Pawar WORD32 i4_peak_bitrate_factor;
363*c83a76b0SSuyog Pawar rate_control_handle ps_rate_control_api;
364*c83a76b0SSuyog Pawar itt_memtab_t as_rc_mem_tab[30];
365*c83a76b0SSuyog Pawar itt_memtab_t *ps_itt_memtab = NULL;
366*c83a76b0SSuyog Pawar ps_rc_ctxt = (rc_context_t *)ps_mem_tab[RC_CTXT].pv_base;
367*c83a76b0SSuyog Pawar memset(ps_rc_ctxt, 0, sizeof(rc_context_t));
368*c83a76b0SSuyog Pawar
369*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_br_id_for_2pass = i4_bitrate_instance_id;
370*c83a76b0SSuyog Pawar if(ps_init_prms->s_coding_tools_prms.i4_max_cra_open_gop_period)
371*c83a76b0SSuyog Pawar {
372*c83a76b0SSuyog Pawar i4_cdr_period = ps_init_prms->s_coding_tools_prms.i4_max_cra_open_gop_period;
373*c83a76b0SSuyog Pawar }
374*c83a76b0SSuyog Pawar if(ps_init_prms->s_coding_tools_prms.i4_max_i_open_gop_period)
375*c83a76b0SSuyog Pawar {
376*c83a76b0SSuyog Pawar i4_cdr_period = ps_init_prms->s_coding_tools_prms.i4_max_i_open_gop_period;
377*c83a76b0SSuyog Pawar }
378*c83a76b0SSuyog Pawar i4_idr_period = ps_init_prms->s_coding_tools_prms.i4_max_closed_gop_period;
379*c83a76b0SSuyog Pawar
380*c83a76b0SSuyog Pawar ps_rc_quant->pi4_qscale_to_qp = (WORD32 *)ps_mem_tab[RC_QSCALE_TO_QP].pv_base;
381*c83a76b0SSuyog Pawar
382*c83a76b0SSuyog Pawar ps_rc_quant->pi4_qp_to_qscale_q_factor = (WORD32 *)ps_mem_tab[RC_QP_TO_QSCALE_Q_FACTOR].pv_base;
383*c83a76b0SSuyog Pawar
384*c83a76b0SSuyog Pawar ps_rc_quant->pi4_qp_to_qscale = (WORD32 *)ps_mem_tab[RC_QP_TO_QSCALE].pv_base;
385*c83a76b0SSuyog Pawar
386*c83a76b0SSuyog Pawar ps_rc_ctxt->pv_gop_stat = (void *)ps_mem_tab[RC_MULTI_PASS_GOP_STAT].pv_base;
387*c83a76b0SSuyog Pawar
388*c83a76b0SSuyog Pawar /*assign memtabs to rc module*/
389*c83a76b0SSuyog Pawar i4_num_memtab =
390*c83a76b0SSuyog Pawar rate_control_num_fill_use_free_memtab(&ps_rate_control_api, ps_itt_memtab, GET_NUM_MEMTAB);
391*c83a76b0SSuyog Pawar
392*c83a76b0SSuyog Pawar i4_num_memtab =
393*c83a76b0SSuyog Pawar rate_control_num_fill_use_free_memtab(&ps_rate_control_api, as_rc_mem_tab, FILL_MEMTAB);
394*c83a76b0SSuyog Pawar for(i = 0; i < i4_num_memtab; i++)
395*c83a76b0SSuyog Pawar {
396*c83a76b0SSuyog Pawar as_rc_mem_tab[i].pv_base = ps_mem_tab[i + NUM_RC_MEM_RECS].pv_base;
397*c83a76b0SSuyog Pawar }
398*c83a76b0SSuyog Pawar i4_num_memtab =
399*c83a76b0SSuyog Pawar rate_control_num_fill_use_free_memtab(&ps_rate_control_api, as_rc_mem_tab, USE_BASE);
400*c83a76b0SSuyog Pawar
401*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl =
402*c83a76b0SSuyog Pawar ps_rate_control_api; /*handle to entire RC structure private to RC library*/
403*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic = ps_init_prms->s_src_prms.i4_field_pic;
404*c83a76b0SSuyog Pawar
405*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_first_frame_encoded = 0;
406*c83a76b0SSuyog Pawar /*added for field encoding*/
407*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_max_inter_frm_int =
408*c83a76b0SSuyog Pawar 1 << (ps_init_prms->s_coding_tools_prms.i4_max_temporal_layers + ps_rc_ctxt->i4_field_pic);
409*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_max_temporal_lyr = ps_init_prms->s_coding_tools_prms.i4_max_temporal_layers;
410*c83a76b0SSuyog Pawar /*Number of picture types used if different models are used for hierarchial B frames*/
411*c83a76b0SSuyog Pawar
412*c83a76b0SSuyog Pawar if(i4_idr_period == 1 || i4_cdr_period == 1)
413*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_active_pic_type = 1;
414*c83a76b0SSuyog Pawar else
415*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_active_pic_type =
416*c83a76b0SSuyog Pawar 2 + ps_init_prms->s_coding_tools_prms.i4_max_temporal_layers;
417*c83a76b0SSuyog Pawar
418*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_quality_preset =
419*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset;
420*c83a76b0SSuyog Pawar
421*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_quality_preset == IHEVCE_QUALITY_P7)
422*c83a76b0SSuyog Pawar {
423*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_quality_preset = IHEVCE_QUALITY_P6;
424*c83a76b0SSuyog Pawar }
425*c83a76b0SSuyog Pawar
426*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_rc_pass = ps_init_prms->s_pass_prms.i4_pass;
427*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_num_gop_mem_alloc = 0;
428*c83a76b0SSuyog Pawar
429*c83a76b0SSuyog Pawar ps_rc_ctxt->u1_is_mb_level_rc_on = 0; /*no mb level RC*/
430*c83a76b0SSuyog Pawar
431*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_infinite_gop = 0;
432*c83a76b0SSuyog Pawar ps_rc_ctxt->u1_bit_depth = (UWORD8)ps_init_prms->s_tgt_lyr_prms.i4_internal_bit_depth;
433*c83a76b0SSuyog Pawar
434*c83a76b0SSuyog Pawar //ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset = ((ps_init_prms->s_src_prms.i4_bit_depth-8)*6);
435*c83a76b0SSuyog Pawar ps_rc_quant->i1_qp_offset = ((ps_init_prms->s_tgt_lyr_prms.i4_internal_bit_depth - 8) * 6);
436*c83a76b0SSuyog Pawar
437*c83a76b0SSuyog Pawar ps_rc_quant->i2_max_qp = MIN(ps_init_prms->s_config_prms.i4_max_frame_qp,
438*c83a76b0SSuyog Pawar 51); // FOR Encoder
439*c83a76b0SSuyog Pawar ps_rc_quant->i2_min_qp =
440*c83a76b0SSuyog Pawar MAX(-(ps_rc_quant->i1_qp_offset), ps_init_prms->s_config_prms.i4_min_frame_qp);
441*c83a76b0SSuyog Pawar
442*c83a76b0SSuyog Pawar if(ps_init_prms->s_lap_prms.i4_rc_look_ahead_pics)
443*c83a76b0SSuyog Pawar {
444*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_frame_in_lap_window =
445*c83a76b0SSuyog Pawar ps_init_prms->s_lap_prms.i4_rc_look_ahead_pics + MIN_L1_L0_STAGGER_NON_SEQ;
446*c83a76b0SSuyog Pawar }
447*c83a76b0SSuyog Pawar else
448*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_frame_in_lap_window = 0;
449*c83a76b0SSuyog Pawar
450*c83a76b0SSuyog Pawar if(i4_cdr_period > 0 && i4_idr_period > 0)
451*c83a76b0SSuyog Pawar {
452*c83a76b0SSuyog Pawar /*both IDR and CDR are positive*/
453*c83a76b0SSuyog Pawar //WORD32 i4_rem;
454*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_intra_frame_interval = i4_cdr_period;
455*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_idr_period = i4_idr_period;
456*c83a76b0SSuyog Pawar
457*c83a76b0SSuyog Pawar /*Allow configuration where IDR period is multiple of CDR period. Though any configuiration is supported by LAP rate control
458*c83a76b0SSuyog Pawar does not handle assymeteric GOPS, Bit-allocation is exposed to CDR or IDR. It treats everything as I pic*/
459*c83a76b0SSuyog Pawar }
460*c83a76b0SSuyog Pawar else if(!i4_idr_period && i4_cdr_period > 0)
461*c83a76b0SSuyog Pawar {
462*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_intra_frame_interval = i4_cdr_period;
463*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_idr_period = 0;
464*c83a76b0SSuyog Pawar }
465*c83a76b0SSuyog Pawar else if(!i4_cdr_period && i4_idr_period > 0)
466*c83a76b0SSuyog Pawar {
467*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_intra_frame_interval = i4_idr_period;
468*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_idr_period = i4_idr_period;
469*c83a76b0SSuyog Pawar }
470*c83a76b0SSuyog Pawar else
471*c83a76b0SSuyog Pawar {
472*c83a76b0SSuyog Pawar /*ASSERT(0);*/
473*c83a76b0SSuyog Pawar
474*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_intra_frame_interval =
475*c83a76b0SSuyog Pawar INFINITE_GOP_CDR_TIME_S *
476*c83a76b0SSuyog Pawar ((ps_init_prms->s_src_prms.i4_frm_rate_num /
477*c83a76b0SSuyog Pawar (ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_frm_rate_scale_factor *
478*c83a76b0SSuyog Pawar ps_init_prms->s_src_prms.i4_frm_rate_denom)));
479*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_idr_period = 0;
480*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_infinite_gop = 1;
481*c83a76b0SSuyog Pawar }
482*c83a76b0SSuyog Pawar
483*c83a76b0SSuyog Pawar /*If cdr period is 0 then only it is closed gop*/
484*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_gop_closed = 0;
485*c83a76b0SSuyog Pawar if(i4_cdr_period == 0)
486*c83a76b0SSuyog Pawar {
487*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_gop_closed = 1;
488*c83a76b0SSuyog Pawar }
489*c83a76b0SSuyog Pawar /*This is required because the intra sad returned by non I pic is not correct. Use only I pic sad for next I pic qp calculation*/
490*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_use_est_intra_sad = 0;
491*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_src_ticks = 1000;
492*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_tgt_ticks = 1000;
493*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_auto_generate_init_qp = 1;
494*c83a76b0SSuyog Pawar
495*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_prev_i_frm_cost = 0;
496*c83a76b0SSuyog Pawar
497*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
498*c83a76b0SSuyog Pawar {
499*c83a76b0SSuyog Pawar /* -1 cost indicates the picture type not been encoded*/
500*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frm_pre_enc_cost[i] = -1;
501*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_est_L0_satd[i] = -1;
502*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_hme_sad[i] = -1;
503*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_pre_intra_sad[i] = -1;
504*c83a76b0SSuyog Pawar /*L1 state metrics*/
505*c83a76b0SSuyog Pawar ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_I_intra_raw_satd[i] = -1;
506*c83a76b0SSuyog Pawar ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_pic_coarse_me_cost[i] = -1;
507*c83a76b0SSuyog Pawar ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_pic_coarse_me_sad[i] = -1;
508*c83a76b0SSuyog Pawar /* SGI & Enc Loop Parallelism related changes*/
509*c83a76b0SSuyog Pawar ps_rc_ctxt->s_l1_state_metric.au4_prev_scene_num[i] = 0;
510*c83a76b0SSuyog Pawar ps_rc_ctxt->au4_prev_scene_num_pre_enc[i] = 0xFFFFFFFF;
511*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_qp_for_previous_scene_pre_enc[i] = 0;
512*c83a76b0SSuyog Pawar }
513*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_scene_num_est_L0_intra_sad_available = 0xFFFFFFFF;
514*c83a76b0SSuyog Pawar
515*c83a76b0SSuyog Pawar for(i = 0; i < MAX_NON_REF_B_PICS_IN_QUEUE_SGI; i++)
516*c83a76b0SSuyog Pawar {
517*c83a76b0SSuyog Pawar ps_rc_ctxt->as_non_ref_b_qp[i].i4_enc_order_num_rc = 0x7FFFFFFF;
518*c83a76b0SSuyog Pawar ps_rc_ctxt->as_non_ref_b_qp[i].i4_non_ref_B_pic_qp = 0x7FFFFFFF;
519*c83a76b0SSuyog Pawar ps_rc_ctxt->as_non_ref_b_qp[i].u4_scene_num_rc = MAX_SCENE_NUM + 1;
520*c83a76b0SSuyog Pawar }
521*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_non_ref_B_ctr = 0;
522*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_prev_qp_ctr = 0;
523*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_cur_scene_num = 0;
524*c83a76b0SSuyog Pawar
525*c83a76b0SSuyog Pawar /*init = 0 set to 1 when atleast one frame of each picture type has completed L1 stage*/
526*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_est_L0_intra_sad_available = 0;
527*c83a76b0SSuyog Pawar
528*c83a76b0SSuyog Pawar /*Min and max qp from user*/
529*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_frame_qp = ps_init_prms->s_config_prms.i4_min_frame_qp;
530*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_max_frame_qp = ps_init_prms->s_config_prms.i4_max_frame_qp;
531*c83a76b0SSuyog Pawar ASSERT(ps_rc_ctxt->i4_min_frame_qp >= ps_rc_quant->i2_min_qp);
532*c83a76b0SSuyog Pawar ASSERT(ps_rc_ctxt->i4_max_frame_qp <= ps_rc_quant->i2_max_qp);
533*c83a76b0SSuyog Pawar /*bitrate init*/
534*c83a76b0SSuyog Pawar /*take average bitrate from comfig file*/
535*c83a76b0SSuyog Pawar i4_avg_bitrate = ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
536*c83a76b0SSuyog Pawar .ai4_tgt_bitrate[i4_bitrate_instance_id];
537*c83a76b0SSuyog Pawar
538*c83a76b0SSuyog Pawar if((ps_init_prms->s_config_prms.i4_rate_control_mode == VBR_STREAMING) &&
539*c83a76b0SSuyog Pawar (ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
540*c83a76b0SSuyog Pawar .ai4_peak_bitrate[i4_bitrate_instance_id] < (1050 * (i4_avg_bitrate / 1000))))
541*c83a76b0SSuyog Pawar {
542*c83a76b0SSuyog Pawar ps_init_prms->s_config_prms.i4_rate_control_mode = CBR_NLDRC;
543*c83a76b0SSuyog Pawar }
544*c83a76b0SSuyog Pawar
545*c83a76b0SSuyog Pawar ps_rc_ctxt->e_rate_control_type = (rc_type_e)ps_init_prms->s_config_prms.i4_rate_control_mode;
546*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_capped_vbr_flag = 0;
547*c83a76b0SSuyog Pawar if(1 == ps_init_prms->s_config_prms.i4_rate_control_mode)
548*c83a76b0SSuyog Pawar {
549*c83a76b0SSuyog Pawar /* The path taken by capped vbr mode is same as normal VBR mode. Only a flag needs to be enabled
550*c83a76b0SSuyog Pawar which tells the rc module that encoder is running in capped vbr mode */
551*c83a76b0SSuyog Pawar ps_rc_ctxt->e_rate_control_type = VBR_STREAMING;
552*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_capped_vbr_flag = 1;
553*c83a76b0SSuyog Pawar }
554*c83a76b0SSuyog Pawar ASSERT(
555*c83a76b0SSuyog Pawar (ps_rc_ctxt->e_rate_control_type == CBR_NLDRC) ||
556*c83a76b0SSuyog Pawar (ps_rc_ctxt->e_rate_control_type == CONST_QP) ||
557*c83a76b0SSuyog Pawar (ps_rc_ctxt->e_rate_control_type == VBR_STREAMING));
558*c83a76b0SSuyog Pawar
559*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_avg_bit_rate = i4_avg_bitrate;
560*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
561*c83a76b0SSuyog Pawar {
562*c83a76b0SSuyog Pawar if(ps_rc_ctxt->e_rate_control_type == VBR_STREAMING)
563*c83a76b0SSuyog Pawar {
564*c83a76b0SSuyog Pawar ps_rc_ctxt->au4_peak_bit_rate[i] =
565*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
566*c83a76b0SSuyog Pawar .ai4_peak_bitrate[i4_bitrate_instance_id];
567*c83a76b0SSuyog Pawar }
568*c83a76b0SSuyog Pawar else
569*c83a76b0SSuyog Pawar {
570*c83a76b0SSuyog Pawar /*peak bitrate parameter is ignored in CBR*/
571*c83a76b0SSuyog Pawar ps_rc_ctxt->au4_peak_bit_rate[i] = i4_avg_bitrate;
572*c83a76b0SSuyog Pawar }
573*c83a76b0SSuyog Pawar }
574*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_min_bit_rate = i4_avg_bitrate;
575*c83a76b0SSuyog Pawar
576*c83a76b0SSuyog Pawar /*buffer size init*/
577*c83a76b0SSuyog Pawar u4_buf_size = (WORD32)(ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
578*c83a76b0SSuyog Pawar .ai4_max_vbv_buffer_size[i4_bitrate_instance_id]);
579*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_max_delay = (UWORD32)(
580*c83a76b0SSuyog Pawar (float)u4_buf_size / i4_avg_bitrate * 1000); /*delay in milli-seconds based on buffer size*/
581*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_max_vbv_buff_size = u4_buf_size; /*buffer size should be in bits*/
582*c83a76b0SSuyog Pawar /*This dictates the max deviaiton allowed for file size in VBR mode. */
583*c83a76b0SSuyog Pawar ps_rc_ctxt->f_vbr_max_peak_sustain_dur =
584*c83a76b0SSuyog Pawar ((float)ps_init_prms->s_config_prms.i4_vbr_max_peak_rate_dur) / 1000;
585*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_num_frms_to_encode = (WORD32)ps_init_prms->s_config_prms.i4_num_frms_to_encode;
586*c83a76b0SSuyog Pawar i4_peak_bitrate_factor = (ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
587*c83a76b0SSuyog Pawar .ai4_peak_bitrate[i4_bitrate_instance_id] /
588*c83a76b0SSuyog Pawar i4_avg_bitrate) *
589*c83a76b0SSuyog Pawar 1000;
590*c83a76b0SSuyog Pawar {
591*c83a76b0SSuyog Pawar //float f_delay = ((float)ps_init_prms->s_config_prms.i4_max_vbv_buffer_size*1000)/i4_peak_bitrate_factor;
592*c83a76b0SSuyog Pawar float f_delay = ((float)ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
593*c83a76b0SSuyog Pawar .ai4_max_vbv_buffer_size[i4_bitrate_instance_id] *
594*c83a76b0SSuyog Pawar 1000) /
595*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
596*c83a76b0SSuyog Pawar .ai4_peak_bitrate[i4_bitrate_instance_id];
597*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_initial_decoder_delay_frames = (WORD32)(
598*c83a76b0SSuyog Pawar ((f_delay) * (ps_init_prms->s_src_prms.i4_frm_rate_num /
599*c83a76b0SSuyog Pawar (ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
600*c83a76b0SSuyog Pawar .i4_frm_rate_scale_factor *
601*c83a76b0SSuyog Pawar ps_init_prms->s_src_prms.i4_frm_rate_denom))) /
602*c83a76b0SSuyog Pawar 1000);
603*c83a76b0SSuyog Pawar }
604*c83a76b0SSuyog Pawar /*Initial buffer fullness*/
605*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_init_vbv_fullness = ps_init_prms->s_config_prms.i4_init_vbv_fullness;
606*c83a76b0SSuyog Pawar
607*c83a76b0SSuyog Pawar /*Init Qp updation. This seems to be used for pre enc stage of second frame. Needs to be looked into*/
608*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_init_frame_qp_user = ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
609*c83a76b0SSuyog Pawar .ai4_frame_qp[i4_bitrate_instance_id];
610*c83a76b0SSuyog Pawar
611*c83a76b0SSuyog Pawar for(i = 0; i < MAX_SCENE_NUM; i++)
612*c83a76b0SSuyog Pawar {
613*c83a76b0SSuyog Pawar for(j = 0; j < MAX_PIC_TYPE; j++)
614*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i][j] = INIT_HEVCE_QP_RC;
615*c83a76b0SSuyog Pawar }
616*c83a76b0SSuyog Pawar memset(&ps_rc_ctxt->ai4_scene_numbers[0], 0, sizeof(ps_rc_ctxt->ai4_scene_numbers));
617*c83a76b0SSuyog Pawar memset(&ps_rc_ctxt->ai4_scene_num_last_pic[0], 0, sizeof(ps_rc_ctxt->ai4_scene_num_last_pic));
618*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_last_tw0_lyr0_pic_qp[0] = ps_rc_ctxt->i4_min_frame_qp - 1;
619*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_last_tw0_lyr0_pic_qp[1] = ps_rc_ctxt->i4_min_frame_qp - 1;
620*c83a76b0SSuyog Pawar /* SGI & Enc Loop Parallelism related changes*/
621*c83a76b0SSuyog Pawar for(i = 0; i < MAX_NUM_ENC_LOOP_PARALLEL; i++)
622*c83a76b0SSuyog Pawar {
623*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_cur_frm_intra_cost[i] = 0;
624*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_cur_frame_coarse_ME_cost[i] = 0;
625*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_I_model_only_reset[i] = 0;
626*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_non_I_scd_pic[i] = 0;
627*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_pause_to_resume[i] = 0;
628*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_cmplx_change_reset_model[i] = 0;
629*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_cmplx_change_reset_bits[i] = 0;
630*c83a76b0SSuyog Pawar /*initialize assuming 30 percent intra and 70 percent inter weightage*/
631*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_lap_complexity_q7[i] = MODERATE_LAP2_COMPLEXITY_Q7;
632*c83a76b0SSuyog Pawar
633*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_lap_f_sim[i] = MODERATE_FSIM_VALUE;
634*c83a76b0SSuyog Pawar }
635*c83a76b0SSuyog Pawar
636*c83a76b0SSuyog Pawar /*Init variables required to handle entropy and rdopt consumption mismatch*/
637*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_rdopt_bit_count = 0;
638*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_entropy_bit_count = 0;
639*c83a76b0SSuyog Pawar for(i = 0; i < NUM_BUF_RDOPT_ENT_CORRECT; i++)
640*c83a76b0SSuyog Pawar {
641*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_rdopt_bit_consumption_estimate[i] =
642*c83a76b0SSuyog Pawar -1; /*negative bit signifies that value is not populated*/
643*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_rdopt_bit_consumption_buf_id[i] = -1;
644*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_entropy_bit_consumption[i] = -1;
645*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_entropy_bit_consumption_buf_id[i] = -1;
646*c83a76b0SSuyog Pawar }
647*c83a76b0SSuyog Pawar
648*c83a76b0SSuyog Pawar /** scd model reset related param init*/
649*c83a76b0SSuyog Pawar for(i = 0; i < MAX_NUM_TEMPORAL_LAYERS; i++)
650*c83a76b0SSuyog Pawar {
651*c83a76b0SSuyog Pawar ps_rc_ctxt->au4_scene_num_temp_id[i] = 0;
652*c83a76b0SSuyog Pawar }
653*c83a76b0SSuyog Pawar /* SGI & Enc Loop Parallelism related changes*/
654*c83a76b0SSuyog Pawar for(i = 0; i < MAX_NUM_ENC_LOOP_PARALLEL; i++)
655*c83a76b0SSuyog Pawar {
656*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_frame_scd[i] = 0;
657*c83a76b0SSuyog Pawar }
658*c83a76b0SSuyog Pawar
659*c83a76b0SSuyog Pawar /*Stat file pointer passed from applicaition*/
660*c83a76b0SSuyog Pawar ps_rc_ctxt->pf_stat_file = NULL;
661*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_num_frame_read = 0;
662*c83a76b0SSuyog Pawar
663*c83a76b0SSuyog Pawar return ps_rc_ctxt;
664*c83a76b0SSuyog Pawar }
665*c83a76b0SSuyog Pawar
666*c83a76b0SSuyog Pawar /*###############################################*/
667*c83a76b0SSuyog Pawar /******* END OF RC MEM INIT FUNCTIONS **********/
668*c83a76b0SSuyog Pawar /*###############################################*/
669*c83a76b0SSuyog Pawar
670*c83a76b0SSuyog Pawar /*###############################################*/
671*c83a76b0SSuyog Pawar /******* START OF RC INIT FUNCTIONS **************/
672*c83a76b0SSuyog Pawar /*###############################################*/
673*c83a76b0SSuyog Pawar /**
674*c83a76b0SSuyog Pawar ******************************************************************************
675*c83a76b0SSuyog Pawar *
676*c83a76b0SSuyog Pawar * @brief Initialises teh Rate control ctxt
677*c83a76b0SSuyog Pawar *
678*c83a76b0SSuyog Pawar * @par Description
679*c83a76b0SSuyog Pawar *
680*c83a76b0SSuyog Pawar * @param[inout] pv_ctxt
681*c83a76b0SSuyog Pawar * pointer to memory descriptors table
682*c83a76b0SSuyog Pawar *
683*c83a76b0SSuyog Pawar * @param[in] ps_run_time_src_param
684*c83a76b0SSuyog Pawar * Create time static parameters
685*c83a76b0SSuyog Pawar *
686*c83a76b0SSuyog Pawar * @return void
687*c83a76b0SSuyog Pawar *
688*c83a76b0SSuyog Pawar ******************************************************************************
689*c83a76b0SSuyog Pawar */
ihevce_rc_init(void * pv_ctxt,ihevce_src_params_t * ps_run_time_src_param,ihevce_tgt_params_t * ps_tgt_params,rc_quant_t * ps_rc_quant,ihevce_sys_api_t * ps_sys_api,ihevce_lap_params_t * ps_lap_prms,WORD32 i4_num_frame_parallel)690*c83a76b0SSuyog Pawar void ihevce_rc_init(
691*c83a76b0SSuyog Pawar void *pv_ctxt,
692*c83a76b0SSuyog Pawar ihevce_src_params_t *ps_run_time_src_param,
693*c83a76b0SSuyog Pawar ihevce_tgt_params_t *ps_tgt_params,
694*c83a76b0SSuyog Pawar rc_quant_t *ps_rc_quant,
695*c83a76b0SSuyog Pawar ihevce_sys_api_t *ps_sys_api,
696*c83a76b0SSuyog Pawar ihevce_lap_params_t *ps_lap_prms,
697*c83a76b0SSuyog Pawar WORD32 i4_num_frame_parallel)
698*c83a76b0SSuyog Pawar {
699*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
700*c83a76b0SSuyog Pawar WORD32 i, i_temp, j;
701*c83a76b0SSuyog Pawar float f_temp;
702*c83a76b0SSuyog Pawar
703*c83a76b0SSuyog Pawar /*run time width and height has to considered*/
704*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_frame_height = ps_tgt_params->i4_height;
705*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_frame_width = ps_tgt_params->i4_width;
706*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic = ps_run_time_src_param->i4_field_pic;
707*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_num_bit_alloc_period = 0;
708*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_new_bitrate = -1; /*-1 indicates no dynamic change in bitrate request pending*/
709*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_new_peak_bitrate = -1;
710*c83a76b0SSuyog Pawar
711*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_last_frame_scan = 0;
712*c83a76b0SSuyog Pawar
713*c83a76b0SSuyog Pawar memset(ps_rc_ctxt->ai4_offsets, 0, 5 * sizeof(WORD32));
714*c83a76b0SSuyog Pawar
715*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_complexity_bin = 5;
716*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_last_p_or_i_frame_gop = 0;
717*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_qp_at_I_frame_for_skip_sad = 1;
718*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_denominator_i_to_avg = 1;
719*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_fp_bit_alloc_in_sp = 0;
720*c83a76b0SSuyog Pawar
721*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_offsets[0] = 0;
722*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_offsets[1] = 1;
723*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_offsets[2] = 2;
724*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_offsets[3] = 3;
725*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_offsets[4] = 4;
726*c83a76b0SSuyog Pawar
727*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_frames_subgop = 0;
728*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_total_acc_coarse_me_sad = 0;
729*c83a76b0SSuyog Pawar
730*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_L0_frame_qp = 1;
731*c83a76b0SSuyog Pawar
732*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_est_text_bits_ctr_get_qp = 0;
733*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_est_text_bits_ctr_update_qp = 0;
734*c83a76b0SSuyog Pawar
735*c83a76b0SSuyog Pawar /*CAllback functions need to be copied for use inside RC*/
736*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_sys_rc_api = ps_sys_api;
737*c83a76b0SSuyog Pawar
738*c83a76b0SSuyog Pawar f_temp = ((float)(ps_rc_quant->i2_max_qp + ps_rc_quant->i1_qp_offset - 4) / 6);
739*c83a76b0SSuyog Pawar
740*c83a76b0SSuyog Pawar ps_rc_quant->i2_max_qscale = (WORD16)((float)pow(2, f_temp) + 0.5) << 3;
741*c83a76b0SSuyog Pawar
742*c83a76b0SSuyog Pawar f_temp = ((float)(ps_rc_quant->i2_min_qp + ps_rc_quant->i1_qp_offset - 4) / 6);
743*c83a76b0SSuyog Pawar
744*c83a76b0SSuyog Pawar ps_rc_quant->i2_min_qscale = (WORD16)((float)pow(2, f_temp) + 0.5);
745*c83a76b0SSuyog Pawar
746*c83a76b0SSuyog Pawar f_temp =
747*c83a76b0SSuyog Pawar ((float)(51 + ps_rc_quant->i1_qp_offset - 4) /
748*c83a76b0SSuyog Pawar 6); // default MPEG2 to HEVC and HEVC to MPEG2 Qp conversion tables
749*c83a76b0SSuyog Pawar i_temp = (WORD16)((float)pow(2, f_temp) + 0.5);
750*c83a76b0SSuyog Pawar
751*c83a76b0SSuyog Pawar i_temp = (i_temp << 3); // Q3 format is mantained for accuarate calc at lower qp
752*c83a76b0SSuyog Pawar
753*c83a76b0SSuyog Pawar for(i = 0; i <= i_temp; i++)
754*c83a76b0SSuyog Pawar {
755*c83a76b0SSuyog Pawar ps_rc_quant->pi4_qscale_to_qp[i] =
756*c83a76b0SSuyog Pawar ihevce_rc_get_scaled_hevce_qp_q3(i, ps_rc_ctxt->u1_bit_depth);
757*c83a76b0SSuyog Pawar }
758*c83a76b0SSuyog Pawar
759*c83a76b0SSuyog Pawar for(i = (0 - ps_rc_quant->i1_qp_offset); i <= 51; i++)
760*c83a76b0SSuyog Pawar {
761*c83a76b0SSuyog Pawar ps_rc_quant->pi4_qp_to_qscale_q_factor[i + ps_rc_quant->i1_qp_offset] =
762*c83a76b0SSuyog Pawar ihevce_rc_get_scaled_mpeg2_qp_q6(
763*c83a76b0SSuyog Pawar i + ps_rc_quant->i1_qp_offset, ps_rc_ctxt->u1_bit_depth);
764*c83a76b0SSuyog Pawar ps_rc_quant->pi4_qp_to_qscale[i + ps_rc_quant->i1_qp_offset] =
765*c83a76b0SSuyog Pawar ((ps_rc_quant->pi4_qp_to_qscale_q_factor[i + ps_rc_quant->i1_qp_offset] +
766*c83a76b0SSuyog Pawar (1 << (QSCALE_Q_FAC_3 - 1))) >>
767*c83a76b0SSuyog Pawar QSCALE_Q_FAC_3);
768*c83a76b0SSuyog Pawar }
769*c83a76b0SSuyog Pawar
770*c83a76b0SSuyog Pawar if(ps_rc_quant->i2_min_qscale < 1)
771*c83a76b0SSuyog Pawar {
772*c83a76b0SSuyog Pawar ps_rc_quant->i2_min_qscale = 1;
773*c83a76b0SSuyog Pawar }
774*c83a76b0SSuyog Pawar
775*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt = ps_rc_quant;
776*c83a76b0SSuyog Pawar
777*c83a76b0SSuyog Pawar /*Frame rate init*/
778*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_max_frame_rate =
779*c83a76b0SSuyog Pawar ps_run_time_src_param->i4_frm_rate_num / ps_tgt_params->i4_frm_rate_scale_factor;
780*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first = ps_run_time_src_param->i4_topfield_first; /**/
781*c83a76b0SSuyog Pawar /*min and max qp initialization*/
782*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_field_pic == 0)
783*c83a76b0SSuyog Pawar {
784*c83a76b0SSuyog Pawar WORD32 i4_max_qp = 0;
785*c83a76b0SSuyog Pawar
786*c83a76b0SSuyog Pawar if(ps_rc_ctxt->u1_bit_depth == 10)
787*c83a76b0SSuyog Pawar {
788*c83a76b0SSuyog Pawar i4_max_qp = MAX_HEVC_QP_10bit;
789*c83a76b0SSuyog Pawar }
790*c83a76b0SSuyog Pawar else if(ps_rc_ctxt->u1_bit_depth == 12)
791*c83a76b0SSuyog Pawar {
792*c83a76b0SSuyog Pawar i4_max_qp = MAX_HEVC_QP_12bit;
793*c83a76b0SSuyog Pawar }
794*c83a76b0SSuyog Pawar else
795*c83a76b0SSuyog Pawar {
796*c83a76b0SSuyog Pawar i4_max_qp = MAX_HEVC_QP;
797*c83a76b0SSuyog Pawar }
798*c83a76b0SSuyog Pawar
799*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
800*c83a76b0SSuyog Pawar {
801*c83a76b0SSuyog Pawar if((ps_rc_ctxt->i4_init_frame_qp_user + (2 * i) +
802*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset) <=
803*c83a76b0SSuyog Pawar i4_max_qp) //BUG_FIX related to init QP allocation
804*c83a76b0SSuyog Pawar {
805*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_qp[i] = (ps_rc_ctxt->ps_rc_quant_ctxt->pi4_qp_to_qscale
806*c83a76b0SSuyog Pawar [(ps_rc_ctxt->i4_init_frame_qp_user + (2 * i)) +
807*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset] +
808*c83a76b0SSuyog Pawar (1 << (QSCALE_Q_FAC_3 - 1))) >>
809*c83a76b0SSuyog Pawar QSCALE_Q_FAC_3;
810*c83a76b0SSuyog Pawar }
811*c83a76b0SSuyog Pawar else
812*c83a76b0SSuyog Pawar {
813*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_qp[i] =
814*c83a76b0SSuyog Pawar (ps_rc_ctxt->ps_rc_quant_ctxt->pi4_qp_to_qscale[i4_max_qp] +
815*c83a76b0SSuyog Pawar (1 << (QSCALE_Q_FAC_3 - 1))) >>
816*c83a76b0SSuyog Pawar QSCALE_Q_FAC_3; // + ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset];
817*c83a76b0SSuyog Pawar }
818*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_min_max_qp[i * 2] =
819*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt->i2_min_qscale; /*min qp for each picture type*/
820*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_min_max_qp[i * 2 + 1] = ps_rc_ctxt->ps_rc_quant_ctxt->i2_max_qscale >>
821*c83a76b0SSuyog Pawar QSCALE_Q_FAC_3; /*max qp for each picture type*/
822*c83a76b0SSuyog Pawar }
823*c83a76b0SSuyog Pawar }
824*c83a76b0SSuyog Pawar else
825*c83a76b0SSuyog Pawar {
826*c83a76b0SSuyog Pawar WORD32 i4_num_pic_types = MAX_PIC_TYPE;
827*c83a76b0SSuyog Pawar WORD32 i4_max_qp = 0;
828*c83a76b0SSuyog Pawar
829*c83a76b0SSuyog Pawar if(ps_rc_ctxt->u1_bit_depth == 10)
830*c83a76b0SSuyog Pawar {
831*c83a76b0SSuyog Pawar i4_max_qp = MAX_HEVC_QP_10bit;
832*c83a76b0SSuyog Pawar }
833*c83a76b0SSuyog Pawar else if(ps_rc_ctxt->u1_bit_depth == 12)
834*c83a76b0SSuyog Pawar {
835*c83a76b0SSuyog Pawar i4_max_qp = MAX_HEVC_QP_12bit;
836*c83a76b0SSuyog Pawar }
837*c83a76b0SSuyog Pawar else
838*c83a76b0SSuyog Pawar {
839*c83a76b0SSuyog Pawar i4_max_qp = MAX_HEVC_QP;
840*c83a76b0SSuyog Pawar }
841*c83a76b0SSuyog Pawar
842*c83a76b0SSuyog Pawar i4_num_pic_types >>= 1;
843*c83a76b0SSuyog Pawar
844*c83a76b0SSuyog Pawar for(i = 0; i < i4_num_pic_types; i++)
845*c83a76b0SSuyog Pawar {
846*c83a76b0SSuyog Pawar if((ps_rc_ctxt->i4_init_frame_qp_user + (2 * i) +
847*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset) <= i4_max_qp)
848*c83a76b0SSuyog Pawar {
849*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_qp[i] = (ps_rc_ctxt->ps_rc_quant_ctxt->pi4_qp_to_qscale
850*c83a76b0SSuyog Pawar [(ps_rc_ctxt->i4_init_frame_qp_user + (2 * i)) +
851*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset] +
852*c83a76b0SSuyog Pawar (1 << (QSCALE_Q_FAC_3 - 1))) >>
853*c83a76b0SSuyog Pawar QSCALE_Q_FAC_3;
854*c83a76b0SSuyog Pawar
855*c83a76b0SSuyog Pawar if(i != 0)
856*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_qp[i + FIELD_OFFSET] = ps_rc_ctxt->ai4_init_qp[i];
857*c83a76b0SSuyog Pawar }
858*c83a76b0SSuyog Pawar else
859*c83a76b0SSuyog Pawar {
860*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_qp[i] =
861*c83a76b0SSuyog Pawar (ps_rc_ctxt->ps_rc_quant_ctxt->pi4_qp_to_qscale[i4_max_qp] +
862*c83a76b0SSuyog Pawar (1 << (QSCALE_Q_FAC_3 - 1))) >>
863*c83a76b0SSuyog Pawar QSCALE_Q_FAC_3; // + ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset];
864*c83a76b0SSuyog Pawar
865*c83a76b0SSuyog Pawar if(i != 0)
866*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_qp[i + FIELD_OFFSET] = ps_rc_ctxt->ai4_init_qp[i];
867*c83a76b0SSuyog Pawar }
868*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_min_max_qp[i * 2] =
869*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt->i2_min_qscale; /*min qp for each picture type*/
870*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_min_max_qp[i * 2 + 1] = ps_rc_ctxt->ps_rc_quant_ctxt->i2_max_qscale >>
871*c83a76b0SSuyog Pawar QSCALE_Q_FAC_3; /*max qp for each picture type*/
872*c83a76b0SSuyog Pawar if(i != 0)
873*c83a76b0SSuyog Pawar {
874*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_min_max_qp[(i + FIELD_OFFSET) * 2] =
875*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt->i2_min_qscale; /*min qp for each picture type*/
876*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_min_max_qp[(i + FIELD_OFFSET) * 2 + 1] =
877*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt->i2_max_qscale; /*max qp for each picture type*/
878*c83a76b0SSuyog Pawar }
879*c83a76b0SSuyog Pawar }
880*c83a76b0SSuyog Pawar }
881*c83a76b0SSuyog Pawar
882*c83a76b0SSuyog Pawar for(j = 0; i < MAX_NUM_ENC_LOOP_PARALLEL; i++)
883*c83a76b0SSuyog Pawar {
884*c83a76b0SSuyog Pawar /*initialise the coeffs to 1 in case lap is not used */
885*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
886*c83a76b0SSuyog Pawar {
887*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[j][i][0] = 1.0;
888*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[j][i][1] = 0.0;
889*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[j][i][2] = 0.0;
890*c83a76b0SSuyog Pawar }
891*c83a76b0SSuyog Pawar }
892*c83a76b0SSuyog Pawar
893*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_frame_parallel = i4_num_frame_parallel; //ELP_RC
894*c83a76b0SSuyog Pawar i4_num_frame_parallel = (i4_num_frame_parallel > 1) ? i4_num_frame_parallel : 0;
895*c83a76b0SSuyog Pawar
896*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_num_frame_parallel > 1)
897*c83a76b0SSuyog Pawar {
898*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_pre_enc_rc_delay = MAX_PRE_ENC_RC_DELAY;
899*c83a76b0SSuyog Pawar }
900*c83a76b0SSuyog Pawar else
901*c83a76b0SSuyog Pawar {
902*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_pre_enc_rc_delay = MIN_PRE_ENC_RC_DELAY;
903*c83a76b0SSuyog Pawar }
904*c83a76b0SSuyog Pawar /*Bitrate and resolutioon based scene cut min qp*/
905*c83a76b0SSuyog Pawar {
906*c83a76b0SSuyog Pawar /*The min qp for scene cut frame is chosen based on bitrate*/
907*c83a76b0SSuyog Pawar float i4_bpp = ((float)ps_rc_ctxt->u4_avg_bit_rate / ps_rc_ctxt->u4_max_frame_rate) * 1000 /
908*c83a76b0SSuyog Pawar (ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width);
909*c83a76b0SSuyog Pawar if(ps_rc_ctxt->u4_intra_frame_interval == 1)
910*c83a76b0SSuyog Pawar {
911*c83a76b0SSuyog Pawar /*Ultra High resolution)*/
912*c83a76b0SSuyog Pawar if((ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width) > 5000000)
913*c83a76b0SSuyog Pawar {
914*c83a76b0SSuyog Pawar if(i4_bpp > 0.24)
915*c83a76b0SSuyog Pawar {
916*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp = SCD_MIN_HEVC_QP_VHBR;
917*c83a76b0SSuyog Pawar }
918*c83a76b0SSuyog Pawar else if(i4_bpp > 0.16)
919*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp =
920*c83a76b0SSuyog Pawar SCD_MIN_HEVC_QP_HBR; /*corresponds to bitrate greater than 40mbps for 4k 30p*/
921*c83a76b0SSuyog Pawar else
922*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp = SCD_MIN_HEVC_QP;
923*c83a76b0SSuyog Pawar }
924*c83a76b0SSuyog Pawar else
925*c83a76b0SSuyog Pawar {
926*c83a76b0SSuyog Pawar if(i4_bpp > 0.32)
927*c83a76b0SSuyog Pawar {
928*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp = SCD_MIN_HEVC_QP_VHBR;
929*c83a76b0SSuyog Pawar }
930*c83a76b0SSuyog Pawar else if(i4_bpp > 0.24)
931*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp =
932*c83a76b0SSuyog Pawar SCD_MIN_HEVC_QP_HBR; /*corresponds to bitrate greater than 15mbps for 1080 30p*/
933*c83a76b0SSuyog Pawar else
934*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp = SCD_MIN_HEVC_QP;
935*c83a76b0SSuyog Pawar }
936*c83a76b0SSuyog Pawar }
937*c83a76b0SSuyog Pawar else
938*c83a76b0SSuyog Pawar {
939*c83a76b0SSuyog Pawar /*Ultra High resolution)*/
940*c83a76b0SSuyog Pawar if((ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width) > 5000000)
941*c83a76b0SSuyog Pawar {
942*c83a76b0SSuyog Pawar if(i4_bpp > 0.16)
943*c83a76b0SSuyog Pawar {
944*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp = SCD_MIN_HEVC_QP_VHBR;
945*c83a76b0SSuyog Pawar }
946*c83a76b0SSuyog Pawar else if(i4_bpp > 0.08)
947*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp =
948*c83a76b0SSuyog Pawar SCD_MIN_HEVC_QP_HBR; /*corresponds to bitrate greater than 20mbps for 4k 30p*/
949*c83a76b0SSuyog Pawar else
950*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp = SCD_MIN_HEVC_QP;
951*c83a76b0SSuyog Pawar }
952*c83a76b0SSuyog Pawar else
953*c83a76b0SSuyog Pawar {
954*c83a76b0SSuyog Pawar /*Resolution lesser than full HD (including )*/
955*c83a76b0SSuyog Pawar if(i4_bpp > 0.24)
956*c83a76b0SSuyog Pawar {
957*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp = SCD_MIN_HEVC_QP_VHBR;
958*c83a76b0SSuyog Pawar }
959*c83a76b0SSuyog Pawar else if(i4_bpp > 0.16)
960*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp =
961*c83a76b0SSuyog Pawar SCD_MIN_HEVC_QP_HBR; /*corresponds to bitrate greater than 10mbps for 1080 30p*/
962*c83a76b0SSuyog Pawar else
963*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp = SCD_MIN_HEVC_QP;
964*c83a76b0SSuyog Pawar }
965*c83a76b0SSuyog Pawar }
966*c83a76b0SSuyog Pawar }
967*c83a76b0SSuyog Pawar
968*c83a76b0SSuyog Pawar initialise_rate_control(
969*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
970*c83a76b0SSuyog Pawar ps_rc_ctxt->e_rate_control_type,
971*c83a76b0SSuyog Pawar ps_rc_ctxt->u1_is_mb_level_rc_on, //0,/*disabling MB level RC*/
972*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_avg_bit_rate,
973*c83a76b0SSuyog Pawar ps_rc_ctxt->au4_peak_bit_rate,
974*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_min_bit_rate,
975*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_max_frame_rate,
976*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_max_delay, /*max delay in milli seconds based on buffer size*/
977*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_intra_frame_interval,
978*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_idr_period,
979*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_qp,
980*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_max_vbv_buff_size,
981*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_max_inter_frm_int,
982*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_gop_closed,
983*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_min_max_qp, /*min and max qp to be used for each of picture type*/
984*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_use_est_intra_sad,
985*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_src_ticks,
986*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_tgt_ticks,
987*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_frame_height, /*pels in frame considering 420 semi planar format*/
988*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_frame_width,
989*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_active_pic_type,
990*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
991*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_quality_preset,
992*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_frame_in_lap_window,
993*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_initial_decoder_delay_frames,
994*c83a76b0SSuyog Pawar ps_rc_ctxt->f_vbr_max_peak_sustain_dur,
995*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_num_frms_to_encode,
996*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_scd_hevc_qp,
997*c83a76b0SSuyog Pawar ps_rc_ctxt->u1_bit_depth,
998*c83a76b0SSuyog Pawar ps_rc_ctxt->pf_stat_file,
999*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_rc_pass,
1000*c83a76b0SSuyog Pawar ps_rc_ctxt->pv_gop_stat,
1001*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_num_gop_mem_alloc,
1002*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_infinite_gop,
1003*c83a76b0SSuyog Pawar sizeof(ihevce_lap_output_params_t),
1004*c83a76b0SSuyog Pawar sizeof(rc_lap_out_params_t),
1005*c83a76b0SSuyog Pawar (void *)ps_sys_api,
1006*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_fp_bit_alloc_in_sp,
1007*c83a76b0SSuyog Pawar i4_num_frame_parallel,
1008*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_capped_vbr_flag);
1009*c83a76b0SSuyog Pawar
1010*c83a76b0SSuyog Pawar //ps_rc_ctxt->i4_init_vbv_fullness = 500000;
1011*c83a76b0SSuyog Pawar rc_init_set_ebf(ps_rc_ctxt->rc_hdl, ps_rc_ctxt->i4_init_vbv_fullness);
1012*c83a76b0SSuyog Pawar
1013*c83a76b0SSuyog Pawar /*get init qp based on ebf for rate control*/
1014*c83a76b0SSuyog Pawar if(ps_rc_ctxt->e_rate_control_type != CONST_QP)
1015*c83a76b0SSuyog Pawar {
1016*c83a76b0SSuyog Pawar WORD32 I_frame_qp, I_frame_mpeg2_qp;
1017*c83a76b0SSuyog Pawar /*assume moderate fsim*/
1018*c83a76b0SSuyog Pawar WORD32 i4_fsim_global = MODERATE_FSIM_VALUE;
1019*c83a76b0SSuyog Pawar I_frame_mpeg2_qp = rc_get_bpp_based_scene_cut_qp(
1020*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
1021*c83a76b0SSuyog Pawar I_PIC,
1022*c83a76b0SSuyog Pawar ((3 * ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width) >> 1),
1023*c83a76b0SSuyog Pawar i4_fsim_global,
1024*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[0],
1025*c83a76b0SSuyog Pawar 1);
1026*c83a76b0SSuyog Pawar
1027*c83a76b0SSuyog Pawar I_frame_qp = ihevce_rc_get_scaled_hevc_qp_from_qs_q3(
1028*c83a76b0SSuyog Pawar I_frame_mpeg2_qp << QSCALE_Q_FAC_3, ps_rc_ctxt->ps_rc_quant_ctxt);
1029*c83a76b0SSuyog Pawar
1030*c83a76b0SSuyog Pawar I_frame_qp = I_frame_qp + ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset;
1031*c83a76b0SSuyog Pawar
1032*c83a76b0SSuyog Pawar if(I_frame_qp > 44)
1033*c83a76b0SSuyog Pawar I_frame_qp = 44;
1034*c83a76b0SSuyog Pawar
1035*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[I_PIC] = I_frame_qp;
1036*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[P_PIC] = I_frame_qp + 1;
1037*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[B_PIC] = I_frame_qp + 2;
1038*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[B1_PIC] = I_frame_qp + 3;
1039*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[B2_PIC] = I_frame_qp + 4;
1040*c83a76b0SSuyog Pawar /*Bottom fields*/
1041*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[P1_PIC] = I_frame_qp + 1;
1042*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[BB_PIC] = I_frame_qp + 2;
1043*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[B11_PIC] = I_frame_qp + 3;
1044*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[B22_PIC] = I_frame_qp + 4;
1045*c83a76b0SSuyog Pawar
1046*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_pre_enc_qp_read_index = 0;
1047*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_pre_enc_qp_write_index = ps_rc_ctxt->i4_pre_enc_rc_delay - 1;
1048*c83a76b0SSuyog Pawar for(i = 0; i < ps_rc_ctxt->i4_pre_enc_rc_delay; i++)
1049*c83a76b0SSuyog Pawar {
1050*c83a76b0SSuyog Pawar /*initialize it to -1 to indicate it as not produced*/
1051*c83a76b0SSuyog Pawar ps_rc_ctxt->as_pre_enc_qp_queue[i].i4_is_qp_valid = -1;
1052*c83a76b0SSuyog Pawar }
1053*c83a76b0SSuyog Pawar for(i = 0; i < (ps_rc_ctxt->i4_pre_enc_qp_write_index); i++)
1054*c83a76b0SSuyog Pawar {
1055*c83a76b0SSuyog Pawar WORD32 j;
1056*c83a76b0SSuyog Pawar ps_rc_ctxt->as_pre_enc_qp_queue[i].i4_is_qp_valid = 1;
1057*c83a76b0SSuyog Pawar for(j = 0; j < MAX_PIC_TYPE; j++)
1058*c83a76b0SSuyog Pawar {
1059*c83a76b0SSuyog Pawar ps_rc_ctxt->as_pre_enc_qp_queue[i].ai4_quant[j] =
1060*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[j];
1061*c83a76b0SSuyog Pawar ps_rc_ctxt->as_pre_enc_qp_queue[i].i4_scd_qp =
1062*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[I_PIC];
1063*c83a76b0SSuyog Pawar }
1064*c83a76b0SSuyog Pawar }
1065*c83a76b0SSuyog Pawar
1066*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_use_qp_offset_pre_enc = 1;
1067*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_frms_from_reset = 0;
1068*c83a76b0SSuyog Pawar /* SGI & Enc Loop Parallelism related changes*/
1069*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_prev_scene_num = 0;
1070*c83a76b0SSuyog Pawar //ps_rc_ctxt->i4_use_init_qp_for_pre_enc = 0;
1071*c83a76b0SSuyog Pawar for(j = 0; j < MAX_NON_REF_B_PICS_IN_QUEUE_SGI; j++)
1072*c83a76b0SSuyog Pawar {
1073*c83a76b0SSuyog Pawar ps_rc_ctxt->au4_prev_scene_num_multi_scene[j] = 0x3FFFFFFF;
1074*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
1075*c83a76b0SSuyog Pawar {
1076*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_qp_for_previous_scene_multi_scene[j][i] =
1077*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[i];
1078*c83a76b0SSuyog Pawar }
1079*c83a76b0SSuyog Pawar }
1080*c83a76b0SSuyog Pawar
1081*c83a76b0SSuyog Pawar /* SGI & Enc Loop Parallelism related changes*/
1082*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
1083*c83a76b0SSuyog Pawar {
1084*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_qp_for_previous_scene[i] = ps_rc_ctxt->ai4_init_pre_enc_qp[i];
1085*c83a76b0SSuyog Pawar }
1086*c83a76b0SSuyog Pawar }
1087*c83a76b0SSuyog Pawar else
1088*c83a76b0SSuyog Pawar {
1089*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
1090*c83a76b0SSuyog Pawar {
1091*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_init_pre_enc_qp[i] = ps_rc_ctxt->i4_init_frame_qp_user;
1092*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_qp_for_previous_scene[i] = ps_rc_ctxt->i4_init_frame_qp_user;
1093*c83a76b0SSuyog Pawar }
1094*c83a76b0SSuyog Pawar }
1095*c83a76b0SSuyog Pawar }
1096*c83a76b0SSuyog Pawar
1097*c83a76b0SSuyog Pawar /**
1098*c83a76b0SSuyog Pawar ******************************************************************************
1099*c83a76b0SSuyog Pawar *
1100*c83a76b0SSuyog Pawar * @brief Populate common params from lap_out structure to rc_lap_out structure
1101*c83a76b0SSuyog Pawar * Also the init of some rc_lap_out params done here
1102*c83a76b0SSuyog Pawar * @par Description
1103*c83a76b0SSuyog Pawar *
1104*c83a76b0SSuyog Pawar * @param[in] ps_lap_out
1105*c83a76b0SSuyog Pawar * pointer to lap_out structure
1106*c83a76b0SSuyog Pawar *
1107*c83a76b0SSuyog Pawar * @param[out] ps_rc_lap_out
1108*c83a76b0SSuyog Pawar * pointer to rc_lap_out structure
1109*c83a76b0SSuyog Pawar *
1110*c83a76b0SSuyog Pawar * @return void
1111*c83a76b0SSuyog Pawar *
1112*c83a76b0SSuyog Pawar ******************************************************************************
1113*c83a76b0SSuyog Pawar */
1114*c83a76b0SSuyog Pawar
ihevce_rc_populate_common_params(ihevce_lap_output_params_t * ps_lap_out,rc_lap_out_params_t * ps_rc_lap_out)1115*c83a76b0SSuyog Pawar void ihevce_rc_populate_common_params(
1116*c83a76b0SSuyog Pawar ihevce_lap_output_params_t *ps_lap_out, rc_lap_out_params_t *ps_rc_lap_out)
1117*c83a76b0SSuyog Pawar {
1118*c83a76b0SSuyog Pawar /* Update common params */
1119*c83a76b0SSuyog Pawar
1120*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_pic_type = ps_lap_out->i4_pic_type;
1121*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_poc = ps_lap_out->i4_poc;
1122*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_temporal_lyr_id = ps_lap_out->i4_temporal_lyr_id;
1123*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_is_ref_pic = ps_lap_out->i4_is_ref_pic;
1124*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_scene_type = ps_lap_out->i4_scene_type;
1125*c83a76b0SSuyog Pawar ps_rc_lap_out->u4_rc_scene_num = ps_lap_out->u4_scene_num;
1126*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_display_num = ps_lap_out->i4_display_num;
1127*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_quality_preset = ps_lap_out->i4_quality_preset;
1128*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_first_field = ps_lap_out->i4_first_field;
1129*c83a76b0SSuyog Pawar
1130*c83a76b0SSuyog Pawar /*params populated in LAP-2*/
1131*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_frame_acc_coarse_me_cost = -1;
1132*c83a76b0SSuyog Pawar memset(ps_rc_lap_out->ai8_frame_acc_coarse_me_sad, -1, sizeof(WORD32) * 52);
1133*c83a76b0SSuyog Pawar
1134*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_pre_intra_satd = -1;
1135*c83a76b0SSuyog Pawar
1136*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_raw_pre_intra_sad = -1;
1137*c83a76b0SSuyog Pawar
1138*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_raw_l1_coarse_me_sad = -1;
1139*c83a76b0SSuyog Pawar
1140*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_rc_model_needs_to_be_updated = 1;
1141*c83a76b0SSuyog Pawar /* SGI & Enc Loop Parallelism related changes*/
1142*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_ignore_for_rc_update = 0;
1143*c83a76b0SSuyog Pawar
1144*c83a76b0SSuyog Pawar /*For 1 pass HQ I frames*/
1145*c83a76b0SSuyog Pawar
1146*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_complexity_bin = 5;
1147*c83a76b0SSuyog Pawar {
1148*c83a76b0SSuyog Pawar WORD32 ai4_offsets[5] = { 0, 1, 2, 3, 4 };
1149*c83a76b0SSuyog Pawar memmove(ps_rc_lap_out->ai4_offsets, ai4_offsets, sizeof(WORD32) * 5);
1150*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_offsets_set_flag = -1;
1151*c83a76b0SSuyog Pawar }
1152*c83a76b0SSuyog Pawar
1153*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_L1_qp = -1;
1154*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_L0_qp = -1;
1155*c83a76b0SSuyog Pawar }
1156*c83a76b0SSuyog Pawar
1157*c83a76b0SSuyog Pawar /*###############################################*/
1158*c83a76b0SSuyog Pawar /******* END OF RC INIT FUNCTIONS **************/
1159*c83a76b0SSuyog Pawar /*###############################################*/
1160*c83a76b0SSuyog Pawar
1161*c83a76b0SSuyog Pawar /*#########################################################*/
1162*c83a76b0SSuyog Pawar /******* START OF PRE-ENC QP QUERY FUNCTIONS **************/
1163*c83a76b0SSuyog Pawar /*#######################################################*/
1164*c83a76b0SSuyog Pawar
1165*c83a76b0SSuyog Pawar /**
1166*c83a76b0SSuyog Pawar ******************************************************************************
1167*c83a76b0SSuyog Pawar *
1168*c83a76b0SSuyog Pawar * @name ihevce_rc_get_bpp_based_frame_qp
1169*c83a76b0SSuyog Pawar *
1170*c83a76b0SSuyog Pawar * @par Description
1171*c83a76b0SSuyog Pawar *
1172*c83a76b0SSuyog Pawar * @param[in] ps_rc_ctxt - pointer to rc context
1173*c83a76b0SSuyog Pawar * ps_rc_lap_out
1174*c83a76b0SSuyog Pawar * @return frame qp
1175*c83a76b0SSuyog Pawar *
1176*c83a76b0SSuyog Pawar ******************************************************************************
1177*c83a76b0SSuyog Pawar */
ihevce_rc_get_bpp_based_frame_qp(void * pv_rc_ctxt,rc_lap_out_params_t * ps_rc_lap_out)1178*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_bpp_based_frame_qp(void *pv_rc_ctxt, rc_lap_out_params_t *ps_rc_lap_out)
1179*c83a76b0SSuyog Pawar {
1180*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_rc_ctxt;
1181*c83a76b0SSuyog Pawar WORD32 i4_frame_qs_q3, i4_hevc_frame_qp, i;
1182*c83a76b0SSuyog Pawar frame_info_t *ps_frame_info;
1183*c83a76b0SSuyog Pawar picture_type_e rc_pic_type = ihevce_rc_conv_pic_type(
1184*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_rc_lap_out->i4_rc_pic_type,
1185*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
1186*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_temporal_lyr_id,
1187*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_bottom_field,
1188*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
1189*c83a76b0SSuyog Pawar /*initialise the coeffs to 1 in case lap is not used */
1190*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
1191*c83a76b0SSuyog Pawar {
1192*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[0][i][0] = 1.0;
1193*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[0][i][1] = 0.0;
1194*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[0][i][2] = 0.0;
1195*c83a76b0SSuyog Pawar }
1196*c83a76b0SSuyog Pawar {
1197*c83a76b0SSuyog Pawar /*scene cut handling during pre-enc stage*/
1198*c83a76b0SSuyog Pawar /*assume lap fsim as 117. not used since ratio is direclt sent*/
1199*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_rc_scene_type == SCENE_TYPE_SCENE_CUT)
1200*c83a76b0SSuyog Pawar {
1201*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
1202*c83a76b0SSuyog Pawar {
1203*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_est_L0_satd[i] = -1;
1204*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_hme_sad[i] = -1;
1205*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_pre_intra_sad[i] = -1;
1206*c83a76b0SSuyog Pawar }
1207*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_est_L0_intra_sad_available = 0;
1208*c83a76b0SSuyog Pawar }
1209*c83a76b0SSuyog Pawar
1210*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_rc_scene_type == SCENE_TYPE_SCENE_CUT ||
1211*c83a76b0SSuyog Pawar !ps_rc_ctxt->i4_is_est_L0_intra_sad_available)
1212*c83a76b0SSuyog Pawar {
1213*c83a76b0SSuyog Pawar /*compute bpp based qp if current frame is scene cut or data is not sufficient*/
1214*c83a76b0SSuyog Pawar i4_frame_qs_q3 = rc_get_bpp_based_scene_cut_qp(
1215*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
1216*c83a76b0SSuyog Pawar I_PIC,
1217*c83a76b0SSuyog Pawar ((3 * ps_rc_lap_out->i4_num_pels_in_frame_considered) >> 1),
1218*c83a76b0SSuyog Pawar 117,
1219*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[0],
1220*c83a76b0SSuyog Pawar 0);
1221*c83a76b0SSuyog Pawar i4_frame_qs_q3 = i4_frame_qs_q3 << QSCALE_Q_FAC_3;
1222*c83a76b0SSuyog Pawar }
1223*c83a76b0SSuyog Pawar else
1224*c83a76b0SSuyog Pawar {
1225*c83a76b0SSuyog Pawar /*using previous one sub-gop data calculate i to rest ratio and qp assuming it is I frame*/
1226*c83a76b0SSuyog Pawar WORD32 i4_num_b, i, ai4_pic_dist[MAX_PIC_TYPE], index, i4_total_bits;
1227*c83a76b0SSuyog Pawar LWORD64 i8_average_pre_intra_sad = 0, i8_average_est_l0_satd_by_act = 0;
1228*c83a76b0SSuyog Pawar double lambda_modifier[MAX_PIC_TYPE], complexity[MAX_PIC_TYPE], den = 0.0f,
1229*c83a76b0SSuyog Pawar i_to_rest_bit_ratio;
1230*c83a76b0SSuyog Pawar WORD32 i4_curr_bits_estimated = 0;
1231*c83a76b0SSuyog Pawar
1232*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
1233*c83a76b0SSuyog Pawar {
1234*c83a76b0SSuyog Pawar complexity[i] = 0;
1235*c83a76b0SSuyog Pawar lambda_modifier[i] = 0;
1236*c83a76b0SSuyog Pawar ai4_pic_dist[i] = 0;
1237*c83a76b0SSuyog Pawar }
1238*c83a76b0SSuyog Pawar
1239*c83a76b0SSuyog Pawar index = ihevce_get_offline_index(
1240*c83a76b0SSuyog Pawar ps_rc_ctxt, ps_rc_lap_out->i4_num_pels_in_frame_considered);
1241*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_max_temporal_lyr)
1242*c83a76b0SSuyog Pawar {
1243*c83a76b0SSuyog Pawar i4_num_b = ((WORD32)pow((float)2, ps_rc_ctxt->i4_max_temporal_lyr)) - 1;
1244*c83a76b0SSuyog Pawar }
1245*c83a76b0SSuyog Pawar else
1246*c83a76b0SSuyog Pawar {
1247*c83a76b0SSuyog Pawar i4_num_b = 0;
1248*c83a76b0SSuyog Pawar }
1249*c83a76b0SSuyog Pawar
1250*c83a76b0SSuyog Pawar lambda_modifier[I_PIC] =
1251*c83a76b0SSuyog Pawar ihevce_get_frame_lambda_modifier((WORD8)I_PIC, 0, 1, 1, i4_num_b);
1252*c83a76b0SSuyog Pawar lambda_modifier[P_PIC] =
1253*c83a76b0SSuyog Pawar ihevce_get_frame_lambda_modifier((WORD8)P_PIC, 0, 1, 1, i4_num_b) *
1254*c83a76b0SSuyog Pawar pow((float)1.125, 1);
1255*c83a76b0SSuyog Pawar lambda_modifier[B_PIC] =
1256*c83a76b0SSuyog Pawar ihevce_get_frame_lambda_modifier(
1257*c83a76b0SSuyog Pawar (WORD8)B_PIC, 1, (ps_rc_ctxt->i4_max_temporal_lyr > 1), 1, i4_num_b) *
1258*c83a76b0SSuyog Pawar pow((float)1.125, 2);
1259*c83a76b0SSuyog Pawar lambda_modifier[B1_PIC] =
1260*c83a76b0SSuyog Pawar ihevce_get_frame_lambda_modifier(
1261*c83a76b0SSuyog Pawar (WORD8)B1_PIC, 2, 1, (ps_rc_ctxt->i4_max_temporal_lyr > 2), i4_num_b) *
1262*c83a76b0SSuyog Pawar pow((float)1.125, 3);
1263*c83a76b0SSuyog Pawar lambda_modifier[B2_PIC] =
1264*c83a76b0SSuyog Pawar ihevce_get_frame_lambda_modifier((WORD8)B2_PIC, 3, 1, 0, i4_num_b) *
1265*c83a76b0SSuyog Pawar pow((float)1.125, 4);
1266*c83a76b0SSuyog Pawar
1267*c83a76b0SSuyog Pawar /*consider average of one sub-gop for intra sad*/
1268*c83a76b0SSuyog Pawar
1269*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_quality_preset == IHEVCE_QUALITY_P6)
1270*c83a76b0SSuyog Pawar {
1271*c83a76b0SSuyog Pawar for(i = 0; i < 2; i++)
1272*c83a76b0SSuyog Pawar {
1273*c83a76b0SSuyog Pawar i8_average_pre_intra_sad += ps_rc_ctxt->ai8_prev_frame_pre_intra_sad[i];
1274*c83a76b0SSuyog Pawar i8_average_est_l0_satd_by_act += ps_rc_ctxt->ai8_prev_frame_est_L0_satd[i];
1275*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_field_pic == 1 && i != 0)
1276*c83a76b0SSuyog Pawar {
1277*c83a76b0SSuyog Pawar i8_average_pre_intra_sad +=
1278*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_pre_intra_sad[i + FIELD_OFFSET];
1279*c83a76b0SSuyog Pawar i8_average_est_l0_satd_by_act +=
1280*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_est_L0_satd[i + FIELD_OFFSET];
1281*c83a76b0SSuyog Pawar }
1282*c83a76b0SSuyog Pawar }
1283*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_field_pic == 1)
1284*c83a76b0SSuyog Pawar {
1285*c83a76b0SSuyog Pawar i8_average_pre_intra_sad /= 3;
1286*c83a76b0SSuyog Pawar i8_average_est_l0_satd_by_act /= 3;
1287*c83a76b0SSuyog Pawar }
1288*c83a76b0SSuyog Pawar else
1289*c83a76b0SSuyog Pawar {
1290*c83a76b0SSuyog Pawar i8_average_pre_intra_sad <<= 1;
1291*c83a76b0SSuyog Pawar i8_average_est_l0_satd_by_act <<= 1;
1292*c83a76b0SSuyog Pawar }
1293*c83a76b0SSuyog Pawar }
1294*c83a76b0SSuyog Pawar else
1295*c83a76b0SSuyog Pawar {
1296*c83a76b0SSuyog Pawar for(i = 0; i < ps_rc_ctxt->i4_num_active_pic_type; i++)
1297*c83a76b0SSuyog Pawar {
1298*c83a76b0SSuyog Pawar i8_average_pre_intra_sad += ps_rc_ctxt->ai8_prev_frame_pre_intra_sad[i];
1299*c83a76b0SSuyog Pawar i8_average_est_l0_satd_by_act += ps_rc_ctxt->ai8_prev_frame_est_L0_satd[i];
1300*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_field_pic == 1 && i != 0)
1301*c83a76b0SSuyog Pawar {
1302*c83a76b0SSuyog Pawar i8_average_pre_intra_sad +=
1303*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_pre_intra_sad[i + FIELD_OFFSET];
1304*c83a76b0SSuyog Pawar i8_average_est_l0_satd_by_act +=
1305*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_est_L0_satd[i + FIELD_OFFSET];
1306*c83a76b0SSuyog Pawar }
1307*c83a76b0SSuyog Pawar }
1308*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_field_pic == 1)
1309*c83a76b0SSuyog Pawar {
1310*c83a76b0SSuyog Pawar i8_average_pre_intra_sad /= ((i << 1) - 1);
1311*c83a76b0SSuyog Pawar i8_average_est_l0_satd_by_act /= ((i << 1) - 1);
1312*c83a76b0SSuyog Pawar }
1313*c83a76b0SSuyog Pawar else
1314*c83a76b0SSuyog Pawar {
1315*c83a76b0SSuyog Pawar i8_average_pre_intra_sad /= i;
1316*c83a76b0SSuyog Pawar i8_average_est_l0_satd_by_act /= i;
1317*c83a76b0SSuyog Pawar }
1318*c83a76b0SSuyog Pawar }
1319*c83a76b0SSuyog Pawar
1320*c83a76b0SSuyog Pawar /*no lambda modifier is considered for I pic as other lambda are scaled according to I frame lambda*/
1321*c83a76b0SSuyog Pawar complexity[I_PIC] = (double)i8_average_pre_intra_sad;
1322*c83a76b0SSuyog Pawar
1323*c83a76b0SSuyog Pawar for(i = 1; i < ps_rc_ctxt->i4_num_active_pic_type; i++)
1324*c83a76b0SSuyog Pawar {
1325*c83a76b0SSuyog Pawar #if !USE_SQRT
1326*c83a76b0SSuyog Pawar complexity[i] = ps_rc_ctxt->ai8_prev_frame_hme_sad[i] / pow(1.125, i);
1327*c83a76b0SSuyog Pawar
1328*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_field_pic == 1)
1329*c83a76b0SSuyog Pawar {
1330*c83a76b0SSuyog Pawar complexity[i + FIELD_OFFSET] =
1331*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_hme_sad[i + FIELD_OFFSET] / pow(1.125, i);
1332*c83a76b0SSuyog Pawar }
1333*c83a76b0SSuyog Pawar #else
1334*c83a76b0SSuyog Pawar complexity[i] = ps_rc_ctxt->ai8_prev_frame_hme_sad[i] /
1335*c83a76b0SSuyog Pawar (sqrt(lambda_modifier[i] / lambda_modifier[I_PIC]) * pow(1.125, i));
1336*c83a76b0SSuyog Pawar #endif
1337*c83a76b0SSuyog Pawar }
1338*c83a76b0SSuyog Pawar /*get picture type distribution in LAP*/
1339*c83a76b0SSuyog Pawar rc_get_pic_distribution(ps_rc_ctxt->rc_hdl, &ai4_pic_dist[0]);
1340*c83a76b0SSuyog Pawar
1341*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
1342*c83a76b0SSuyog Pawar {
1343*c83a76b0SSuyog Pawar den += complexity[i] * ai4_pic_dist[i];
1344*c83a76b0SSuyog Pawar }
1345*c83a76b0SSuyog Pawar /*subtract I frame complexity to get I to rest ratio*/
1346*c83a76b0SSuyog Pawar {
1347*c83a76b0SSuyog Pawar WORD32 num_inter_pic = 0;
1348*c83a76b0SSuyog Pawar for(i = 1; i < MAX_PIC_TYPE; i++)
1349*c83a76b0SSuyog Pawar {
1350*c83a76b0SSuyog Pawar num_inter_pic += ai4_pic_dist[i];
1351*c83a76b0SSuyog Pawar }
1352*c83a76b0SSuyog Pawar if(num_inter_pic > 0)
1353*c83a76b0SSuyog Pawar den = (den - (complexity[I_PIC] * ai4_pic_dist[I_PIC])) / num_inter_pic;
1354*c83a76b0SSuyog Pawar else
1355*c83a76b0SSuyog Pawar den = complexity[I_PIC];
1356*c83a76b0SSuyog Pawar }
1357*c83a76b0SSuyog Pawar
1358*c83a76b0SSuyog Pawar if(den > 0)
1359*c83a76b0SSuyog Pawar i_to_rest_bit_ratio = (float)((complexity[I_PIC]) / den);
1360*c83a76b0SSuyog Pawar else
1361*c83a76b0SSuyog Pawar i_to_rest_bit_ratio = 15;
1362*c83a76b0SSuyog Pawar
1363*c83a76b0SSuyog Pawar /*get qp for scene cut frame based on offline data*/
1364*c83a76b0SSuyog Pawar i4_frame_qs_q3 = rc_get_qp_for_scd_frame(
1365*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
1366*c83a76b0SSuyog Pawar I_PIC,
1367*c83a76b0SSuyog Pawar i8_average_est_l0_satd_by_act,
1368*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_num_pels_in_frame_considered,
1369*c83a76b0SSuyog Pawar -1,
1370*c83a76b0SSuyog Pawar MODERATE_FSIM_VALUE,
1371*c83a76b0SSuyog Pawar (void *)&g_offline_i_model_coeff[index][0],
1372*c83a76b0SSuyog Pawar (float)i_to_rest_bit_ratio,
1373*c83a76b0SSuyog Pawar 0,
1374*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[0],
1375*c83a76b0SSuyog Pawar ps_rc_lap_out->ps_frame_info,
1376*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_rc_pass,
1377*c83a76b0SSuyog Pawar 0,
1378*c83a76b0SSuyog Pawar 0,
1379*c83a76b0SSuyog Pawar 0,
1380*c83a76b0SSuyog Pawar &i4_total_bits,
1381*c83a76b0SSuyog Pawar &i4_curr_bits_estimated,
1382*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_use_offline_model_2pass,
1383*c83a76b0SSuyog Pawar 0,
1384*c83a76b0SSuyog Pawar 0,
1385*c83a76b0SSuyog Pawar -1,
1386*c83a76b0SSuyog Pawar NULL);
1387*c83a76b0SSuyog Pawar }
1388*c83a76b0SSuyog Pawar
1389*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
1390*c83a76b0SSuyog Pawar ihevce_rc_get_scaled_hevc_qp_from_qs_q3(i4_frame_qs_q3, ps_rc_ctxt->ps_rc_quant_ctxt);
1391*c83a76b0SSuyog Pawar
1392*c83a76b0SSuyog Pawar i4_hevc_frame_qp = i4_hevc_frame_qp + ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset;
1393*c83a76b0SSuyog Pawar
1394*c83a76b0SSuyog Pawar if(i4_hevc_frame_qp > ps_rc_ctxt->ps_rc_quant_ctxt->i2_max_qp)
1395*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ps_rc_ctxt->ps_rc_quant_ctxt->i2_max_qp;
1396*c83a76b0SSuyog Pawar
1397*c83a76b0SSuyog Pawar /*offset depending on current picture type*/
1398*c83a76b0SSuyog Pawar if(rc_pic_type != I_PIC)
1399*c83a76b0SSuyog Pawar i4_hevc_frame_qp += ps_rc_lap_out->i4_rc_temporal_lyr_id + 1;
1400*c83a76b0SSuyog Pawar /*clip min and max qp to be within range*/
1401*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ihevce_clip_min_max_qp(
1402*c83a76b0SSuyog Pawar ps_rc_ctxt, i4_hevc_frame_qp, rc_pic_type, ps_rc_lap_out->i4_rc_temporal_lyr_id);
1403*c83a76b0SSuyog Pawar
1404*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_qp_for_previous_scene_pre_enc[rc_pic_type] = i4_hevc_frame_qp;
1405*c83a76b0SSuyog Pawar ps_rc_ctxt->au4_prev_scene_num_pre_enc[rc_pic_type] = ps_rc_lap_out->u4_rc_scene_num;
1406*c83a76b0SSuyog Pawar }
1407*c83a76b0SSuyog Pawar
1408*c83a76b0SSuyog Pawar return i4_hevc_frame_qp;
1409*c83a76b0SSuyog Pawar }
1410*c83a76b0SSuyog Pawar /**
1411*c83a76b0SSuyog Pawar ******************************************************************************
1412*c83a76b0SSuyog Pawar *
1413*c83a76b0SSuyog Pawar * @name ihevce_rc_get_pre_enc_pic_quant
1414*c83a76b0SSuyog Pawar *
1415*c83a76b0SSuyog Pawar * @par Description - Called from ihevce_rc_cal_pre_enc_qp. updates frame qp
1416*c83a76b0SSuyog Pawar * which will be used by next frame of same pic type in
1417*c83a76b0SSuyog Pawar * pre-enc stage
1418*c83a76b0SSuyog Pawar *
1419*c83a76b0SSuyog Pawar * @param[in] ps_rc_ctxt - pointer to rc context
1420*c83a76b0SSuyog Pawar * @return void
1421*c83a76b0SSuyog Pawar *
1422*c83a76b0SSuyog Pawar ******************************************************************************
1423*c83a76b0SSuyog Pawar */
1424*c83a76b0SSuyog Pawar WORD32
ihevce_rc_get_pre_enc_pic_quant(void * pv_ctxt,picture_type_e rc_pic_type,WORD32 * pi4_scd_qp)1425*c83a76b0SSuyog Pawar ihevce_rc_get_pre_enc_pic_quant(void *pv_ctxt, picture_type_e rc_pic_type, WORD32 *pi4_scd_qp)
1426*c83a76b0SSuyog Pawar {
1427*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
1428*c83a76b0SSuyog Pawar WORD32 i4_frame_qp, i4_frame_qp_q6, i4_hevc_frame_qp = -1;
1429*c83a76b0SSuyog Pawar WORD32 i4_max_frame_bits = (1 << 30);
1430*c83a76b0SSuyog Pawar WORD32 i4_temporal_layer_id, i4_is_bottom_field, i4_cur_est_texture_bits;
1431*c83a76b0SSuyog Pawar
1432*c83a76b0SSuyog Pawar ihevce_rc_get_pic_param(rc_pic_type, &i4_temporal_layer_id, &i4_is_bottom_field);
1433*c83a76b0SSuyog Pawar
1434*c83a76b0SSuyog Pawar {
1435*c83a76b0SSuyog Pawar WORD32 is_scd_ref_frame = 0, i4_num_scd_in_lap_window = 0, num_frames_b4_scd = 0;
1436*c83a76b0SSuyog Pawar
1437*c83a76b0SSuyog Pawar /*treat even first frame as scd frame*/
1438*c83a76b0SSuyog Pawar if(!ps_rc_ctxt->i4_is_first_frame_encoded)
1439*c83a76b0SSuyog Pawar {
1440*c83a76b0SSuyog Pawar is_scd_ref_frame = 1;
1441*c83a76b0SSuyog Pawar }
1442*c83a76b0SSuyog Pawar
1443*c83a76b0SSuyog Pawar {
1444*c83a76b0SSuyog Pawar /*Only I frames are considered as scd pic during pre-enc*/
1445*c83a76b0SSuyog Pawar is_scd_ref_frame &= (rc_pic_type == I_PIC);
1446*c83a76b0SSuyog Pawar }
1447*c83a76b0SSuyog Pawar
1448*c83a76b0SSuyog Pawar rc_set_num_scd_in_lap_window(
1449*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl, i4_num_scd_in_lap_window, num_frames_b4_scd);
1450*c83a76b0SSuyog Pawar
1451*c83a76b0SSuyog Pawar /** Pre-enc thread as of now SCD handling is not present */
1452*c83a76b0SSuyog Pawar //if(!(is_scd_ref_frame || ps_rc_ctxt->i4_is_pause_to_resume) || call_type == PRE_ENC_GET_QP)
1453*c83a76b0SSuyog Pawar {
1454*c83a76b0SSuyog Pawar WORD32 i4_is_first_frame_coded;
1455*c83a76b0SSuyog Pawar /*Once first frame has been encoded use prev frame intra satd and cur frame satd to alter est intra sad for cur frame*/
1456*c83a76b0SSuyog Pawar i4_is_first_frame_coded = is_first_frame_coded(ps_rc_ctxt->rc_hdl);
1457*c83a76b0SSuyog Pawar {
1458*c83a76b0SSuyog Pawar int i;
1459*c83a76b0SSuyog Pawar WORD32 i4_curr_bits_estimated, i4_is_model_valid;
1460*c83a76b0SSuyog Pawar /*initialise the coeffs to 1 and 0in case lap is not used */
1461*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
1462*c83a76b0SSuyog Pawar {
1463*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[0][i][0] = 1.0;
1464*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[0][i][1] = 0.0;
1465*c83a76b0SSuyog Pawar }
1466*c83a76b0SSuyog Pawar
1467*c83a76b0SSuyog Pawar i4_frame_qp_q6 = get_frame_level_qp(
1468*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
1469*c83a76b0SSuyog Pawar rc_pic_type,
1470*c83a76b0SSuyog Pawar i4_max_frame_bits,
1471*c83a76b0SSuyog Pawar &i4_cur_est_texture_bits, //this value is returned by rc
1472*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[0],
1473*c83a76b0SSuyog Pawar 0,
1474*c83a76b0SSuyog Pawar 8.0f,
1475*c83a76b0SSuyog Pawar NULL,
1476*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_complexity_bin,
1477*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_scene_num_latest, /*no pause resume concept*/
1478*c83a76b0SSuyog Pawar &i4_curr_bits_estimated,
1479*c83a76b0SSuyog Pawar &i4_is_model_valid,
1480*c83a76b0SSuyog Pawar NULL,
1481*c83a76b0SSuyog Pawar NULL,
1482*c83a76b0SSuyog Pawar NULL,
1483*c83a76b0SSuyog Pawar NULL,
1484*c83a76b0SSuyog Pawar NULL,
1485*c83a76b0SSuyog Pawar NULL);
1486*c83a76b0SSuyog Pawar
1487*c83a76b0SSuyog Pawar /** The usage of global table will truncate the input given as qp format and hence will not return very low qp values desirable at very
1488*c83a76b0SSuyog Pawar low bitrate. Hence on the fly calculation is enabled*/
1489*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
1490*c83a76b0SSuyog Pawar ihevce_rc_get_scaled_hevce_qp_q6(i4_frame_qp_q6, ps_rc_ctxt->u1_bit_depth);
1491*c83a76b0SSuyog Pawar
1492*c83a76b0SSuyog Pawar if(rc_pic_type == I_PIC)
1493*c83a76b0SSuyog Pawar {
1494*c83a76b0SSuyog Pawar /*scene cut handling during pre-enc stage*/
1495*c83a76b0SSuyog Pawar i4_frame_qp = rc_get_bpp_based_scene_cut_qp(
1496*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
1497*c83a76b0SSuyog Pawar rc_pic_type,
1498*c83a76b0SSuyog Pawar ((3 * ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width) >> 1),
1499*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_lap_f_sim[0],
1500*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[0],
1501*c83a76b0SSuyog Pawar 0);
1502*c83a76b0SSuyog Pawar
1503*c83a76b0SSuyog Pawar *pi4_scd_qp = ihevce_rc_get_scaled_hevc_qp_from_qs_q3(
1504*c83a76b0SSuyog Pawar i4_frame_qp << QSCALE_Q_FAC_3, ps_rc_ctxt->ps_rc_quant_ctxt);
1505*c83a76b0SSuyog Pawar *pi4_scd_qp = *pi4_scd_qp + ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset;
1506*c83a76b0SSuyog Pawar if(*pi4_scd_qp > ps_rc_ctxt->ps_rc_quant_ctxt->i2_max_qp)
1507*c83a76b0SSuyog Pawar *pi4_scd_qp = ps_rc_ctxt->ps_rc_quant_ctxt->i2_max_qp;
1508*c83a76b0SSuyog Pawar }
1509*c83a76b0SSuyog Pawar else
1510*c83a76b0SSuyog Pawar {
1511*c83a76b0SSuyog Pawar /*scene cut qp is only valid when queried for I_PIC*/
1512*c83a76b0SSuyog Pawar *pi4_scd_qp = i4_hevc_frame_qp;
1513*c83a76b0SSuyog Pawar }
1514*c83a76b0SSuyog Pawar }
1515*c83a76b0SSuyog Pawar }
1516*c83a76b0SSuyog Pawar
1517*c83a76b0SSuyog Pawar ASSERT(i4_hevc_frame_qp >= (-ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset));
1518*c83a76b0SSuyog Pawar
1519*c83a76b0SSuyog Pawar /*constraint qp swing based on neighbour frames*/
1520*c83a76b0SSuyog Pawar if(is_first_frame_coded(ps_rc_ctxt->rc_hdl))
1521*c83a76b0SSuyog Pawar {
1522*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_field_pic == 0)
1523*c83a76b0SSuyog Pawar {
1524*c83a76b0SSuyog Pawar if((rc_pic_type != I_PIC && rc_pic_type != P_PIC) &&
1525*c83a76b0SSuyog Pawar i4_hevc_frame_qp >
1526*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[ps_rc_ctxt->i4_scene_num_latest]
1527*c83a76b0SSuyog Pawar [rc_pic_type - 1] +
1528*c83a76b0SSuyog Pawar 3)
1529*c83a76b0SSuyog Pawar {
1530*c83a76b0SSuyog Pawar /*allow max of +3 compared to previous frame*/
1531*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
1532*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[ps_rc_ctxt->i4_scene_num_latest]
1533*c83a76b0SSuyog Pawar [rc_pic_type - 1] +
1534*c83a76b0SSuyog Pawar 3;
1535*c83a76b0SSuyog Pawar }
1536*c83a76b0SSuyog Pawar if((rc_pic_type != I_PIC && rc_pic_type != P_PIC) &&
1537*c83a76b0SSuyog Pawar i4_hevc_frame_qp <
1538*c83a76b0SSuyog Pawar (ps_rc_ctxt->ai4_prev_pic_hevc_qp[ps_rc_ctxt->i4_scene_num_latest]
1539*c83a76b0SSuyog Pawar [rc_pic_type - 1]))
1540*c83a76b0SSuyog Pawar {
1541*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
1542*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[ps_rc_ctxt->i4_scene_num_latest]
1543*c83a76b0SSuyog Pawar [rc_pic_type - 1];
1544*c83a76b0SSuyog Pawar }
1545*c83a76b0SSuyog Pawar
1546*c83a76b0SSuyog Pawar /** Force non-ref B pic qp to be ref_B_PIC_qp - 1. This is not valid for when max teporla later is less than 2*/
1547*c83a76b0SSuyog Pawar if(i4_temporal_layer_id == ps_rc_ctxt->i4_max_temporal_lyr &&
1548*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_max_temporal_lyr > 1)
1549*c83a76b0SSuyog Pawar {
1550*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
1551*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[ps_rc_ctxt->i4_scene_num_latest]
1552*c83a76b0SSuyog Pawar [rc_pic_type - 1] +
1553*c83a76b0SSuyog Pawar 1;
1554*c83a76b0SSuyog Pawar }
1555*c83a76b0SSuyog Pawar }
1556*c83a76b0SSuyog Pawar else /*for field case*/
1557*c83a76b0SSuyog Pawar {
1558*c83a76b0SSuyog Pawar if(i4_temporal_layer_id >= 1)
1559*c83a76b0SSuyog Pawar {
1560*c83a76b0SSuyog Pawar /*To make the comparison of qp with the top field's of previous layer tempor layer id matches with the pic type. */
1561*c83a76b0SSuyog Pawar if(i4_hevc_frame_qp >
1562*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[ps_rc_ctxt->i4_scene_num_latest]
1563*c83a76b0SSuyog Pawar [i4_temporal_layer_id] +
1564*c83a76b0SSuyog Pawar 3)
1565*c83a76b0SSuyog Pawar {
1566*c83a76b0SSuyog Pawar /*allow max of +3 compared to previous frame*/
1567*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
1568*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[ps_rc_ctxt->i4_scene_num_latest]
1569*c83a76b0SSuyog Pawar [i4_temporal_layer_id] +
1570*c83a76b0SSuyog Pawar 3;
1571*c83a76b0SSuyog Pawar }
1572*c83a76b0SSuyog Pawar if(i4_hevc_frame_qp <
1573*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[ps_rc_ctxt->i4_scene_num_latest]
1574*c83a76b0SSuyog Pawar [i4_temporal_layer_id])
1575*c83a76b0SSuyog Pawar {
1576*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
1577*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[ps_rc_ctxt->i4_scene_num_latest]
1578*c83a76b0SSuyog Pawar [i4_temporal_layer_id];
1579*c83a76b0SSuyog Pawar }
1580*c83a76b0SSuyog Pawar /** Force non-ref B pic qp to be ref_B_PIC_qp - 1. This is not valid for when max teporla later is less than 2*/
1581*c83a76b0SSuyog Pawar if(i4_temporal_layer_id == ps_rc_ctxt->i4_max_temporal_lyr &&
1582*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_max_temporal_lyr > 1)
1583*c83a76b0SSuyog Pawar {
1584*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
1585*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[ps_rc_ctxt->i4_scene_num_latest]
1586*c83a76b0SSuyog Pawar [i4_temporal_layer_id] +
1587*c83a76b0SSuyog Pawar 1;
1588*c83a76b0SSuyog Pawar }
1589*c83a76b0SSuyog Pawar }
1590*c83a76b0SSuyog Pawar }
1591*c83a76b0SSuyog Pawar }
1592*c83a76b0SSuyog Pawar
1593*c83a76b0SSuyog Pawar #if USE_USER_FIRST_FRAME_QP
1594*c83a76b0SSuyog Pawar /*I_PIC check is necessary coz pre-enc can query for qp even before first frame update has happened*/
1595*c83a76b0SSuyog Pawar if(!ps_rc_ctxt->i4_is_first_frame_encoded && rc_pic_type == I_PIC)
1596*c83a76b0SSuyog Pawar {
1597*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ps_rc_ctxt->i4_init_frame_qp_user;
1598*c83a76b0SSuyog Pawar DBG_PRINTF("FIXED START QP PATH *************************\n");
1599*c83a76b0SSuyog Pawar }
1600*c83a76b0SSuyog Pawar #endif
1601*c83a76b0SSuyog Pawar /**clip to min qp which is user configurable*/
1602*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
1603*c83a76b0SSuyog Pawar ihevce_clip_min_max_qp(ps_rc_ctxt, i4_hevc_frame_qp, rc_pic_type, i4_temporal_layer_id);
1604*c83a76b0SSuyog Pawar
1605*c83a76b0SSuyog Pawar return i4_hevc_frame_qp;
1606*c83a76b0SSuyog Pawar }
1607*c83a76b0SSuyog Pawar }
1608*c83a76b0SSuyog Pawar /**
1609*c83a76b0SSuyog Pawar ******************************************************************************
1610*c83a76b0SSuyog Pawar *
1611*c83a76b0SSuyog Pawar * @name ihevce_rc_cal_pre_enc_qp
1612*c83a76b0SSuyog Pawar *
1613*c83a76b0SSuyog Pawar * @par Description - Called from enc_loop_init. updates frame qp which will
1614*c83a76b0SSuyog Pawar be used by next frame of same pic type in pre-enc stage
1615*c83a76b0SSuyog Pawar *
1616*c83a76b0SSuyog Pawar * @param[in] ps_rc_ctxt - pointer to rc context
1617*c83a76b0SSuyog Pawar * @return void
1618*c83a76b0SSuyog Pawar *
1619*c83a76b0SSuyog Pawar ******************************************************************************
1620*c83a76b0SSuyog Pawar */
ihevce_rc_cal_pre_enc_qp(void * pv_rc_ctxt)1621*c83a76b0SSuyog Pawar void ihevce_rc_cal_pre_enc_qp(void *pv_rc_ctxt)
1622*c83a76b0SSuyog Pawar {
1623*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_rc_ctxt;
1624*c83a76b0SSuyog Pawar WORD32 i, i4_frame_qp, i4_scd_qp;
1625*c83a76b0SSuyog Pawar WORD32 i4_delay_l0_enc = 0;
1626*c83a76b0SSuyog Pawar
1627*c83a76b0SSuyog Pawar i4_delay_l0_enc = ps_rc_ctxt->i4_pre_enc_rc_delay;
1628*c83a76b0SSuyog Pawar
1629*c83a76b0SSuyog Pawar if(ps_rc_ctxt->e_rate_control_type != CONST_QP)
1630*c83a76b0SSuyog Pawar {
1631*c83a76b0SSuyog Pawar //DBG_PRINTF("\ncheck query read = %d write = %d",ps_rc_ctxt->i4_pre_enc_qp_read_index,ps_rc_ctxt->i4_pre_enc_qp_write_index);
1632*c83a76b0SSuyog Pawar #if DETERMINISTIC_RC
1633*c83a76b0SSuyog Pawar ASSERT(
1634*c83a76b0SSuyog Pawar ps_rc_ctxt->as_pre_enc_qp_queue[ps_rc_ctxt->i4_pre_enc_qp_write_index].i4_is_qp_valid ==
1635*c83a76b0SSuyog Pawar -1);
1636*c83a76b0SSuyog Pawar #endif
1637*c83a76b0SSuyog Pawar for(i = 0; i < ps_rc_ctxt->i4_num_active_pic_type; i++)
1638*c83a76b0SSuyog Pawar {
1639*c83a76b0SSuyog Pawar i4_frame_qp =
1640*c83a76b0SSuyog Pawar ihevce_rc_get_pre_enc_pic_quant(ps_rc_ctxt, (picture_type_e)i, &i4_scd_qp);
1641*c83a76b0SSuyog Pawar
1642*c83a76b0SSuyog Pawar ps_rc_ctxt->as_pre_enc_qp_queue[ps_rc_ctxt->i4_pre_enc_qp_write_index].ai4_quant[i] =
1643*c83a76b0SSuyog Pawar i4_frame_qp;
1644*c83a76b0SSuyog Pawar /*returns valid scene cut qp only when queried as I_PIC*/
1645*c83a76b0SSuyog Pawar if(i == 0)
1646*c83a76b0SSuyog Pawar {
1647*c83a76b0SSuyog Pawar ps_rc_ctxt->as_pre_enc_qp_queue[ps_rc_ctxt->i4_pre_enc_qp_write_index].i4_scd_qp =
1648*c83a76b0SSuyog Pawar i4_scd_qp;
1649*c83a76b0SSuyog Pawar }
1650*c83a76b0SSuyog Pawar
1651*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_field_pic && i > 0)
1652*c83a76b0SSuyog Pawar {
1653*c83a76b0SSuyog Pawar i4_frame_qp = ihevce_rc_get_pre_enc_pic_quant(
1654*c83a76b0SSuyog Pawar ps_rc_ctxt, (picture_type_e)(i + FIELD_OFFSET), &i4_scd_qp);
1655*c83a76b0SSuyog Pawar
1656*c83a76b0SSuyog Pawar ps_rc_ctxt->as_pre_enc_qp_queue[ps_rc_ctxt->i4_pre_enc_qp_write_index]
1657*c83a76b0SSuyog Pawar .ai4_quant[i + FIELD_OFFSET] = i4_frame_qp;
1658*c83a76b0SSuyog Pawar }
1659*c83a76b0SSuyog Pawar }
1660*c83a76b0SSuyog Pawar /*mark index as populated*/
1661*c83a76b0SSuyog Pawar ps_rc_ctxt->as_pre_enc_qp_queue[ps_rc_ctxt->i4_pre_enc_qp_write_index].i4_is_qp_valid = 1;
1662*c83a76b0SSuyog Pawar
1663*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_pre_enc_qp_write_index =
1664*c83a76b0SSuyog Pawar (ps_rc_ctxt->i4_pre_enc_qp_write_index + 1) % i4_delay_l0_enc;
1665*c83a76b0SSuyog Pawar }
1666*c83a76b0SSuyog Pawar }
1667*c83a76b0SSuyog Pawar /**
1668*c83a76b0SSuyog Pawar ******************************************************************************
1669*c83a76b0SSuyog Pawar *
1670*c83a76b0SSuyog Pawar * @brief function to get updated qp after L1 analysis for L0. '
1671*c83a76b0SSuyog Pawar * This uses estimated L0 satd based on L1 satd/act
1672*c83a76b0SSuyog Pawar *
1673*c83a76b0SSuyog Pawar * @par Description
1674*c83a76b0SSuyog Pawar *
1675*c83a76b0SSuyog Pawar * @param[in] pv_rc_ctxt
1676*c83a76b0SSuyog Pawar * void pointer to rc ctxt
1677*c83a76b0SSuyog Pawar * @param[in] rc_lap_out_params_t *
1678*c83a76b0SSuyog Pawar pointer to lap out structure
1679*c83a76b0SSuyog Pawar * @param[in] i8_est_L0_satd_act
1680*c83a76b0SSuyog Pawar * estimated L0 satd/act based on L1 satd/act
1681*c83a76b0SSuyog Pawar * @return void
1682*c83a76b0SSuyog Pawar *
1683*c83a76b0SSuyog Pawar ******************************************************************************
1684*c83a76b0SSuyog Pawar */
ihevce_get_L0_est_satd_based_scd_qp(void * pv_rc_ctxt,rc_lap_out_params_t * ps_rc_lap_out,LWORD64 i8_est_L0_satd_act,float i_to_avg_rest_ratio)1685*c83a76b0SSuyog Pawar WORD32 ihevce_get_L0_est_satd_based_scd_qp(
1686*c83a76b0SSuyog Pawar void *pv_rc_ctxt,
1687*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_out,
1688*c83a76b0SSuyog Pawar LWORD64 i8_est_L0_satd_act,
1689*c83a76b0SSuyog Pawar float i_to_avg_rest_ratio)
1690*c83a76b0SSuyog Pawar {
1691*c83a76b0SSuyog Pawar rc_context_t *ps_ctxt = (rc_context_t *)pv_rc_ctxt;
1692*c83a76b0SSuyog Pawar WORD32 i4_frame_qs_q3, i4_hevc_qp, i4_est_header_bits, index, i, i4_total_bits;
1693*c83a76b0SSuyog Pawar picture_type_e rc_pic_type;
1694*c83a76b0SSuyog Pawar
1695*c83a76b0SSuyog Pawar rc_pic_type = ihevce_rc_conv_pic_type(
1696*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_rc_lap_out->i4_rc_pic_type,
1697*c83a76b0SSuyog Pawar ps_ctxt->i4_field_pic,
1698*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_temporal_lyr_id,
1699*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_bottom_field,
1700*c83a76b0SSuyog Pawar ps_ctxt->i4_top_field_first);
1701*c83a76b0SSuyog Pawar
1702*c83a76b0SSuyog Pawar /*initialise the coeffs to 1 in case lap is not used */
1703*c83a76b0SSuyog Pawar
1704*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
1705*c83a76b0SSuyog Pawar {
1706*c83a76b0SSuyog Pawar ps_ctxt->af_sum_weigh[0][i][0] = 1.0;
1707*c83a76b0SSuyog Pawar ps_ctxt->af_sum_weigh[0][i][1] = 0.0;
1708*c83a76b0SSuyog Pawar }
1709*c83a76b0SSuyog Pawar
1710*c83a76b0SSuyog Pawar /*get bits to find estimate of header bits*/
1711*c83a76b0SSuyog Pawar i4_est_header_bits = rc_get_scene_change_est_header_bits(
1712*c83a76b0SSuyog Pawar ps_ctxt->rc_hdl,
1713*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_num_pels_in_frame_considered,
1714*c83a76b0SSuyog Pawar ps_ctxt->ai4_lap_f_sim[0],
1715*c83a76b0SSuyog Pawar ps_ctxt->af_sum_weigh[0],
1716*c83a76b0SSuyog Pawar i_to_avg_rest_ratio);
1717*c83a76b0SSuyog Pawar
1718*c83a76b0SSuyog Pawar index = ihevce_get_offline_index(ps_ctxt, ps_rc_lap_out->i4_num_pels_in_frame_considered);
1719*c83a76b0SSuyog Pawar {
1720*c83a76b0SSuyog Pawar WORD32 i4_true_scd = 0;
1721*c83a76b0SSuyog Pawar WORD32 i4_curr_bits_estimated;
1722*c83a76b0SSuyog Pawar
1723*c83a76b0SSuyog Pawar i4_frame_qs_q3 = rc_get_qp_for_scd_frame(
1724*c83a76b0SSuyog Pawar ps_ctxt->rc_hdl,
1725*c83a76b0SSuyog Pawar I_PIC,
1726*c83a76b0SSuyog Pawar i8_est_L0_satd_act,
1727*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_num_pels_in_frame_considered,
1728*c83a76b0SSuyog Pawar i4_est_header_bits,
1729*c83a76b0SSuyog Pawar ps_ctxt->ai4_lap_f_sim[0],
1730*c83a76b0SSuyog Pawar (void *)&g_offline_i_model_coeff[index][0],
1731*c83a76b0SSuyog Pawar i_to_avg_rest_ratio,
1732*c83a76b0SSuyog Pawar i4_true_scd,
1733*c83a76b0SSuyog Pawar ps_ctxt->af_sum_weigh[0],
1734*c83a76b0SSuyog Pawar ps_rc_lap_out->ps_frame_info,
1735*c83a76b0SSuyog Pawar ps_ctxt->i4_rc_pass,
1736*c83a76b0SSuyog Pawar 0,
1737*c83a76b0SSuyog Pawar 0,
1738*c83a76b0SSuyog Pawar 0,
1739*c83a76b0SSuyog Pawar &i4_total_bits,
1740*c83a76b0SSuyog Pawar &i4_curr_bits_estimated,
1741*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_use_offline_model_2pass,
1742*c83a76b0SSuyog Pawar 0,
1743*c83a76b0SSuyog Pawar 0,
1744*c83a76b0SSuyog Pawar -1,
1745*c83a76b0SSuyog Pawar NULL);
1746*c83a76b0SSuyog Pawar }
1747*c83a76b0SSuyog Pawar i4_hevc_qp = ihevce_rc_get_scaled_hevc_qp_from_qs_q3(i4_frame_qs_q3, ps_ctxt->ps_rc_quant_ctxt);
1748*c83a76b0SSuyog Pawar i4_hevc_qp = i4_hevc_qp + ps_ctxt->ps_rc_quant_ctxt->i1_qp_offset;
1749*c83a76b0SSuyog Pawar
1750*c83a76b0SSuyog Pawar if(i4_hevc_qp > ps_ctxt->ps_rc_quant_ctxt->i2_max_qp)
1751*c83a76b0SSuyog Pawar i4_hevc_qp = ps_ctxt->ps_rc_quant_ctxt->i2_max_qp;
1752*c83a76b0SSuyog Pawar
1753*c83a76b0SSuyog Pawar if(i4_hevc_qp < (SCD_MIN_HEVC_QP -
1754*c83a76b0SSuyog Pawar ps_ctxt->ps_rc_quant_ctxt
1755*c83a76b0SSuyog Pawar ->i1_qp_offset)) // since outside RC the QP range is -12 to 51 for 10 bit
1756*c83a76b0SSuyog Pawar {
1757*c83a76b0SSuyog Pawar i4_hevc_qp = (SCD_MIN_HEVC_QP - ps_ctxt->ps_rc_quant_ctxt->i1_qp_offset);
1758*c83a76b0SSuyog Pawar }
1759*c83a76b0SSuyog Pawar else if(i4_hevc_qp > SCD_MAX_HEVC_QP)
1760*c83a76b0SSuyog Pawar {
1761*c83a76b0SSuyog Pawar i4_hevc_qp = SCD_MAX_HEVC_QP;
1762*c83a76b0SSuyog Pawar }
1763*c83a76b0SSuyog Pawar /*this is done outside loop*/
1764*c83a76b0SSuyog Pawar
1765*c83a76b0SSuyog Pawar return i4_hevc_qp;
1766*c83a76b0SSuyog Pawar }
1767*c83a76b0SSuyog Pawar /**
1768*c83a76b0SSuyog Pawar ******************************************************************************
1769*c83a76b0SSuyog Pawar *
1770*c83a76b0SSuyog Pawar * @name ihevce_rc_pre_enc_qp_query
1771*c83a76b0SSuyog Pawar *
1772*c83a76b0SSuyog Pawar * @par Description - Called from pre enc thrd for getting the qp of non scd
1773*c83a76b0SSuyog Pawar frames. updates frame qp from reverse queue from enc loop
1774*c83a76b0SSuyog Pawar when its available
1775*c83a76b0SSuyog Pawar *
1776*c83a76b0SSuyog Pawar * @param[in] ps_rc_ctxt - pointer to rc context
1777*c83a76b0SSuyog Pawar * @param[in] i4_update_delay : The Delay in the update. This can happen for dist. case!
1778*c83a76b0SSuyog Pawar * All decision should consider this delay for updation!
1779*c83a76b0SSuyog Pawar *
1780*c83a76b0SSuyog Pawar * @return void
1781*c83a76b0SSuyog Pawar *
1782*c83a76b0SSuyog Pawar ******************************************************************************
1783*c83a76b0SSuyog Pawar */
1784*c83a76b0SSuyog Pawar
ihevce_rc_pre_enc_qp_query(void * pv_rc_ctxt,rc_lap_out_params_t * ps_rc_lap_out,WORD32 i4_update_delay)1785*c83a76b0SSuyog Pawar WORD32 ihevce_rc_pre_enc_qp_query(
1786*c83a76b0SSuyog Pawar void *pv_rc_ctxt, rc_lap_out_params_t *ps_rc_lap_out, WORD32 i4_update_delay)
1787*c83a76b0SSuyog Pawar {
1788*c83a76b0SSuyog Pawar WORD32 scene_type, i4_is_scd = 0, i4_frame_qp, slice_type = ISLICE;
1789*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_rc_ctxt;
1790*c83a76b0SSuyog Pawar rc_type_e e_rc_type = ps_rc_ctxt->e_rate_control_type;
1791*c83a76b0SSuyog Pawar IV_PICTURE_CODING_TYPE_T pic_type = (IV_PICTURE_CODING_TYPE_T)ps_rc_lap_out->i4_rc_pic_type;
1792*c83a76b0SSuyog Pawar picture_type_e rc_pic_type = ihevce_rc_conv_pic_type(
1793*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_rc_lap_out->i4_rc_pic_type,
1794*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
1795*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_temporal_lyr_id,
1796*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_bottom_field,
1797*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
1798*c83a76b0SSuyog Pawar WORD32 i4_use_offset_flag = 0, k = 0;
1799*c83a76b0SSuyog Pawar WORD32 i4_inter_frame_interval = rc_get_inter_frame_interval(ps_rc_ctxt->rc_hdl);
1800*c83a76b0SSuyog Pawar WORD32 ai4_offsets[5] = { 0, 1, 2, 3, 4 };
1801*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_out_temp = ps_rc_lap_out;
1802*c83a76b0SSuyog Pawar
1803*c83a76b0SSuyog Pawar /* The window for which your update is guaranteed */
1804*c83a76b0SSuyog Pawar WORD32 updated_window = ps_rc_ctxt->i4_num_frame_in_lap_window - i4_update_delay;
1805*c83a76b0SSuyog Pawar
1806*c83a76b0SSuyog Pawar k = 0;
1807*c83a76b0SSuyog Pawar if((updated_window >= i4_inter_frame_interval) && (ps_rc_ctxt->i4_rc_pass != 2) &&
1808*c83a76b0SSuyog Pawar ((rc_pic_type == I_PIC) || (rc_pic_type == P_PIC)))
1809*c83a76b0SSuyog Pawar {
1810*c83a76b0SSuyog Pawar WORD32 i4_count = 0;
1811*c83a76b0SSuyog Pawar
1812*c83a76b0SSuyog Pawar for(i4_count = 0; i4_count < updated_window; i4_count++)
1813*c83a76b0SSuyog Pawar {
1814*c83a76b0SSuyog Pawar picture_type_e rc_pic_type_temp = ihevce_rc_conv_pic_type(
1815*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_rc_lap_out_temp->i4_rc_pic_type,
1816*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
1817*c83a76b0SSuyog Pawar ps_rc_lap_out_temp->i4_rc_temporal_lyr_id,
1818*c83a76b0SSuyog Pawar ps_rc_lap_out_temp->i4_is_bottom_field,
1819*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
1820*c83a76b0SSuyog Pawar
1821*c83a76b0SSuyog Pawar if((rc_pic_type_temp == I_PIC) || (rc_pic_type_temp == P_PIC))
1822*c83a76b0SSuyog Pawar ihevce_compute_temporal_complexity_reset_Kp_Kb(ps_rc_lap_out_temp, pv_rc_ctxt, 0);
1823*c83a76b0SSuyog Pawar
1824*c83a76b0SSuyog Pawar ps_rc_lap_out_temp =
1825*c83a76b0SSuyog Pawar (rc_lap_out_params_t *)ps_rc_lap_out_temp->ps_rc_lap_out_next_encode;
1826*c83a76b0SSuyog Pawar
1827*c83a76b0SSuyog Pawar if(ps_rc_lap_out_temp == NULL)
1828*c83a76b0SSuyog Pawar break;
1829*c83a76b0SSuyog Pawar }
1830*c83a76b0SSuyog Pawar }
1831*c83a76b0SSuyog Pawar
1832*c83a76b0SSuyog Pawar if(updated_window >= i4_inter_frame_interval)
1833*c83a76b0SSuyog Pawar {
1834*c83a76b0SSuyog Pawar i4_use_offset_flag = 1;
1835*c83a76b0SSuyog Pawar memmove(ai4_offsets, ps_rc_lap_out->ai4_offsets, sizeof(WORD32) * 5);
1836*c83a76b0SSuyog Pawar }
1837*c83a76b0SSuyog Pawar
1838*c83a76b0SSuyog Pawar if(CONST_QP == e_rc_type)
1839*c83a76b0SSuyog Pawar {
1840*c83a76b0SSuyog Pawar switch(pic_type)
1841*c83a76b0SSuyog Pawar {
1842*c83a76b0SSuyog Pawar case IV_I_FRAME:
1843*c83a76b0SSuyog Pawar case IV_IDR_FRAME:
1844*c83a76b0SSuyog Pawar {
1845*c83a76b0SSuyog Pawar slice_type = ISLICE;
1846*c83a76b0SSuyog Pawar break;
1847*c83a76b0SSuyog Pawar }
1848*c83a76b0SSuyog Pawar case IV_P_FRAME:
1849*c83a76b0SSuyog Pawar {
1850*c83a76b0SSuyog Pawar slice_type = PSLICE;
1851*c83a76b0SSuyog Pawar break;
1852*c83a76b0SSuyog Pawar }
1853*c83a76b0SSuyog Pawar case IV_B_FRAME:
1854*c83a76b0SSuyog Pawar {
1855*c83a76b0SSuyog Pawar slice_type = BSLICE;
1856*c83a76b0SSuyog Pawar break;
1857*c83a76b0SSuyog Pawar }
1858*c83a76b0SSuyog Pawar default:
1859*c83a76b0SSuyog Pawar {
1860*c83a76b0SSuyog Pawar DBG_PRINTF("Invalid picture type %d\n", pic_type);
1861*c83a76b0SSuyog Pawar break;
1862*c83a76b0SSuyog Pawar }
1863*c83a76b0SSuyog Pawar }
1864*c83a76b0SSuyog Pawar
1865*c83a76b0SSuyog Pawar i4_frame_qp = ihevce_get_cur_frame_qp(
1866*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_init_frame_qp_user,
1867*c83a76b0SSuyog Pawar slice_type,
1868*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_temporal_lyr_id,
1869*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_frame_qp,
1870*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_max_frame_qp,
1871*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt);
1872*c83a76b0SSuyog Pawar
1873*c83a76b0SSuyog Pawar return i4_frame_qp;
1874*c83a76b0SSuyog Pawar }
1875*c83a76b0SSuyog Pawar else
1876*c83a76b0SSuyog Pawar {
1877*c83a76b0SSuyog Pawar /*check scene type*/
1878*c83a76b0SSuyog Pawar scene_type = ihevce_rc_lap_get_scene_type(ps_rc_lap_out);
1879*c83a76b0SSuyog Pawar
1880*c83a76b0SSuyog Pawar if(scene_type == SCENE_TYPE_SCENE_CUT)
1881*c83a76b0SSuyog Pawar {
1882*c83a76b0SSuyog Pawar i4_is_scd = 1;
1883*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_frms_from_reset = 0;
1884*c83a76b0SSuyog Pawar #if USE_QP_OFFSET_POST_SCD
1885*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_use_qp_offset_pre_enc = 1;
1886*c83a76b0SSuyog Pawar #else
1887*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_use_qp_offset_pre_enc = 0;
1888*c83a76b0SSuyog Pawar #endif
1889*c83a76b0SSuyog Pawar }
1890*c83a76b0SSuyog Pawar ASSERT(
1891*c83a76b0SSuyog Pawar ps_rc_ctxt->as_pre_enc_qp_queue[ps_rc_ctxt->i4_pre_enc_qp_read_index].i4_is_qp_valid ==
1892*c83a76b0SSuyog Pawar 1 ||
1893*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_poc < 20);
1894*c83a76b0SSuyog Pawar
1895*c83a76b0SSuyog Pawar if(ps_rc_ctxt->as_pre_enc_qp_queue[ps_rc_ctxt->i4_pre_enc_qp_read_index].i4_is_qp_valid ==
1896*c83a76b0SSuyog Pawar 1)
1897*c83a76b0SSuyog Pawar {
1898*c83a76b0SSuyog Pawar if(i4_is_scd || ps_rc_ctxt->i4_use_qp_offset_pre_enc)
1899*c83a76b0SSuyog Pawar {
1900*c83a76b0SSuyog Pawar #if 1 //The qp will be populated assuming the frame is I_PIC. Adjust according to current pic type
1901*c83a76b0SSuyog Pawar i4_frame_qp =
1902*c83a76b0SSuyog Pawar ps_rc_ctxt->as_pre_enc_qp_queue[ps_rc_ctxt->i4_pre_enc_qp_read_index].i4_scd_qp;
1903*c83a76b0SSuyog Pawar if(rc_pic_type == P_PIC)
1904*c83a76b0SSuyog Pawar i4_frame_qp++;
1905*c83a76b0SSuyog Pawar else
1906*c83a76b0SSuyog Pawar i4_frame_qp = i4_frame_qp + ps_rc_lap_out->i4_rc_temporal_lyr_id;
1907*c83a76b0SSuyog Pawar #endif
1908*c83a76b0SSuyog Pawar if(i4_use_offset_flag)
1909*c83a76b0SSuyog Pawar {
1910*c83a76b0SSuyog Pawar if(rc_pic_type > B2_PIC)
1911*c83a76b0SSuyog Pawar i4_frame_qp = ps_rc_ctxt->i4_L0_frame_qp + ai4_offsets[rc_pic_type - 4];
1912*c83a76b0SSuyog Pawar else
1913*c83a76b0SSuyog Pawar i4_frame_qp = ps_rc_ctxt->i4_L0_frame_qp + ai4_offsets[rc_pic_type];
1914*c83a76b0SSuyog Pawar }
1915*c83a76b0SSuyog Pawar }
1916*c83a76b0SSuyog Pawar else
1917*c83a76b0SSuyog Pawar {
1918*c83a76b0SSuyog Pawar #if DETERMINISTIC_RC
1919*c83a76b0SSuyog Pawar i4_frame_qp = ps_rc_ctxt->as_pre_enc_qp_queue[ps_rc_ctxt->i4_pre_enc_qp_read_index]
1920*c83a76b0SSuyog Pawar .ai4_quant[rc_pic_type];
1921*c83a76b0SSuyog Pawar #else
1922*c83a76b0SSuyog Pawar /*read the latest qp updated by enc*/
1923*c83a76b0SSuyog Pawar i4_frame_qp =
1924*c83a76b0SSuyog Pawar ps_rc_ctxt
1925*c83a76b0SSuyog Pawar ->as_pre_enc_qp_queue
1926*c83a76b0SSuyog Pawar [(ps_rc_ctxt->i4_pre_enc_qp_write_index + MAX_PRE_ENC_RC_DELAY - 1) %
1927*c83a76b0SSuyog Pawar MAX_PRE_ENC_RC_DELAY]
1928*c83a76b0SSuyog Pawar .ai4_quant[rc_pic_type];
1929*c83a76b0SSuyog Pawar #endif
1930*c83a76b0SSuyog Pawar }
1931*c83a76b0SSuyog Pawar
1932*c83a76b0SSuyog Pawar ps_rc_ctxt->as_pre_enc_qp_queue[ps_rc_ctxt->i4_pre_enc_qp_read_index].i4_is_qp_valid =
1933*c83a76b0SSuyog Pawar -1;
1934*c83a76b0SSuyog Pawar /*once encoder starts reading from qp queue it should always read from qp queue*/
1935*c83a76b0SSuyog Pawar //ps_rc_ctxt->i4_use_init_qp_for_pre_enc = 0;
1936*c83a76b0SSuyog Pawar }
1937*c83a76b0SSuyog Pawar else
1938*c83a76b0SSuyog Pawar {
1939*c83a76b0SSuyog Pawar i4_frame_qp = ps_rc_ctxt->ai4_init_pre_enc_qp[rc_pic_type];
1940*c83a76b0SSuyog Pawar }
1941*c83a76b0SSuyog Pawar {
1942*c83a76b0SSuyog Pawar WORD32 i4_delay_l0_enc = ps_rc_ctxt->i4_pre_enc_rc_delay;
1943*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_pre_enc_qp_read_index =
1944*c83a76b0SSuyog Pawar (ps_rc_ctxt->i4_pre_enc_qp_read_index + 1) % i4_delay_l0_enc;
1945*c83a76b0SSuyog Pawar
1946*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_num_frms_from_reset < i4_delay_l0_enc)
1947*c83a76b0SSuyog Pawar {
1948*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_frms_from_reset++;
1949*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_num_frms_from_reset >= i4_delay_l0_enc)
1950*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_use_qp_offset_pre_enc = 0;
1951*c83a76b0SSuyog Pawar }
1952*c83a76b0SSuyog Pawar }
1953*c83a76b0SSuyog Pawar
1954*c83a76b0SSuyog Pawar i4_frame_qp = CLIP3(i4_frame_qp, ps_rc_ctxt->i4_min_frame_qp, ps_rc_ctxt->i4_max_frame_qp);
1955*c83a76b0SSuyog Pawar return i4_frame_qp;
1956*c83a76b0SSuyog Pawar }
1957*c83a76b0SSuyog Pawar }
1958*c83a76b0SSuyog Pawar /**
1959*c83a76b0SSuyog Pawar ******************************************************************************
1960*c83a76b0SSuyog Pawar *
1961*c83a76b0SSuyog Pawar * @brief function to estimate L0 satd based on L1 satd. '
1962*c83a76b0SSuyog Pawar *
1963*c83a76b0SSuyog Pawar *
1964*c83a76b0SSuyog Pawar * @par Description
1965*c83a76b0SSuyog Pawar *
1966*c83a76b0SSuyog Pawar * @param[in] pv_rc_ctxt
1967*c83a76b0SSuyog Pawar * void pointer to rc ctxt
1968*c83a76b0SSuyog Pawar * @param[in] rc_lap_out_params_t *
1969*c83a76b0SSuyog Pawar pointer to lap out structure
1970*c83a76b0SSuyog Pawar * @param[in] i8_est_L0_satd_act
1971*c83a76b0SSuyog Pawar * estimated L0 satd/act based on L1 satd/act
1972*c83a76b0SSuyog Pawar * @return void
1973*c83a76b0SSuyog Pawar *
1974*c83a76b0SSuyog Pawar ******************************************************************************
1975*c83a76b0SSuyog Pawar */
ihevce_get_L0_satd_based_on_L1(LWORD64 i8_satd_by_act_L1,WORD32 i4_num_pixel,WORD32 i4_cur_q_scale)1976*c83a76b0SSuyog Pawar LWORD64 ihevce_get_L0_satd_based_on_L1(
1977*c83a76b0SSuyog Pawar LWORD64 i8_satd_by_act_L1, WORD32 i4_num_pixel, WORD32 i4_cur_q_scale)
1978*c83a76b0SSuyog Pawar {
1979*c83a76b0SSuyog Pawar LWORD64 est_L0_satd_by_act;
1980*c83a76b0SSuyog Pawar float m, c;
1981*c83a76b0SSuyog Pawar /** choose coeff based on resolution*/
1982*c83a76b0SSuyog Pawar if(i4_num_pixel > 5184000)
1983*c83a76b0SSuyog Pawar {
1984*c83a76b0SSuyog Pawar m = (float)2.3911;
1985*c83a76b0SSuyog Pawar c = (float)86329;
1986*c83a76b0SSuyog Pawar }
1987*c83a76b0SSuyog Pawar else if(i4_num_pixel > 1497600)
1988*c83a76b0SSuyog Pawar {
1989*c83a76b0SSuyog Pawar m = (float)2.7311;
1990*c83a76b0SSuyog Pawar c = (float)-1218.9;
1991*c83a76b0SSuyog Pawar }
1992*c83a76b0SSuyog Pawar else if(i4_num_pixel > 633600)
1993*c83a76b0SSuyog Pawar {
1994*c83a76b0SSuyog Pawar m = (float)3.1454;
1995*c83a76b0SSuyog Pawar c = (float)-5836.1;
1996*c83a76b0SSuyog Pawar }
1997*c83a76b0SSuyog Pawar else
1998*c83a76b0SSuyog Pawar {
1999*c83a76b0SSuyog Pawar m = (float)3.5311;
2000*c83a76b0SSuyog Pawar c = (float)-2377.2;
2001*c83a76b0SSuyog Pawar }
2002*c83a76b0SSuyog Pawar /*due to qp difference between I and P, For P pic for same */
2003*c83a76b0SSuyog Pawar est_L0_satd_by_act = (LWORD64)(i8_satd_by_act_L1 / i4_cur_q_scale * m + c) * i4_cur_q_scale;
2004*c83a76b0SSuyog Pawar
2005*c83a76b0SSuyog Pawar {
2006*c83a76b0SSuyog Pawar if(est_L0_satd_by_act < (i4_num_pixel >> 3))
2007*c83a76b0SSuyog Pawar est_L0_satd_by_act = (i4_num_pixel >> 3);
2008*c83a76b0SSuyog Pawar }
2009*c83a76b0SSuyog Pawar return est_L0_satd_by_act;
2010*c83a76b0SSuyog Pawar }
2011*c83a76b0SSuyog Pawar /**
2012*c83a76b0SSuyog Pawar ******************************************************************************
2013*c83a76b0SSuyog Pawar *
2014*c83a76b0SSuyog Pawar * @name ihevce_rc_register_L1_analysis_data
2015*c83a76b0SSuyog Pawar *
2016*c83a76b0SSuyog Pawar * @par Description
2017*c83a76b0SSuyog Pawar *
2018*c83a76b0SSuyog Pawar * @param[in] ps_rc_ctxt - pointer to rc context
2019*c83a76b0SSuyog Pawar * ps_rc_lap_out
2020*c83a76b0SSuyog Pawar * i8_est_L0_satd_by_act
2021*c83a76b0SSuyog Pawar * i8_pre_intra_sad
2022*c83a76b0SSuyog Pawar * i8_l1_hme_sad
2023*c83a76b0SSuyog Pawar * @return void
2024*c83a76b0SSuyog Pawar *
2025*c83a76b0SSuyog Pawar ******************************************************************************
2026*c83a76b0SSuyog Pawar */
ihevce_rc_register_L1_analysis_data(void * pv_rc_ctxt,rc_lap_out_params_t * ps_rc_lap_out,LWORD64 i8_est_L0_satd_by_act,LWORD64 i8_pre_intra_sad,LWORD64 i8_l1_hme_sad)2027*c83a76b0SSuyog Pawar void ihevce_rc_register_L1_analysis_data(
2028*c83a76b0SSuyog Pawar void *pv_rc_ctxt,
2029*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_out,
2030*c83a76b0SSuyog Pawar LWORD64 i8_est_L0_satd_by_act,
2031*c83a76b0SSuyog Pawar LWORD64 i8_pre_intra_sad,
2032*c83a76b0SSuyog Pawar LWORD64 i8_l1_hme_sad)
2033*c83a76b0SSuyog Pawar {
2034*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_rc_ctxt;
2035*c83a76b0SSuyog Pawar WORD32 i, data_available = 1;
2036*c83a76b0SSuyog Pawar picture_type_e rc_pic_type = ihevce_rc_conv_pic_type(
2037*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_rc_lap_out->i4_rc_pic_type,
2038*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
2039*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_temporal_lyr_id,
2040*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_bottom_field,
2041*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
2042*c83a76b0SSuyog Pawar
2043*c83a76b0SSuyog Pawar //if( ps_rc_ctxt->u4_rc_scene_num_est_L0_intra_sad_available == ps_rc_lap_out->u4_rc_scene_num)
2044*c83a76b0SSuyog Pawar {
2045*c83a76b0SSuyog Pawar /*update current frame's data*/
2046*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_est_L0_satd[rc_pic_type] = i8_est_L0_satd_by_act;
2047*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_hme_sad[rc_pic_type] = i8_l1_hme_sad;
2048*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frame_pre_intra_sad[rc_pic_type] = i8_pre_intra_sad;
2049*c83a76b0SSuyog Pawar }
2050*c83a76b0SSuyog Pawar /*check if data is available for all picture type*/
2051*c83a76b0SSuyog Pawar if(!ps_rc_ctxt->i4_is_est_L0_intra_sad_available)
2052*c83a76b0SSuyog Pawar {
2053*c83a76b0SSuyog Pawar for(i = 0; i < ps_rc_ctxt->i4_num_active_pic_type; i++)
2054*c83a76b0SSuyog Pawar {
2055*c83a76b0SSuyog Pawar data_available &= (ps_rc_ctxt->ai8_prev_frame_est_L0_satd[i] >= 0);
2056*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_field_pic == 1 && i != 0)
2057*c83a76b0SSuyog Pawar data_available &= (ps_rc_ctxt->ai8_prev_frame_est_L0_satd[i + FIELD_OFFSET] >= 0);
2058*c83a76b0SSuyog Pawar }
2059*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_est_L0_intra_sad_available = data_available;
2060*c83a76b0SSuyog Pawar }
2061*c83a76b0SSuyog Pawar }
2062*c83a76b0SSuyog Pawar
2063*c83a76b0SSuyog Pawar /*#######################################################*/
2064*c83a76b0SSuyog Pawar /******* END OF PRE-ENC QP QUERY FUNCTIONS **************/
2065*c83a76b0SSuyog Pawar /*#####################################################*/
2066*c83a76b0SSuyog Pawar
2067*c83a76b0SSuyog Pawar /*##########################################################*/
2068*c83a76b0SSuyog Pawar /******* START OF ENC THRD QP QUERY FUNCTIONS **************/
2069*c83a76b0SSuyog Pawar /*########################################################*/
2070*c83a76b0SSuyog Pawar
2071*c83a76b0SSuyog Pawar /**
2072*c83a76b0SSuyog Pawar ******************************************************************************
2073*c83a76b0SSuyog Pawar *
2074*c83a76b0SSuyog Pawar * @brief function to get ihevce_rc_get_pic_quant
2075*c83a76b0SSuyog Pawar *
2076*c83a76b0SSuyog Pawar * @par Description
2077*c83a76b0SSuyog Pawar * @param[in] i4_update_delay : The Delay in the update. This can happen for dist. case!
2078*c83a76b0SSuyog Pawar * All decision should consider this delay for updation!
2079*c83a76b0SSuyog Pawar ******************************************************************************
2080*c83a76b0SSuyog Pawar */
2081*c83a76b0SSuyog Pawar
ihevce_rc_get_pic_quant(void * pv_ctxt,rc_lap_out_params_t * ps_rc_lap_out,IHEVCE_RC_CALL_TYPE call_type,WORD32 i4_enc_frm_id,WORD32 i4_update_delay,WORD32 * pi4_tot_bits_estimated)2082*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_pic_quant(
2083*c83a76b0SSuyog Pawar void *pv_ctxt,
2084*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_out,
2085*c83a76b0SSuyog Pawar IHEVCE_RC_CALL_TYPE call_type,
2086*c83a76b0SSuyog Pawar WORD32 i4_enc_frm_id,
2087*c83a76b0SSuyog Pawar WORD32 i4_update_delay,
2088*c83a76b0SSuyog Pawar WORD32 *pi4_tot_bits_estimated)
2089*c83a76b0SSuyog Pawar {
2090*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
2091*c83a76b0SSuyog Pawar WORD32 i4_frame_qp, i4_frame_qp_q6, i4_hevc_frame_qp = -1, i4_deltaQP = 0;
2092*c83a76b0SSuyog Pawar WORD32 i4_max_frame_bits = (1 << 30);
2093*c83a76b0SSuyog Pawar rc_type_e e_rc_type = ps_rc_ctxt->e_rate_control_type;
2094*c83a76b0SSuyog Pawar WORD32 slice_type = ISLICE, index, i4_num_frames_in_cur_gop, i4_cur_est_texture_bits;
2095*c83a76b0SSuyog Pawar WORD32 temporal_layer_id = ps_rc_lap_out->i4_rc_temporal_lyr_id;
2096*c83a76b0SSuyog Pawar IV_PICTURE_CODING_TYPE_T pic_type = (IV_PICTURE_CODING_TYPE_T)ps_rc_lap_out->i4_rc_pic_type;
2097*c83a76b0SSuyog Pawar picture_type_e rc_pic_type = ihevce_rc_conv_pic_type(
2098*c83a76b0SSuyog Pawar pic_type,
2099*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
2100*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_temporal_lyr_id,
2101*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_bottom_field,
2102*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
2103*c83a76b0SSuyog Pawar float i_to_avg_bit_ratio;
2104*c83a76b0SSuyog Pawar frame_info_t s_frame_info_temp;
2105*c83a76b0SSuyog Pawar WORD32 i4_scene_num = ps_rc_lap_out->u4_rc_scene_num % MAX_SCENE_NUM;
2106*c83a76b0SSuyog Pawar WORD32 i4_vbv_buf_max_bits;
2107*c83a76b0SSuyog Pawar WORD32 i4_est_tex_bits;
2108*c83a76b0SSuyog Pawar WORD32 i4_cur_est_header_bits, i4_fade_scene;
2109*c83a76b0SSuyog Pawar WORD32 i4_model_available, i4_is_no_model_scd;
2110*c83a76b0SSuyog Pawar WORD32 i4_estimate_to_calc_frm_error;
2111*c83a76b0SSuyog Pawar
2112*c83a76b0SSuyog Pawar /* The window for which your update is guaranteed */
2113*c83a76b0SSuyog Pawar WORD32 updated_window = ps_rc_ctxt->i4_num_frame_in_lap_window - i4_update_delay;
2114*c83a76b0SSuyog Pawar
2115*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_scene_num_latest = i4_scene_num;
2116*c83a76b0SSuyog Pawar
2117*c83a76b0SSuyog Pawar ps_rc_ctxt->s_rc_high_lvl_stat.i4_modelQP = INVALID_QP;
2118*c83a76b0SSuyog Pawar ps_rc_ctxt->s_rc_high_lvl_stat.i4_finalQP = INVALID_QP;
2119*c83a76b0SSuyog Pawar ps_rc_ctxt->s_rc_high_lvl_stat.i4_maxEbfQP = INVALID_QP;
2120*c83a76b0SSuyog Pawar
2121*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_quality_preset = ps_rc_lap_out->i4_rc_quality_preset;
2122*c83a76b0SSuyog Pawar ps_rc_ctxt->s_rc_high_lvl_stat.i4_finalQP = INVALID_QP;
2123*c83a76b0SSuyog Pawar
2124*c83a76b0SSuyog Pawar if(1 == ps_rc_ctxt->i4_bitrate_changed)
2125*c83a76b0SSuyog Pawar {
2126*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_bitrate_changed = 0;
2127*c83a76b0SSuyog Pawar }
2128*c83a76b0SSuyog Pawar if(CONST_QP == e_rc_type)
2129*c83a76b0SSuyog Pawar {
2130*c83a76b0SSuyog Pawar switch(pic_type)
2131*c83a76b0SSuyog Pawar {
2132*c83a76b0SSuyog Pawar case IV_I_FRAME:
2133*c83a76b0SSuyog Pawar case IV_IDR_FRAME:
2134*c83a76b0SSuyog Pawar {
2135*c83a76b0SSuyog Pawar slice_type = ISLICE;
2136*c83a76b0SSuyog Pawar break;
2137*c83a76b0SSuyog Pawar }
2138*c83a76b0SSuyog Pawar case IV_P_FRAME:
2139*c83a76b0SSuyog Pawar {
2140*c83a76b0SSuyog Pawar slice_type = PSLICE;
2141*c83a76b0SSuyog Pawar break;
2142*c83a76b0SSuyog Pawar }
2143*c83a76b0SSuyog Pawar case IV_B_FRAME:
2144*c83a76b0SSuyog Pawar {
2145*c83a76b0SSuyog Pawar slice_type = BSLICE;
2146*c83a76b0SSuyog Pawar break;
2147*c83a76b0SSuyog Pawar }
2148*c83a76b0SSuyog Pawar default:
2149*c83a76b0SSuyog Pawar {
2150*c83a76b0SSuyog Pawar DBG_PRINTF("Invalid picture type %d\n", pic_type);
2151*c83a76b0SSuyog Pawar break;
2152*c83a76b0SSuyog Pawar }
2153*c83a76b0SSuyog Pawar }
2154*c83a76b0SSuyog Pawar
2155*c83a76b0SSuyog Pawar i4_frame_qp = ihevce_get_cur_frame_qp(
2156*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_init_frame_qp_user,
2157*c83a76b0SSuyog Pawar slice_type,
2158*c83a76b0SSuyog Pawar temporal_layer_id,
2159*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_min_frame_qp,
2160*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_max_frame_qp,
2161*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt);
2162*c83a76b0SSuyog Pawar return i4_frame_qp;
2163*c83a76b0SSuyog Pawar }
2164*c83a76b0SSuyog Pawar else
2165*c83a76b0SSuyog Pawar {
2166*c83a76b0SSuyog Pawar WORD32 is_scd_ref_frame = 0, i4_num_scd_in_lap_window = 0, num_frames_b4_scd = 0,
2167*c83a76b0SSuyog Pawar scene_type = 0, i;
2168*c83a76b0SSuyog Pawar //ihevce_lap_output_params_t *ps_cur_rc_lap_out;
2169*c83a76b0SSuyog Pawar
2170*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ai4_scene_num_last_pic[rc_pic_type] !=
2171*c83a76b0SSuyog Pawar (WORD32)ps_rc_lap_out->u4_rc_scene_num)
2172*c83a76b0SSuyog Pawar {
2173*c83a76b0SSuyog Pawar rc_reset_pic_model(ps_rc_ctxt->rc_hdl, rc_pic_type);
2174*c83a76b0SSuyog Pawar rc_reset_first_frame_coded_flag(ps_rc_ctxt->rc_hdl, rc_pic_type);
2175*c83a76b0SSuyog Pawar }
2176*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_scene_num_last_pic[rc_pic_type] = ps_rc_lap_out->u4_rc_scene_num;
2177*c83a76b0SSuyog Pawar
2178*c83a76b0SSuyog Pawar if(call_type == ENC_GET_QP)
2179*c83a76b0SSuyog Pawar {
2180*c83a76b0SSuyog Pawar i4_model_available = model_availability(ps_rc_ctxt->rc_hdl, rc_pic_type);
2181*c83a76b0SSuyog Pawar
2182*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_est_text_bits = -1;
2183*c83a76b0SSuyog Pawar }
2184*c83a76b0SSuyog Pawar
2185*c83a76b0SSuyog Pawar if((rc_pic_type == I_PIC) || (rc_pic_type == P_PIC) || (rc_pic_type == P1_PIC))
2186*c83a76b0SSuyog Pawar {
2187*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_cur_scene_num = ps_rc_lap_out->u4_rc_scene_num;
2188*c83a76b0SSuyog Pawar }
2189*c83a76b0SSuyog Pawar
2190*c83a76b0SSuyog Pawar {
2191*c83a76b0SSuyog Pawar if(!(pic_type == IV_I_FRAME || pic_type == IV_IDR_FRAME))
2192*c83a76b0SSuyog Pawar {
2193*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_cur_frame_coarse_ME_cost[i4_enc_frm_id] =
2194*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_frame_acc_coarse_me_cost;
2195*c83a76b0SSuyog Pawar }
2196*c83a76b0SSuyog Pawar /*check if frame is scene cut*/
2197*c83a76b0SSuyog Pawar /* If scd do not query the model. obtain qp from offline data model*/
2198*c83a76b0SSuyog Pawar scene_type = ihevce_rc_lap_get_scene_type(ps_rc_lap_out);
2199*c83a76b0SSuyog Pawar
2200*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ai4_scene_numbers[ps_rc_lap_out->u4_rc_scene_num] == 0 &&
2201*c83a76b0SSuyog Pawar (scene_type != SCENE_TYPE_SCENE_CUT))
2202*c83a76b0SSuyog Pawar {
2203*c83a76b0SSuyog Pawar scene_type = SCENE_TYPE_SCENE_CUT;
2204*c83a76b0SSuyog Pawar }
2205*c83a76b0SSuyog Pawar
2206*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ai4_scene_numbers[ps_rc_lap_out->u4_rc_scene_num] > 0 &&
2207*c83a76b0SSuyog Pawar (scene_type == SCENE_TYPE_SCENE_CUT))
2208*c83a76b0SSuyog Pawar {
2209*c83a76b0SSuyog Pawar scene_type = SCENE_TYPE_NORMAL;
2210*c83a76b0SSuyog Pawar }
2211*c83a76b0SSuyog Pawar if(scene_type == SCENE_TYPE_SCENE_CUT)
2212*c83a76b0SSuyog Pawar {
2213*c83a76b0SSuyog Pawar if((ps_rc_lap_out->i4_rc_quality_preset == IHEVCE_QUALITY_P6) &&
2214*c83a76b0SSuyog Pawar (rc_pic_type > P_PIC))
2215*c83a76b0SSuyog Pawar {
2216*c83a76b0SSuyog Pawar is_scd_ref_frame = 0;
2217*c83a76b0SSuyog Pawar }
2218*c83a76b0SSuyog Pawar else
2219*c83a76b0SSuyog Pawar {
2220*c83a76b0SSuyog Pawar is_scd_ref_frame = 1;
2221*c83a76b0SSuyog Pawar }
2222*c83a76b0SSuyog Pawar }
2223*c83a76b0SSuyog Pawar else if(scene_type == SCENE_TYPE_PAUSE_TO_RESUME)
2224*c83a76b0SSuyog Pawar {
2225*c83a76b0SSuyog Pawar /*pause to resume flag will only be set in layer 0 frames( I and P pic)*/
2226*c83a76b0SSuyog Pawar /*I PIC can handle this by detecting I_only SCD which is based on open loop SATD hence explicit handling for pause to resume is required only for P_PIC*/
2227*c83a76b0SSuyog Pawar
2228*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_rc_quality_preset == IHEVCE_QUALITY_P6)
2229*c83a76b0SSuyog Pawar {
2230*c83a76b0SSuyog Pawar if(call_type == ENC_GET_QP && rc_pic_type == P_PIC)
2231*c83a76b0SSuyog Pawar {
2232*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_pause_to_resume[i4_enc_frm_id] = 1;
2233*c83a76b0SSuyog Pawar }
2234*c83a76b0SSuyog Pawar }
2235*c83a76b0SSuyog Pawar else
2236*c83a76b0SSuyog Pawar {
2237*c83a76b0SSuyog Pawar if(call_type == ENC_GET_QP && rc_pic_type != I_PIC)
2238*c83a76b0SSuyog Pawar {
2239*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_pause_to_resume[i4_enc_frm_id] = 1;
2240*c83a76b0SSuyog Pawar }
2241*c83a76b0SSuyog Pawar }
2242*c83a76b0SSuyog Pawar }
2243*c83a76b0SSuyog Pawar
2244*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_cmplx_change_reset_model[i4_enc_frm_id] =
2245*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_cmplx_change_reset_model;
2246*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_cmplx_change_reset_bits[i4_enc_frm_id] =
2247*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_cmplx_change_reset_bits;
2248*c83a76b0SSuyog Pawar
2249*c83a76b0SSuyog Pawar /*initialise the coeffs to 1 in case lap is not used */
2250*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
2251*c83a76b0SSuyog Pawar {
2252*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id][i][0] = 1.0;
2253*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id][i][1] = 0.0;
2254*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id][i][2] = 0.0;
2255*c83a76b0SSuyog Pawar }
2256*c83a76b0SSuyog Pawar
2257*c83a76b0SSuyog Pawar /*treat even first frame as scd frame*/
2258*c83a76b0SSuyog Pawar if(!ps_rc_ctxt->i4_is_first_frame_encoded)
2259*c83a76b0SSuyog Pawar {
2260*c83a76b0SSuyog Pawar is_scd_ref_frame = 1;
2261*c83a76b0SSuyog Pawar }
2262*c83a76b0SSuyog Pawar
2263*c83a76b0SSuyog Pawar /*special case SCD handling for Non-I pic*/
2264*c83a76b0SSuyog Pawar if(!(pic_type == IV_I_FRAME || pic_type == IV_IDR_FRAME) && call_type == ENC_GET_QP)
2265*c83a76b0SSuyog Pawar {
2266*c83a76b0SSuyog Pawar if(is_scd_ref_frame)
2267*c83a76b0SSuyog Pawar {
2268*c83a76b0SSuyog Pawar /*A non-I pic will only be marked as scene cut only if there is another SCD follows within another subgop*/
2269*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_non_I_scd_pic[i4_enc_frm_id] = 1;
2270*c83a76b0SSuyog Pawar }
2271*c83a76b0SSuyog Pawar /*check if current sad is very different from previous SAD and */
2272*c83a76b0SSuyog Pawar else if(
2273*c83a76b0SSuyog Pawar !ps_rc_ctxt->ai4_is_pause_to_resume[i4_enc_frm_id] &&
2274*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_non_I_scd)
2275*c83a76b0SSuyog Pawar {
2276*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_non_I_scd_pic[i4_enc_frm_id] = 1;
2277*c83a76b0SSuyog Pawar is_scd_ref_frame = 1;
2278*c83a76b0SSuyog Pawar }
2279*c83a76b0SSuyog Pawar }
2280*c83a76b0SSuyog Pawar
2281*c83a76b0SSuyog Pawar if(call_type == PRE_ENC_GET_QP)
2282*c83a76b0SSuyog Pawar {
2283*c83a76b0SSuyog Pawar /*Only I frames are considered as scd pic during pre-enc*/
2284*c83a76b0SSuyog Pawar is_scd_ref_frame &= (pic_type == IV_I_FRAME || pic_type == IV_IDR_FRAME);
2285*c83a76b0SSuyog Pawar }
2286*c83a76b0SSuyog Pawar
2287*c83a76b0SSuyog Pawar /*special case SCD handling for I pic*/
2288*c83a76b0SSuyog Pawar if((pic_type == IV_I_FRAME || pic_type == IV_IDR_FRAME) && !is_scd_ref_frame)
2289*c83a76b0SSuyog Pawar {
2290*c83a76b0SSuyog Pawar /*If open loop SATD's of two I picture are very different then treat the I pic as SCD and reset only model as this can
2291*c83a76b0SSuyog Pawar happen during fade-in and fade-out where other picture types would have learnt. Reset is required only for I.*/
2292*c83a76b0SSuyog Pawar
2293*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_is_I_only_scd)
2294*c83a76b0SSuyog Pawar {
2295*c83a76b0SSuyog Pawar is_scd_ref_frame = 1;
2296*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_I_model_only_reset[i4_enc_frm_id] = 1;
2297*c83a76b0SSuyog Pawar }
2298*c83a76b0SSuyog Pawar }
2299*c83a76b0SSuyog Pawar /*should be recalculated for every picture*/
2300*c83a76b0SSuyog Pawar if((updated_window) > 0 && (call_type == ENC_GET_QP) && (ps_rc_ctxt->i4_rc_pass != 2))
2301*c83a76b0SSuyog Pawar {
2302*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_cur_rc_lap_out;
2303*c83a76b0SSuyog Pawar
2304*c83a76b0SSuyog Pawar UWORD32 u4_L1_based_lap_complexity_q7;
2305*c83a76b0SSuyog Pawar WORD32 i = 0, k = 0, i4_f_sim = 0, i4_h_sim = 0, i4_var_sum = 0,
2306*c83a76b0SSuyog Pawar i4_num_pic_metric_count = 0, i4_is_first_frm = 1,
2307*c83a76b0SSuyog Pawar i4_intra_frame_interval = 0;
2308*c83a76b0SSuyog Pawar LWORD64 i8_l1_analysis_lap_comp = 0;
2309*c83a76b0SSuyog Pawar LWORD64 nor_frm_hme_sad_q10;
2310*c83a76b0SSuyog Pawar picture_type_e curr_rc_pic_type;
2311*c83a76b0SSuyog Pawar WORD32 ai4_pic_dist[MAX_PIC_TYPE] = { 0 };
2312*c83a76b0SSuyog Pawar LWORD64 i8_sad_first_frame_pic_type[MAX_PIC_TYPE] = { 0 },
2313*c83a76b0SSuyog Pawar i8_total_sad_pic_type[MAX_PIC_TYPE] = { 0 };
2314*c83a76b0SSuyog Pawar LWORD64 i8_last_frame_pic_type[MAX_PIC_TYPE] = { 0 }, i8_esti_consum_bits = 0;
2315*c83a76b0SSuyog Pawar WORD32 i4_num_pic_type[MAX_PIC_TYPE] = { 0 }, i4_frames_in_lap_end = 0,
2316*c83a76b0SSuyog Pawar i4_first_frame_coded_flag, i4_gop_end_flag = 1, i4_num_frame_for_ebf = 0;
2317*c83a76b0SSuyog Pawar i4_first_frame_coded_flag = is_first_frame_coded(ps_rc_ctxt->rc_hdl);
2318*c83a76b0SSuyog Pawar
2319*c83a76b0SSuyog Pawar /*Setting the next scene cut as well as pic distribution for the gop*/
2320*c83a76b0SSuyog Pawar
2321*c83a76b0SSuyog Pawar ps_cur_rc_lap_out = (rc_lap_out_params_t *)ps_rc_lap_out;
2322*c83a76b0SSuyog Pawar i4_intra_frame_interval = rc_get_intra_frame_interval(ps_rc_ctxt->rc_hdl);
2323*c83a76b0SSuyog Pawar
2324*c83a76b0SSuyog Pawar /*Set the rc sc i next*/
2325*c83a76b0SSuyog Pawar if(ps_cur_rc_lap_out != NULL)
2326*c83a76b0SSuyog Pawar {
2327*c83a76b0SSuyog Pawar WORD32 i4_count = 0;
2328*c83a76b0SSuyog Pawar do
2329*c83a76b0SSuyog Pawar {
2330*c83a76b0SSuyog Pawar if(((rc_lap_out_params_t *)ps_cur_rc_lap_out->ps_rc_lap_out_next_encode ==
2331*c83a76b0SSuyog Pawar NULL)) //||((( (ihevce_lap_output_params_t*)ps_cur_rc_lap_out->ps_lap_out_next)->i8_pre_intra_sad == -1) || ( ((ihevce_lap_output_params_t*)ps_cur_rc_lap_out->ps_lap_out_next)->i8_raw_pre_intra_sad == -1) ||( ((ihevce_lap_output_params_t*)ps_cur_rc_lap_out->ps_lap_out_next)->i8_raw_l1_coarse_me_sad == -1) ||(((ihevce_lap_output_params_t*)ps_cur_rc_lap_out->ps_lap_out_next)->i8_frame_acc_coarse_me_sad == -1)))
2332*c83a76b0SSuyog Pawar break;
2333*c83a76b0SSuyog Pawar
2334*c83a76b0SSuyog Pawar ps_cur_rc_lap_out =
2335*c83a76b0SSuyog Pawar (rc_lap_out_params_t *)ps_cur_rc_lap_out->ps_rc_lap_out_next_encode;
2336*c83a76b0SSuyog Pawar i4_count++;
2337*c83a76b0SSuyog Pawar
2338*c83a76b0SSuyog Pawar } while((i4_count + 1) < updated_window);
2339*c83a76b0SSuyog Pawar
2340*c83a76b0SSuyog Pawar rc_set_next_sc_i_in_rc_look_ahead(
2341*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl, ps_cur_rc_lap_out->i4_next_sc_i_in_rc_look_ahead);
2342*c83a76b0SSuyog Pawar rc_update_pic_distn_lap_to_rc(
2343*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl, ps_cur_rc_lap_out->ai4_num_pic_type);
2344*c83a76b0SSuyog Pawar
2345*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_next_sc_i_in_rc_look_ahead =
2346*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->i4_next_sc_i_in_rc_look_ahead;
2347*c83a76b0SSuyog Pawar }
2348*c83a76b0SSuyog Pawar
2349*c83a76b0SSuyog Pawar ps_cur_rc_lap_out = (rc_lap_out_params_t *)ps_rc_lap_out;
2350*c83a76b0SSuyog Pawar if(ps_cur_rc_lap_out != NULL)
2351*c83a76b0SSuyog Pawar {
2352*c83a76b0SSuyog Pawar /*initialise the coeffs to 1 in case lap is not used */
2353*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
2354*c83a76b0SSuyog Pawar {
2355*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id][i][0] = 0.0;
2356*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id][i][1] = 0.0;
2357*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id][i][2] = 0.0;
2358*c83a76b0SSuyog Pawar }
2359*c83a76b0SSuyog Pawar i = 0;
2360*c83a76b0SSuyog Pawar k = 0;
2361*c83a76b0SSuyog Pawar
2362*c83a76b0SSuyog Pawar //ASSERT(ps_cur_rc_lap_out != NULL);
2363*c83a76b0SSuyog Pawar do
2364*c83a76b0SSuyog Pawar {
2365*c83a76b0SSuyog Pawar curr_rc_pic_type = ihevce_rc_conv_pic_type(
2366*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_cur_rc_lap_out->i4_rc_pic_type,
2367*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
2368*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->i4_rc_temporal_lyr_id,
2369*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->i4_is_bottom_field,
2370*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
2371*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_is_first_frame_encoded || !i4_is_first_frm)
2372*c83a76b0SSuyog Pawar {
2373*c83a76b0SSuyog Pawar /*Ignore first frame Fsim as it is not valid for first frame*/
2374*c83a76b0SSuyog Pawar i4_f_sim += ps_cur_rc_lap_out->s_pic_metrics.i4_fsim;
2375*c83a76b0SSuyog Pawar i4_h_sim += ps_cur_rc_lap_out->s_pic_metrics.ai4_hsim[0];
2376*c83a76b0SSuyog Pawar i4_var_sum += (WORD32)ps_cur_rc_lap_out->s_pic_metrics.i8_8x8_var_lum;
2377*c83a76b0SSuyog Pawar i4_num_pic_metric_count++;
2378*c83a76b0SSuyog Pawar //DBG_PRINTF("\n fsim = %d i = %d",ps_cur_rc_lap_out->s_pic_metrics.i4_fsim,i);
2379*c83a76b0SSuyog Pawar //ASSERT(ps_cur_rc_lap_out->s_pic_metrics.i4_fsim <= 128);
2380*c83a76b0SSuyog Pawar }
2381*c83a76b0SSuyog Pawar
2382*c83a76b0SSuyog Pawar /*accumulate complexity from LAP2*/
2383*c83a76b0SSuyog Pawar if(curr_rc_pic_type == I_PIC)
2384*c83a76b0SSuyog Pawar {
2385*c83a76b0SSuyog Pawar i8_l1_analysis_lap_comp +=
2386*c83a76b0SSuyog Pawar (LWORD64)(1.17 * ps_cur_rc_lap_out->i8_raw_pre_intra_sad);
2387*c83a76b0SSuyog Pawar }
2388*c83a76b0SSuyog Pawar else
2389*c83a76b0SSuyog Pawar {
2390*c83a76b0SSuyog Pawar if(curr_rc_pic_type <= B2_PIC)
2391*c83a76b0SSuyog Pawar i8_l1_analysis_lap_comp += (LWORD64)(
2392*c83a76b0SSuyog Pawar (float)ps_cur_rc_lap_out->i8_raw_l1_coarse_me_sad /
2393*c83a76b0SSuyog Pawar pow(1.125f, curr_rc_pic_type));
2394*c83a76b0SSuyog Pawar else
2395*c83a76b0SSuyog Pawar i8_l1_analysis_lap_comp += (LWORD64)(
2396*c83a76b0SSuyog Pawar (float)ps_cur_rc_lap_out->i8_raw_l1_coarse_me_sad /
2397*c83a76b0SSuyog Pawar pow(1.125f, curr_rc_pic_type - B2_PIC));
2398*c83a76b0SSuyog Pawar }
2399*c83a76b0SSuyog Pawar i++;
2400*c83a76b0SSuyog Pawar i4_is_first_frm = 0;
2401*c83a76b0SSuyog Pawar
2402*c83a76b0SSuyog Pawar /*CAll the function for predictting the ebf and stuffing condition check*/
2403*c83a76b0SSuyog Pawar /*rd model pass lapout l1 pass ebf return estimated ebf and signal*/
2404*c83a76b0SSuyog Pawar
2405*c83a76b0SSuyog Pawar {
2406*c83a76b0SSuyog Pawar if(i4_first_frame_coded_flag && (i4_gop_end_flag != 0))
2407*c83a76b0SSuyog Pawar {
2408*c83a76b0SSuyog Pawar if(curr_rc_pic_type == 0)
2409*c83a76b0SSuyog Pawar i4_gop_end_flag = 0;
2410*c83a76b0SSuyog Pawar
2411*c83a76b0SSuyog Pawar if(i4_gop_end_flag)
2412*c83a76b0SSuyog Pawar {
2413*c83a76b0SSuyog Pawar WORD32 prev_frm_cl_sad =
2414*c83a76b0SSuyog Pawar rc_get_prev_frame_sad(ps_rc_ctxt->rc_hdl, curr_rc_pic_type);
2415*c83a76b0SSuyog Pawar WORD32 cur_frm_est_cl_sad = (WORD32)(
2416*c83a76b0SSuyog Pawar (ps_cur_rc_lap_out->i8_frame_acc_coarse_me_cost *
2417*c83a76b0SSuyog Pawar prev_frm_cl_sad) /
2418*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frm_pre_enc_cost[curr_rc_pic_type]);
2419*c83a76b0SSuyog Pawar i8_esti_consum_bits += bit_alloc_get_estimated_bits_for_pic(
2420*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
2421*c83a76b0SSuyog Pawar cur_frm_est_cl_sad,
2422*c83a76b0SSuyog Pawar prev_frm_cl_sad,
2423*c83a76b0SSuyog Pawar curr_rc_pic_type);
2424*c83a76b0SSuyog Pawar i4_num_frame_for_ebf++;
2425*c83a76b0SSuyog Pawar }
2426*c83a76b0SSuyog Pawar }
2427*c83a76b0SSuyog Pawar }
2428*c83a76b0SSuyog Pawar ps_cur_rc_lap_out =
2429*c83a76b0SSuyog Pawar (rc_lap_out_params_t *)ps_cur_rc_lap_out->ps_rc_lap_out_next_encode;
2430*c83a76b0SSuyog Pawar /*The scene cut is lap window other than current frame is used to reduce bit alloc window for I pic*/
2431*c83a76b0SSuyog Pawar if(ps_cur_rc_lap_out != NULL &&
2432*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->i4_rc_scene_type == SCENE_TYPE_SCENE_CUT)
2433*c83a76b0SSuyog Pawar {
2434*c83a76b0SSuyog Pawar i4_num_scd_in_lap_window++;
2435*c83a76b0SSuyog Pawar if(i4_num_scd_in_lap_window == 1)
2436*c83a76b0SSuyog Pawar {
2437*c83a76b0SSuyog Pawar /*Note how many frames are parsed before first scd is hit*/
2438*c83a76b0SSuyog Pawar num_frames_b4_scd = i + 1;
2439*c83a76b0SSuyog Pawar }
2440*c83a76b0SSuyog Pawar }
2441*c83a76b0SSuyog Pawar
2442*c83a76b0SSuyog Pawar if((ps_cur_rc_lap_out == NULL ||
2443*c83a76b0SSuyog Pawar (i >=
2444*c83a76b0SSuyog Pawar (updated_window -
2445*c83a76b0SSuyog Pawar k)))) //||((( -1 == ps_cur_rc_lap_out->i8_pre_intra_sad ) || ( -1 == ps_cur_rc_lap_out->i8_raw_pre_intra_sad ) ||( -1 == ps_cur_rc_lap_out->i8_raw_l1_coarse_me_sad) ||(-1 == ps_cur_rc_lap_out->i8_frame_acc_coarse_me_sad))))
2446*c83a76b0SSuyog Pawar break;
2447*c83a76b0SSuyog Pawar if(0) //(( -1 == ps_cur_rc_lap_out->i8_pre_intra_sad ) || ( -1 == ps_cur_rc_lap_out->i8_raw_pre_intra_sad ) ||( -1 == ps_cur_rc_lap_out->i8_raw_l1_coarse_me_sad) ||(-1 == ps_cur_rc_lap_out->i8_frame_acc_coarse_me_sad)))
2448*c83a76b0SSuyog Pawar {
2449*c83a76b0SSuyog Pawar k++;
2450*c83a76b0SSuyog Pawar ps_cur_rc_lap_out =
2451*c83a76b0SSuyog Pawar (rc_lap_out_params_t *)ps_cur_rc_lap_out->ps_rc_lap_out_next_encode;
2452*c83a76b0SSuyog Pawar if(ps_cur_rc_lap_out == NULL)
2453*c83a76b0SSuyog Pawar break;
2454*c83a76b0SSuyog Pawar continue;
2455*c83a76b0SSuyog Pawar }
2456*c83a76b0SSuyog Pawar
2457*c83a76b0SSuyog Pawar } while(1);
2458*c83a76b0SSuyog Pawar ;
2459*c83a76b0SSuyog Pawar }
2460*c83a76b0SSuyog Pawar /*For the first subgop we cant have underflow prevention logic
2461*c83a76b0SSuyog Pawar since once picture of each type is not encoded also happens for static contents thants high i_to avg_ratio */
2462*c83a76b0SSuyog Pawar if(i4_first_frame_coded_flag &&
2463*c83a76b0SSuyog Pawar (ps_rc_ctxt->ai_to_avg_bit_ratio[i4_enc_frm_id] > I_TO_REST_SLOW))
2464*c83a76b0SSuyog Pawar {
2465*c83a76b0SSuyog Pawar if(!(i4_num_frame_for_ebf < ps_rc_ctxt->i4_max_inter_frm_int))
2466*c83a76b0SSuyog Pawar rc_bit_alloc_detect_ebf_stuff_scenario(
2467*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
2468*c83a76b0SSuyog Pawar i4_num_frame_for_ebf,
2469*c83a76b0SSuyog Pawar i8_esti_consum_bits,
2470*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_max_inter_frm_int);
2471*c83a76b0SSuyog Pawar }
2472*c83a76b0SSuyog Pawar
2473*c83a76b0SSuyog Pawar k = 0;
2474*c83a76b0SSuyog Pawar
2475*c83a76b0SSuyog Pawar i4_frames_in_lap_end = 0;
2476*c83a76b0SSuyog Pawar {
2477*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_cur_rc_lap_out1;
2478*c83a76b0SSuyog Pawar
2479*c83a76b0SSuyog Pawar ps_cur_rc_lap_out1 = (rc_lap_out_params_t *)ps_rc_lap_out;
2480*c83a76b0SSuyog Pawar do
2481*c83a76b0SSuyog Pawar {
2482*c83a76b0SSuyog Pawar curr_rc_pic_type = ihevce_rc_conv_pic_type(
2483*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_cur_rc_lap_out1->i4_rc_pic_type,
2484*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
2485*c83a76b0SSuyog Pawar ps_cur_rc_lap_out1->i4_rc_temporal_lyr_id,
2486*c83a76b0SSuyog Pawar ps_cur_rc_lap_out1->i4_is_bottom_field,
2487*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
2488*c83a76b0SSuyog Pawar /*accumulate complexity from LAP2*/
2489*c83a76b0SSuyog Pawar
2490*c83a76b0SSuyog Pawar if(curr_rc_pic_type == I_PIC)
2491*c83a76b0SSuyog Pawar {
2492*c83a76b0SSuyog Pawar i8_total_sad_pic_type[I_PIC] +=
2493*c83a76b0SSuyog Pawar ps_cur_rc_lap_out1->i8_raw_pre_intra_sad;
2494*c83a76b0SSuyog Pawar i8_last_frame_pic_type[I_PIC] =
2495*c83a76b0SSuyog Pawar ps_cur_rc_lap_out1->i8_raw_pre_intra_sad;
2496*c83a76b0SSuyog Pawar }
2497*c83a76b0SSuyog Pawar else
2498*c83a76b0SSuyog Pawar {
2499*c83a76b0SSuyog Pawar i8_total_sad_pic_type[curr_rc_pic_type] +=
2500*c83a76b0SSuyog Pawar ps_cur_rc_lap_out1->i8_raw_l1_coarse_me_sad;
2501*c83a76b0SSuyog Pawar i8_last_frame_pic_type[curr_rc_pic_type] =
2502*c83a76b0SSuyog Pawar ps_cur_rc_lap_out1->i8_raw_l1_coarse_me_sad;
2503*c83a76b0SSuyog Pawar }
2504*c83a76b0SSuyog Pawar if(i4_num_pic_type[curr_rc_pic_type] == 0)
2505*c83a76b0SSuyog Pawar {
2506*c83a76b0SSuyog Pawar if(curr_rc_pic_type == I_PIC)
2507*c83a76b0SSuyog Pawar {
2508*c83a76b0SSuyog Pawar i8_sad_first_frame_pic_type[I_PIC] =
2509*c83a76b0SSuyog Pawar ps_cur_rc_lap_out1->i8_raw_pre_intra_sad;
2510*c83a76b0SSuyog Pawar }
2511*c83a76b0SSuyog Pawar else
2512*c83a76b0SSuyog Pawar {
2513*c83a76b0SSuyog Pawar i8_sad_first_frame_pic_type[curr_rc_pic_type] =
2514*c83a76b0SSuyog Pawar ps_cur_rc_lap_out1->i8_raw_l1_coarse_me_sad;
2515*c83a76b0SSuyog Pawar }
2516*c83a76b0SSuyog Pawar }
2517*c83a76b0SSuyog Pawar i4_num_pic_type[curr_rc_pic_type]++;
2518*c83a76b0SSuyog Pawar
2519*c83a76b0SSuyog Pawar i4_frames_in_lap_end++;
2520*c83a76b0SSuyog Pawar
2521*c83a76b0SSuyog Pawar ps_cur_rc_lap_out1 =
2522*c83a76b0SSuyog Pawar (rc_lap_out_params_t *)ps_cur_rc_lap_out1->ps_rc_lap_out_next_encode;
2523*c83a76b0SSuyog Pawar if((ps_cur_rc_lap_out1 == NULL ||
2524*c83a76b0SSuyog Pawar (i4_frames_in_lap_end >=
2525*c83a76b0SSuyog Pawar (updated_window -
2526*c83a76b0SSuyog Pawar k)))) //||((( -1 == ps_cur_rc_lap_out1->i8_pre_intra_sad ) || ( -1 == ps_cur_rc_lap_out1->i8_raw_pre_intra_sad ) ||( -1 == ps_cur_rc_lap_out1->i8_raw_l1_coarse_me_sad) ||(-1 == ps_cur_rc_lap_out1->i8_frame_acc_coarse_me_sad))))
2527*c83a76b0SSuyog Pawar {
2528*c83a76b0SSuyog Pawar break;
2529*c83a76b0SSuyog Pawar }
2530*c83a76b0SSuyog Pawar if(0) //((( -1 == ps_cur_rc_lap_out1->i8_pre_intra_sad ) || ( -1 == ps_cur_rc_lap_out1->i8_raw_pre_intra_sad ) ||( -1 == ps_cur_rc_lap_out1->i8_raw_l1_coarse_me_sad) ||(-1 == ps_cur_rc_lap_out1->i8_frame_acc_coarse_me_sad))))
2531*c83a76b0SSuyog Pawar {
2532*c83a76b0SSuyog Pawar k++;
2533*c83a76b0SSuyog Pawar ps_cur_rc_lap_out1 = (rc_lap_out_params_t *)
2534*c83a76b0SSuyog Pawar ps_cur_rc_lap_out1->ps_rc_lap_out_next_encode;
2535*c83a76b0SSuyog Pawar if(ps_cur_rc_lap_out1 == NULL)
2536*c83a76b0SSuyog Pawar break;
2537*c83a76b0SSuyog Pawar continue;
2538*c83a76b0SSuyog Pawar }
2539*c83a76b0SSuyog Pawar
2540*c83a76b0SSuyog Pawar } while(i4_frames_in_lap_end < (ps_rc_ctxt->i4_next_sc_i_in_rc_look_ahead - k));
2541*c83a76b0SSuyog Pawar }
2542*c83a76b0SSuyog Pawar
2543*c83a76b0SSuyog Pawar /*get picture type distribution in LAP*/
2544*c83a76b0SSuyog Pawar rc_get_pic_distribution(ps_rc_ctxt->rc_hdl, &ai4_pic_dist[0]);
2545*c83a76b0SSuyog Pawar
2546*c83a76b0SSuyog Pawar {
2547*c83a76b0SSuyog Pawar float f_prev_comp;
2548*c83a76b0SSuyog Pawar WORD32 j;
2549*c83a76b0SSuyog Pawar float af_sum_weigh[MAX_PIC_TYPE], af_nume_weight[MAX_PIC_TYPE];
2550*c83a76b0SSuyog Pawar float af_average_sad_pic_type[MAX_PIC_TYPE] = { 0 };
2551*c83a76b0SSuyog Pawar for(j = 0; j < MAX_PIC_TYPE; j++)
2552*c83a76b0SSuyog Pawar {
2553*c83a76b0SSuyog Pawar if(i4_num_pic_type[j] > 0)
2554*c83a76b0SSuyog Pawar {
2555*c83a76b0SSuyog Pawar af_average_sad_pic_type[j] =
2556*c83a76b0SSuyog Pawar (float)i8_total_sad_pic_type[j] / i4_num_pic_type[j];
2557*c83a76b0SSuyog Pawar }
2558*c83a76b0SSuyog Pawar
2559*c83a76b0SSuyog Pawar f_prev_comp = 1.;
2560*c83a76b0SSuyog Pawar
2561*c83a76b0SSuyog Pawar i4_num_pic_type[j] = (i4_num_pic_type[j] > ai4_pic_dist[j])
2562*c83a76b0SSuyog Pawar ? ai4_pic_dist[j]
2563*c83a76b0SSuyog Pawar : i4_num_pic_type[j];
2564*c83a76b0SSuyog Pawar
2565*c83a76b0SSuyog Pawar af_sum_weigh[j] = (float)i4_num_pic_type[j];
2566*c83a76b0SSuyog Pawar af_nume_weight[j] = 1.0;
2567*c83a76b0SSuyog Pawar
2568*c83a76b0SSuyog Pawar if(i4_num_pic_type[j] > 1 && (af_average_sad_pic_type[j] > 0))
2569*c83a76b0SSuyog Pawar {
2570*c83a76b0SSuyog Pawar af_nume_weight[j] =
2571*c83a76b0SSuyog Pawar (float)i8_sad_first_frame_pic_type[j] / af_average_sad_pic_type[j];
2572*c83a76b0SSuyog Pawar
2573*c83a76b0SSuyog Pawar f_prev_comp =
2574*c83a76b0SSuyog Pawar (float)i8_last_frame_pic_type[j] / af_average_sad_pic_type[j];
2575*c83a76b0SSuyog Pawar }
2576*c83a76b0SSuyog Pawar //if(rc_pic_type != I_PIC)
2577*c83a76b0SSuyog Pawar {
2578*c83a76b0SSuyog Pawar af_sum_weigh[j] += f_prev_comp * (ai4_pic_dist[j] - i4_num_pic_type[j]);
2579*c83a76b0SSuyog Pawar }
2580*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id][j][0] = af_nume_weight[j];
2581*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id][j][1] = af_sum_weigh[j];
2582*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id][j][2] = af_average_sad_pic_type[j];
2583*c83a76b0SSuyog Pawar
2584*c83a76b0SSuyog Pawar /*Disabling steady state complexity based bit movement*/
2585*c83a76b0SSuyog Pawar /*Enable it in CBR and not in VBR since VBR already has complexity based bit movement*/
2586*c83a76b0SSuyog Pawar
2587*c83a76b0SSuyog Pawar if(0) /*i4_frames_in_lap_end < (updated_window) || ps_rc_ctxt->e_rate_control_type == VBR_STREAMING)*/
2588*c83a76b0SSuyog Pawar {
2589*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id][j][0] = 1.0;
2590*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id][j][1] =
2591*c83a76b0SSuyog Pawar 0; //(float)ai4_pic_dist[j];
2592*c83a76b0SSuyog Pawar }
2593*c83a76b0SSuyog Pawar }
2594*c83a76b0SSuyog Pawar memmove(
2595*c83a76b0SSuyog Pawar ps_rc_lap_out->ps_frame_info->af_sum_weigh,
2596*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id],
2597*c83a76b0SSuyog Pawar sizeof(float) * MAX_PIC_TYPE * 3);
2598*c83a76b0SSuyog Pawar }
2599*c83a76b0SSuyog Pawar
2600*c83a76b0SSuyog Pawar if(i4_num_pic_metric_count > 0)
2601*c83a76b0SSuyog Pawar {
2602*c83a76b0SSuyog Pawar i4_f_sim = i4_f_sim / i4_num_pic_metric_count;
2603*c83a76b0SSuyog Pawar i4_h_sim = i4_h_sim / i4_num_pic_metric_count;
2604*c83a76b0SSuyog Pawar i4_var_sum = i4_var_sum / i4_num_pic_metric_count;
2605*c83a76b0SSuyog Pawar }
2606*c83a76b0SSuyog Pawar else
2607*c83a76b0SSuyog Pawar {
2608*c83a76b0SSuyog Pawar i4_f_sim = MODERATE_FSIM_VALUE;
2609*c83a76b0SSuyog Pawar i4_h_sim = MODERATE_FSIM_VALUE;
2610*c83a76b0SSuyog Pawar }
2611*c83a76b0SSuyog Pawar
2612*c83a76b0SSuyog Pawar if(i > 0)
2613*c83a76b0SSuyog Pawar {
2614*c83a76b0SSuyog Pawar float lap_L1_comp =
2615*c83a76b0SSuyog Pawar (float)i8_l1_analysis_lap_comp /
2616*c83a76b0SSuyog Pawar (i * ps_rc_ctxt->i4_frame_height *
2617*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_frame_width); //per frame per pixel complexity
2618*c83a76b0SSuyog Pawar
2619*c83a76b0SSuyog Pawar lap_L1_comp = rc_get_offline_normalized_complexity(
2620*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_intra_frame_interval,
2621*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width,
2622*c83a76b0SSuyog Pawar lap_L1_comp,
2623*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_rc_pass);
2624*c83a76b0SSuyog Pawar
2625*c83a76b0SSuyog Pawar u4_L1_based_lap_complexity_q7 = (WORD32)((lap_L1_comp * (1 << 7)) + .05f);
2626*c83a76b0SSuyog Pawar }
2627*c83a76b0SSuyog Pawar else
2628*c83a76b0SSuyog Pawar {
2629*c83a76b0SSuyog Pawar u4_L1_based_lap_complexity_q7 = 25;
2630*c83a76b0SSuyog Pawar }
2631*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_lap_complexity_q7[i4_enc_frm_id] =
2632*c83a76b0SSuyog Pawar (WORD32)u4_L1_based_lap_complexity_q7;
2633*c83a76b0SSuyog Pawar /*clip f_sim to 0.3 for better stability*/
2634*c83a76b0SSuyog Pawar if(i4_f_sim < 38)
2635*c83a76b0SSuyog Pawar i4_f_sim = 128 - MAX_LAP_COMPLEXITY_Q7;
2636*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_lap_f_sim[i4_enc_frm_id] = i4_f_sim;
2637*c83a76b0SSuyog Pawar
2638*c83a76b0SSuyog Pawar /*calculate normalized per pixel sad*/
2639*c83a76b0SSuyog Pawar nor_frm_hme_sad_q10 = (ps_rc_lap_out->i8_frame_acc_coarse_me_cost << 10) /
2640*c83a76b0SSuyog Pawar (ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width);
2641*c83a76b0SSuyog Pawar /*if(rc_pic_type == P_PIC)
2642*c83a76b0SSuyog Pawar DBG_PRINTF("\n P frm hme sad = %f ",((float)nor_frm_hme_sad_q10/ (1 << 10))); */
2643*c83a76b0SSuyog Pawar rc_put_temp_comp_lap(
2644*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl, i4_f_sim, nor_frm_hme_sad_q10, rc_pic_type);
2645*c83a76b0SSuyog Pawar
2646*c83a76b0SSuyog Pawar rc_set_num_scd_in_lap_window(
2647*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl, i4_num_scd_in_lap_window, num_frames_b4_scd);
2648*c83a76b0SSuyog Pawar
2649*c83a76b0SSuyog Pawar if(rc_pic_type == I_PIC && updated_window > (ps_rc_ctxt->i4_max_inter_frm_int << 1))
2650*c83a76b0SSuyog Pawar {
2651*c83a76b0SSuyog Pawar float i_to_avg_bit_ratio = ihevce_get_i_to_avg_ratio(
2652*c83a76b0SSuyog Pawar (void *)ps_rc_ctxt,
2653*c83a76b0SSuyog Pawar ps_rc_lap_out,
2654*c83a76b0SSuyog Pawar 1,
2655*c83a76b0SSuyog Pawar 1,
2656*c83a76b0SSuyog Pawar 1,
2657*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_offsets,
2658*c83a76b0SSuyog Pawar i4_update_delay);
2659*c83a76b0SSuyog Pawar i_to_avg_bit_ratio = i_to_avg_bit_ratio * 1;
2660*c83a76b0SSuyog Pawar }
2661*c83a76b0SSuyog Pawar
2662*c83a76b0SSuyog Pawar /* accumulation of the hme sad over next sub gop to find the temporal comlexity of the sub GOP*/
2663*c83a76b0SSuyog Pawar if((rc_pic_type == I_PIC) || (rc_pic_type == P_PIC))
2664*c83a76b0SSuyog Pawar {
2665*c83a76b0SSuyog Pawar ihevce_compute_temporal_complexity_reset_Kp_Kb(
2666*c83a76b0SSuyog Pawar ps_rc_lap_out, (void *)ps_rc_ctxt, 1);
2667*c83a76b0SSuyog Pawar }
2668*c83a76b0SSuyog Pawar
2669*c83a76b0SSuyog Pawar if(i4_var_sum > MAX_LAP_VAR)
2670*c83a76b0SSuyog Pawar {
2671*c83a76b0SSuyog Pawar i4_var_sum = MAX_LAP_VAR;
2672*c83a76b0SSuyog Pawar }
2673*c83a76b0SSuyog Pawar
2674*c83a76b0SSuyog Pawar {
2675*c83a76b0SSuyog Pawar /*Filling for dumping data */
2676*c83a76b0SSuyog Pawar
2677*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_num_scd_in_lap_window[i4_enc_frm_id] = i4_num_scd_in_lap_window;
2678*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_num_frames_b4_scd[i4_enc_frm_id] = num_frames_b4_scd;
2679*c83a76b0SSuyog Pawar }
2680*c83a76b0SSuyog Pawar }
2681*c83a76b0SSuyog Pawar }
2682*c83a76b0SSuyog Pawar
2683*c83a76b0SSuyog Pawar if((ps_rc_lap_out->i4_rc_quality_preset == IHEVCE_QUALITY_P6) && (rc_pic_type > P_PIC))
2684*c83a76b0SSuyog Pawar {
2685*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_pause_to_resume[i4_enc_frm_id] = 0;
2686*c83a76b0SSuyog Pawar is_scd_ref_frame = 0;
2687*c83a76b0SSuyog Pawar }
2688*c83a76b0SSuyog Pawar i4_fade_scene = 0;
2689*c83a76b0SSuyog Pawar /*Scene type fade is marked only for P pics which are in fade regions*/
2690*c83a76b0SSuyog Pawar if((ps_rc_lap_out->i4_rc_scene_type == SCENE_TYPE_FADE_IN ||
2691*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_scene_type == SCENE_TYPE_FADE_OUT) &&
2692*c83a76b0SSuyog Pawar (ps_rc_lap_out->i4_rc_temporal_lyr_id == 0))
2693*c83a76b0SSuyog Pawar {
2694*c83a76b0SSuyog Pawar is_scd_ref_frame = 1;
2695*c83a76b0SSuyog Pawar i4_fade_scene = 1;
2696*c83a76b0SSuyog Pawar }
2697*c83a76b0SSuyog Pawar
2698*c83a76b0SSuyog Pawar if((!(is_scd_ref_frame || ps_rc_ctxt->ai4_is_pause_to_resume[i4_enc_frm_id])) &&
2699*c83a76b0SSuyog Pawar (((is_first_frame_coded(ps_rc_ctxt->rc_hdl)) && (pic_type == IV_I_FRAME)) ||
2700*c83a76b0SSuyog Pawar (pic_type != IV_I_FRAME)))
2701*c83a76b0SSuyog Pawar {
2702*c83a76b0SSuyog Pawar WORD32 i4_is_first_frame_coded = is_first_frame_coded(ps_rc_ctxt->rc_hdl);
2703*c83a76b0SSuyog Pawar i4_is_no_model_scd = 0;
2704*c83a76b0SSuyog Pawar if(call_type == ENC_GET_QP)
2705*c83a76b0SSuyog Pawar {
2706*c83a76b0SSuyog Pawar if(((0 == i4_model_available) || (!i4_is_first_frame_coded)))
2707*c83a76b0SSuyog Pawar {
2708*c83a76b0SSuyog Pawar /*No scene change but model not available*/
2709*c83a76b0SSuyog Pawar i4_is_no_model_scd = 1;
2710*c83a76b0SSuyog Pawar }
2711*c83a76b0SSuyog Pawar }
2712*c83a76b0SSuyog Pawar }
2713*c83a76b0SSuyog Pawar else
2714*c83a76b0SSuyog Pawar {
2715*c83a76b0SSuyog Pawar /*actual scene changes*/
2716*c83a76b0SSuyog Pawar i4_is_no_model_scd = 2;
2717*c83a76b0SSuyog Pawar }
2718*c83a76b0SSuyog Pawar /** Pre-enc thread as of now SCD handling is not present */
2719*c83a76b0SSuyog Pawar if(!i4_is_no_model_scd)
2720*c83a76b0SSuyog Pawar {
2721*c83a76b0SSuyog Pawar WORD32 i4_is_first_frame_coded, i4_prev_I_frm_sad, i4_cur_I_frm_sad;
2722*c83a76b0SSuyog Pawar /*Once first frame has been encoded use prev frame intra satd and cur frame satd to alter est intra sad for cur frame*/
2723*c83a76b0SSuyog Pawar i4_is_first_frame_coded = is_first_frame_coded(ps_rc_ctxt->rc_hdl);
2724*c83a76b0SSuyog Pawar
2725*c83a76b0SSuyog Pawar /*prev I frame sad i changes only in enc stage. For pre enc cur and prev will be same*/
2726*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i8_prev_i_frm_cost > 0)
2727*c83a76b0SSuyog Pawar {
2728*c83a76b0SSuyog Pawar if(i4_is_first_frame_coded && (pic_type == IV_I_FRAME || pic_type == IV_IDR_FRAME))
2729*c83a76b0SSuyog Pawar {
2730*c83a76b0SSuyog Pawar i4_prev_I_frm_sad = rc_get_prev_frame_intra_sad(ps_rc_ctxt->rc_hdl);
2731*c83a76b0SSuyog Pawar i4_cur_I_frm_sad = (WORD32)(
2732*c83a76b0SSuyog Pawar (ps_rc_ctxt->ai8_cur_frm_intra_cost[i4_enc_frm_id] * i4_prev_I_frm_sad) /
2733*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_prev_i_frm_cost);
2734*c83a76b0SSuyog Pawar rc_update_prev_frame_intra_sad(ps_rc_ctxt->rc_hdl, i4_cur_I_frm_sad);
2735*c83a76b0SSuyog Pawar }
2736*c83a76b0SSuyog Pawar }
2737*c83a76b0SSuyog Pawar /*scale previous frame closed loop SAD with current frame HME SAD to be considered as current frame SAD*/
2738*c83a76b0SSuyog Pawar if(i4_is_first_frame_coded && !(pic_type == IV_I_FRAME || pic_type == IV_IDR_FRAME) &&
2739*c83a76b0SSuyog Pawar call_type == ENC_GET_QP)
2740*c83a76b0SSuyog Pawar {
2741*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ai8_prev_frm_pre_enc_cost[rc_pic_type] > 0)
2742*c83a76b0SSuyog Pawar {
2743*c83a76b0SSuyog Pawar WORD32 prev_frm_cl_sad = rc_get_prev_frame_sad(ps_rc_ctxt->rc_hdl, rc_pic_type);
2744*c83a76b0SSuyog Pawar WORD32 cur_frm_est_cl_sad = (WORD32)(
2745*c83a76b0SSuyog Pawar (ps_rc_ctxt->ai8_cur_frame_coarse_ME_cost[i4_enc_frm_id] *
2746*c83a76b0SSuyog Pawar prev_frm_cl_sad) /
2747*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frm_pre_enc_cost[rc_pic_type]);
2748*c83a76b0SSuyog Pawar rc_update_prev_frame_sad(ps_rc_ctxt->rc_hdl, cur_frm_est_cl_sad, rc_pic_type);
2749*c83a76b0SSuyog Pawar }
2750*c83a76b0SSuyog Pawar }
2751*c83a76b0SSuyog Pawar
2752*c83a76b0SSuyog Pawar if(rc_pic_type == I_PIC && updated_window > (ps_rc_ctxt->i4_max_inter_frm_int << 1))
2753*c83a76b0SSuyog Pawar {
2754*c83a76b0SSuyog Pawar ps_rc_ctxt->ai_to_avg_bit_ratio[i4_enc_frm_id] = ihevce_get_i_to_avg_ratio(
2755*c83a76b0SSuyog Pawar (void *)ps_rc_ctxt,
2756*c83a76b0SSuyog Pawar ps_rc_lap_out,
2757*c83a76b0SSuyog Pawar 1,
2758*c83a76b0SSuyog Pawar 0,
2759*c83a76b0SSuyog Pawar 1,
2760*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_offsets,
2761*c83a76b0SSuyog Pawar i4_update_delay);
2762*c83a76b0SSuyog Pawar }
2763*c83a76b0SSuyog Pawar
2764*c83a76b0SSuyog Pawar ps_rc_ctxt->s_rc_high_lvl_stat.i8_bits_from_finalQP = -1;
2765*c83a76b0SSuyog Pawar i4_frame_qp_q6 = get_frame_level_qp(
2766*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
2767*c83a76b0SSuyog Pawar rc_pic_type,
2768*c83a76b0SSuyog Pawar i4_max_frame_bits,
2769*c83a76b0SSuyog Pawar &i4_cur_est_texture_bits, //this value is returned by rc
2770*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id],
2771*c83a76b0SSuyog Pawar 1,
2772*c83a76b0SSuyog Pawar ps_rc_ctxt->ai_to_avg_bit_ratio[i4_enc_frm_id],
2773*c83a76b0SSuyog Pawar ps_rc_lap_out->ps_frame_info,
2774*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_complexity_bin,
2775*c83a76b0SSuyog Pawar i4_scene_num, /*no pause resume concept*/
2776*c83a76b0SSuyog Pawar pi4_tot_bits_estimated,
2777*c83a76b0SSuyog Pawar &ps_rc_lap_out->i4_is_model_valid,
2778*c83a76b0SSuyog Pawar &i4_vbv_buf_max_bits,
2779*c83a76b0SSuyog Pawar &i4_est_tex_bits,
2780*c83a76b0SSuyog Pawar &i4_cur_est_header_bits,
2781*c83a76b0SSuyog Pawar &ps_rc_ctxt->s_rc_high_lvl_stat.i4_maxEbfQP,
2782*c83a76b0SSuyog Pawar &ps_rc_ctxt->s_rc_high_lvl_stat.i4_modelQP,
2783*c83a76b0SSuyog Pawar &i4_estimate_to_calc_frm_error);
2784*c83a76b0SSuyog Pawar ASSERT(*pi4_tot_bits_estimated != 0);
2785*c83a76b0SSuyog Pawar /** The usage of global table will truncate the input given as qp format and hence will not return very low qp values desirable at very
2786*c83a76b0SSuyog Pawar low bitrate. Hence on the fly calculation is enabled*/
2787*c83a76b0SSuyog Pawar
2788*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
2789*c83a76b0SSuyog Pawar ihevce_rc_get_scaled_hevce_qp_q6(i4_frame_qp_q6, ps_rc_ctxt->u1_bit_depth);
2790*c83a76b0SSuyog Pawar
2791*c83a76b0SSuyog Pawar if(1 == ps_rc_lap_out->i4_is_model_valid)
2792*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_steady_state = 1;
2793*c83a76b0SSuyog Pawar else
2794*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_steady_state = 0;
2795*c83a76b0SSuyog Pawar
2796*c83a76b0SSuyog Pawar ps_rc_ctxt->s_rc_high_lvl_stat.i4_is_offline_model_used = 0;
2797*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_est_I_pic_header_bits = i4_cur_est_header_bits;
2798*c83a76b0SSuyog Pawar }
2799*c83a76b0SSuyog Pawar else
2800*c83a76b0SSuyog Pawar {
2801*c83a76b0SSuyog Pawar WORD32 i4_count = 0, i4_total_bits, i4_min_error_hevc_qp = 0;
2802*c83a76b0SSuyog Pawar float f_percent_error = 0.0f, f_min_error = 10000.0f;
2803*c83a76b0SSuyog Pawar WORD32 i4_current_bits_estimated = 0;
2804*c83a76b0SSuyog Pawar float i4_i_to_rest_ratio_final;
2805*c83a76b0SSuyog Pawar WORD32 i4_best_br_id = 0;
2806*c83a76b0SSuyog Pawar float af_i_qs[2];
2807*c83a76b0SSuyog Pawar LWORD64 ai8_i_tex_bits[2];
2808*c83a76b0SSuyog Pawar WORD32 i4_ref_qscale = ihevce_rc_get_scaled_mpeg2_qp(
2809*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_L0_qp, ps_rc_ctxt->ps_rc_quant_ctxt);
2810*c83a76b0SSuyog Pawar WORD32 ai4_header_bits[2];
2811*c83a76b0SSuyog Pawar
2812*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_steady_state = 0;
2813*c83a76b0SSuyog Pawar
2814*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_L0_qp > 44)
2815*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_L0_qp = 44;
2816*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_L0_qp < 7 - ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset)
2817*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_L0_qp = 7 - ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset;
2818*c83a76b0SSuyog Pawar
2819*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_L0_qp = ps_rc_lap_out->i4_L0_qp - 9;
2820*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_model_valid = 0;
2821*c83a76b0SSuyog Pawar ps_rc_ctxt->s_rc_high_lvl_stat.i4_is_offline_model_used = 1;
2822*c83a76b0SSuyog Pawar ps_rc_ctxt->s_rc_high_lvl_stat.i8_bits_from_finalQP = -1;
2823*c83a76b0SSuyog Pawar
2824*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_normal_inter_pic = (i4_is_no_model_scd == 1);
2825*c83a76b0SSuyog Pawar while(1)
2826*c83a76b0SSuyog Pawar {
2827*c83a76b0SSuyog Pawar WORD32 i4_frame_qs_q3;
2828*c83a76b0SSuyog Pawar WORD32 i4_estimate_to_calc_frm_error_temp;
2829*c83a76b0SSuyog Pawar
2830*c83a76b0SSuyog Pawar i_to_avg_bit_ratio = ihevce_get_i_to_avg_ratio(
2831*c83a76b0SSuyog Pawar (void *)ps_rc_ctxt,
2832*c83a76b0SSuyog Pawar ps_rc_lap_out,
2833*c83a76b0SSuyog Pawar 1,
2834*c83a76b0SSuyog Pawar 0,
2835*c83a76b0SSuyog Pawar 1,
2836*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_offsets,
2837*c83a76b0SSuyog Pawar i4_update_delay);
2838*c83a76b0SSuyog Pawar
2839*c83a76b0SSuyog Pawar ps_rc_ctxt->ai_to_avg_bit_ratio[i4_enc_frm_id] = i_to_avg_bit_ratio;
2840*c83a76b0SSuyog Pawar
2841*c83a76b0SSuyog Pawar /** Use estimate of header bits from pre-enc*/
2842*c83a76b0SSuyog Pawar if(1 == i4_is_no_model_scd)
2843*c83a76b0SSuyog Pawar {
2844*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_est_I_pic_header_bits =
2845*c83a76b0SSuyog Pawar get_est_hdr_bits(ps_rc_ctxt->rc_hdl, rc_pic_type);
2846*c83a76b0SSuyog Pawar }
2847*c83a76b0SSuyog Pawar else
2848*c83a76b0SSuyog Pawar {
2849*c83a76b0SSuyog Pawar WORD32 i4_curr_qscale = ihevce_rc_get_scaled_mpeg2_qp(
2850*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_L0_qp, ps_rc_ctxt->ps_rc_quant_ctxt);
2851*c83a76b0SSuyog Pawar /*Assume that 30% of header bits are constant and remaining are dependent on Qp
2852*c83a76b0SSuyog Pawar and map them accordingly*/
2853*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_est_I_pic_header_bits = (LWORD64)(
2854*c83a76b0SSuyog Pawar (.3 * ps_rc_lap_out->i8_est_I_pic_header_bits +
2855*c83a76b0SSuyog Pawar (1. - .3) * ps_rc_lap_out->i8_est_I_pic_header_bits * i4_ref_qscale) /
2856*c83a76b0SSuyog Pawar i4_curr_qscale);
2857*c83a76b0SSuyog Pawar }
2858*c83a76b0SSuyog Pawar
2859*c83a76b0SSuyog Pawar /*get qp for scene cut frame based on offline data*/
2860*c83a76b0SSuyog Pawar index = ihevce_get_offline_index(
2861*c83a76b0SSuyog Pawar ps_rc_ctxt, ps_rc_lap_out->i4_num_pels_in_frame_considered);
2862*c83a76b0SSuyog Pawar
2863*c83a76b0SSuyog Pawar /*Sub pic rC bits extraction */
2864*c83a76b0SSuyog Pawar i4_frame_qs_q3 = rc_get_qp_for_scd_frame(
2865*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
2866*c83a76b0SSuyog Pawar I_PIC,
2867*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_frame_satd_act_accum,
2868*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_num_pels_in_frame_considered,
2869*c83a76b0SSuyog Pawar (WORD32)ps_rc_ctxt->i8_est_I_pic_header_bits,
2870*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_lap_f_sim[i4_enc_frm_id],
2871*c83a76b0SSuyog Pawar (void *)&g_offline_i_model_coeff[index][0],
2872*c83a76b0SSuyog Pawar i_to_avg_bit_ratio,
2873*c83a76b0SSuyog Pawar 1,
2874*c83a76b0SSuyog Pawar ps_rc_ctxt->af_sum_weigh[i4_enc_frm_id],
2875*c83a76b0SSuyog Pawar ps_rc_lap_out->ps_frame_info,
2876*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_rc_pass,
2877*c83a76b0SSuyog Pawar (rc_pic_type != I_PIC),
2878*c83a76b0SSuyog Pawar ((ps_rc_lap_out->i4_rc_temporal_lyr_id != ps_rc_ctxt->i4_max_temporal_lyr) ||
2879*c83a76b0SSuyog Pawar (!ps_rc_ctxt->i4_max_temporal_lyr)),
2880*c83a76b0SSuyog Pawar 1,
2881*c83a76b0SSuyog Pawar &i4_total_bits,
2882*c83a76b0SSuyog Pawar &i4_current_bits_estimated,
2883*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_use_offline_model_2pass,
2884*c83a76b0SSuyog Pawar ai8_i_tex_bits,
2885*c83a76b0SSuyog Pawar af_i_qs,
2886*c83a76b0SSuyog Pawar i4_best_br_id,
2887*c83a76b0SSuyog Pawar &i4_estimate_to_calc_frm_error_temp);
2888*c83a76b0SSuyog Pawar
2889*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ihevce_rc_get_scaled_hevc_qp_from_qs_q3(
2890*c83a76b0SSuyog Pawar i4_frame_qs_q3, ps_rc_ctxt->ps_rc_quant_ctxt);
2891*c83a76b0SSuyog Pawar
2892*c83a76b0SSuyog Pawar /*Get corresponding q scale*/
2893*c83a76b0SSuyog Pawar i4_frame_qp =
2894*c83a76b0SSuyog Pawar ihevce_rc_get_scaled_mpeg2_qp(i4_hevc_frame_qp, ps_rc_ctxt->ps_rc_quant_ctxt);
2895*c83a76b0SSuyog Pawar
2896*c83a76b0SSuyog Pawar if(i4_hevc_frame_qp > ps_rc_ctxt->ps_rc_quant_ctxt->i2_max_qp)
2897*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ps_rc_ctxt->ps_rc_quant_ctxt->i2_max_qp;
2898*c83a76b0SSuyog Pawar
2899*c83a76b0SSuyog Pawar {
2900*c83a76b0SSuyog Pawar WORD32 i4_init_qscale = ihevce_rc_get_scaled_mpeg2_qp(
2901*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_L0_qp, ps_rc_ctxt->ps_rc_quant_ctxt);
2902*c83a76b0SSuyog Pawar f_percent_error = (float)(abs(i4_init_qscale - i4_frame_qp)) / i4_init_qscale;
2903*c83a76b0SSuyog Pawar if(f_percent_error < f_min_error)
2904*c83a76b0SSuyog Pawar {
2905*c83a76b0SSuyog Pawar f_min_error = f_percent_error;
2906*c83a76b0SSuyog Pawar i4_min_error_hevc_qp = i4_hevc_frame_qp;
2907*c83a76b0SSuyog Pawar i4_i_to_rest_ratio_final = i_to_avg_bit_ratio;
2908*c83a76b0SSuyog Pawar /*Get the bits estimated for least error*/
2909*c83a76b0SSuyog Pawar *pi4_tot_bits_estimated = i4_current_bits_estimated;
2910*c83a76b0SSuyog Pawar i4_estimate_to_calc_frm_error = i4_estimate_to_calc_frm_error_temp;
2911*c83a76b0SSuyog Pawar }
2912*c83a76b0SSuyog Pawar else
2913*c83a76b0SSuyog Pawar {}
2914*c83a76b0SSuyog Pawar ASSERT(*pi4_tot_bits_estimated != 0);
2915*c83a76b0SSuyog Pawar }
2916*c83a76b0SSuyog Pawar i4_count++;
2917*c83a76b0SSuyog Pawar if(/*(ps_rc_lap_out->i4_L0_qp == i4_hevc_frame_qp) ||*/ (i4_count > 17))
2918*c83a76b0SSuyog Pawar break;
2919*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_L0_qp++;
2920*c83a76b0SSuyog Pawar }
2921*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_L0_qp = i4_min_error_hevc_qp;
2922*c83a76b0SSuyog Pawar
2923*c83a76b0SSuyog Pawar i4_hevc_frame_qp = i4_min_error_hevc_qp;
2924*c83a76b0SSuyog Pawar if(2 == i4_is_no_model_scd)
2925*c83a76b0SSuyog Pawar {
2926*c83a76b0SSuyog Pawar /* SGI & Enc Loop Parallelism related changes*/
2927*c83a76b0SSuyog Pawar
2928*c83a76b0SSuyog Pawar /*model reset not required if it is first frame*/
2929*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_is_first_frame_encoded && !i4_fade_scene &&
2930*c83a76b0SSuyog Pawar !ps_rc_ctxt->ai4_I_model_only_reset[i4_enc_frm_id] &&
2931*c83a76b0SSuyog Pawar !ps_rc_ctxt->ai4_is_non_I_scd_pic[i4_enc_frm_id] &&
2932*c83a76b0SSuyog Pawar !ps_rc_ctxt->ai4_is_pause_to_resume[i4_enc_frm_id] &&
2933*c83a76b0SSuyog Pawar !ps_rc_ctxt->ai4_is_cmplx_change_reset_model[i4_enc_frm_id])
2934*c83a76b0SSuyog Pawar {
2935*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_frame_scd[i4_enc_frm_id] = 1;
2936*c83a76b0SSuyog Pawar /*reset all pic type is first frame encoded flag*/
2937*c83a76b0SSuyog Pawar
2938*c83a76b0SSuyog Pawar ASSERT(pic_type == IV_IDR_FRAME || pic_type == IV_I_FRAME);
2939*c83a76b0SSuyog Pawar }
2940*c83a76b0SSuyog Pawar else if(ps_rc_ctxt->ai4_I_model_only_reset[i4_enc_frm_id])
2941*c83a76b0SSuyog Pawar {
2942*c83a76b0SSuyog Pawar rc_reset_first_frame_coded_flag(ps_rc_ctxt->rc_hdl, I_PIC);
2943*c83a76b0SSuyog Pawar ASSERT(rc_pic_type == I_PIC);
2944*c83a76b0SSuyog Pawar ASSERT(ps_rc_ctxt->ai4_is_non_I_scd_pic[i4_enc_frm_id] == 0);
2945*c83a76b0SSuyog Pawar }
2946*c83a76b0SSuyog Pawar else if(
2947*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_non_I_scd_pic[i4_enc_frm_id] ||
2948*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_pause_to_resume[i4_enc_frm_id] ||
2949*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_cmplx_change_reset_model[i4_enc_frm_id] || i4_fade_scene)
2950*c83a76b0SSuyog Pawar {
2951*c83a76b0SSuyog Pawar /*Only when there are back to back scene cuts we need a non- Ipic will be marked as scene cut*/
2952*c83a76b0SSuyog Pawar /* Same path can also be followed during pause to resume detection to determine cur frame qp however handling during update is different*/
2953*c83a76b0SSuyog Pawar WORD32 i4_prev_qp, i, i4_new_qp_hevc_qp, I_hevc_qp, cur_hevc_qp;
2954*c83a76b0SSuyog Pawar
2955*c83a76b0SSuyog Pawar /*both cannot be set at same time since lap cannot mark same frame as both scene cut and pause to resume flag*/
2956*c83a76b0SSuyog Pawar ASSERT(
2957*c83a76b0SSuyog Pawar (ps_rc_ctxt->ai4_is_non_I_scd_pic[i4_enc_frm_id] &&
2958*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_pause_to_resume[i4_enc_frm_id]) == 0);
2959*c83a76b0SSuyog Pawar
2960*c83a76b0SSuyog Pawar I_hevc_qp = i4_hevc_frame_qp;
2961*c83a76b0SSuyog Pawar
2962*c83a76b0SSuyog Pawar /*alter ai4_prev_pic_hevc_qp so that qp restriction ll not let even other pictures temporary scd are thrashed*/
2963*c83a76b0SSuyog Pawar //if(ps_rc_lap_out->i4_rc_temporal_lyr_id != ps_rc_ctxt->i4_max_temporal_lyr)
2964*c83a76b0SSuyog Pawar {
2965*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_field_pic == 0)
2966*c83a76b0SSuyog Pawar {
2967*c83a76b0SSuyog Pawar for(i = 1; i < ps_rc_ctxt->i4_num_active_pic_type; i++)
2968*c83a76b0SSuyog Pawar {
2969*c83a76b0SSuyog Pawar i4_prev_qp = ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][i];
2970*c83a76b0SSuyog Pawar i4_new_qp_hevc_qp = I_hevc_qp + i;
2971*c83a76b0SSuyog Pawar i4_new_qp_hevc_qp = ihevce_clip_min_max_qp(
2972*c83a76b0SSuyog Pawar ps_rc_ctxt, i4_new_qp_hevc_qp, (picture_type_e)i, i - 1);
2973*c83a76b0SSuyog Pawar if(i4_prev_qp < i4_new_qp_hevc_qp)
2974*c83a76b0SSuyog Pawar {
2975*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][i] =
2976*c83a76b0SSuyog Pawar i4_new_qp_hevc_qp;
2977*c83a76b0SSuyog Pawar }
2978*c83a76b0SSuyog Pawar }
2979*c83a76b0SSuyog Pawar }
2980*c83a76b0SSuyog Pawar else
2981*c83a76b0SSuyog Pawar { /*field case*/
2982*c83a76b0SSuyog Pawar
2983*c83a76b0SSuyog Pawar for(i = 1; i < ps_rc_ctxt->i4_num_active_pic_type; i++)
2984*c83a76b0SSuyog Pawar {
2985*c83a76b0SSuyog Pawar i4_prev_qp = ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][i];
2986*c83a76b0SSuyog Pawar i4_new_qp_hevc_qp = I_hevc_qp + i;
2987*c83a76b0SSuyog Pawar i4_new_qp_hevc_qp = ihevce_clip_min_max_qp(
2988*c83a76b0SSuyog Pawar ps_rc_ctxt, i4_new_qp_hevc_qp, (picture_type_e)i, i - 1);
2989*c83a76b0SSuyog Pawar if(i4_prev_qp < i4_new_qp_hevc_qp)
2990*c83a76b0SSuyog Pawar {
2991*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][i] =
2992*c83a76b0SSuyog Pawar i4_new_qp_hevc_qp;
2993*c83a76b0SSuyog Pawar }
2994*c83a76b0SSuyog Pawar
2995*c83a76b0SSuyog Pawar i4_prev_qp =
2996*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][i + FIELD_OFFSET];
2997*c83a76b0SSuyog Pawar i4_new_qp_hevc_qp = I_hevc_qp + i;
2998*c83a76b0SSuyog Pawar i4_new_qp_hevc_qp = ihevce_clip_min_max_qp(
2999*c83a76b0SSuyog Pawar ps_rc_ctxt, i4_new_qp_hevc_qp, (picture_type_e)i, i - 1);
3000*c83a76b0SSuyog Pawar if(i4_prev_qp < i4_new_qp_hevc_qp)
3001*c83a76b0SSuyog Pawar {
3002*c83a76b0SSuyog Pawar ps_rc_ctxt
3003*c83a76b0SSuyog Pawar ->ai4_prev_pic_hevc_qp[i4_scene_num][i + FIELD_OFFSET] =
3004*c83a76b0SSuyog Pawar i4_new_qp_hevc_qp;
3005*c83a76b0SSuyog Pawar }
3006*c83a76b0SSuyog Pawar }
3007*c83a76b0SSuyog Pawar }
3008*c83a76b0SSuyog Pawar }
3009*c83a76b0SSuyog Pawar {
3010*c83a76b0SSuyog Pawar WORD32 i4_updated_qp = ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][i];
3011*c83a76b0SSuyog Pawar WORD32 i4_scale;
3012*c83a76b0SSuyog Pawar
3013*c83a76b0SSuyog Pawar if(I_hevc_qp == i4_updated_qp)
3014*c83a76b0SSuyog Pawar i4_scale = 16;
3015*c83a76b0SSuyog Pawar else if(I_hevc_qp == (i4_updated_qp - 1))
3016*c83a76b0SSuyog Pawar i4_scale = 14;
3017*c83a76b0SSuyog Pawar else if(I_hevc_qp == (i4_updated_qp - 2))
3018*c83a76b0SSuyog Pawar i4_scale = 12;
3019*c83a76b0SSuyog Pawar else
3020*c83a76b0SSuyog Pawar i4_scale = 10;
3021*c83a76b0SSuyog Pawar
3022*c83a76b0SSuyog Pawar *pi4_tot_bits_estimated = (i4_scale * (*pi4_tot_bits_estimated)) >> 4;
3023*c83a76b0SSuyog Pawar i4_estimate_to_calc_frm_error =
3024*c83a76b0SSuyog Pawar (i4_scale * i4_estimate_to_calc_frm_error) >> 4;
3025*c83a76b0SSuyog Pawar }
3026*c83a76b0SSuyog Pawar if(call_type == ENC_GET_QP)
3027*c83a76b0SSuyog Pawar {
3028*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_est_text_bits = *pi4_tot_bits_estimated;
3029*c83a76b0SSuyog Pawar }
3030*c83a76b0SSuyog Pawar ASSERT(*pi4_tot_bits_estimated != 0);
3031*c83a76b0SSuyog Pawar
3032*c83a76b0SSuyog Pawar /*use previous frame qp of same pic type or SCD i frame qp with offset whichever is maximum*/
3033*c83a76b0SSuyog Pawar /*For field case adding of grater than 4 results in the qp increasing greatly when compared to previous pics/fields*/
3034*c83a76b0SSuyog Pawar if(rc_pic_type <= FIELD_OFFSET)
3035*c83a76b0SSuyog Pawar cur_hevc_qp = I_hevc_qp + rc_pic_type;
3036*c83a76b0SSuyog Pawar else
3037*c83a76b0SSuyog Pawar cur_hevc_qp = I_hevc_qp + (rc_pic_type - FIELD_OFFSET);
3038*c83a76b0SSuyog Pawar
3039*c83a76b0SSuyog Pawar i4_prev_qp = ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][rc_pic_type];
3040*c83a76b0SSuyog Pawar
3041*c83a76b0SSuyog Pawar if((cur_hevc_qp < i4_prev_qp) && (ps_rc_ctxt->i4_num_active_pic_type > 2) &&
3042*c83a76b0SSuyog Pawar (is_first_frame_coded(ps_rc_ctxt->rc_hdl)) && (!i4_fade_scene))
3043*c83a76b0SSuyog Pawar {
3044*c83a76b0SSuyog Pawar cur_hevc_qp = i4_prev_qp;
3045*c83a76b0SSuyog Pawar }
3046*c83a76b0SSuyog Pawar i4_frame_qp =
3047*c83a76b0SSuyog Pawar ihevce_rc_get_scaled_mpeg2_qp(cur_hevc_qp, ps_rc_ctxt->ps_rc_quant_ctxt);
3048*c83a76b0SSuyog Pawar i4_hevc_frame_qp = cur_hevc_qp;
3049*c83a76b0SSuyog Pawar //ps_rc_ctxt->i4_is_non_I_scd_pic = 0;
3050*c83a76b0SSuyog Pawar
3051*c83a76b0SSuyog Pawar rc_reset_first_frame_coded_flag(ps_rc_ctxt->rc_hdl, rc_pic_type);
3052*c83a76b0SSuyog Pawar }
3053*c83a76b0SSuyog Pawar else
3054*c83a76b0SSuyog Pawar {}
3055*c83a76b0SSuyog Pawar }
3056*c83a76b0SSuyog Pawar if((1 == i4_is_no_model_scd) && (call_type == ENC_GET_QP))
3057*c83a76b0SSuyog Pawar {
3058*c83a76b0SSuyog Pawar WORD32 i4_clip_QP;
3059*c83a76b0SSuyog Pawar i4_frame_qp_q6 =
3060*c83a76b0SSuyog Pawar clip_qp_based_on_prev_ref(ps_rc_ctxt->rc_hdl, rc_pic_type, 1, i4_scene_num);
3061*c83a76b0SSuyog Pawar i4_clip_QP =
3062*c83a76b0SSuyog Pawar ihevce_rc_get_scaled_hevce_qp_q6(i4_frame_qp_q6, ps_rc_ctxt->u1_bit_depth);
3063*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_rc_pass != 2)
3064*c83a76b0SSuyog Pawar {
3065*c83a76b0SSuyog Pawar i4_hevc_frame_qp = i4_clip_QP;
3066*c83a76b0SSuyog Pawar }
3067*c83a76b0SSuyog Pawar if((rc_pic_type == P_PIC) || (rc_pic_type == P1_PIC))
3068*c83a76b0SSuyog Pawar {
3069*c83a76b0SSuyog Pawar *pi4_tot_bits_estimated = (*pi4_tot_bits_estimated * 11) >> 4; /* P picture*/
3070*c83a76b0SSuyog Pawar i4_estimate_to_calc_frm_error = (i4_estimate_to_calc_frm_error * 11) >> 4;
3071*c83a76b0SSuyog Pawar }
3072*c83a76b0SSuyog Pawar else if((rc_pic_type == B_PIC) || (rc_pic_type == BB_PIC))
3073*c83a76b0SSuyog Pawar {
3074*c83a76b0SSuyog Pawar *pi4_tot_bits_estimated = (*pi4_tot_bits_estimated * 9) >> 4; /* B layer 1*/
3075*c83a76b0SSuyog Pawar i4_estimate_to_calc_frm_error = (i4_estimate_to_calc_frm_error * 9) >> 4;
3076*c83a76b0SSuyog Pawar }
3077*c83a76b0SSuyog Pawar else if((rc_pic_type == B1_PIC) || (rc_pic_type == B11_PIC))
3078*c83a76b0SSuyog Pawar {
3079*c83a76b0SSuyog Pawar *pi4_tot_bits_estimated = (*pi4_tot_bits_estimated * 7) >> 4; /* B layer 2*/
3080*c83a76b0SSuyog Pawar i4_estimate_to_calc_frm_error = (i4_estimate_to_calc_frm_error * 7) >> 4;
3081*c83a76b0SSuyog Pawar }
3082*c83a76b0SSuyog Pawar else if((rc_pic_type == B2_PIC) || (rc_pic_type == B22_PIC))
3083*c83a76b0SSuyog Pawar {
3084*c83a76b0SSuyog Pawar *pi4_tot_bits_estimated = (*pi4_tot_bits_estimated * 5) >> 4; /* B layer 3*/
3085*c83a76b0SSuyog Pawar i4_estimate_to_calc_frm_error = (i4_estimate_to_calc_frm_error * 5) >> 4;
3086*c83a76b0SSuyog Pawar }
3087*c83a76b0SSuyog Pawar }
3088*c83a76b0SSuyog Pawar rc_add_est_tot(ps_rc_ctxt->rc_hdl, *pi4_tot_bits_estimated);
3089*c83a76b0SSuyog Pawar }
3090*c83a76b0SSuyog Pawar
3091*c83a76b0SSuyog Pawar ASSERT(i4_hevc_frame_qp >= -ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset);
3092*c83a76b0SSuyog Pawar
3093*c83a76b0SSuyog Pawar /*constraint qp swing based on neighbour frames*/
3094*c83a76b0SSuyog Pawar if(is_first_frame_coded(ps_rc_ctxt->rc_hdl))
3095*c83a76b0SSuyog Pawar {
3096*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_field_pic == 0)
3097*c83a76b0SSuyog Pawar {
3098*c83a76b0SSuyog Pawar /*In dissolve case the p frame comes before an I pic and ref b comes after then what
3099*c83a76b0SSuyog Pawar happens is b frame qp is restricted by the p frame qp so changed it to prev ref pic type*/
3100*c83a76b0SSuyog Pawar if(rc_pic_type != I_PIC && rc_pic_type != P_PIC)
3101*c83a76b0SSuyog Pawar {
3102*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_rc_temporal_lyr_id == 1)
3103*c83a76b0SSuyog Pawar {
3104*c83a76b0SSuyog Pawar picture_type_e prev_ref_pic_type =
3105*c83a76b0SSuyog Pawar rc_getprev_ref_pic_type(ps_rc_ctxt->rc_hdl);
3106*c83a76b0SSuyog Pawar
3107*c83a76b0SSuyog Pawar if(i4_hevc_frame_qp >
3108*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][prev_ref_pic_type] + 3)
3109*c83a76b0SSuyog Pawar {
3110*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][prev_ref_pic_type] >
3111*c83a76b0SSuyog Pawar 0)
3112*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
3113*c83a76b0SSuyog Pawar ps_rc_ctxt
3114*c83a76b0SSuyog Pawar ->ai4_prev_pic_hevc_qp[i4_scene_num][prev_ref_pic_type] +
3115*c83a76b0SSuyog Pawar 3;
3116*c83a76b0SSuyog Pawar }
3117*c83a76b0SSuyog Pawar }
3118*c83a76b0SSuyog Pawar else if(
3119*c83a76b0SSuyog Pawar i4_hevc_frame_qp >
3120*c83a76b0SSuyog Pawar (ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][rc_pic_type - 1] + 3))
3121*c83a76b0SSuyog Pawar {
3122*c83a76b0SSuyog Pawar /*allow max of +3 compared to previous frame*/
3123*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][rc_pic_type - 1] > 0)
3124*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
3125*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][rc_pic_type - 1] + 3;
3126*c83a76b0SSuyog Pawar }
3127*c83a76b0SSuyog Pawar }
3128*c83a76b0SSuyog Pawar
3129*c83a76b0SSuyog Pawar if((rc_pic_type != I_PIC && rc_pic_type != P_PIC) &&
3130*c83a76b0SSuyog Pawar (i4_hevc_frame_qp <
3131*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][rc_pic_type - 1]))
3132*c83a76b0SSuyog Pawar {
3133*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
3134*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][rc_pic_type - 1];
3135*c83a76b0SSuyog Pawar }
3136*c83a76b0SSuyog Pawar
3137*c83a76b0SSuyog Pawar /** Force non-ref B pic qp to be ref_B_PIC_qp - 1. This is not valid for when max teporla later is less than 2*/
3138*c83a76b0SSuyog Pawar if(temporal_layer_id == ps_rc_ctxt->i4_max_temporal_lyr &&
3139*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_max_temporal_lyr > 1)
3140*c83a76b0SSuyog Pawar {
3141*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
3142*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][rc_pic_type - 1] + 1;
3143*c83a76b0SSuyog Pawar }
3144*c83a76b0SSuyog Pawar }
3145*c83a76b0SSuyog Pawar else /*for field case*/
3146*c83a76b0SSuyog Pawar {
3147*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_rc_temporal_lyr_id >= 1)
3148*c83a76b0SSuyog Pawar {
3149*c83a76b0SSuyog Pawar /*To make the comparison of qp with the top field's of previous layer tempor layer id matches with the pic type. */
3150*c83a76b0SSuyog Pawar if(i4_hevc_frame_qp >
3151*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num]
3152*c83a76b0SSuyog Pawar [ps_rc_lap_out->i4_rc_temporal_lyr_id] +
3153*c83a76b0SSuyog Pawar 3)
3154*c83a76b0SSuyog Pawar {
3155*c83a76b0SSuyog Pawar /*allow max of +3 compared to previous frame*/
3156*c83a76b0SSuyog Pawar if(0 <
3157*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num]
3158*c83a76b0SSuyog Pawar [ps_rc_lap_out->i4_rc_temporal_lyr_id])
3159*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
3160*c83a76b0SSuyog Pawar ps_rc_ctxt
3161*c83a76b0SSuyog Pawar ->ai4_prev_pic_hevc_qp[i4_scene_num]
3162*c83a76b0SSuyog Pawar [ps_rc_lap_out->i4_rc_temporal_lyr_id] +
3163*c83a76b0SSuyog Pawar 3;
3164*c83a76b0SSuyog Pawar }
3165*c83a76b0SSuyog Pawar if(i4_hevc_frame_qp <
3166*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num]
3167*c83a76b0SSuyog Pawar [ps_rc_lap_out->i4_rc_temporal_lyr_id])
3168*c83a76b0SSuyog Pawar {
3169*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
3170*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num]
3171*c83a76b0SSuyog Pawar [ps_rc_lap_out->i4_rc_temporal_lyr_id];
3172*c83a76b0SSuyog Pawar }
3173*c83a76b0SSuyog Pawar
3174*c83a76b0SSuyog Pawar /** Force non-ref B pic qp to be ref_B_PIC_qp - 1. This is not valid for when max teporla later is less than 2*/
3175*c83a76b0SSuyog Pawar if(temporal_layer_id == ps_rc_ctxt->i4_max_temporal_lyr &&
3176*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_max_temporal_lyr > 1)
3177*c83a76b0SSuyog Pawar {
3178*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
3179*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num]
3180*c83a76b0SSuyog Pawar [ps_rc_lap_out->i4_rc_temporal_lyr_id] +
3181*c83a76b0SSuyog Pawar 1;
3182*c83a76b0SSuyog Pawar }
3183*c83a76b0SSuyog Pawar }
3184*c83a76b0SSuyog Pawar /** At lower range qp swing for same pic type is also imposed to make sure
3185*c83a76b0SSuyog Pawar qp does not fall from 10 to 4 since they differ by only one q scale*/
3186*c83a76b0SSuyog Pawar }
3187*c83a76b0SSuyog Pawar }
3188*c83a76b0SSuyog Pawar
3189*c83a76b0SSuyog Pawar /**clip to min qp which is user configurable*/
3190*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ihevce_clip_min_max_qp(
3191*c83a76b0SSuyog Pawar ps_rc_ctxt, i4_hevc_frame_qp, rc_pic_type, ps_rc_lap_out->i4_rc_temporal_lyr_id);
3192*c83a76b0SSuyog Pawar
3193*c83a76b0SSuyog Pawar #if 1 //FRAME_PARALLEL_LVL
3194*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_est_text_bits_ctr_get_qp++; //ELP_RC
3195*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_est_text_bits_ctr_get_qp =
3196*c83a76b0SSuyog Pawar (ps_rc_ctxt->i4_est_text_bits_ctr_get_qp % (ps_rc_ctxt->i4_num_frame_parallel));
3197*c83a76b0SSuyog Pawar #endif
3198*c83a76b0SSuyog Pawar /** the estimates are reset only duing enc call*/
3199*c83a76b0SSuyog Pawar
3200*c83a76b0SSuyog Pawar #if USE_USER_FIRST_FRAME_QP
3201*c83a76b0SSuyog Pawar /*I_PIC check is necessary coz pre-enc can query for qp even before first frame update has happened*/
3202*c83a76b0SSuyog Pawar if(!ps_rc_ctxt->i4_is_first_frame_encoded && rc_pic_type == I_PIC)
3203*c83a76b0SSuyog Pawar {
3204*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ps_rc_ctxt->i4_init_frame_qp_user;
3205*c83a76b0SSuyog Pawar DBG_PRINTF("FIXED START QP PATH *************************\n");
3206*c83a76b0SSuyog Pawar }
3207*c83a76b0SSuyog Pawar #endif
3208*c83a76b0SSuyog Pawar }
3209*c83a76b0SSuyog Pawar
3210*c83a76b0SSuyog Pawar if(CONST_QP != e_rc_type)
3211*c83a76b0SSuyog Pawar {
3212*c83a76b0SSuyog Pawar ASSERT(*pi4_tot_bits_estimated != 0);
3213*c83a76b0SSuyog Pawar }
3214*c83a76b0SSuyog Pawar
3215*c83a76b0SSuyog Pawar ps_rc_ctxt->s_rc_high_lvl_stat.i4_finalQP = i4_hevc_frame_qp;
3216*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_is_model_valid)
3217*c83a76b0SSuyog Pawar {
3218*c83a76b0SSuyog Pawar get_bits_for_final_qp(
3219*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
3220*c83a76b0SSuyog Pawar &ps_rc_ctxt->s_rc_high_lvl_stat.i4_modelQP,
3221*c83a76b0SSuyog Pawar &ps_rc_ctxt->s_rc_high_lvl_stat.i4_maxEbfQP,
3222*c83a76b0SSuyog Pawar &ps_rc_ctxt->s_rc_high_lvl_stat.i8_bits_from_finalQP,
3223*c83a76b0SSuyog Pawar i4_hevc_frame_qp,
3224*c83a76b0SSuyog Pawar ihevce_rc_get_scaled_mpeg2_qp_q6(
3225*c83a76b0SSuyog Pawar i4_hevc_frame_qp + ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset,
3226*c83a76b0SSuyog Pawar ps_rc_ctxt->u1_bit_depth),
3227*c83a76b0SSuyog Pawar i4_cur_est_header_bits,
3228*c83a76b0SSuyog Pawar i4_est_tex_bits,
3229*c83a76b0SSuyog Pawar i4_vbv_buf_max_bits,
3230*c83a76b0SSuyog Pawar rc_pic_type,
3231*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_display_num);
3232*c83a76b0SSuyog Pawar }
3233*c83a76b0SSuyog Pawar i4_deltaQP = ihevce_ebf_based_rc_correction_to_avoid_overflow(
3234*c83a76b0SSuyog Pawar ps_rc_ctxt, ps_rc_lap_out, pi4_tot_bits_estimated);
3235*c83a76b0SSuyog Pawar i4_hevc_frame_qp += i4_deltaQP;
3236*c83a76b0SSuyog Pawar
3237*c83a76b0SSuyog Pawar /**clip to min qp which is user configurable*/
3238*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ihevce_clip_min_max_qp(
3239*c83a76b0SSuyog Pawar ps_rc_ctxt, i4_hevc_frame_qp, rc_pic_type, ps_rc_lap_out->i4_rc_temporal_lyr_id);
3240*c83a76b0SSuyog Pawar
3241*c83a76b0SSuyog Pawar /*set estimate status for frame level error calculation*/
3242*c83a76b0SSuyog Pawar if(i4_estimate_to_calc_frm_error > 0)
3243*c83a76b0SSuyog Pawar {
3244*c83a76b0SSuyog Pawar rc_set_estimate_status(
3245*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
3246*c83a76b0SSuyog Pawar i4_estimate_to_calc_frm_error - ps_rc_ctxt->i8_est_I_pic_header_bits,
3247*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_est_I_pic_header_bits,
3248*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_est_text_bits_ctr_get_qp);
3249*c83a76b0SSuyog Pawar }
3250*c83a76b0SSuyog Pawar else
3251*c83a76b0SSuyog Pawar {
3252*c83a76b0SSuyog Pawar rc_set_estimate_status(
3253*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
3254*c83a76b0SSuyog Pawar -1,
3255*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_est_I_pic_header_bits,
3256*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_est_text_bits_ctr_get_qp);
3257*c83a76b0SSuyog Pawar }
3258*c83a76b0SSuyog Pawar
3259*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_est_text_bits = *pi4_tot_bits_estimated;
3260*c83a76b0SSuyog Pawar
3261*c83a76b0SSuyog Pawar /*B pictures which are in fades will take the highest QP of either side of P pics*/
3262*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_rc_pic_type == IV_B_FRAME &&
3263*c83a76b0SSuyog Pawar (ps_rc_lap_out->i4_rc_scene_type == SCENE_TYPE_FADE_IN ||
3264*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_scene_type == SCENE_TYPE_FADE_OUT))
3265*c83a76b0SSuyog Pawar {
3266*c83a76b0SSuyog Pawar i4_hevc_frame_qp =
3267*c83a76b0SSuyog Pawar MAX(ps_rc_ctxt->ai4_last_tw0_lyr0_pic_qp[0], ps_rc_ctxt->ai4_last_tw0_lyr0_pic_qp[1]);
3268*c83a76b0SSuyog Pawar }
3269*c83a76b0SSuyog Pawar
3270*c83a76b0SSuyog Pawar /*saving the last two pics of layer 0*/
3271*c83a76b0SSuyog Pawar if(0 == ps_rc_lap_out->i4_rc_temporal_lyr_id)
3272*c83a76b0SSuyog Pawar {
3273*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_last_tw0_lyr0_pic_qp[1] = ps_rc_ctxt->ai4_last_tw0_lyr0_pic_qp[0];
3274*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_last_tw0_lyr0_pic_qp[0] = i4_hevc_frame_qp;
3275*c83a76b0SSuyog Pawar }
3276*c83a76b0SSuyog Pawar
3277*c83a76b0SSuyog Pawar return i4_hevc_frame_qp;
3278*c83a76b0SSuyog Pawar }
3279*c83a76b0SSuyog Pawar
3280*c83a76b0SSuyog Pawar /*##########################################################*/
3281*c83a76b0SSuyog Pawar /******* END OF ENC THRD QP QUERY FUNCTIONS ****************/
3282*c83a76b0SSuyog Pawar /*########################################################*/
3283*c83a76b0SSuyog Pawar
3284*c83a76b0SSuyog Pawar /*####################################################*/
3285*c83a76b0SSuyog Pawar /******* START OF I2AVG RATIO FUNCTIONS **************/
3286*c83a76b0SSuyog Pawar /*##################################################*/
3287*c83a76b0SSuyog Pawar
3288*c83a76b0SSuyog Pawar /**
3289*c83a76b0SSuyog Pawar ******************************************************************************
3290*c83a76b0SSuyog Pawar *
3291*c83a76b0SSuyog Pawar * @brief function to get i_to_avg_rest at scene cut frame based on data available from LAP
3292*c83a76b0SSuyog Pawar *
3293*c83a76b0SSuyog Pawar * @par Description
3294*c83a76b0SSuyog Pawar *
3295*c83a76b0SSuyog Pawar * @param[in] pv_rc_ctxt
3296*c83a76b0SSuyog Pawar * void pointer to rc ctxt
3297*c83a76b0SSuyog Pawar * @param[in] ps_rc_lap_out : pointer to lap out structure
3298*c83a76b0SSuyog Pawar * @param[in] i4_update_delay : The Delay in the update. This can happen for dist. case!
3299*c83a76b0SSuyog Pawar * All decision should consider this delay for updation!
3300*c83a76b0SSuyog Pawar * @return WORD32 i_to_rest bit ratio
3301*c83a76b0SSuyog Pawar *
3302*c83a76b0SSuyog Pawar ******************************************************************************
3303*c83a76b0SSuyog Pawar */
ihevce_get_i_to_avg_ratio(void * pv_rc_ctxt,rc_lap_out_params_t * ps_rc_lap_out,WORD32 i_to_p_qp_offset,WORD32 i4_offset_flag,WORD32 i4_call_type,WORD32 ai4_qp_offsets[4],WORD32 i4_update_delay)3304*c83a76b0SSuyog Pawar float ihevce_get_i_to_avg_ratio(
3305*c83a76b0SSuyog Pawar void *pv_rc_ctxt,
3306*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_out,
3307*c83a76b0SSuyog Pawar WORD32 i_to_p_qp_offset,
3308*c83a76b0SSuyog Pawar WORD32 i4_offset_flag,
3309*c83a76b0SSuyog Pawar WORD32 i4_call_type,
3310*c83a76b0SSuyog Pawar WORD32 ai4_qp_offsets[4],
3311*c83a76b0SSuyog Pawar WORD32 i4_update_delay)
3312*c83a76b0SSuyog Pawar {
3313*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_rc_ctxt;
3314*c83a76b0SSuyog Pawar WORD32 i = 0, k = 0, num_frames_in_lap[MAX_PIC_TYPE] = { 0 }, ai4_pic_dist[MAX_PIC_TYPE],
3315*c83a76b0SSuyog Pawar ai4_pic_dist_in_cur_gop[MAX_PIC_TYPE] = { 0 };
3316*c83a76b0SSuyog Pawar WORD32 i4_num_b, i4_num_frms_traversed_in_lap = 0, total_frms_considered = 0,
3317*c83a76b0SSuyog Pawar i4_flag_i_frame_exit = 0, u4_rc_scene_number;
3318*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_cur_rc_lap_out = ps_rc_lap_out;
3319*c83a76b0SSuyog Pawar
3320*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_cur_rc_lap_out_I = ps_rc_lap_out;
3321*c83a76b0SSuyog Pawar double complexity[MAX_PIC_TYPE] = { 0 }, d_first_i_complexity = 0, d_first_p_complexity = 0.0f,
3322*c83a76b0SSuyog Pawar cur_lambda_modifer, den = 0, average_intra_complexity = 0;
3323*c83a76b0SSuyog Pawar double i_frm_lambda_modifier;
3324*c83a76b0SSuyog Pawar float i_to_rest_bit_ratio = 8.00;
3325*c83a76b0SSuyog Pawar picture_type_e curr_rc_pic_type;
3326*c83a76b0SSuyog Pawar LWORD64 i8_l1_analysis_lap_comp = 0;
3327*c83a76b0SSuyog Pawar WORD32 i4_intra_frame_interval = rc_get_intra_frame_interval(ps_rc_ctxt->rc_hdl);
3328*c83a76b0SSuyog Pawar UWORD32 u4_L1_based_lap_complexity_q7 = 0;
3329*c83a76b0SSuyog Pawar WORD32 i4_frame_qp = 0, i4_I_frame_qp = 0;
3330*c83a76b0SSuyog Pawar
3331*c83a76b0SSuyog Pawar WORD32 ai4_lambda_offsets[5] = { -3, -2, 2, 6, 7 };
3332*c83a76b0SSuyog Pawar /* The window for which your update is guaranteed */
3333*c83a76b0SSuyog Pawar WORD32 updated_window = ps_rc_ctxt->i4_num_frame_in_lap_window - i4_update_delay;
3334*c83a76b0SSuyog Pawar
3335*c83a76b0SSuyog Pawar ASSERT(ps_rc_ctxt->i4_rc_pass != 2);
3336*c83a76b0SSuyog Pawar rc_get_pic_distribution(ps_rc_ctxt->rc_hdl, &ai4_pic_dist[0]);
3337*c83a76b0SSuyog Pawar
3338*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_max_temporal_lyr)
3339*c83a76b0SSuyog Pawar {
3340*c83a76b0SSuyog Pawar i4_num_b = ((WORD32)pow((float)2, ps_rc_ctxt->i4_max_temporal_lyr)) - 1;
3341*c83a76b0SSuyog Pawar }
3342*c83a76b0SSuyog Pawar else
3343*c83a76b0SSuyog Pawar {
3344*c83a76b0SSuyog Pawar i4_num_b = 0;
3345*c83a76b0SSuyog Pawar }
3346*c83a76b0SSuyog Pawar i_frm_lambda_modifier = ihevce_get_frame_lambda_modifier((WORD8)I_PIC, 0, 1, 1, i4_num_b);
3347*c83a76b0SSuyog Pawar /* check should be wrt inter frame interval*/
3348*c83a76b0SSuyog Pawar /*If lap frames are not sufficient return default ratio*/
3349*c83a76b0SSuyog Pawar u4_rc_scene_number = ps_cur_rc_lap_out_I->u4_rc_scene_num;
3350*c83a76b0SSuyog Pawar
3351*c83a76b0SSuyog Pawar if(updated_window < 4)
3352*c83a76b0SSuyog Pawar {
3353*c83a76b0SSuyog Pawar return i_to_rest_bit_ratio;
3354*c83a76b0SSuyog Pawar }
3355*c83a76b0SSuyog Pawar
3356*c83a76b0SSuyog Pawar k = 0;
3357*c83a76b0SSuyog Pawar if(ps_cur_rc_lap_out != NULL)
3358*c83a76b0SSuyog Pawar {
3359*c83a76b0SSuyog Pawar WORD32 i4_temp_frame_qp;
3360*c83a76b0SSuyog Pawar
3361*c83a76b0SSuyog Pawar if(ps_cur_rc_lap_out->i4_L0_qp == -1)
3362*c83a76b0SSuyog Pawar {
3363*c83a76b0SSuyog Pawar i4_frame_qp = ps_cur_rc_lap_out->i4_L1_qp;
3364*c83a76b0SSuyog Pawar i4_I_frame_qp = ps_cur_rc_lap_out->i4_L1_qp - 3;
3365*c83a76b0SSuyog Pawar }
3366*c83a76b0SSuyog Pawar else
3367*c83a76b0SSuyog Pawar {
3368*c83a76b0SSuyog Pawar i4_frame_qp = ps_cur_rc_lap_out->i4_L0_qp;
3369*c83a76b0SSuyog Pawar i4_I_frame_qp = ps_cur_rc_lap_out->i4_L0_qp - 3;
3370*c83a76b0SSuyog Pawar }
3371*c83a76b0SSuyog Pawar
3372*c83a76b0SSuyog Pawar do
3373*c83a76b0SSuyog Pawar {
3374*c83a76b0SSuyog Pawar curr_rc_pic_type = ihevce_rc_conv_pic_type(
3375*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_cur_rc_lap_out->i4_rc_pic_type,
3376*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
3377*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->i4_rc_temporal_lyr_id,
3378*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->i4_is_bottom_field,
3379*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
3380*c83a76b0SSuyog Pawar cur_lambda_modifer = ihevce_get_frame_lambda_modifier(
3381*c83a76b0SSuyog Pawar (WORD8)curr_rc_pic_type,
3382*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->i4_rc_temporal_lyr_id,
3383*c83a76b0SSuyog Pawar 1,
3384*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->i4_rc_is_ref_pic,
3385*c83a76b0SSuyog Pawar i4_num_b);
3386*c83a76b0SSuyog Pawar if(curr_rc_pic_type == I_PIC)
3387*c83a76b0SSuyog Pawar {
3388*c83a76b0SSuyog Pawar i4_temp_frame_qp = i4_frame_qp + ai4_lambda_offsets[curr_rc_pic_type];
3389*c83a76b0SSuyog Pawar }
3390*c83a76b0SSuyog Pawar else
3391*c83a76b0SSuyog Pawar {
3392*c83a76b0SSuyog Pawar i4_temp_frame_qp =
3393*c83a76b0SSuyog Pawar i4_frame_qp + ai4_lambda_offsets[ps_cur_rc_lap_out->i4_rc_temporal_lyr_id + 1];
3394*c83a76b0SSuyog Pawar i4_temp_frame_qp =
3395*c83a76b0SSuyog Pawar i4_temp_frame_qp +
3396*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->ai4_offsets[ps_cur_rc_lap_out->i4_rc_temporal_lyr_id + 1];
3397*c83a76b0SSuyog Pawar }
3398*c83a76b0SSuyog Pawar
3399*c83a76b0SSuyog Pawar i4_temp_frame_qp = CLIP3(i4_temp_frame_qp, 1, 51);
3400*c83a76b0SSuyog Pawar i4_I_frame_qp = CLIP3(i4_I_frame_qp, 1, 51);
3401*c83a76b0SSuyog Pawar
3402*c83a76b0SSuyog Pawar if(curr_rc_pic_type == I_PIC)
3403*c83a76b0SSuyog Pawar {
3404*c83a76b0SSuyog Pawar complexity[I_PIC] += (double)ps_cur_rc_lap_out->ai8_pre_intra_sad[i4_I_frame_qp];
3405*c83a76b0SSuyog Pawar if(total_frms_considered == 0)
3406*c83a76b0SSuyog Pawar d_first_i_complexity =
3407*c83a76b0SSuyog Pawar (double)ps_cur_rc_lap_out->ai8_pre_intra_sad[i4_I_frame_qp];
3408*c83a76b0SSuyog Pawar
3409*c83a76b0SSuyog Pawar num_frames_in_lap[I_PIC]++;
3410*c83a76b0SSuyog Pawar i8_l1_analysis_lap_comp +=
3411*c83a76b0SSuyog Pawar (LWORD64)(1.17 * ps_cur_rc_lap_out->i8_raw_pre_intra_sad);
3412*c83a76b0SSuyog Pawar }
3413*c83a76b0SSuyog Pawar else
3414*c83a76b0SSuyog Pawar {
3415*c83a76b0SSuyog Pawar if((num_frames_in_lap[P_PIC] == 0) && (curr_rc_pic_type == P_PIC))
3416*c83a76b0SSuyog Pawar d_first_p_complexity =
3417*c83a76b0SSuyog Pawar (double)ps_cur_rc_lap_out->ai8_pre_intra_sad[i4_I_frame_qp];
3418*c83a76b0SSuyog Pawar
3419*c83a76b0SSuyog Pawar if(total_frms_considered == 0)
3420*c83a76b0SSuyog Pawar {
3421*c83a76b0SSuyog Pawar num_frames_in_lap[I_PIC]++;
3422*c83a76b0SSuyog Pawar {
3423*c83a76b0SSuyog Pawar complexity[I_PIC] +=
3424*c83a76b0SSuyog Pawar (double)ps_cur_rc_lap_out->ai8_pre_intra_sad[i4_I_frame_qp];
3425*c83a76b0SSuyog Pawar d_first_i_complexity =
3426*c83a76b0SSuyog Pawar (double)ps_cur_rc_lap_out->ai8_pre_intra_sad[i4_I_frame_qp];
3427*c83a76b0SSuyog Pawar }
3428*c83a76b0SSuyog Pawar }
3429*c83a76b0SSuyog Pawar else
3430*c83a76b0SSuyog Pawar {
3431*c83a76b0SSuyog Pawar /*SAD is scaled according the lambda parametrs use to make it proportional to bits consumed in the end*/
3432*c83a76b0SSuyog Pawar #if !USE_SQRT
3433*c83a76b0SSuyog Pawar //complexity[curr_rc_pic_type] += (double)(MIN(ps_cur_rc_lap_out->ai8_frame_acc_coarse_me_sad[i4_temp_frame_qp],ps_cur_rc_lap_out->i8_pre_intra_sad)/(/*(cur_lambda_modifer/i_frm_lambda_modifier) * */pow(1.125,(ps_rc_lap_out->i4_rc_temporal_lyr_id + 1/*i_to_p_qp_offset*/))));
3434*c83a76b0SSuyog Pawar if((curr_rc_pic_type > P_PIC) &&
3435*c83a76b0SSuyog Pawar (ps_rc_lap_out->i4_rc_quality_preset == IHEVCE_QUALITY_P6))
3436*c83a76b0SSuyog Pawar complexity[curr_rc_pic_type] +=
3437*c83a76b0SSuyog Pawar (double)(ps_cur_rc_lap_out->ai8_frame_acc_coarse_me_sad
3438*c83a76b0SSuyog Pawar [i4_temp_frame_qp]); // /(/*(cur_lambda_modifer/i_frm_lambda_modifier) * */pow(1.125,(ps_rc_lap_out->i4_rc_temporal_lyr_id + 1/*i_to_p_qp_offset*/))));
3439*c83a76b0SSuyog Pawar else
3440*c83a76b0SSuyog Pawar complexity[curr_rc_pic_type] += (double)(MIN(
3441*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->ai8_frame_acc_coarse_me_sad[i4_temp_frame_qp],
3442*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->ai8_pre_intra_sad
3443*c83a76b0SSuyog Pawar [i4_temp_frame_qp])); ///(/*(cur_lambda_modifer/i_frm_lambda_modifier) * */pow(1.125,(ps_rc_lap_out->i4_rc_temporal_lyr_id + 1/*i_to_p_qp_offset*/))));
3444*c83a76b0SSuyog Pawar
3445*c83a76b0SSuyog Pawar #else
3446*c83a76b0SSuyog Pawar complexity[curr_rc_pic_type] +=
3447*c83a76b0SSuyog Pawar MIN(ps_cur_rc_lap_out->ai8_frame_acc_coarse_me_sad[i4_temp_frame_qp],
3448*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->i8_pre_intra_sad) /
3449*c83a76b0SSuyog Pawar (sqrt(cur_lambda_modifer / i_frm_lambda_modifier) *
3450*c83a76b0SSuyog Pawar pow(1.125, (ps_rc_lap_out->i4_rc_temporal_lyr_id + 1)));
3451*c83a76b0SSuyog Pawar #endif
3452*c83a76b0SSuyog Pawar num_frames_in_lap[curr_rc_pic_type]++;
3453*c83a76b0SSuyog Pawar }
3454*c83a76b0SSuyog Pawar i8_l1_analysis_lap_comp += (LWORD64)(
3455*c83a76b0SSuyog Pawar (float)ps_cur_rc_lap_out->i8_raw_l1_coarse_me_sad /
3456*c83a76b0SSuyog Pawar pow(1.125, curr_rc_pic_type));
3457*c83a76b0SSuyog Pawar }
3458*c83a76b0SSuyog Pawar
3459*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_rc_quality_preset == IHEVCE_QUALITY_P6)
3460*c83a76b0SSuyog Pawar {
3461*c83a76b0SSuyog Pawar if(curr_rc_pic_type < B_PIC)
3462*c83a76b0SSuyog Pawar {
3463*c83a76b0SSuyog Pawar /*accumulate average intra sad*/
3464*c83a76b0SSuyog Pawar average_intra_complexity +=
3465*c83a76b0SSuyog Pawar ps_cur_rc_lap_out
3466*c83a76b0SSuyog Pawar ->ai8_pre_intra_sad[i4_I_frame_qp] /*/i_frm_lambda_modifier*/;
3467*c83a76b0SSuyog Pawar i4_num_frms_traversed_in_lap++;
3468*c83a76b0SSuyog Pawar }
3469*c83a76b0SSuyog Pawar }
3470*c83a76b0SSuyog Pawar else
3471*c83a76b0SSuyog Pawar {
3472*c83a76b0SSuyog Pawar /*accumulate average intra sad*/
3473*c83a76b0SSuyog Pawar average_intra_complexity +=
3474*c83a76b0SSuyog Pawar ps_cur_rc_lap_out->ai8_pre_intra_sad[i4_I_frame_qp] /*/i_frm_lambda_modifier*/;
3475*c83a76b0SSuyog Pawar i4_num_frms_traversed_in_lap++;
3476*c83a76b0SSuyog Pawar }
3477*c83a76b0SSuyog Pawar
3478*c83a76b0SSuyog Pawar ai4_pic_dist_in_cur_gop[curr_rc_pic_type]++;
3479*c83a76b0SSuyog Pawar i++;
3480*c83a76b0SSuyog Pawar total_frms_considered++;
3481*c83a76b0SSuyog Pawar i4_num_frms_traversed_in_lap++;
3482*c83a76b0SSuyog Pawar ps_cur_rc_lap_out = (rc_lap_out_params_t *)ps_cur_rc_lap_out->ps_rc_lap_out_next_encode;
3483*c83a76b0SSuyog Pawar
3484*c83a76b0SSuyog Pawar if((ps_cur_rc_lap_out == NULL) ||
3485*c83a76b0SSuyog Pawar ((total_frms_considered + k) == i4_intra_frame_interval) || (i >= updated_window))
3486*c83a76b0SSuyog Pawar {
3487*c83a76b0SSuyog Pawar break;
3488*c83a76b0SSuyog Pawar }
3489*c83a76b0SSuyog Pawar
3490*c83a76b0SSuyog Pawar if((i >= (ps_rc_ctxt->i4_next_sc_i_in_rc_look_ahead - k) ||
3491*c83a76b0SSuyog Pawar (ps_cur_rc_lap_out->i4_rc_pic_type == IV_I_FRAME) ||
3492*c83a76b0SSuyog Pawar (ps_cur_rc_lap_out->i4_rc_pic_type == IV_IDR_FRAME)) &&
3493*c83a76b0SSuyog Pawar (i4_offset_flag == 1))
3494*c83a76b0SSuyog Pawar {
3495*c83a76b0SSuyog Pawar break;
3496*c83a76b0SSuyog Pawar }
3497*c83a76b0SSuyog Pawar /*If an I frame enters the lookahead it can cause bit allocation to go bad
3498*c83a76b0SSuyog Pawar if corresponding p/b frames are absent*/
3499*c83a76b0SSuyog Pawar if(((total_frms_considered + k) > (WORD32)(0.75f * i4_intra_frame_interval)) &&
3500*c83a76b0SSuyog Pawar ((ps_cur_rc_lap_out->i4_rc_pic_type == IV_I_FRAME) ||
3501*c83a76b0SSuyog Pawar (ps_cur_rc_lap_out->i4_rc_pic_type == IV_IDR_FRAME)))
3502*c83a76b0SSuyog Pawar {
3503*c83a76b0SSuyog Pawar i4_flag_i_frame_exit = 1;
3504*c83a76b0SSuyog Pawar break;
3505*c83a76b0SSuyog Pawar }
3506*c83a76b0SSuyog Pawar
3507*c83a76b0SSuyog Pawar } while(1);
3508*c83a76b0SSuyog Pawar
3509*c83a76b0SSuyog Pawar if(total_frms_considered > 0)
3510*c83a76b0SSuyog Pawar {
3511*c83a76b0SSuyog Pawar float lap_L1_comp =
3512*c83a76b0SSuyog Pawar (float)i8_l1_analysis_lap_comp /
3513*c83a76b0SSuyog Pawar (total_frms_considered * ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width);
3514*c83a76b0SSuyog Pawar
3515*c83a76b0SSuyog Pawar lap_L1_comp = rc_get_offline_normalized_complexity(
3516*c83a76b0SSuyog Pawar ps_rc_ctxt->u4_intra_frame_interval,
3517*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width,
3518*c83a76b0SSuyog Pawar lap_L1_comp,
3519*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_rc_pass);
3520*c83a76b0SSuyog Pawar
3521*c83a76b0SSuyog Pawar u4_L1_based_lap_complexity_q7 = (WORD32)((lap_L1_comp * (1 << 7)) + .05f);
3522*c83a76b0SSuyog Pawar }
3523*c83a76b0SSuyog Pawar else
3524*c83a76b0SSuyog Pawar {
3525*c83a76b0SSuyog Pawar u4_L1_based_lap_complexity_q7 = 25;
3526*c83a76b0SSuyog Pawar }
3527*c83a76b0SSuyog Pawar
3528*c83a76b0SSuyog Pawar if(i4_call_type == 1)
3529*c83a76b0SSuyog Pawar {
3530*c83a76b0SSuyog Pawar if(num_frames_in_lap[0] > 0)
3531*c83a76b0SSuyog Pawar {
3532*c83a76b0SSuyog Pawar float f_curr_i_to_sum = (float)(d_first_i_complexity / complexity[0]);
3533*c83a76b0SSuyog Pawar f_curr_i_to_sum = CLIP3(f_curr_i_to_sum, 0.1f, 100.0f);
3534*c83a76b0SSuyog Pawar rc_set_i_to_sum_api_ba(ps_rc_ctxt->rc_hdl, f_curr_i_to_sum);
3535*c83a76b0SSuyog Pawar }
3536*c83a76b0SSuyog Pawar }
3537*c83a76b0SSuyog Pawar
3538*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
3539*c83a76b0SSuyog Pawar {
3540*c83a76b0SSuyog Pawar if(num_frames_in_lap[i] > 0)
3541*c83a76b0SSuyog Pawar {
3542*c83a76b0SSuyog Pawar complexity[i] = complexity[i] / num_frames_in_lap[i];
3543*c83a76b0SSuyog Pawar }
3544*c83a76b0SSuyog Pawar }
3545*c83a76b0SSuyog Pawar /*for non - I scd case it is possible that entire LAP window might not have intra picture. Consider average intra sad when
3546*c83a76b0SSuyog Pawar atleast one I pic is not available*/
3547*c83a76b0SSuyog Pawar if(num_frames_in_lap[I_PIC] == 0)
3548*c83a76b0SSuyog Pawar {
3549*c83a76b0SSuyog Pawar ASSERT(i4_num_frms_traversed_in_lap);
3550*c83a76b0SSuyog Pawar complexity[I_PIC] = average_intra_complexity / i4_num_frms_traversed_in_lap;
3551*c83a76b0SSuyog Pawar }
3552*c83a76b0SSuyog Pawar /*get picture type distribution in LAP*/
3553*c83a76b0SSuyog Pawar if(num_frames_in_lap[I_PIC] == 0)
3554*c83a76b0SSuyog Pawar {
3555*c83a76b0SSuyog Pawar rc_get_pic_distribution(ps_rc_ctxt->rc_hdl, &ai4_pic_dist[0]);
3556*c83a76b0SSuyog Pawar }
3557*c83a76b0SSuyog Pawar else
3558*c83a76b0SSuyog Pawar {
3559*c83a76b0SSuyog Pawar memmove(ai4_pic_dist, num_frames_in_lap, sizeof(WORD32) * MAX_PIC_TYPE);
3560*c83a76b0SSuyog Pawar }
3561*c83a76b0SSuyog Pawar
3562*c83a76b0SSuyog Pawar {
3563*c83a76b0SSuyog Pawar WORD32 num_inter_pic = 0;
3564*c83a76b0SSuyog Pawar for(i = 1; i < MAX_PIC_TYPE; i++)
3565*c83a76b0SSuyog Pawar {
3566*c83a76b0SSuyog Pawar den += complexity[i] * ai4_pic_dist[i];
3567*c83a76b0SSuyog Pawar }
3568*c83a76b0SSuyog Pawar
3569*c83a76b0SSuyog Pawar for(i = 1; i < MAX_PIC_TYPE; i++)
3570*c83a76b0SSuyog Pawar {
3571*c83a76b0SSuyog Pawar num_inter_pic += ai4_pic_dist[i];
3572*c83a76b0SSuyog Pawar }
3573*c83a76b0SSuyog Pawar if(num_inter_pic > 0)
3574*c83a76b0SSuyog Pawar den = den / num_inter_pic;
3575*c83a76b0SSuyog Pawar else
3576*c83a76b0SSuyog Pawar den = 0.0;
3577*c83a76b0SSuyog Pawar }
3578*c83a76b0SSuyog Pawar
3579*c83a76b0SSuyog Pawar if(den > 0)
3580*c83a76b0SSuyog Pawar i_to_rest_bit_ratio = (float)((complexity[I_PIC]) / den);
3581*c83a76b0SSuyog Pawar else
3582*c83a76b0SSuyog Pawar i_to_rest_bit_ratio = 15;
3583*c83a76b0SSuyog Pawar
3584*c83a76b0SSuyog Pawar if((total_frms_considered < (WORD32)(0.75f * i4_intra_frame_interval)) &&
3585*c83a76b0SSuyog Pawar (total_frms_considered < (updated_window - 1)) &&
3586*c83a76b0SSuyog Pawar ((UWORD32)total_frms_considered < ((ps_rc_ctxt->u4_max_frame_rate / 1000))))
3587*c83a76b0SSuyog Pawar {
3588*c83a76b0SSuyog Pawar /*This GOP will only sustain for few frames hence have strict restriction for I to rest ratio*/
3589*c83a76b0SSuyog Pawar if(i_to_rest_bit_ratio > 12)
3590*c83a76b0SSuyog Pawar i_to_rest_bit_ratio = 12;
3591*c83a76b0SSuyog Pawar
3592*c83a76b0SSuyog Pawar if(i_to_rest_bit_ratio > 8 &&
3593*c83a76b0SSuyog Pawar total_frms_considered < (ps_rc_ctxt->i4_max_inter_frm_int * 2))
3594*c83a76b0SSuyog Pawar i_to_rest_bit_ratio = 8;
3595*c83a76b0SSuyog Pawar }
3596*c83a76b0SSuyog Pawar }
3597*c83a76b0SSuyog Pawar
3598*c83a76b0SSuyog Pawar if((i4_call_type == 1) && (i_to_rest_bit_ratio < I_TO_REST_VVFAST) && (i4_offset_flag == 1))
3599*c83a76b0SSuyog Pawar {
3600*c83a76b0SSuyog Pawar float f_p_to_i_ratio = (float)(d_first_p_complexity / d_first_i_complexity);
3601*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i8_frame_satd_act_accum <
3602*c83a76b0SSuyog Pawar (ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width * 1.5f))
3603*c83a76b0SSuyog Pawar rc_set_p_to_i_complexity_ratio(ps_rc_ctxt->rc_hdl, f_p_to_i_ratio);
3604*c83a76b0SSuyog Pawar }
3605*c83a76b0SSuyog Pawar
3606*c83a76b0SSuyog Pawar /*Reset the pic distribution if I frame exit was encountered*/
3607*c83a76b0SSuyog Pawar
3608*c83a76b0SSuyog Pawar if(ps_rc_ctxt->e_rate_control_type != CONST_QP)
3609*c83a76b0SSuyog Pawar {
3610*c83a76b0SSuyog Pawar rc_get_pic_distribution(ps_rc_ctxt->rc_hdl, &ai4_pic_dist[0]);
3611*c83a76b0SSuyog Pawar if((ai4_pic_dist_in_cur_gop[I_PIC] > 1) && (ai4_pic_dist[0] == 1))
3612*c83a76b0SSuyog Pawar {
3613*c83a76b0SSuyog Pawar i4_flag_i_frame_exit = 1;
3614*c83a76b0SSuyog Pawar }
3615*c83a76b0SSuyog Pawar if(i4_flag_i_frame_exit && (i4_call_type == 1))
3616*c83a76b0SSuyog Pawar {
3617*c83a76b0SSuyog Pawar if(ai4_pic_dist_in_cur_gop[I_PIC] == 0)
3618*c83a76b0SSuyog Pawar memmove(ai4_pic_dist_in_cur_gop, num_frames_in_lap, sizeof(WORD32) * MAX_PIC_TYPE);
3619*c83a76b0SSuyog Pawar
3620*c83a76b0SSuyog Pawar rc_update_pic_distn_lap_to_rc(ps_rc_ctxt->rc_hdl, ai4_pic_dist_in_cur_gop);
3621*c83a76b0SSuyog Pawar rc_set_bits_based_on_complexity(
3622*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl, u4_L1_based_lap_complexity_q7, total_frms_considered);
3623*c83a76b0SSuyog Pawar }
3624*c83a76b0SSuyog Pawar }
3625*c83a76b0SSuyog Pawar
3626*c83a76b0SSuyog Pawar return i_to_rest_bit_ratio;
3627*c83a76b0SSuyog Pawar }
3628*c83a76b0SSuyog Pawar
3629*c83a76b0SSuyog Pawar /*##################################################*/
3630*c83a76b0SSuyog Pawar /******* END OF I2AVG RATIO FUNCTIONS **************/
3631*c83a76b0SSuyog Pawar /*################################################*/
3632*c83a76b0SSuyog Pawar
3633*c83a76b0SSuyog Pawar /*#########################################################*/
3634*c83a76b0SSuyog Pawar /******* START OF QSCALE CONVERSION FUNCTIONS *************/
3635*c83a76b0SSuyog Pawar /*########################################################*/
3636*c83a76b0SSuyog Pawar
3637*c83a76b0SSuyog Pawar /**
3638*c83a76b0SSuyog Pawar ******************************************************************************
3639*c83a76b0SSuyog Pawar *
3640*c83a76b0SSuyog Pawar * @brief function to convert from qscale to qp
3641*c83a76b0SSuyog Pawar *
3642*c83a76b0SSuyog Pawar * @par Description
3643*c83a76b0SSuyog Pawar * @param[in] i4_frame_qs_q3 : QP value in qscale
3644*c83a76b0SSuyog Pawar * return frame qp
3645*c83a76b0SSuyog Pawar ******************************************************************************
3646*c83a76b0SSuyog Pawar */
3647*c83a76b0SSuyog Pawar
ihevce_rc_get_scaled_hevc_qp_from_qs_q3(WORD32 i4_frame_qs_q3,rc_quant_t * ps_rc_quant_ctxt)3648*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_scaled_hevc_qp_from_qs_q3(WORD32 i4_frame_qs_q3, rc_quant_t *ps_rc_quant_ctxt)
3649*c83a76b0SSuyog Pawar {
3650*c83a76b0SSuyog Pawar if(i4_frame_qs_q3 > ps_rc_quant_ctxt->i2_max_qscale)
3651*c83a76b0SSuyog Pawar {
3652*c83a76b0SSuyog Pawar i4_frame_qs_q3 = ps_rc_quant_ctxt->i2_max_qscale;
3653*c83a76b0SSuyog Pawar }
3654*c83a76b0SSuyog Pawar else if(i4_frame_qs_q3 < ps_rc_quant_ctxt->i2_min_qscale)
3655*c83a76b0SSuyog Pawar {
3656*c83a76b0SSuyog Pawar i4_frame_qs_q3 = ps_rc_quant_ctxt->i2_min_qscale;
3657*c83a76b0SSuyog Pawar }
3658*c83a76b0SSuyog Pawar
3659*c83a76b0SSuyog Pawar return (ps_rc_quant_ctxt->pi4_qscale_to_qp[i4_frame_qs_q3]);
3660*c83a76b0SSuyog Pawar }
3661*c83a76b0SSuyog Pawar
3662*c83a76b0SSuyog Pawar /**
3663*c83a76b0SSuyog Pawar ******************************************************************************
3664*c83a76b0SSuyog Pawar *
3665*c83a76b0SSuyog Pawar * @brief function to convert from qp to qscale
3666*c83a76b0SSuyog Pawar *
3667*c83a76b0SSuyog Pawar * @par Description
3668*c83a76b0SSuyog Pawar * @param[in] i4_frame_qp : QP value
3669*c83a76b0SSuyog Pawar * return value in qscale
3670*c83a76b0SSuyog Pawar ******************************************************************************
3671*c83a76b0SSuyog Pawar */
ihevce_rc_get_scaled_mpeg2_qp(WORD32 i4_frame_qp,rc_quant_t * ps_rc_quant_ctxt)3672*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_scaled_mpeg2_qp(WORD32 i4_frame_qp, rc_quant_t *ps_rc_quant_ctxt)
3673*c83a76b0SSuyog Pawar {
3674*c83a76b0SSuyog Pawar //i4_frame_qp = i4_frame_qp >> 3; // Q3 format is mantained for accuarate calc at lower qp
3675*c83a76b0SSuyog Pawar WORD32 i4_qscale;
3676*c83a76b0SSuyog Pawar if(i4_frame_qp > ps_rc_quant_ctxt->i2_max_qp)
3677*c83a76b0SSuyog Pawar {
3678*c83a76b0SSuyog Pawar i4_frame_qp = ps_rc_quant_ctxt->i2_max_qp;
3679*c83a76b0SSuyog Pawar }
3680*c83a76b0SSuyog Pawar else if(i4_frame_qp < ps_rc_quant_ctxt->i2_min_qp)
3681*c83a76b0SSuyog Pawar {
3682*c83a76b0SSuyog Pawar i4_frame_qp = ps_rc_quant_ctxt->i2_min_qp;
3683*c83a76b0SSuyog Pawar }
3684*c83a76b0SSuyog Pawar
3685*c83a76b0SSuyog Pawar i4_qscale = (ps_rc_quant_ctxt->pi4_qp_to_qscale[i4_frame_qp + ps_rc_quant_ctxt->i1_qp_offset] +
3686*c83a76b0SSuyog Pawar (1 << (QSCALE_Q_FAC_3 - 1))) >>
3687*c83a76b0SSuyog Pawar QSCALE_Q_FAC_3;
3688*c83a76b0SSuyog Pawar return i4_qscale;
3689*c83a76b0SSuyog Pawar }
3690*c83a76b0SSuyog Pawar
3691*c83a76b0SSuyog Pawar /**
3692*c83a76b0SSuyog Pawar ******************************************************************************
3693*c83a76b0SSuyog Pawar *
3694*c83a76b0SSuyog Pawar * @brief function to convert from qp to qscale
3695*c83a76b0SSuyog Pawar *
3696*c83a76b0SSuyog Pawar * @par Description : This function maps logarithmic QP values to linear QP
3697*c83a76b0SSuyog Pawar * values. The linear values are represented in Q6 format.
3698*c83a76b0SSuyog Pawar *
3699*c83a76b0SSuyog Pawar * @param[in] i4_frame_qp : QP value (log scale)
3700*c83a76b0SSuyog Pawar *
3701*c83a76b0SSuyog Pawar * @return value in QP (linear scale)
3702*c83a76b0SSuyog Pawar *
3703*c83a76b0SSuyog Pawar ******************************************************************************
3704*c83a76b0SSuyog Pawar */
ihevce_rc_get_scaled_mpeg2_qp_q6(WORD32 i4_frame_qp,UWORD8 u1_bit_depth)3705*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_scaled_mpeg2_qp_q6(WORD32 i4_frame_qp, UWORD8 u1_bit_depth)
3706*c83a76b0SSuyog Pawar {
3707*c83a76b0SSuyog Pawar WORD32 i4_frame_qp_q6;
3708*c83a76b0SSuyog Pawar number_t s_frame_qp;
3709*c83a76b0SSuyog Pawar float f_qp;
3710*c83a76b0SSuyog Pawar
3711*c83a76b0SSuyog Pawar (void)u1_bit_depth;
3712*c83a76b0SSuyog Pawar ASSERT(i4_frame_qp >= 0);
3713*c83a76b0SSuyog Pawar ASSERT(i4_frame_qp <= 51 + ((u1_bit_depth - 8) * 6));
3714*c83a76b0SSuyog Pawar f_qp = (float)pow((float)2, ((float)(i4_frame_qp - 4) / 6));
3715*c83a76b0SSuyog Pawar convert_float_to_fix(f_qp, &s_frame_qp);
3716*c83a76b0SSuyog Pawar convert_varq_to_fixq(s_frame_qp, &i4_frame_qp_q6, QSCALE_Q_FAC);
3717*c83a76b0SSuyog Pawar
3718*c83a76b0SSuyog Pawar if(i4_frame_qp_q6 < (1 << QSCALE_Q_FAC))
3719*c83a76b0SSuyog Pawar i4_frame_qp_q6 = 1 << QSCALE_Q_FAC;
3720*c83a76b0SSuyog Pawar
3721*c83a76b0SSuyog Pawar return i4_frame_qp_q6;
3722*c83a76b0SSuyog Pawar }
3723*c83a76b0SSuyog Pawar
3724*c83a76b0SSuyog Pawar /**
3725*c83a76b0SSuyog Pawar ******************************************************************************
3726*c83a76b0SSuyog Pawar *
3727*c83a76b0SSuyog Pawar * @brief function to convert from qscale to qp
3728*c83a76b0SSuyog Pawar *
3729*c83a76b0SSuyog Pawar * @par Description
3730*c83a76b0SSuyog Pawar * @param[in] i4_frame_qp_q6 : QP value in qscale. the input is assumed to be in q6 format
3731*c83a76b0SSuyog Pawar * return frame qp
3732*c83a76b0SSuyog Pawar ******************************************************************************
3733*c83a76b0SSuyog Pawar */
ihevce_rc_get_scaled_hevce_qp_q6(WORD32 i4_frame_qp_q6,UWORD8 u1_bit_depth)3734*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_scaled_hevce_qp_q6(WORD32 i4_frame_qp_q6, UWORD8 u1_bit_depth)
3735*c83a76b0SSuyog Pawar {
3736*c83a76b0SSuyog Pawar WORD32 i4_hevce_qp;
3737*c83a76b0SSuyog Pawar number_t s_hevce_qp, s_temp;
3738*c83a76b0SSuyog Pawar float f_mpeg2_qp, f_hevce_qp;
3739*c83a76b0SSuyog Pawar f_mpeg2_qp = (float)i4_frame_qp_q6 / (1 << QSCALE_Q_FAC);
3740*c83a76b0SSuyog Pawar f_hevce_qp = (6 * ((float)log(f_mpeg2_qp) / (float)log((float)2))) + 4;
3741*c83a76b0SSuyog Pawar convert_float_to_fix(f_hevce_qp, &s_hevce_qp);
3742*c83a76b0SSuyog Pawar
3743*c83a76b0SSuyog Pawar /*rounf off to nearest integer*/
3744*c83a76b0SSuyog Pawar s_temp.sm = 1;
3745*c83a76b0SSuyog Pawar s_temp.e = 1;
3746*c83a76b0SSuyog Pawar add32_var_q(s_hevce_qp, s_temp, &s_hevce_qp);
3747*c83a76b0SSuyog Pawar number_t_to_word32(s_hevce_qp, &i4_hevce_qp);
3748*c83a76b0SSuyog Pawar if(i4_frame_qp_q6 == 0)
3749*c83a76b0SSuyog Pawar {
3750*c83a76b0SSuyog Pawar i4_hevce_qp = 0;
3751*c83a76b0SSuyog Pawar }
3752*c83a76b0SSuyog Pawar
3753*c83a76b0SSuyog Pawar i4_hevce_qp -= ((u1_bit_depth - 8) * 6);
3754*c83a76b0SSuyog Pawar
3755*c83a76b0SSuyog Pawar return i4_hevce_qp;
3756*c83a76b0SSuyog Pawar }
3757*c83a76b0SSuyog Pawar
3758*c83a76b0SSuyog Pawar /**
3759*c83a76b0SSuyog Pawar ******************************************************************************
3760*c83a76b0SSuyog Pawar *
3761*c83a76b0SSuyog Pawar * @brief function to convert from qp scale to qp
3762*c83a76b0SSuyog Pawar *
3763*c83a76b0SSuyog Pawar * @par Description : This function maps linear QP values to logarithimic QP
3764*c83a76b0SSuyog Pawar * values. The linear values are represented in Q3 format.
3765*c83a76b0SSuyog Pawar *
3766*c83a76b0SSuyog Pawar * @param[in] i4_frame_qp : QP value (linear scale, Q3 mode)
3767*c83a76b0SSuyog Pawar *
3768*c83a76b0SSuyog Pawar * @return value in QP (log scale)
3769*c83a76b0SSuyog Pawar *
3770*c83a76b0SSuyog Pawar ******************************************************************************
3771*c83a76b0SSuyog Pawar */
ihevce_rc_get_scaled_hevce_qp_q3(WORD32 i4_frame_qp,UWORD8 u1_bit_depth)3772*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_scaled_hevce_qp_q3(WORD32 i4_frame_qp, UWORD8 u1_bit_depth)
3773*c83a76b0SSuyog Pawar {
3774*c83a76b0SSuyog Pawar WORD32 i4_hevce_qp;
3775*c83a76b0SSuyog Pawar number_t s_hevce_qp, s_temp;
3776*c83a76b0SSuyog Pawar
3777*c83a76b0SSuyog Pawar if(i4_frame_qp == 0)
3778*c83a76b0SSuyog Pawar {
3779*c83a76b0SSuyog Pawar i4_hevce_qp = 0;
3780*c83a76b0SSuyog Pawar }
3781*c83a76b0SSuyog Pawar else
3782*c83a76b0SSuyog Pawar {
3783*c83a76b0SSuyog Pawar float f_mpeg2_qp, f_hevce_qp;
3784*c83a76b0SSuyog Pawar
3785*c83a76b0SSuyog Pawar f_mpeg2_qp = (float)i4_frame_qp;
3786*c83a76b0SSuyog Pawar f_hevce_qp = (6 * ((float)log(f_mpeg2_qp) / (float)log((float)2) - 3)) + 4;
3787*c83a76b0SSuyog Pawar convert_float_to_fix(f_hevce_qp, &s_hevce_qp);
3788*c83a76b0SSuyog Pawar
3789*c83a76b0SSuyog Pawar /*rounf off to nearest integer*/
3790*c83a76b0SSuyog Pawar s_temp.sm = 1;
3791*c83a76b0SSuyog Pawar s_temp.e = 1;
3792*c83a76b0SSuyog Pawar add32_var_q(s_hevce_qp, s_temp, &s_hevce_qp);
3793*c83a76b0SSuyog Pawar number_t_to_word32(s_hevce_qp, &i4_hevce_qp);
3794*c83a76b0SSuyog Pawar }
3795*c83a76b0SSuyog Pawar i4_hevce_qp -= ((u1_bit_depth - 8) * 6);
3796*c83a76b0SSuyog Pawar
3797*c83a76b0SSuyog Pawar return i4_hevce_qp;
3798*c83a76b0SSuyog Pawar }
3799*c83a76b0SSuyog Pawar
3800*c83a76b0SSuyog Pawar /*#######################################################*/
3801*c83a76b0SSuyog Pawar /******* END OF QSCALE CONVERSION FUNCTIONS *************/
3802*c83a76b0SSuyog Pawar /*######################################################*/
3803*c83a76b0SSuyog Pawar
3804*c83a76b0SSuyog Pawar /*###############################################*/
3805*c83a76b0SSuyog Pawar /******* START OF SET,GET FUNCTIONS *************/
3806*c83a76b0SSuyog Pawar /*#############################################*/
3807*c83a76b0SSuyog Pawar
3808*c83a76b0SSuyog Pawar /**
3809*c83a76b0SSuyog Pawar ******************************************************************************
3810*c83a76b0SSuyog Pawar *
3811*c83a76b0SSuyog Pawar * @brief Convert pic type to rc pic type
3812*c83a76b0SSuyog Pawar *
3813*c83a76b0SSuyog Pawar * @par Description
3814*c83a76b0SSuyog Pawar *
3815*c83a76b0SSuyog Pawar *
3816*c83a76b0SSuyog Pawar * @param[in] pic_type
3817*c83a76b0SSuyog Pawar * Pic type
3818*c83a76b0SSuyog Pawar *
3819*c83a76b0SSuyog Pawar * @return rc_pic_type
3820*c83a76b0SSuyog Pawar *
3821*c83a76b0SSuyog Pawar ******************************************************************************
3822*c83a76b0SSuyog Pawar */
ihevce_rc_conv_pic_type(IV_PICTURE_CODING_TYPE_T pic_type,WORD32 i4_field_pic,WORD32 i4_temporal_layer_id,WORD32 i4_is_bottom_field,WORD32 i4_top_field_first)3823*c83a76b0SSuyog Pawar picture_type_e ihevce_rc_conv_pic_type(
3824*c83a76b0SSuyog Pawar IV_PICTURE_CODING_TYPE_T pic_type,
3825*c83a76b0SSuyog Pawar WORD32 i4_field_pic,
3826*c83a76b0SSuyog Pawar WORD32 i4_temporal_layer_id,
3827*c83a76b0SSuyog Pawar WORD32 i4_is_bottom_field,
3828*c83a76b0SSuyog Pawar WORD32 i4_top_field_first)
3829*c83a76b0SSuyog Pawar {
3830*c83a76b0SSuyog Pawar picture_type_e rc_pic_type = (picture_type_e)pic_type;
3831*c83a76b0SSuyog Pawar /*interlaced pictype are not supported*/
3832*c83a76b0SSuyog Pawar if(pic_type > 9 && i4_temporal_layer_id > 3) /**/
3833*c83a76b0SSuyog Pawar {
3834*c83a76b0SSuyog Pawar DBG_PRINTF("unsupported picture type or temporal id\n");
3835*c83a76b0SSuyog Pawar exit(0);
3836*c83a76b0SSuyog Pawar }
3837*c83a76b0SSuyog Pawar
3838*c83a76b0SSuyog Pawar if(i4_field_pic == 0) /*Progressive Source*/
3839*c83a76b0SSuyog Pawar {
3840*c83a76b0SSuyog Pawar if(pic_type == IV_IDR_FRAME)
3841*c83a76b0SSuyog Pawar {
3842*c83a76b0SSuyog Pawar rc_pic_type = I_PIC;
3843*c83a76b0SSuyog Pawar }
3844*c83a76b0SSuyog Pawar else
3845*c83a76b0SSuyog Pawar {
3846*c83a76b0SSuyog Pawar rc_pic_type = (picture_type_e)pic_type;
3847*c83a76b0SSuyog Pawar
3848*c83a76b0SSuyog Pawar /*return different picture type based on temporal layer*/
3849*c83a76b0SSuyog Pawar if(i4_temporal_layer_id > 1)
3850*c83a76b0SSuyog Pawar {
3851*c83a76b0SSuyog Pawar rc_pic_type = (picture_type_e)(pic_type + (i4_temporal_layer_id - 1));
3852*c83a76b0SSuyog Pawar }
3853*c83a76b0SSuyog Pawar }
3854*c83a76b0SSuyog Pawar }
3855*c83a76b0SSuyog Pawar
3856*c83a76b0SSuyog Pawar else if(i4_field_pic == 1)
3857*c83a76b0SSuyog Pawar {
3858*c83a76b0SSuyog Pawar if(pic_type == IV_IDR_FRAME || pic_type == IV_I_FRAME)
3859*c83a76b0SSuyog Pawar {
3860*c83a76b0SSuyog Pawar rc_pic_type = I_PIC;
3861*c83a76b0SSuyog Pawar }
3862*c83a76b0SSuyog Pawar
3863*c83a76b0SSuyog Pawar else if(i4_top_field_first == 1)
3864*c83a76b0SSuyog Pawar {
3865*c83a76b0SSuyog Pawar rc_pic_type = (picture_type_e)pic_type;
3866*c83a76b0SSuyog Pawar
3867*c83a76b0SSuyog Pawar if(i4_temporal_layer_id <= 1)
3868*c83a76b0SSuyog Pawar
3869*c83a76b0SSuyog Pawar {
3870*c83a76b0SSuyog Pawar if(i4_is_bottom_field == 1)
3871*c83a76b0SSuyog Pawar rc_pic_type = (picture_type_e)(pic_type + 4);
3872*c83a76b0SSuyog Pawar }
3873*c83a76b0SSuyog Pawar /*return different picture type based on temporal layer*/
3874*c83a76b0SSuyog Pawar if(i4_temporal_layer_id > 1)
3875*c83a76b0SSuyog Pawar {
3876*c83a76b0SSuyog Pawar if(i4_is_bottom_field == 0)
3877*c83a76b0SSuyog Pawar rc_pic_type = (picture_type_e)(pic_type + (i4_temporal_layer_id - 1));
3878*c83a76b0SSuyog Pawar else
3879*c83a76b0SSuyog Pawar rc_pic_type = (picture_type_e)(
3880*c83a76b0SSuyog Pawar pic_type + (i4_temporal_layer_id - 1) +
3881*c83a76b0SSuyog Pawar 4); /*Offset of 4 for the bottomfield*/
3882*c83a76b0SSuyog Pawar }
3883*c83a76b0SSuyog Pawar }
3884*c83a76b0SSuyog Pawar else if(i4_top_field_first == 0)
3885*c83a76b0SSuyog Pawar {
3886*c83a76b0SSuyog Pawar rc_pic_type = (picture_type_e)pic_type;
3887*c83a76b0SSuyog Pawar
3888*c83a76b0SSuyog Pawar if(i4_temporal_layer_id <= 1)
3889*c83a76b0SSuyog Pawar {
3890*c83a76b0SSuyog Pawar if(i4_is_bottom_field == 1)
3891*c83a76b0SSuyog Pawar rc_pic_type = (picture_type_e)(pic_type + 4);
3892*c83a76b0SSuyog Pawar }
3893*c83a76b0SSuyog Pawar /*return different picture type based on temporal layer*/
3894*c83a76b0SSuyog Pawar if(i4_temporal_layer_id > 1)
3895*c83a76b0SSuyog Pawar {
3896*c83a76b0SSuyog Pawar if(i4_is_bottom_field == 0)
3897*c83a76b0SSuyog Pawar rc_pic_type = (picture_type_e)(pic_type + (i4_temporal_layer_id - 1));
3898*c83a76b0SSuyog Pawar else
3899*c83a76b0SSuyog Pawar rc_pic_type = (picture_type_e)(
3900*c83a76b0SSuyog Pawar pic_type + (i4_temporal_layer_id - 1) + 4); /*Offset of 4 for the topfield*/
3901*c83a76b0SSuyog Pawar }
3902*c83a76b0SSuyog Pawar }
3903*c83a76b0SSuyog Pawar }
3904*c83a76b0SSuyog Pawar
3905*c83a76b0SSuyog Pawar return rc_pic_type;
3906*c83a76b0SSuyog Pawar }
3907*c83a76b0SSuyog Pawar
3908*c83a76b0SSuyog Pawar /**
3909*c83a76b0SSuyog Pawar ******************************************************************************
3910*c83a76b0SSuyog Pawar *
3911*c83a76b0SSuyog Pawar * @brief function to update current frame intra cost
3912*c83a76b0SSuyog Pawar *
3913*c83a76b0SSuyog Pawar * @par Description
3914*c83a76b0SSuyog Pawar * @param[inout] ps_rc_ctxt
3915*c83a76b0SSuyog Pawar * @param[in] i8_cur_frm_intra_cost
3916*c83a76b0SSuyog Pawar ******************************************************************************
3917*c83a76b0SSuyog Pawar */
ihevce_rc_update_cur_frm_intra_satd(void * pv_ctxt,LWORD64 i8_cur_frm_intra_cost,WORD32 i4_enc_frm_id)3918*c83a76b0SSuyog Pawar void ihevce_rc_update_cur_frm_intra_satd(
3919*c83a76b0SSuyog Pawar void *pv_ctxt, LWORD64 i8_cur_frm_intra_cost, WORD32 i4_enc_frm_id)
3920*c83a76b0SSuyog Pawar {
3921*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
3922*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_cur_frm_intra_cost[i4_enc_frm_id] = i8_cur_frm_intra_cost;
3923*c83a76b0SSuyog Pawar }
3924*c83a76b0SSuyog Pawar /**
3925*c83a76b0SSuyog Pawar ******************************************************************************
3926*c83a76b0SSuyog Pawar *
3927*c83a76b0SSuyog Pawar * @brief function to return scene type
3928*c83a76b0SSuyog Pawar *
3929*c83a76b0SSuyog Pawar * @par Description
3930*c83a76b0SSuyog Pawar * @param[inout] ps_rc_lap_out
3931*c83a76b0SSuyog Pawar * @return i4_rc_scene_type
3932*c83a76b0SSuyog Pawar ******************************************************************************
3933*c83a76b0SSuyog Pawar */
3934*c83a76b0SSuyog Pawar /* Functions dependent on lap input*/
ihevce_rc_lap_get_scene_type(rc_lap_out_params_t * ps_rc_lap_out)3935*c83a76b0SSuyog Pawar WORD32 ihevce_rc_lap_get_scene_type(rc_lap_out_params_t *ps_rc_lap_out)
3936*c83a76b0SSuyog Pawar {
3937*c83a76b0SSuyog Pawar return (WORD32)ps_rc_lap_out->i4_rc_scene_type;
3938*c83a76b0SSuyog Pawar }
3939*c83a76b0SSuyog Pawar
3940*c83a76b0SSuyog Pawar /**
3941*c83a76b0SSuyog Pawar ******************************************************************************
3942*c83a76b0SSuyog Pawar *
3943*c83a76b0SSuyog Pawar * @name ihevce_rc_get_pic_param
3944*c83a76b0SSuyog Pawar *
3945*c83a76b0SSuyog Pawar * @par Description
3946*c83a76b0SSuyog Pawar *
3947*c83a76b0SSuyog Pawar * @param[in] rc_pic_type
3948*c83a76b0SSuyog Pawar *
3949*c83a76b0SSuyog Pawar * @return void
3950*c83a76b0SSuyog Pawar *
3951*c83a76b0SSuyog Pawar ******************************************************************************
3952*c83a76b0SSuyog Pawar */
ihevce_rc_get_pic_param(picture_type_e rc_pic_type,WORD32 * pi4_tem_lyr,WORD32 * pi4_is_bottom_field)3953*c83a76b0SSuyog Pawar static void ihevce_rc_get_pic_param(
3954*c83a76b0SSuyog Pawar picture_type_e rc_pic_type, WORD32 *pi4_tem_lyr, WORD32 *pi4_is_bottom_field)
3955*c83a76b0SSuyog Pawar {
3956*c83a76b0SSuyog Pawar /*bottom field determination*/
3957*c83a76b0SSuyog Pawar if(rc_pic_type >= P1_PIC)
3958*c83a76b0SSuyog Pawar *pi4_is_bottom_field = 1;
3959*c83a76b0SSuyog Pawar else
3960*c83a76b0SSuyog Pawar *pi4_is_bottom_field = 0;
3961*c83a76b0SSuyog Pawar
3962*c83a76b0SSuyog Pawar /*temporal lyr id determination*/
3963*c83a76b0SSuyog Pawar if(rc_pic_type == I_PIC || rc_pic_type == P_PIC || rc_pic_type == P1_PIC)
3964*c83a76b0SSuyog Pawar {
3965*c83a76b0SSuyog Pawar *pi4_tem_lyr = 0;
3966*c83a76b0SSuyog Pawar }
3967*c83a76b0SSuyog Pawar else if(rc_pic_type == B_PIC || rc_pic_type == BB_PIC)
3968*c83a76b0SSuyog Pawar {
3969*c83a76b0SSuyog Pawar *pi4_tem_lyr = 1;
3970*c83a76b0SSuyog Pawar }
3971*c83a76b0SSuyog Pawar else if(rc_pic_type == B1_PIC || rc_pic_type == B11_PIC)
3972*c83a76b0SSuyog Pawar {
3973*c83a76b0SSuyog Pawar *pi4_tem_lyr = 2;
3974*c83a76b0SSuyog Pawar }
3975*c83a76b0SSuyog Pawar else if(rc_pic_type == B2_PIC || rc_pic_type == B22_PIC)
3976*c83a76b0SSuyog Pawar {
3977*c83a76b0SSuyog Pawar *pi4_tem_lyr = 3;
3978*c83a76b0SSuyog Pawar }
3979*c83a76b0SSuyog Pawar else
3980*c83a76b0SSuyog Pawar {
3981*c83a76b0SSuyog Pawar ASSERT(0);
3982*c83a76b0SSuyog Pawar }
3983*c83a76b0SSuyog Pawar }
3984*c83a76b0SSuyog Pawar /**
3985*c83a76b0SSuyog Pawar ******************************************************************************
3986*c83a76b0SSuyog Pawar *
3987*c83a76b0SSuyog Pawar * @name ihevce_get_offline_index
3988*c83a76b0SSuyog Pawar *
3989*c83a76b0SSuyog Pawar * @par Description
3990*c83a76b0SSuyog Pawar *
3991*c83a76b0SSuyog Pawar * @param[in] ps_rc_ctxt - pointer to rc context
3992*c83a76b0SSuyog Pawar *
3993*c83a76b0SSuyog Pawar * @return index
3994*c83a76b0SSuyog Pawar *
3995*c83a76b0SSuyog Pawar ******************************************************************************
3996*c83a76b0SSuyog Pawar */
ihevce_get_offline_index(rc_context_t * ps_rc_ctxt,WORD32 i4_num_pels_in_frame)3997*c83a76b0SSuyog Pawar static WORD32 ihevce_get_offline_index(rc_context_t *ps_rc_ctxt, WORD32 i4_num_pels_in_frame)
3998*c83a76b0SSuyog Pawar {
3999*c83a76b0SSuyog Pawar WORD32 i4_rc_quality_preset = ps_rc_ctxt->i4_quality_preset;
4000*c83a76b0SSuyog Pawar WORD32 base = 1;
4001*c83a76b0SSuyog Pawar if(i4_num_pels_in_frame > 5000000) /*ultra HD*/
4002*c83a76b0SSuyog Pawar {
4003*c83a76b0SSuyog Pawar base = 0;
4004*c83a76b0SSuyog Pawar }
4005*c83a76b0SSuyog Pawar else if(i4_num_pels_in_frame > 1500000) /*Full HD*/
4006*c83a76b0SSuyog Pawar {
4007*c83a76b0SSuyog Pawar base = 5;
4008*c83a76b0SSuyog Pawar }
4009*c83a76b0SSuyog Pawar else if(i4_num_pels_in_frame > 600000) /*720p*/
4010*c83a76b0SSuyog Pawar {
4011*c83a76b0SSuyog Pawar base = 10;
4012*c83a76b0SSuyog Pawar }
4013*c83a76b0SSuyog Pawar else /*SD*/
4014*c83a76b0SSuyog Pawar {
4015*c83a76b0SSuyog Pawar base = 15;
4016*c83a76b0SSuyog Pawar }
4017*c83a76b0SSuyog Pawar /*based on preset choose coeff*/
4018*c83a76b0SSuyog Pawar if(i4_rc_quality_preset == IHEVCE_QUALITY_P0) /*Pristine quality*/
4019*c83a76b0SSuyog Pawar {
4020*c83a76b0SSuyog Pawar return base;
4021*c83a76b0SSuyog Pawar }
4022*c83a76b0SSuyog Pawar else if(i4_rc_quality_preset == IHEVCE_QUALITY_P2) /*High quality*/
4023*c83a76b0SSuyog Pawar {
4024*c83a76b0SSuyog Pawar return base + 1;
4025*c83a76b0SSuyog Pawar }
4026*c83a76b0SSuyog Pawar else if(
4027*c83a76b0SSuyog Pawar (i4_rc_quality_preset == IHEVCE_QUALITY_P5) ||
4028*c83a76b0SSuyog Pawar (i4_rc_quality_preset == IHEVCE_QUALITY_P6) ||
4029*c83a76b0SSuyog Pawar (i4_rc_quality_preset == IHEVCE_QUALITY_P7)) /*Extreme speed */
4030*c83a76b0SSuyog Pawar {
4031*c83a76b0SSuyog Pawar return base + 4;
4032*c83a76b0SSuyog Pawar }
4033*c83a76b0SSuyog Pawar else if(i4_rc_quality_preset == IHEVCE_QUALITY_P4) /*High speed */
4034*c83a76b0SSuyog Pawar {
4035*c83a76b0SSuyog Pawar return base + 3;
4036*c83a76b0SSuyog Pawar }
4037*c83a76b0SSuyog Pawar else if(i4_rc_quality_preset == IHEVCE_QUALITY_P3) /*default assume Medium speed*/
4038*c83a76b0SSuyog Pawar {
4039*c83a76b0SSuyog Pawar return base + 2;
4040*c83a76b0SSuyog Pawar }
4041*c83a76b0SSuyog Pawar else
4042*c83a76b0SSuyog Pawar {
4043*c83a76b0SSuyog Pawar ASSERT(0);
4044*c83a76b0SSuyog Pawar }
4045*c83a76b0SSuyog Pawar return base + 2;
4046*c83a76b0SSuyog Pawar }
4047*c83a76b0SSuyog Pawar
4048*c83a76b0SSuyog Pawar /**
4049*c83a76b0SSuyog Pawar ******************************************************************************
4050*c83a76b0SSuyog Pawar *
4051*c83a76b0SSuyog Pawar * @name ihevce_get_frame_lambda_modifier
4052*c83a76b0SSuyog Pawar *
4053*c83a76b0SSuyog Pawar * @par Description
4054*c83a76b0SSuyog Pawar *
4055*c83a76b0SSuyog Pawar * @param[in] pic_type
4056*c83a76b0SSuyog Pawar * i4_rc_temporal_lyr_id
4057*c83a76b0SSuyog Pawar * @param[in] i4_first_field
4058*c83a76b0SSuyog Pawar * @param[in] i4_rc_is_ref_pic
4059*c83a76b0SSuyog Pawar * @return lambda_modifier
4060*c83a76b0SSuyog Pawar *
4061*c83a76b0SSuyog Pawar ******************************************************************************
4062*c83a76b0SSuyog Pawar */
ihevce_get_frame_lambda_modifier(WORD8 pic_type,WORD32 i4_rc_temporal_lyr_id,WORD32 i4_first_field,WORD32 i4_rc_is_ref_pic,WORD32 i4_num_b_frms)4063*c83a76b0SSuyog Pawar static double ihevce_get_frame_lambda_modifier(
4064*c83a76b0SSuyog Pawar WORD8 pic_type,
4065*c83a76b0SSuyog Pawar WORD32 i4_rc_temporal_lyr_id,
4066*c83a76b0SSuyog Pawar WORD32 i4_first_field,
4067*c83a76b0SSuyog Pawar WORD32 i4_rc_is_ref_pic,
4068*c83a76b0SSuyog Pawar WORD32 i4_num_b_frms)
4069*c83a76b0SSuyog Pawar {
4070*c83a76b0SSuyog Pawar double lambda_modifier;
4071*c83a76b0SSuyog Pawar WORD32 num_b_frms = i4_num_b_frms, first_field = i4_first_field;
4072*c83a76b0SSuyog Pawar
4073*c83a76b0SSuyog Pawar if(I_PIC == pic_type)
4074*c83a76b0SSuyog Pawar {
4075*c83a76b0SSuyog Pawar double temporal_correction_islice = 1.0 - 0.05 * num_b_frms;
4076*c83a76b0SSuyog Pawar temporal_correction_islice = MAX(0.5, temporal_correction_islice);
4077*c83a76b0SSuyog Pawar
4078*c83a76b0SSuyog Pawar lambda_modifier = 0.57 * temporal_correction_islice;
4079*c83a76b0SSuyog Pawar }
4080*c83a76b0SSuyog Pawar else if(P_PIC == pic_type)
4081*c83a76b0SSuyog Pawar {
4082*c83a76b0SSuyog Pawar if(first_field)
4083*c83a76b0SSuyog Pawar lambda_modifier = 0.442; //0.442*0.8;
4084*c83a76b0SSuyog Pawar else
4085*c83a76b0SSuyog Pawar lambda_modifier = 0.442;
4086*c83a76b0SSuyog Pawar
4087*c83a76b0SSuyog Pawar //lambda_modifier *= pow(2.00,(double)(1.00/3.00));
4088*c83a76b0SSuyog Pawar }
4089*c83a76b0SSuyog Pawar else
4090*c83a76b0SSuyog Pawar {
4091*c83a76b0SSuyog Pawar /* BSLICE */
4092*c83a76b0SSuyog Pawar if(1 == i4_rc_is_ref_pic)
4093*c83a76b0SSuyog Pawar {
4094*c83a76b0SSuyog Pawar lambda_modifier = 0.3536;
4095*c83a76b0SSuyog Pawar }
4096*c83a76b0SSuyog Pawar else if(2 == i4_rc_is_ref_pic)
4097*c83a76b0SSuyog Pawar {
4098*c83a76b0SSuyog Pawar lambda_modifier = 0.45;
4099*c83a76b0SSuyog Pawar }
4100*c83a76b0SSuyog Pawar else
4101*c83a76b0SSuyog Pawar {
4102*c83a76b0SSuyog Pawar lambda_modifier = 0.68;
4103*c83a76b0SSuyog Pawar }
4104*c83a76b0SSuyog Pawar
4105*c83a76b0SSuyog Pawar /* TODO: Disable lambda modification for interlace encode to match HM runs */
4106*c83a76b0SSuyog Pawar //if(0 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
4107*c83a76b0SSuyog Pawar {
4108*c83a76b0SSuyog Pawar /* modify b lambda further based on temporal id */
4109*c83a76b0SSuyog Pawar if(i4_rc_temporal_lyr_id)
4110*c83a76b0SSuyog Pawar {
4111*c83a76b0SSuyog Pawar lambda_modifier *= 3.00;
4112*c83a76b0SSuyog Pawar }
4113*c83a76b0SSuyog Pawar }
4114*c83a76b0SSuyog Pawar //lambda_modifier *= pow(2.00,(double)((1.00/3.00) * (i4_rc_temporal_lyr_id + 1)));
4115*c83a76b0SSuyog Pawar }
4116*c83a76b0SSuyog Pawar
4117*c83a76b0SSuyog Pawar /* modify the base lambda according to lambda modifier */
4118*c83a76b0SSuyog Pawar lambda_modifier = sqrt(lambda_modifier);
4119*c83a76b0SSuyog Pawar return lambda_modifier;
4120*c83a76b0SSuyog Pawar }
4121*c83a76b0SSuyog Pawar
4122*c83a76b0SSuyog Pawar /*!
4123*c83a76b0SSuyog Pawar ******************************************************************************
4124*c83a76b0SSuyog Pawar * \if Function name : get_avg_bitrate_bufsize
4125*c83a76b0SSuyog Pawar *
4126*c83a76b0SSuyog Pawar * \brief
4127*c83a76b0SSuyog Pawar *
4128*c83a76b0SSuyog Pawar * \param[in] *pv_ctxt -> rc context
4129*c83a76b0SSuyog Pawar *
4130*c83a76b0SSuyog Pawar * \return
4131*c83a76b0SSuyog Pawar *
4132*c83a76b0SSuyog Pawar * \author
4133*c83a76b0SSuyog Pawar * Ittiam
4134*c83a76b0SSuyog Pawar *
4135*c83a76b0SSuyog Pawar *****************************************************************************
4136*c83a76b0SSuyog Pawar */
get_avg_bitrate_bufsize(void * pv_ctxt,LWORD64 * pi8_bitrate,LWORD64 * pi8_ebf)4137*c83a76b0SSuyog Pawar void get_avg_bitrate_bufsize(void *pv_ctxt, LWORD64 *pi8_bitrate, LWORD64 *pi8_ebf)
4138*c83a76b0SSuyog Pawar {
4139*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
4140*c83a76b0SSuyog Pawar *pi8_bitrate = rc_get_bit_rate(ps_rc_ctxt->rc_hdl);
4141*c83a76b0SSuyog Pawar *pi8_ebf = rc_get_vbv_buf_size(ps_rc_ctxt->rc_hdl);
4142*c83a76b0SSuyog Pawar }
4143*c83a76b0SSuyog Pawar
4144*c83a76b0SSuyog Pawar /**
4145*c83a76b0SSuyog Pawar ******************************************************************************
4146*c83a76b0SSuyog Pawar *
4147*c83a76b0SSuyog Pawar * @name ihevce_get_dbf_buffer_size
4148*c83a76b0SSuyog Pawar *
4149*c83a76b0SSuyog Pawar * @par Description
4150*c83a76b0SSuyog Pawar *
4151*c83a76b0SSuyog Pawar * @param[in] ps_rc_ctxt - pointer to rc context
4152*c83a76b0SSuyog Pawar *
4153*c83a76b0SSuyog Pawar * @return qp
4154*c83a76b0SSuyog Pawar *
4155*c83a76b0SSuyog Pawar ******************************************************************************
4156*c83a76b0SSuyog Pawar */
ihevce_get_dbf_buffer_size(void * pv_rc_ctxt,UWORD32 * pi4_buffer_size,UWORD32 * pi4_dbf,UWORD32 * pi4_bit_rate)4157*c83a76b0SSuyog Pawar void ihevce_get_dbf_buffer_size(
4158*c83a76b0SSuyog Pawar void *pv_rc_ctxt, UWORD32 *pi4_buffer_size, UWORD32 *pi4_dbf, UWORD32 *pi4_bit_rate)
4159*c83a76b0SSuyog Pawar {
4160*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_rc_ctxt;
4161*c83a76b0SSuyog Pawar
4162*c83a76b0SSuyog Pawar pi4_buffer_size[0] = (WORD32)ps_rc_ctxt->s_vbv_compliance.f_buffer_size;
4163*c83a76b0SSuyog Pawar pi4_dbf[0] = (WORD32)(ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level);
4164*c83a76b0SSuyog Pawar ASSERT(
4165*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_buffer_size >=
4166*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level);
4167*c83a76b0SSuyog Pawar
4168*c83a76b0SSuyog Pawar pi4_bit_rate[0] = (WORD32)ps_rc_ctxt->s_vbv_compliance.f_bit_rate;
4169*c83a76b0SSuyog Pawar }
4170*c83a76b0SSuyog Pawar
4171*c83a76b0SSuyog Pawar /*!
4172*c83a76b0SSuyog Pawar ******************************************************************************
4173*c83a76b0SSuyog Pawar * \if Function name : ihevce_set_L0_scd_qp
4174*c83a76b0SSuyog Pawar *
4175*c83a76b0SSuyog Pawar * \brief
4176*c83a76b0SSuyog Pawar *
4177*c83a76b0SSuyog Pawar * \param[in] *pv_ctxt -> rc context
4178*c83a76b0SSuyog Pawar *
4179*c83a76b0SSuyog Pawar * \return
4180*c83a76b0SSuyog Pawar *
4181*c83a76b0SSuyog Pawar * \author
4182*c83a76b0SSuyog Pawar * Ittiam
4183*c83a76b0SSuyog Pawar *
4184*c83a76b0SSuyog Pawar *****************************************************************************
4185*c83a76b0SSuyog Pawar */
ihevce_set_L0_scd_qp(void * pv_rc_ctxt,WORD32 i4_scd_qp)4186*c83a76b0SSuyog Pawar void ihevce_set_L0_scd_qp(void *pv_rc_ctxt, WORD32 i4_scd_qp)
4187*c83a76b0SSuyog Pawar {
4188*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_rc_ctxt;
4189*c83a76b0SSuyog Pawar
4190*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_L0_frame_qp = i4_scd_qp;
4191*c83a76b0SSuyog Pawar }
4192*c83a76b0SSuyog Pawar
4193*c83a76b0SSuyog Pawar /**
4194*c83a76b0SSuyog Pawar ******************************************************************************
4195*c83a76b0SSuyog Pawar *
4196*c83a76b0SSuyog Pawar * @name rc_get_buffer_level_unclip
4197*c83a76b0SSuyog Pawar *
4198*c83a76b0SSuyog Pawar * @par Description
4199*c83a76b0SSuyog Pawar *
4200*c83a76b0SSuyog Pawar * @param[in] pv_rc_ctxt
4201*c83a76b0SSuyog Pawar *
4202*c83a76b0SSuyog Pawar *
4203*c83a76b0SSuyog Pawar * @return void
4204*c83a76b0SSuyog Pawar *
4205*c83a76b0SSuyog Pawar ******************************************************************************
4206*c83a76b0SSuyog Pawar */
rc_get_buffer_level_unclip(void * pv_rc_ctxt)4207*c83a76b0SSuyog Pawar float rc_get_buffer_level_unclip(void *pv_rc_ctxt)
4208*c83a76b0SSuyog Pawar {
4209*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_rc_ctxt;
4210*c83a76b0SSuyog Pawar return (ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level_unclip);
4211*c83a76b0SSuyog Pawar }
4212*c83a76b0SSuyog Pawar
4213*c83a76b0SSuyog Pawar /**
4214*c83a76b0SSuyog Pawar ******************************************************************************
4215*c83a76b0SSuyog Pawar *
4216*c83a76b0SSuyog Pawar * @brief Clip QP based on min and max frame qp
4217*c83a76b0SSuyog Pawar *
4218*c83a76b0SSuyog Pawar * @par Description
4219*c83a76b0SSuyog Pawar *
4220*c83a76b0SSuyog Pawar * @param[inout] ps_rc_ctxt
4221*c83a76b0SSuyog Pawar * pointer to rc context
4222*c83a76b0SSuyog Pawar *
4223*c83a76b0SSuyog Pawar * @param[in] rc_pic_type
4224*c83a76b0SSuyog Pawar * Pic type
4225*c83a76b0SSuyog Pawar *
4226*c83a76b0SSuyog Pawar * @return i4_hevc_frame_qp
4227*c83a76b0SSuyog Pawar *
4228*c83a76b0SSuyog Pawar ******************************************************************************
4229*c83a76b0SSuyog Pawar */
ihevce_clip_min_max_qp(rc_context_t * ps_rc_ctxt,WORD32 i4_hevc_frame_qp,picture_type_e rc_pic_type,WORD32 i4_rc_temporal_lyr_id)4230*c83a76b0SSuyog Pawar static WORD32 ihevce_clip_min_max_qp(
4231*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt,
4232*c83a76b0SSuyog Pawar WORD32 i4_hevc_frame_qp,
4233*c83a76b0SSuyog Pawar picture_type_e rc_pic_type,
4234*c83a76b0SSuyog Pawar WORD32 i4_rc_temporal_lyr_id)
4235*c83a76b0SSuyog Pawar {
4236*c83a76b0SSuyog Pawar ASSERT(i4_rc_temporal_lyr_id >= 0);
4237*c83a76b0SSuyog Pawar /**clip to min qp which is user configurable*/
4238*c83a76b0SSuyog Pawar if(rc_pic_type == I_PIC && i4_hevc_frame_qp < ps_rc_ctxt->i4_min_frame_qp)
4239*c83a76b0SSuyog Pawar {
4240*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ps_rc_ctxt->i4_min_frame_qp;
4241*c83a76b0SSuyog Pawar }
4242*c83a76b0SSuyog Pawar else if(rc_pic_type == P_PIC && i4_hevc_frame_qp < (ps_rc_ctxt->i4_min_frame_qp + 1))
4243*c83a76b0SSuyog Pawar {
4244*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ps_rc_ctxt->i4_min_frame_qp + 1;
4245*c83a76b0SSuyog Pawar }
4246*c83a76b0SSuyog Pawar else if(i4_hevc_frame_qp < (ps_rc_ctxt->i4_min_frame_qp + i4_rc_temporal_lyr_id + 1))
4247*c83a76b0SSuyog Pawar {
4248*c83a76b0SSuyog Pawar /** For B frame max qp is set based on temporal reference*/
4249*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ps_rc_ctxt->i4_min_frame_qp + i4_rc_temporal_lyr_id + 1;
4250*c83a76b0SSuyog Pawar }
4251*c83a76b0SSuyog Pawar /* clip the Qp to MAX QP */
4252*c83a76b0SSuyog Pawar if(i4_hevc_frame_qp < ps_rc_ctxt->ps_rc_quant_ctxt->i2_min_qp)
4253*c83a76b0SSuyog Pawar {
4254*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ps_rc_ctxt->ps_rc_quant_ctxt->i2_min_qp;
4255*c83a76b0SSuyog Pawar }
4256*c83a76b0SSuyog Pawar /**clip to max qp based on pic type*/
4257*c83a76b0SSuyog Pawar if(rc_pic_type == I_PIC && i4_hevc_frame_qp > ps_rc_ctxt->i4_max_frame_qp)
4258*c83a76b0SSuyog Pawar {
4259*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ps_rc_ctxt->i4_max_frame_qp;
4260*c83a76b0SSuyog Pawar }
4261*c83a76b0SSuyog Pawar else if(rc_pic_type == P_PIC && i4_hevc_frame_qp > (ps_rc_ctxt->i4_max_frame_qp + 1))
4262*c83a76b0SSuyog Pawar {
4263*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ps_rc_ctxt->i4_max_frame_qp + 1;
4264*c83a76b0SSuyog Pawar }
4265*c83a76b0SSuyog Pawar else if(i4_hevc_frame_qp > (ps_rc_ctxt->i4_max_frame_qp + i4_rc_temporal_lyr_id + 1))
4266*c83a76b0SSuyog Pawar {
4267*c83a76b0SSuyog Pawar /** For B frame max qp is set based on temporal reference*/
4268*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ps_rc_ctxt->i4_max_frame_qp + i4_rc_temporal_lyr_id + 1;
4269*c83a76b0SSuyog Pawar }
4270*c83a76b0SSuyog Pawar /* clip the Qp to MAX QP */
4271*c83a76b0SSuyog Pawar if(i4_hevc_frame_qp > ps_rc_ctxt->ps_rc_quant_ctxt->i2_max_qp)
4272*c83a76b0SSuyog Pawar {
4273*c83a76b0SSuyog Pawar i4_hevc_frame_qp = ps_rc_ctxt->ps_rc_quant_ctxt->i2_max_qp;
4274*c83a76b0SSuyog Pawar }
4275*c83a76b0SSuyog Pawar return i4_hevc_frame_qp;
4276*c83a76b0SSuyog Pawar }
4277*c83a76b0SSuyog Pawar
4278*c83a76b0SSuyog Pawar /*#############################################*/
4279*c83a76b0SSuyog Pawar /******* END OF SET,GET FUNCTIONS *************/
4280*c83a76b0SSuyog Pawar /*###########################################*/
4281*c83a76b0SSuyog Pawar
4282*c83a76b0SSuyog Pawar /*#################################################*/
4283*c83a76b0SSuyog Pawar /******* START OF RC UPDATE FUNCTIONS **************/
4284*c83a76b0SSuyog Pawar /*#################################################*/
4285*c83a76b0SSuyog Pawar
4286*c83a76b0SSuyog Pawar /**
4287*c83a76b0SSuyog Pawar ******************************************************************************
4288*c83a76b0SSuyog Pawar *
4289*c83a76b0SSuyog Pawar * @brief updates the picture level information like bits consumed and
4290*c83a76b0SSuyog Pawar *
4291*c83a76b0SSuyog Pawar * @par Description
4292*c83a76b0SSuyog Pawar *
4293*c83a76b0SSuyog Pawar * @param[inout] ps_mem_tab
4294*c83a76b0SSuyog Pawar * pointer to memory descriptors table
4295*c83a76b0SSuyog Pawar *
4296*c83a76b0SSuyog Pawar * @param[in] ps_init_prms
4297*c83a76b0SSuyog Pawar * Create time static parameters
4298*c83a76b0SSuyog Pawar *
4299*c83a76b0SSuyog Pawar * @return void
4300*c83a76b0SSuyog Pawar *
4301*c83a76b0SSuyog Pawar ******************************************************************************
4302*c83a76b0SSuyog Pawar */
4303*c83a76b0SSuyog Pawar
ihevce_rc_update_pic_info(void * pv_ctxt,UWORD32 u4_total_bits_consumed,UWORD32 u4_total_header_bits,UWORD32 u4_frame_sad,UWORD32 u4_frame_intra_sad,IV_PICTURE_CODING_TYPE_T pic_type,WORD32 i4_avg_frame_hevc_qp,WORD32 i4_suppress_bpic_update,WORD32 * pi4_qp_normalized_8x8_cu_sum,WORD32 * pi4_8x8_cu_sum,LWORD64 * pi8_sad_by_qscale,ihevce_lap_output_params_t * ps_lap_out,rc_lap_out_params_t * ps_rc_lap_out,WORD32 i4_buf_id,UWORD32 u4_open_loop_intra_sad,LWORD64 i8_total_ssd_frame,WORD32 i4_enc_frm_id)4304*c83a76b0SSuyog Pawar void ihevce_rc_update_pic_info(
4305*c83a76b0SSuyog Pawar void *pv_ctxt,
4306*c83a76b0SSuyog Pawar UWORD32 u4_total_bits_consumed,
4307*c83a76b0SSuyog Pawar UWORD32 u4_total_header_bits,
4308*c83a76b0SSuyog Pawar UWORD32 u4_frame_sad,
4309*c83a76b0SSuyog Pawar UWORD32 u4_frame_intra_sad,
4310*c83a76b0SSuyog Pawar IV_PICTURE_CODING_TYPE_T pic_type,
4311*c83a76b0SSuyog Pawar WORD32 i4_avg_frame_hevc_qp,
4312*c83a76b0SSuyog Pawar WORD32 i4_suppress_bpic_update,
4313*c83a76b0SSuyog Pawar WORD32 *pi4_qp_normalized_8x8_cu_sum,
4314*c83a76b0SSuyog Pawar WORD32 *pi4_8x8_cu_sum,
4315*c83a76b0SSuyog Pawar LWORD64 *pi8_sad_by_qscale,
4316*c83a76b0SSuyog Pawar ihevce_lap_output_params_t *ps_lap_out,
4317*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_out,
4318*c83a76b0SSuyog Pawar WORD32 i4_buf_id,
4319*c83a76b0SSuyog Pawar UWORD32 u4_open_loop_intra_sad,
4320*c83a76b0SSuyog Pawar LWORD64 i8_total_ssd_frame,
4321*c83a76b0SSuyog Pawar WORD32 i4_enc_frm_id)
4322*c83a76b0SSuyog Pawar {
4323*c83a76b0SSuyog Pawar LWORD64 a_mb_type_sad[2];
4324*c83a76b0SSuyog Pawar WORD32 a_mb_type_tex_bits[2];
4325*c83a76b0SSuyog Pawar /*dummy variables not used*/
4326*c83a76b0SSuyog Pawar WORD32 a_mb_in_type[2] = { 0, 0 };
4327*c83a76b0SSuyog Pawar LWORD64 a_mb_type_qp_q6[2] = { 0, 0 };
4328*c83a76b0SSuyog Pawar /*qp accumulation at */
4329*c83a76b0SSuyog Pawar WORD32 i4_avg_activity = 250; //hardcoding to usual value
4330*c83a76b0SSuyog Pawar WORD32 i4_intra_cost, i4_avg_frame_qp_q6, i;
4331*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
4332*c83a76b0SSuyog Pawar WORD32 i4_frame_complexity, i4_bits_to_be_stuffed = 0, i4_is_last_frm_period = 0;
4333*c83a76b0SSuyog Pawar picture_type_e rc_pic_type = ihevce_rc_conv_pic_type(
4334*c83a76b0SSuyog Pawar pic_type,
4335*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
4336*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_temporal_lyr_id,
4337*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_bottom_field,
4338*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
4339*c83a76b0SSuyog Pawar frame_info_t s_frame_info;
4340*c83a76b0SSuyog Pawar WORD32 i4_ctr = -1, i4_i, i4_j;
4341*c83a76b0SSuyog Pawar WORD32 i4_scene_num = ps_rc_lap_out->u4_rc_scene_num % MAX_SCENE_NUM;
4342*c83a76b0SSuyog Pawar
4343*c83a76b0SSuyog Pawar /*update bit consumption. used only in rdopt*/
4344*c83a76b0SSuyog Pawar //ASSERT(ps_rc_ctxt->ai4_rdopt_bit_consumption_estimate[ps_rc_ctxt->i4_rdopt_bit_count] == -1);
4345*c83a76b0SSuyog Pawar //ASSERT(i4_buf_id>=0);
4346*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_rdopt_bit_consumption_estimate[ps_rc_ctxt->i4_rdopt_bit_count] =
4347*c83a76b0SSuyog Pawar u4_total_bits_consumed;
4348*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_rdopt_bit_consumption_buf_id[ps_rc_ctxt->i4_rdopt_bit_count] = i4_buf_id;
4349*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_rdopt_bit_count =
4350*c83a76b0SSuyog Pawar (ps_rc_ctxt->i4_rdopt_bit_count + 1) % NUM_BUF_RDOPT_ENT_CORRECT;
4351*c83a76b0SSuyog Pawar
4352*c83a76b0SSuyog Pawar {
4353*c83a76b0SSuyog Pawar LWORD64 i8_texture_bits = u4_total_bits_consumed - u4_total_header_bits;
4354*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_use_offline_model_2pass = 0;
4355*c83a76b0SSuyog Pawar
4356*c83a76b0SSuyog Pawar /*flag to guide whether 2nd pass can use offline model or not*/
4357*c83a76b0SSuyog Pawar if((abs(ps_rc_lap_out->i4_orig_rc_qp - i4_avg_frame_hevc_qp) < 2) &&
4358*c83a76b0SSuyog Pawar (i8_texture_bits <= (ps_rc_lap_out->i8_est_text_bits * 2.0f)) &&
4359*c83a76b0SSuyog Pawar (i8_texture_bits >= (ps_rc_lap_out->i8_est_text_bits * 0.5f)))
4360*c83a76b0SSuyog Pawar
4361*c83a76b0SSuyog Pawar {
4362*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_use_offline_model_2pass = 1;
4363*c83a76b0SSuyog Pawar }
4364*c83a76b0SSuyog Pawar }
4365*c83a76b0SSuyog Pawar /*Counter of number of bit alloction periods*/
4366*c83a76b0SSuyog Pawar if(rc_pic_type == I_PIC)
4367*c83a76b0SSuyog Pawar ps_rc_ctxt
4368*c83a76b0SSuyog Pawar ->i8_num_bit_alloc_period++; //Currently only I frame periods are considerd as bit allocation period (Ignoring non- I scd and complexity reset flag
4369*c83a76b0SSuyog Pawar /*initialze frame info*/
4370*c83a76b0SSuyog Pawar init_frame_info(&s_frame_info);
4371*c83a76b0SSuyog Pawar s_frame_info.i4_rc_hevc_qp = i4_avg_frame_hevc_qp;
4372*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4373*c83a76b0SSuyog Pawar s_frame_info.i8_L1_me_sad = ps_rc_lap_out->i8_raw_l1_coarse_me_sad;
4374*c83a76b0SSuyog Pawar s_frame_info.i8_L1_ipe_raw_sad = ps_rc_lap_out->i8_raw_pre_intra_sad;
4375*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4376*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4377*c83a76b0SSuyog Pawar s_frame_info.i8_L0_open_cost = (LWORD64)u4_open_loop_intra_sad;
4378*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4379*c83a76b0SSuyog Pawar
4380*c83a76b0SSuyog Pawar if(rc_pic_type == I_PIC)
4381*c83a76b0SSuyog Pawar s_frame_info.i8_L1_me_or_ipe_raw_sad = ps_rc_lap_out->i8_raw_pre_intra_sad;
4382*c83a76b0SSuyog Pawar else
4383*c83a76b0SSuyog Pawar s_frame_info.i8_L1_me_or_ipe_raw_sad = ps_rc_lap_out->i8_raw_l1_coarse_me_sad;
4384*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4385*c83a76b0SSuyog Pawar s_frame_info.i4_poc = ps_rc_lap_out->i4_rc_poc;
4386*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4387*c83a76b0SSuyog Pawar s_frame_info.i4_scene_type = ps_rc_lap_out->i4_rc_scene_type;
4388*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4389*c83a76b0SSuyog Pawar s_frame_info.i4_non_i_scd = ps_rc_lap_out->i4_is_non_I_scd || ps_rc_lap_out->i4_is_I_only_scd;
4390*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4391*c83a76b0SSuyog Pawar s_frame_info.i8_cl_sad = u4_frame_sad;
4392*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4393*c83a76b0SSuyog Pawar s_frame_info.i8_header_bits = u4_total_header_bits;
4394*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4395*c83a76b0SSuyog Pawar s_frame_info.i8_tex_bits = u4_total_bits_consumed - u4_total_header_bits;
4396*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4397*c83a76b0SSuyog Pawar s_frame_info.e_pic_type = rc_pic_type;
4398*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4399*c83a76b0SSuyog Pawar s_frame_info.i8_est_texture_bits = ps_rc_lap_out->i8_est_text_bits;
4400*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4401*c83a76b0SSuyog Pawar s_frame_info.i4_lap_complexity_q7 = ps_rc_ctxt->ai4_lap_complexity_q7[i4_enc_frm_id];
4402*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4403*c83a76b0SSuyog Pawar s_frame_info.i4_lap_f_sim = ps_rc_ctxt->ai4_lap_f_sim[i4_enc_frm_id];
4404*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4405*c83a76b0SSuyog Pawar s_frame_info.i8_frame_acc_coarse_me_cost = ps_rc_lap_out->i8_frame_acc_coarse_me_cost;
4406*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4407*c83a76b0SSuyog Pawar s_frame_info.i_to_avg_bit_ratio = ps_rc_ctxt->ai_to_avg_bit_ratio[i4_enc_frm_id];
4408*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4409*c83a76b0SSuyog Pawar s_frame_info.i4_num_scd_in_lap_window = ps_rc_ctxt->ai4_num_scd_in_lap_window[i4_enc_frm_id];
4410*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4411*c83a76b0SSuyog Pawar s_frame_info.i4_num_frames_b4_scd = ps_rc_ctxt->ai4_num_frames_b4_scd[i4_enc_frm_id];
4412*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4413*c83a76b0SSuyog Pawar s_frame_info.i8_num_bit_alloc_period = ps_rc_ctxt->i8_num_bit_alloc_period;
4414*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4415*c83a76b0SSuyog Pawar s_frame_info.i1_is_complexity_based_bits_reset =
4416*c83a76b0SSuyog Pawar (WORD8)ps_rc_lap_out->i4_is_cmplx_change_reset_bits;
4417*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4418*c83a76b0SSuyog Pawar /*For the complexity based movement in 2nd pass*/
4419*c83a76b0SSuyog Pawar memmove(
4420*c83a76b0SSuyog Pawar (void *)s_frame_info.af_sum_weigh,
4421*c83a76b0SSuyog Pawar ps_rc_lap_out->ps_frame_info->af_sum_weigh,
4422*c83a76b0SSuyog Pawar sizeof(float) * MAX_PIC_TYPE * 3);
4423*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4424*c83a76b0SSuyog Pawar
4425*c83a76b0SSuyog Pawar /*store frame qp to clip qp accordingly*/
4426*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_is_rc_model_needs_to_be_updated)
4427*c83a76b0SSuyog Pawar {
4428*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][rc_pic_type] = i4_avg_frame_hevc_qp;
4429*c83a76b0SSuyog Pawar }
4430*c83a76b0SSuyog Pawar
4431*c83a76b0SSuyog Pawar for(i4_i = 0; i4_i < MAX_NON_REF_B_PICS_IN_QUEUE_SGI; i4_i++)
4432*c83a76b0SSuyog Pawar {
4433*c83a76b0SSuyog Pawar if(ps_rc_lap_out->u4_rc_scene_num == ps_rc_ctxt->au4_prev_scene_num_multi_scene[i4_i])
4434*c83a76b0SSuyog Pawar {
4435*c83a76b0SSuyog Pawar i4_ctr = i4_i;
4436*c83a76b0SSuyog Pawar break;
4437*c83a76b0SSuyog Pawar }
4438*c83a76b0SSuyog Pawar }
4439*c83a76b0SSuyog Pawar if(-1 == i4_ctr)
4440*c83a76b0SSuyog Pawar {
4441*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_prev_qp_ctr++;
4442*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_prev_qp_ctr = ps_rc_ctxt->i4_prev_qp_ctr % MAX_NON_REF_B_PICS_IN_QUEUE_SGI;
4443*c83a76b0SSuyog Pawar i4_ctr = ps_rc_ctxt->i4_prev_qp_ctr;
4444*c83a76b0SSuyog Pawar ps_rc_ctxt->au4_prev_scene_num_multi_scene[i4_ctr] = ps_rc_lap_out->u4_rc_scene_num;
4445*c83a76b0SSuyog Pawar for(i4_j = 0; i4_j < MAX_PIC_TYPE; i4_j++)
4446*c83a76b0SSuyog Pawar {
4447*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_qp_for_previous_scene_multi_scene[i4_ctr][i4_j] = 0;
4448*c83a76b0SSuyog Pawar }
4449*c83a76b0SSuyog Pawar }
4450*c83a76b0SSuyog Pawar
4451*c83a76b0SSuyog Pawar {
4452*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_qp_for_previous_scene_multi_scene[i4_ctr][rc_pic_type] =
4453*c83a76b0SSuyog Pawar i4_avg_frame_hevc_qp;
4454*c83a76b0SSuyog Pawar }
4455*c83a76b0SSuyog Pawar if(i4_scene_num < HALF_MAX_SCENE_ARRAY_QP)
4456*c83a76b0SSuyog Pawar {
4457*c83a76b0SSuyog Pawar WORD32 i4_i;
4458*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_scene_numbers[i4_scene_num + HALF_MAX_SCENE_ARRAY_QP] = 0;
4459*c83a76b0SSuyog Pawar for(i4_i = 0; i4_i < MAX_PIC_TYPE; i4_i++)
4460*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num + HALF_MAX_SCENE_ARRAY_QP][i4_i] =
4461*c83a76b0SSuyog Pawar INIT_HEVCE_QP_RC;
4462*c83a76b0SSuyog Pawar }
4463*c83a76b0SSuyog Pawar else
4464*c83a76b0SSuyog Pawar {
4465*c83a76b0SSuyog Pawar WORD32 i4_i;
4466*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_scene_numbers[i4_scene_num - HALF_MAX_SCENE_ARRAY_QP] = 0;
4467*c83a76b0SSuyog Pawar for(i4_i = 0; i4_i < MAX_PIC_TYPE; i4_i++)
4468*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num - HALF_MAX_SCENE_ARRAY_QP][i4_i] =
4469*c83a76b0SSuyog Pawar INIT_HEVCE_QP_RC;
4470*c83a76b0SSuyog Pawar }
4471*c83a76b0SSuyog Pawar
4472*c83a76b0SSuyog Pawar /*update will have HEVC qp, convert it back to mpeg2 range qp for all internal calculations of RC*/
4473*c83a76b0SSuyog Pawar
4474*c83a76b0SSuyog Pawar i4_avg_frame_qp_q6 = ps_rc_ctxt->ps_rc_quant_ctxt->pi4_qp_to_qscale_q_factor
4475*c83a76b0SSuyog Pawar [i4_avg_frame_hevc_qp + ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset];
4476*c83a76b0SSuyog Pawar
4477*c83a76b0SSuyog Pawar if(pic_type == IV_I_FRAME || pic_type == IV_IDR_FRAME)
4478*c83a76b0SSuyog Pawar {
4479*c83a76b0SSuyog Pawar /*TODO : Take care of precision of a_mb_type_sad*/
4480*c83a76b0SSuyog Pawar a_mb_type_sad[0] =
4481*c83a76b0SSuyog Pawar (((pi8_sad_by_qscale[1] * i4_avg_frame_qp_q6) +
4482*c83a76b0SSuyog Pawar (((LWORD64)1) << (SAD_BY_QSCALE_Q + QSCALE_Q_FAC - 1))) >>
4483*c83a76b0SSuyog Pawar (SAD_BY_QSCALE_Q + QSCALE_Q_FAC)); //u4_frame_sad;
4484*c83a76b0SSuyog Pawar
4485*c83a76b0SSuyog Pawar a_mb_type_sad[1] =
4486*c83a76b0SSuyog Pawar (((pi8_sad_by_qscale[0] * i4_avg_frame_qp_q6) +
4487*c83a76b0SSuyog Pawar (((LWORD64)1) << (SAD_BY_QSCALE_Q + QSCALE_Q_FAC - 1))) >>
4488*c83a76b0SSuyog Pawar (SAD_BY_QSCALE_Q + QSCALE_Q_FAC));
4489*c83a76b0SSuyog Pawar a_mb_type_tex_bits[0] =
4490*c83a76b0SSuyog Pawar u4_total_bits_consumed - u4_total_header_bits; //(u4_total_bits_consumed >> 3);
4491*c83a76b0SSuyog Pawar a_mb_type_tex_bits[1] = 0;
4492*c83a76b0SSuyog Pawar a_mb_in_type[0] = (ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width) >> 8;
4493*c83a76b0SSuyog Pawar a_mb_in_type[1] = 0;
4494*c83a76b0SSuyog Pawar }
4495*c83a76b0SSuyog Pawar else
4496*c83a76b0SSuyog Pawar {
4497*c83a76b0SSuyog Pawar /*TODO : Take care of precision of a_mb_type_sad*/
4498*c83a76b0SSuyog Pawar a_mb_type_sad[1] =
4499*c83a76b0SSuyog Pawar (((pi8_sad_by_qscale[0] * i4_avg_frame_qp_q6) +
4500*c83a76b0SSuyog Pawar (((LWORD64)1) << (SAD_BY_QSCALE_Q + QSCALE_Q_FAC - 1))) >>
4501*c83a76b0SSuyog Pawar (SAD_BY_QSCALE_Q + QSCALE_Q_FAC));
4502*c83a76b0SSuyog Pawar
4503*c83a76b0SSuyog Pawar a_mb_type_tex_bits[0] =
4504*c83a76b0SSuyog Pawar u4_total_bits_consumed - u4_total_header_bits; //(u4_total_bits_consumed >> 3);
4505*c83a76b0SSuyog Pawar a_mb_type_sad[0] =
4506*c83a76b0SSuyog Pawar (((pi8_sad_by_qscale[1] * i4_avg_frame_qp_q6) +
4507*c83a76b0SSuyog Pawar (((LWORD64)1) << (SAD_BY_QSCALE_Q + QSCALE_Q_FAC - 1))) >>
4508*c83a76b0SSuyog Pawar (SAD_BY_QSCALE_Q + QSCALE_Q_FAC)); //u4_frame_sad;
4509*c83a76b0SSuyog Pawar a_mb_type_tex_bits[1] =
4510*c83a76b0SSuyog Pawar u4_total_bits_consumed - u4_total_header_bits; //(u4_total_bits_consumed >> 3);
4511*c83a76b0SSuyog Pawar a_mb_type_tex_bits[0] = 0;
4512*c83a76b0SSuyog Pawar a_mb_in_type[1] = (ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width) >> 8;
4513*c83a76b0SSuyog Pawar a_mb_in_type[0] = 0;
4514*c83a76b0SSuyog Pawar }
4515*c83a76b0SSuyog Pawar ASSERT(a_mb_type_sad[0] >= 0);
4516*c83a76b0SSuyog Pawar ASSERT(a_mb_type_sad[1] >= 0);
4517*c83a76b0SSuyog Pawar /*THis calclates sum of Qps of all MBs as per the corresponding mb type*/
4518*c83a76b0SSuyog Pawar /*THis is different from a_mb_in_type,a_mb_type_sad and a_mb_type_tex_bits*/
4519*c83a76b0SSuyog Pawar a_mb_type_qp_q6[0] = ((LWORD64)i4_avg_frame_qp_q6) * a_mb_in_type[0];
4520*c83a76b0SSuyog Pawar a_mb_type_qp_q6[1] = ((LWORD64)i4_avg_frame_qp_q6) * a_mb_in_type[1];
4521*c83a76b0SSuyog Pawar {
4522*c83a76b0SSuyog Pawar WORD32 i4_avg_qp_q6_without_offset = 0, i4_hevc_qp_rc = i4_avg_frame_hevc_qp;
4523*c83a76b0SSuyog Pawar WORD32 i4_rc_pic_type_rc_for_offset = rc_pic_type;
4524*c83a76b0SSuyog Pawar if(i4_rc_pic_type_rc_for_offset > B2_PIC)
4525*c83a76b0SSuyog Pawar i4_rc_pic_type_rc_for_offset = i4_rc_pic_type_rc_for_offset - B2_PIC;
4526*c83a76b0SSuyog Pawar i4_hevc_qp_rc = i4_hevc_qp_rc - ps_rc_lap_out->ai4_offsets[i4_rc_pic_type_rc_for_offset] +
4527*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset;
4528*c83a76b0SSuyog Pawar
4529*c83a76b0SSuyog Pawar i4_hevc_qp_rc =
4530*c83a76b0SSuyog Pawar CLIP3(i4_hevc_qp_rc, 1, MAX_HEVC_QP + ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset);
4531*c83a76b0SSuyog Pawar i4_avg_qp_q6_without_offset =
4532*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt->pi4_qp_to_qscale_q_factor[i4_hevc_qp_rc];
4533*c83a76b0SSuyog Pawar
4534*c83a76b0SSuyog Pawar /*Store the HBD qscale with and without accounting for offset*/
4535*c83a76b0SSuyog Pawar s_frame_info.f_hbd_q_scale_without_offset =
4536*c83a76b0SSuyog Pawar (float)i4_avg_qp_q6_without_offset / (1 << QSCALE_Q_FAC);
4537*c83a76b0SSuyog Pawar s_frame_info.f_hbd_q_scale = (float)i4_avg_frame_qp_q6 / (1 << QSCALE_Q_FAC);
4538*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4539*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4540*c83a76b0SSuyog Pawar
4541*c83a76b0SSuyog Pawar /*Store the 8 bit qscale with and without accounting for offset*/
4542*c83a76b0SSuyog Pawar /*Can be useful for pre-enc stage*/
4543*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset != 0)
4544*c83a76b0SSuyog Pawar {
4545*c83a76b0SSuyog Pawar s_frame_info.f_8bit_q_scale_without_offset =
4546*c83a76b0SSuyog Pawar s_frame_info.f_hbd_q_scale_without_offset / (1 << (ps_rc_ctxt->u1_bit_depth - 8));
4547*c83a76b0SSuyog Pawar s_frame_info.f_8bit_q_scale =
4548*c83a76b0SSuyog Pawar s_frame_info.f_hbd_q_scale / (1 << (ps_rc_ctxt->u1_bit_depth - 8));
4549*c83a76b0SSuyog Pawar }
4550*c83a76b0SSuyog Pawar else
4551*c83a76b0SSuyog Pawar {
4552*c83a76b0SSuyog Pawar s_frame_info.f_8bit_q_scale_without_offset = s_frame_info.f_hbd_q_scale_without_offset;
4553*c83a76b0SSuyog Pawar s_frame_info.f_8bit_q_scale = s_frame_info.f_hbd_q_scale;
4554*c83a76b0SSuyog Pawar }
4555*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4556*c83a76b0SSuyog Pawar s_frame_info.i4_num_entries++;
4557*c83a76b0SSuyog Pawar }
4558*c83a76b0SSuyog Pawar
4559*c83a76b0SSuyog Pawar /*making intra cost same as ssd as of now*/
4560*c83a76b0SSuyog Pawar i4_intra_cost = u4_frame_intra_sad;
4561*c83a76b0SSuyog Pawar
4562*c83a76b0SSuyog Pawar /* Handling bits stuffing and skips */
4563*c83a76b0SSuyog Pawar {
4564*c83a76b0SSuyog Pawar WORD32 i4_num_bits_to_prevent_vbv_underflow;
4565*c83a76b0SSuyog Pawar vbv_buf_status_e vbv_buffer_status;
4566*c83a76b0SSuyog Pawar vbv_buffer_status = get_buffer_status(
4567*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
4568*c83a76b0SSuyog Pawar u4_total_bits_consumed,
4569*c83a76b0SSuyog Pawar rc_pic_type, //the picture type convention is different in buffer handling
4570*c83a76b0SSuyog Pawar &i4_num_bits_to_prevent_vbv_underflow);
4571*c83a76b0SSuyog Pawar
4572*c83a76b0SSuyog Pawar if(vbv_buffer_status == VBV_UNDERFLOW)
4573*c83a76b0SSuyog Pawar {
4574*c83a76b0SSuyog Pawar }
4575*c83a76b0SSuyog Pawar if(vbv_buffer_status == VBV_OVERFLOW)
4576*c83a76b0SSuyog Pawar {
4577*c83a76b0SSuyog Pawar i4_bits_to_be_stuffed =
4578*c83a76b0SSuyog Pawar get_bits_to_stuff(ps_rc_ctxt->rc_hdl, u4_total_bits_consumed, rc_pic_type);
4579*c83a76b0SSuyog Pawar //i4_bits_to_be_stuffed = 0;/*STORAGE_RC*/
4580*c83a76b0SSuyog Pawar }
4581*c83a76b0SSuyog Pawar }
4582*c83a76b0SSuyog Pawar {
4583*c83a76b0SSuyog Pawar WORD32 ai4_sad[MAX_PIC_TYPE], i4_valid_sad_entry = 0;
4584*c83a76b0SSuyog Pawar UWORD32 u4_avg_sad = 0;
4585*c83a76b0SSuyog Pawar
4586*c83a76b0SSuyog Pawar /*calculate frame complexity. Given same content frame complexity should not vary across I,P and Bpic. Hence frame complexity is calculated
4587*c83a76b0SSuyog Pawar based on average of all pic types SAD*/
4588*c83a76b0SSuyog Pawar if(rc_pic_type == I_PIC)
4589*c83a76b0SSuyog Pawar {
4590*c83a76b0SSuyog Pawar ai4_sad[I_PIC] = u4_frame_intra_sad;
4591*c83a76b0SSuyog Pawar }
4592*c83a76b0SSuyog Pawar else
4593*c83a76b0SSuyog Pawar {
4594*c83a76b0SSuyog Pawar /*call to get previous I-PIC sad*/
4595*c83a76b0SSuyog Pawar rc_get_sad(ps_rc_ctxt->rc_hdl, &ai4_sad[0]);
4596*c83a76b0SSuyog Pawar }
4597*c83a76b0SSuyog Pawar
4598*c83a76b0SSuyog Pawar /*since intra sad is not available for every frame use previous I pic intra frame SAD*/
4599*c83a76b0SSuyog Pawar rc_put_sad(ps_rc_ctxt->rc_hdl, ai4_sad[I_PIC], u4_frame_sad, rc_pic_type);
4600*c83a76b0SSuyog Pawar rc_get_sad(ps_rc_ctxt->rc_hdl, &ai4_sad[0]);
4601*c83a76b0SSuyog Pawar /*for first few frame valid SAD is not available. This will make sure invalid data is not used*/
4602*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_field_pic == 0)
4603*c83a76b0SSuyog Pawar {
4604*c83a76b0SSuyog Pawar for(i = 0; i < ps_rc_ctxt->i4_num_active_pic_type; i++)
4605*c83a76b0SSuyog Pawar {
4606*c83a76b0SSuyog Pawar if(ai4_sad[i] >= 0)
4607*c83a76b0SSuyog Pawar {
4608*c83a76b0SSuyog Pawar u4_avg_sad += ai4_sad[i];
4609*c83a76b0SSuyog Pawar i4_valid_sad_entry++;
4610*c83a76b0SSuyog Pawar }
4611*c83a76b0SSuyog Pawar }
4612*c83a76b0SSuyog Pawar }
4613*c83a76b0SSuyog Pawar else /*for field case*/
4614*c83a76b0SSuyog Pawar {
4615*c83a76b0SSuyog Pawar if(ai4_sad[0] >= 0)
4616*c83a76b0SSuyog Pawar {
4617*c83a76b0SSuyog Pawar u4_avg_sad += ai4_sad[0];
4618*c83a76b0SSuyog Pawar i4_valid_sad_entry++;
4619*c83a76b0SSuyog Pawar }
4620*c83a76b0SSuyog Pawar
4621*c83a76b0SSuyog Pawar for(i = 1; i < ps_rc_ctxt->i4_num_active_pic_type; i++)
4622*c83a76b0SSuyog Pawar {
4623*c83a76b0SSuyog Pawar if(ai4_sad[i] >= 0)
4624*c83a76b0SSuyog Pawar {
4625*c83a76b0SSuyog Pawar u4_avg_sad += ai4_sad[i];
4626*c83a76b0SSuyog Pawar i4_valid_sad_entry++;
4627*c83a76b0SSuyog Pawar }
4628*c83a76b0SSuyog Pawar
4629*c83a76b0SSuyog Pawar if(ai4_sad[i + FIELD_OFFSET] >= 0)
4630*c83a76b0SSuyog Pawar {
4631*c83a76b0SSuyog Pawar u4_avg_sad += ai4_sad[i + FIELD_OFFSET];
4632*c83a76b0SSuyog Pawar i4_valid_sad_entry++;
4633*c83a76b0SSuyog Pawar }
4634*c83a76b0SSuyog Pawar }
4635*c83a76b0SSuyog Pawar }
4636*c83a76b0SSuyog Pawar
4637*c83a76b0SSuyog Pawar if(i4_valid_sad_entry > 0)
4638*c83a76b0SSuyog Pawar {
4639*c83a76b0SSuyog Pawar i4_frame_complexity =
4640*c83a76b0SSuyog Pawar (u4_avg_sad) /
4641*c83a76b0SSuyog Pawar (i4_valid_sad_entry * (ps_rc_ctxt->i4_frame_width * ps_rc_ctxt->i4_frame_height));
4642*c83a76b0SSuyog Pawar }
4643*c83a76b0SSuyog Pawar else
4644*c83a76b0SSuyog Pawar {
4645*c83a76b0SSuyog Pawar i4_frame_complexity = 1;
4646*c83a76b0SSuyog Pawar }
4647*c83a76b0SSuyog Pawar }
4648*c83a76b0SSuyog Pawar ASSERT(i4_frame_complexity >= 0);
4649*c83a76b0SSuyog Pawar /*I_model only reset In case of fade-in and fade-out*/
4650*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ai4_I_model_only_reset[i4_enc_frm_id])
4651*c83a76b0SSuyog Pawar {
4652*c83a76b0SSuyog Pawar ASSERT(rc_pic_type == I_PIC);
4653*c83a76b0SSuyog Pawar rc_reset_pic_model(ps_rc_ctxt->rc_hdl, I_PIC);
4654*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_I_model_only_reset[i4_enc_frm_id] = 0;
4655*c83a76b0SSuyog Pawar }
4656*c83a76b0SSuyog Pawar
4657*c83a76b0SSuyog Pawar /*check if next picture is I frame, both scene cuts and I pictures are treated as end of period*/
4658*c83a76b0SSuyog Pawar {
4659*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_rc_pic_type != -1 && ps_rc_lap_out->i4_rc_scene_type != -1)
4660*c83a76b0SSuyog Pawar {
4661*c83a76b0SSuyog Pawar if(ps_rc_ctxt->u4_intra_frame_interval != 1)
4662*c83a76b0SSuyog Pawar {
4663*c83a76b0SSuyog Pawar /*TBD: For second pass this should be only criteria, While merging to latest verison make sure non - I SCD is not considered as one of the condition*/
4664*c83a76b0SSuyog Pawar i4_is_last_frm_period = (WORD32)(
4665*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_next_pic_type == IV_IDR_FRAME ||
4666*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_next_pic_type == IV_I_FRAME);
4667*c83a76b0SSuyog Pawar }
4668*c83a76b0SSuyog Pawar else
4669*c83a76b0SSuyog Pawar {
4670*c83a76b0SSuyog Pawar i4_is_last_frm_period =
4671*c83a76b0SSuyog Pawar (WORD32)(ps_rc_lap_out->i4_next_scene_type == SCENE_TYPE_SCENE_CUT);
4672*c83a76b0SSuyog Pawar }
4673*c83a76b0SSuyog Pawar }
4674*c83a76b0SSuyog Pawar
4675*c83a76b0SSuyog Pawar /*In two pass only I frame ending should be considered end of period, otherwise complexity changes should be allowed to reset model in CBR and VBR modes*/
4676*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_rc_pass != 2)
4677*c83a76b0SSuyog Pawar i4_is_last_frm_period = i4_is_last_frm_period ||
4678*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_cmplx_change_reset_bits[i4_enc_frm_id];
4679*c83a76b0SSuyog Pawar }
4680*c83a76b0SSuyog Pawar
4681*c83a76b0SSuyog Pawar #if 1 //FRAME_PARALLEL_LVL //ELP_RC
4682*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_est_text_bits_ctr_update_qp++;
4683*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_est_text_bits_ctr_update_qp =
4684*c83a76b0SSuyog Pawar (ps_rc_ctxt->i4_est_text_bits_ctr_update_qp % (ps_rc_ctxt->i4_num_frame_parallel));
4685*c83a76b0SSuyog Pawar #endif
4686*c83a76b0SSuyog Pawar
4687*c83a76b0SSuyog Pawar update_frame_level_info(
4688*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
4689*c83a76b0SSuyog Pawar rc_pic_type,
4690*c83a76b0SSuyog Pawar a_mb_type_sad,
4691*c83a76b0SSuyog Pawar u4_total_bits_consumed, /*total bits consumed by frame*/
4692*c83a76b0SSuyog Pawar u4_total_header_bits,
4693*c83a76b0SSuyog Pawar a_mb_type_tex_bits,
4694*c83a76b0SSuyog Pawar a_mb_type_qp_q6, /*sum of qp of all mb in frame, since no ctb level modulation*/
4695*c83a76b0SSuyog Pawar a_mb_in_type,
4696*c83a76b0SSuyog Pawar i4_avg_activity,
4697*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_frame_scd[i4_enc_frm_id], /*currenlty SCD is not enabled*/
4698*c83a76b0SSuyog Pawar 0, /*not a pre encode skip*/
4699*c83a76b0SSuyog Pawar i4_intra_cost,
4700*c83a76b0SSuyog Pawar 0,
4701*c83a76b0SSuyog Pawar ps_rc_lap_out
4702*c83a76b0SSuyog Pawar ->i4_ignore_for_rc_update, /*HEVC_hierarchy: do not supress update for non-ref B pic*/
4703*c83a76b0SSuyog Pawar i4_bits_to_be_stuffed,
4704*c83a76b0SSuyog Pawar (ps_rc_ctxt->ai4_is_pause_to_resume[i4_enc_frm_id] ||
4705*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_non_I_scd_pic[i4_enc_frm_id] ||
4706*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_cmplx_change_reset_model[i4_enc_frm_id]),
4707*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_lap_complexity_q7[i4_enc_frm_id],
4708*c83a76b0SSuyog Pawar i4_is_last_frm_period,
4709*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_cmplx_change_reset_bits[i4_enc_frm_id],
4710*c83a76b0SSuyog Pawar &s_frame_info,
4711*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_rc_model_needs_to_be_updated,
4712*c83a76b0SSuyog Pawar ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset,
4713*c83a76b0SSuyog Pawar i4_scene_num,
4714*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_scene_numbers[i4_scene_num],
4715*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_est_text_bits_ctr_update_qp);
4716*c83a76b0SSuyog Pawar /** reset flags valid for only one frame*/
4717*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_frame_scd[i4_enc_frm_id] = 0;
4718*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_pause_to_resume[i4_enc_frm_id] = 0;
4719*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_non_I_scd_pic[i4_enc_frm_id] = 0;
4720*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_cmplx_change_reset_model[i4_enc_frm_id] = 0;
4721*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_cmplx_change_reset_bits[i4_enc_frm_id] = 0;
4722*c83a76b0SSuyog Pawar
4723*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_first_frame_encoded = 1;
4724*c83a76b0SSuyog Pawar
4725*c83a76b0SSuyog Pawar /** update the scene num for current frame*/
4726*c83a76b0SSuyog Pawar ps_rc_ctxt->au4_scene_num_temp_id[ps_rc_lap_out->i4_rc_temporal_lyr_id] =
4727*c83a76b0SSuyog Pawar ps_rc_lap_out->u4_rc_scene_num;
4728*c83a76b0SSuyog Pawar
4729*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ai4_is_frame_scd[i4_enc_frm_id])
4730*c83a76b0SSuyog Pawar {
4731*c83a76b0SSuyog Pawar /*reset pre-enc SAD whenever SCD is detected so that it does not detect scene cut for other pictures*/
4732*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
4733*c83a76b0SSuyog Pawar {
4734*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frm_pre_enc_cost[i] = -1;
4735*c83a76b0SSuyog Pawar }
4736*c83a76b0SSuyog Pawar }
4737*c83a76b0SSuyog Pawar
4738*c83a76b0SSuyog Pawar /*remember i frame's cost metric to scale SAD of next of I frame*/
4739*c83a76b0SSuyog Pawar if(pic_type == IV_I_FRAME || pic_type == IV_IDR_FRAME)
4740*c83a76b0SSuyog Pawar {
4741*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_prev_i_frm_cost = ps_rc_ctxt->ai8_cur_frm_intra_cost[i4_enc_frm_id];
4742*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frm_pre_enc_cost[rc_pic_type] =
4743*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_cur_frm_intra_cost[i4_enc_frm_id];
4744*c83a76b0SSuyog Pawar }
4745*c83a76b0SSuyog Pawar /*for other picture types update hme cost*/
4746*c83a76b0SSuyog Pawar else
4747*c83a76b0SSuyog Pawar {
4748*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frm_pre_enc_cost[rc_pic_type] =
4749*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_cur_frame_coarse_ME_cost[i4_enc_frm_id];
4750*c83a76b0SSuyog Pawar }
4751*c83a76b0SSuyog Pawar }
4752*c83a76b0SSuyog Pawar /*!
4753*c83a76b0SSuyog Pawar ******************************************************************************
4754*c83a76b0SSuyog Pawar * \if Function name : ihevce_rc_interface_update \endif
4755*c83a76b0SSuyog Pawar *
4756*c83a76b0SSuyog Pawar * \brief
4757*c83a76b0SSuyog Pawar * Updating rate control interface parameters after the query call.
4758*c83a76b0SSuyog Pawar *
4759*c83a76b0SSuyog Pawar * \param[in] Rate control interface context,
4760*c83a76b0SSuyog Pawar * Picture Type
4761*c83a76b0SSuyog Pawar * Lap out structure pointer
4762*c83a76b0SSuyog Pawar *
4763*c83a76b0SSuyog Pawar *
4764*c83a76b0SSuyog Pawar * \return
4765*c83a76b0SSuyog Pawar * None
4766*c83a76b0SSuyog Pawar *
4767*c83a76b0SSuyog Pawar * \author Ittiam
4768*c83a76b0SSuyog Pawar * Ittiam
4769*c83a76b0SSuyog Pawar *
4770*c83a76b0SSuyog Pawar *****************************************************************************
4771*c83a76b0SSuyog Pawar */
ihevce_rc_interface_update(void * pv_ctxt,IV_PICTURE_CODING_TYPE_T pic_type,rc_lap_out_params_t * ps_rc_lap_out,WORD32 i4_avg_frame_hevc_qp,WORD32 i4_enc_frm_id)4772*c83a76b0SSuyog Pawar void ihevce_rc_interface_update(
4773*c83a76b0SSuyog Pawar void *pv_ctxt,
4774*c83a76b0SSuyog Pawar IV_PICTURE_CODING_TYPE_T pic_type,
4775*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_out,
4776*c83a76b0SSuyog Pawar WORD32 i4_avg_frame_hevc_qp,
4777*c83a76b0SSuyog Pawar WORD32 i4_enc_frm_id)
4778*c83a76b0SSuyog Pawar {
4779*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
4780*c83a76b0SSuyog Pawar picture_type_e rc_pic_type = ihevce_rc_conv_pic_type(
4781*c83a76b0SSuyog Pawar pic_type,
4782*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
4783*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_temporal_lyr_id,
4784*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_bottom_field,
4785*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
4786*c83a76b0SSuyog Pawar WORD32 i;
4787*c83a76b0SSuyog Pawar WORD32 i4_avg_frame_qp_q6, i4_ctr = -1, i4_i, i4_j;
4788*c83a76b0SSuyog Pawar WORD32 i4_scene_num = ps_rc_lap_out->u4_rc_scene_num % MAX_SCENE_NUM;
4789*c83a76b0SSuyog Pawar
4790*c83a76b0SSuyog Pawar /*store frame qp to clip qp accordingly*/
4791*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_is_rc_model_needs_to_be_updated)
4792*c83a76b0SSuyog Pawar {
4793*c83a76b0SSuyog Pawar WORD32 i4_i, i4_temp_i_qp, i4_temp_qp;
4794*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][rc_pic_type] = i4_avg_frame_hevc_qp;
4795*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_scene_numbers[i4_scene_num]++;
4796*c83a76b0SSuyog Pawar
4797*c83a76b0SSuyog Pawar if(rc_pic_type < P1_PIC)
4798*c83a76b0SSuyog Pawar i4_temp_i_qp = i4_avg_frame_hevc_qp - rc_pic_type;
4799*c83a76b0SSuyog Pawar else
4800*c83a76b0SSuyog Pawar i4_temp_i_qp = i4_avg_frame_hevc_qp - rc_pic_type + 4;
4801*c83a76b0SSuyog Pawar
4802*c83a76b0SSuyog Pawar i4_temp_i_qp = ihevce_clip_min_max_qp(ps_rc_ctxt, i4_temp_i_qp, I_PIC, 0);
4803*c83a76b0SSuyog Pawar
4804*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ai4_scene_numbers[i4_scene_num] == 1)
4805*c83a76b0SSuyog Pawar {
4806*c83a76b0SSuyog Pawar for(i4_i = 0; i4_i < 5; i4_i++)
4807*c83a76b0SSuyog Pawar {
4808*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][i4_i] == INIT_HEVCE_QP_RC)
4809*c83a76b0SSuyog Pawar {
4810*c83a76b0SSuyog Pawar i4_temp_qp = i4_temp_i_qp + i4_i;
4811*c83a76b0SSuyog Pawar i4_temp_qp = ihevce_clip_min_max_qp(
4812*c83a76b0SSuyog Pawar ps_rc_ctxt, i4_temp_qp, (picture_type_e)i4_i, MAX(i4_i - 1, 0));
4813*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][i4_i] = i4_temp_qp;
4814*c83a76b0SSuyog Pawar
4815*c83a76b0SSuyog Pawar if(i4_i > 0)
4816*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_prev_pic_hevc_qp[i4_scene_num][i4_i + 4] = i4_temp_qp;
4817*c83a76b0SSuyog Pawar }
4818*c83a76b0SSuyog Pawar }
4819*c83a76b0SSuyog Pawar }
4820*c83a76b0SSuyog Pawar }
4821*c83a76b0SSuyog Pawar
4822*c83a76b0SSuyog Pawar for(i4_i = 0; i4_i < MAX_NON_REF_B_PICS_IN_QUEUE_SGI; i4_i++)
4823*c83a76b0SSuyog Pawar {
4824*c83a76b0SSuyog Pawar if(ps_rc_lap_out->u4_rc_scene_num == ps_rc_ctxt->au4_prev_scene_num_multi_scene[i4_i])
4825*c83a76b0SSuyog Pawar {
4826*c83a76b0SSuyog Pawar i4_ctr = i4_i;
4827*c83a76b0SSuyog Pawar break;
4828*c83a76b0SSuyog Pawar }
4829*c83a76b0SSuyog Pawar }
4830*c83a76b0SSuyog Pawar if(-1 == i4_ctr)
4831*c83a76b0SSuyog Pawar {
4832*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_prev_qp_ctr++;
4833*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_prev_qp_ctr = ps_rc_ctxt->i4_prev_qp_ctr % MAX_NON_REF_B_PICS_IN_QUEUE_SGI;
4834*c83a76b0SSuyog Pawar i4_ctr = ps_rc_ctxt->i4_prev_qp_ctr;
4835*c83a76b0SSuyog Pawar ps_rc_ctxt->au4_prev_scene_num_multi_scene[i4_ctr] = ps_rc_lap_out->u4_rc_scene_num;
4836*c83a76b0SSuyog Pawar for(i4_j = 0; i4_j < MAX_PIC_TYPE; i4_j++)
4837*c83a76b0SSuyog Pawar {
4838*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_qp_for_previous_scene_multi_scene[i4_ctr][i4_j] = 0;
4839*c83a76b0SSuyog Pawar }
4840*c83a76b0SSuyog Pawar }
4841*c83a76b0SSuyog Pawar
4842*c83a76b0SSuyog Pawar {
4843*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_qp_for_previous_scene_multi_scene[i4_ctr][rc_pic_type] =
4844*c83a76b0SSuyog Pawar i4_avg_frame_hevc_qp;
4845*c83a76b0SSuyog Pawar }
4846*c83a76b0SSuyog Pawar
4847*c83a76b0SSuyog Pawar /*I_model only reset In case of fade-in and fade-out*/
4848*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ai4_I_model_only_reset[i4_enc_frm_id])
4849*c83a76b0SSuyog Pawar {
4850*c83a76b0SSuyog Pawar ASSERT(rc_pic_type == I_PIC);
4851*c83a76b0SSuyog Pawar rc_reset_pic_model(ps_rc_ctxt->rc_hdl, I_PIC);
4852*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_I_model_only_reset[i4_enc_frm_id] = 0;
4853*c83a76b0SSuyog Pawar }
4854*c83a76b0SSuyog Pawar
4855*c83a76b0SSuyog Pawar i4_avg_frame_qp_q6 = ps_rc_ctxt->ps_rc_quant_ctxt->pi4_qp_to_qscale_q_factor
4856*c83a76b0SSuyog Pawar [i4_avg_frame_hevc_qp + ps_rc_ctxt->ps_rc_quant_ctxt->i1_qp_offset];
4857*c83a76b0SSuyog Pawar
4858*c83a76b0SSuyog Pawar update_frame_rc_get_frame_qp_info(
4859*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
4860*c83a76b0SSuyog Pawar rc_pic_type,
4861*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_frame_scd[i4_enc_frm_id],
4862*c83a76b0SSuyog Pawar (ps_rc_ctxt->ai4_is_pause_to_resume[i4_enc_frm_id] ||
4863*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_non_I_scd_pic[i4_enc_frm_id] ||
4864*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_is_cmplx_change_reset_model[i4_enc_frm_id]),
4865*c83a76b0SSuyog Pawar i4_avg_frame_qp_q6,
4866*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_ignore_for_rc_update,
4867*c83a76b0SSuyog Pawar i4_scene_num,
4868*c83a76b0SSuyog Pawar ps_rc_ctxt->ai4_scene_numbers[i4_scene_num]);
4869*c83a76b0SSuyog Pawar
4870*c83a76b0SSuyog Pawar /** update the scene num for current frame*/
4871*c83a76b0SSuyog Pawar ps_rc_ctxt->au4_scene_num_temp_id[ps_rc_lap_out->i4_rc_temporal_lyr_id] =
4872*c83a76b0SSuyog Pawar ps_rc_lap_out->u4_rc_scene_num;
4873*c83a76b0SSuyog Pawar
4874*c83a76b0SSuyog Pawar if(ps_rc_ctxt->ai4_is_frame_scd[i4_enc_frm_id])
4875*c83a76b0SSuyog Pawar {
4876*c83a76b0SSuyog Pawar /*reset pre-enc SAD whenever SCD is detected so that it does not detect scene cut for other pictures*/
4877*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
4878*c83a76b0SSuyog Pawar {
4879*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frm_pre_enc_cost[i] = -1;
4880*c83a76b0SSuyog Pawar }
4881*c83a76b0SSuyog Pawar }
4882*c83a76b0SSuyog Pawar
4883*c83a76b0SSuyog Pawar /*remember i frame's cost metric to scale SAD of next of I frame*/
4884*c83a76b0SSuyog Pawar if(pic_type == IV_I_FRAME || pic_type == IV_IDR_FRAME)
4885*c83a76b0SSuyog Pawar {
4886*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_prev_i_frm_cost = ps_rc_ctxt->ai8_cur_frm_intra_cost[i4_enc_frm_id];
4887*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frm_pre_enc_cost[rc_pic_type] =
4888*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_cur_frm_intra_cost[i4_enc_frm_id];
4889*c83a76b0SSuyog Pawar }
4890*c83a76b0SSuyog Pawar /*for other picture types update hme cost*/
4891*c83a76b0SSuyog Pawar else
4892*c83a76b0SSuyog Pawar {
4893*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_prev_frm_pre_enc_cost[rc_pic_type] =
4894*c83a76b0SSuyog Pawar ps_rc_ctxt->ai8_cur_frame_coarse_ME_cost[i4_enc_frm_id];
4895*c83a76b0SSuyog Pawar }
4896*c83a76b0SSuyog Pawar
4897*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_is_first_frame_encoded = 1;
4898*c83a76b0SSuyog Pawar }
4899*c83a76b0SSuyog Pawar
4900*c83a76b0SSuyog Pawar /****************************************************************************
4901*c83a76b0SSuyog Pawar Function Name : ihevce_rc_store_retrive_update_info
4902*c83a76b0SSuyog Pawar Description : for storing and retrieving the data in case of the Enc Loop Parallelism.
4903*c83a76b0SSuyog Pawar Inputs :
4904*c83a76b0SSuyog Pawar Globals :
4905*c83a76b0SSuyog Pawar Processing :
4906*c83a76b0SSuyog Pawar Outputs :
4907*c83a76b0SSuyog Pawar Returns :
4908*c83a76b0SSuyog Pawar Issues :
4909*c83a76b0SSuyog Pawar Revision History:
4910*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4911*c83a76b0SSuyog Pawar *****************************************************************************/
4912*c83a76b0SSuyog Pawar
ihevce_rc_store_retrive_update_info(void * pv_ctxt,rc_bits_sad_t * ps_rc_frame_stat,WORD32 i4_enc_frm_id_rc,WORD32 bit_rate_id,WORD32 i4_store_retrive,WORD32 * pout_buf_id,WORD32 * pi4_rc_pic_type,WORD32 * pcur_qp,void * ps_lap_out,void * ps_rc_lap_out)4913*c83a76b0SSuyog Pawar void ihevce_rc_store_retrive_update_info(
4914*c83a76b0SSuyog Pawar void *pv_ctxt,
4915*c83a76b0SSuyog Pawar rc_bits_sad_t *ps_rc_frame_stat,
4916*c83a76b0SSuyog Pawar WORD32 i4_enc_frm_id_rc,
4917*c83a76b0SSuyog Pawar WORD32 bit_rate_id,
4918*c83a76b0SSuyog Pawar WORD32 i4_store_retrive,
4919*c83a76b0SSuyog Pawar WORD32 *pout_buf_id,
4920*c83a76b0SSuyog Pawar WORD32 *pi4_rc_pic_type,
4921*c83a76b0SSuyog Pawar WORD32 *pcur_qp,
4922*c83a76b0SSuyog Pawar void *ps_lap_out,
4923*c83a76b0SSuyog Pawar void *ps_rc_lap_out)
4924*c83a76b0SSuyog Pawar {
4925*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
4926*c83a76b0SSuyog Pawar if(1 == i4_store_retrive)
4927*c83a76b0SSuyog Pawar {
4928*c83a76b0SSuyog Pawar memcpy(
4929*c83a76b0SSuyog Pawar &ps_rc_ctxt->as_rc_frame_stat_store[i4_enc_frm_id_rc][bit_rate_id],
4930*c83a76b0SSuyog Pawar ps_rc_frame_stat,
4931*c83a76b0SSuyog Pawar sizeof(rc_bits_sad_t));
4932*c83a76b0SSuyog Pawar memcpy(&ps_rc_ctxt->out_buf_id[i4_enc_frm_id_rc][bit_rate_id], pout_buf_id, sizeof(WORD32));
4933*c83a76b0SSuyog Pawar memcpy(&ps_rc_ctxt->i4_pic_type[i4_enc_frm_id_rc], pi4_rc_pic_type, sizeof(WORD32));
4934*c83a76b0SSuyog Pawar memcpy(&ps_rc_ctxt->cur_qp[i4_enc_frm_id_rc][bit_rate_id], pcur_qp, sizeof(WORD32));
4935*c83a76b0SSuyog Pawar memcpy(
4936*c83a76b0SSuyog Pawar &ps_rc_ctxt->as_lap_out[i4_enc_frm_id_rc],
4937*c83a76b0SSuyog Pawar ps_lap_out,
4938*c83a76b0SSuyog Pawar sizeof(ihevce_lap_output_params_t));
4939*c83a76b0SSuyog Pawar memcpy(
4940*c83a76b0SSuyog Pawar &ps_rc_ctxt->as_rc_lap_out[i4_enc_frm_id_rc],
4941*c83a76b0SSuyog Pawar ps_rc_lap_out,
4942*c83a76b0SSuyog Pawar sizeof(rc_lap_out_params_t));
4943*c83a76b0SSuyog Pawar
4944*c83a76b0SSuyog Pawar {
4945*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_out_curr = (rc_lap_out_params_t *)ps_rc_lap_out;
4946*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_out_next_encode =
4947*c83a76b0SSuyog Pawar (rc_lap_out_params_t *)ps_rc_lap_out_curr->ps_rc_lap_out_next_encode;
4948*c83a76b0SSuyog Pawar
4949*c83a76b0SSuyog Pawar if(NULL != ps_rc_lap_out_next_encode)
4950*c83a76b0SSuyog Pawar {
4951*c83a76b0SSuyog Pawar ps_rc_ctxt->as_rc_lap_out[i4_enc_frm_id_rc].i4_next_pic_type =
4952*c83a76b0SSuyog Pawar ps_rc_lap_out_next_encode->i4_rc_pic_type;
4953*c83a76b0SSuyog Pawar ps_rc_ctxt->as_rc_lap_out[i4_enc_frm_id_rc].i4_next_scene_type =
4954*c83a76b0SSuyog Pawar ps_rc_lap_out_next_encode->i4_rc_scene_type;
4955*c83a76b0SSuyog Pawar }
4956*c83a76b0SSuyog Pawar else
4957*c83a76b0SSuyog Pawar {
4958*c83a76b0SSuyog Pawar if(ps_rc_ctxt->u4_intra_frame_interval <= 1 ||
4959*c83a76b0SSuyog Pawar (ps_rc_lap_out_curr->i4_rc_display_num &&
4960*c83a76b0SSuyog Pawar (ps_rc_lap_out_curr->i4_rc_display_num %
4961*c83a76b0SSuyog Pawar (ps_rc_ctxt->u4_intra_frame_interval - 1)) == 0))
4962*c83a76b0SSuyog Pawar {
4963*c83a76b0SSuyog Pawar ps_rc_ctxt->as_rc_lap_out[i4_enc_frm_id_rc].i4_next_pic_type = IV_I_FRAME;
4964*c83a76b0SSuyog Pawar }
4965*c83a76b0SSuyog Pawar else
4966*c83a76b0SSuyog Pawar {
4967*c83a76b0SSuyog Pawar ps_rc_ctxt->as_rc_lap_out[i4_enc_frm_id_rc].i4_next_pic_type = -1;
4968*c83a76b0SSuyog Pawar }
4969*c83a76b0SSuyog Pawar ps_rc_ctxt->as_rc_lap_out[i4_enc_frm_id_rc].i4_next_scene_type = -1;
4970*c83a76b0SSuyog Pawar }
4971*c83a76b0SSuyog Pawar ps_rc_ctxt->as_rc_lap_out[i4_enc_frm_id_rc].ps_rc_lap_out_next_encode = NULL;
4972*c83a76b0SSuyog Pawar }
4973*c83a76b0SSuyog Pawar }
4974*c83a76b0SSuyog Pawar else if(2 == i4_store_retrive)
4975*c83a76b0SSuyog Pawar {
4976*c83a76b0SSuyog Pawar memcpy(
4977*c83a76b0SSuyog Pawar ps_rc_frame_stat,
4978*c83a76b0SSuyog Pawar &ps_rc_ctxt->as_rc_frame_stat_store[i4_enc_frm_id_rc][bit_rate_id],
4979*c83a76b0SSuyog Pawar sizeof(rc_bits_sad_t));
4980*c83a76b0SSuyog Pawar memcpy(pout_buf_id, &ps_rc_ctxt->out_buf_id[i4_enc_frm_id_rc][bit_rate_id], sizeof(WORD32));
4981*c83a76b0SSuyog Pawar memcpy(pi4_rc_pic_type, &ps_rc_ctxt->i4_pic_type[i4_enc_frm_id_rc], sizeof(WORD32));
4982*c83a76b0SSuyog Pawar memcpy(pcur_qp, &ps_rc_ctxt->cur_qp[i4_enc_frm_id_rc][bit_rate_id], sizeof(WORD32));
4983*c83a76b0SSuyog Pawar memcpy(
4984*c83a76b0SSuyog Pawar ps_lap_out,
4985*c83a76b0SSuyog Pawar &ps_rc_ctxt->as_lap_out[i4_enc_frm_id_rc],
4986*c83a76b0SSuyog Pawar sizeof(ihevce_lap_output_params_t));
4987*c83a76b0SSuyog Pawar memcpy(
4988*c83a76b0SSuyog Pawar ps_rc_lap_out,
4989*c83a76b0SSuyog Pawar &ps_rc_ctxt->as_rc_lap_out[i4_enc_frm_id_rc],
4990*c83a76b0SSuyog Pawar sizeof(rc_lap_out_params_t));
4991*c83a76b0SSuyog Pawar }
4992*c83a76b0SSuyog Pawar else
4993*c83a76b0SSuyog Pawar {
4994*c83a76b0SSuyog Pawar ASSERT(0);
4995*c83a76b0SSuyog Pawar }
4996*c83a76b0SSuyog Pawar }
4997*c83a76b0SSuyog Pawar
4998*c83a76b0SSuyog Pawar /*###############################################*/
4999*c83a76b0SSuyog Pawar /******* END OF RC UPDATE FUNCTIONS **************/
5000*c83a76b0SSuyog Pawar /*###############################################*/
5001*c83a76b0SSuyog Pawar
5002*c83a76b0SSuyog Pawar /*#################################################*/
5003*c83a76b0SSuyog Pawar /******* START OF RC UTILS FUNCTIONS **************/
5004*c83a76b0SSuyog Pawar /*#################################################*/
5005*c83a76b0SSuyog Pawar
5006*c83a76b0SSuyog Pawar /**
5007*c83a76b0SSuyog Pawar ******************************************************************************
5008*c83a76b0SSuyog Pawar *
5009*c83a76b0SSuyog Pawar * @brief function to account for error correction between bits rdopt estimate
5010*c83a76b0SSuyog Pawar * and actual entropy bit generation
5011*c83a76b0SSuyog Pawar *
5012*c83a76b0SSuyog Pawar * @par Description
5013*c83a76b0SSuyog Pawar *
5014*c83a76b0SSuyog Pawar * @param[in] pv_rc_ctxt
5015*c83a76b0SSuyog Pawar * void pointer to rc ctxt
5016*c83a76b0SSuyog Pawar * @param[in] i4_rdopt_bits_gen_error
5017*c83a76b0SSuyog Pawar * WODd32 variable with error correction between rdopt and entropy bytes gen
5018*c83a76b0SSuyog Pawar *
5019*c83a76b0SSuyog Pawar * @return void
5020*c83a76b0SSuyog Pawar *
5021*c83a76b0SSuyog Pawar ******************************************************************************
5022*c83a76b0SSuyog Pawar */
5023*c83a76b0SSuyog Pawar
ihevce_rc_rdopt_entropy_bit_correct(void * pv_rc_ctxt,WORD32 i4_cur_entropy_consumption,WORD32 i4_buf_id)5024*c83a76b0SSuyog Pawar void ihevce_rc_rdopt_entropy_bit_correct(
5025*c83a76b0SSuyog Pawar void *pv_rc_ctxt, WORD32 i4_cur_entropy_consumption, WORD32 i4_buf_id)
5026*c83a76b0SSuyog Pawar {
5027*c83a76b0SSuyog Pawar rc_context_t *ps_ctxt = (rc_context_t *)pv_rc_ctxt;
5028*c83a76b0SSuyog Pawar WORD32 i4_error;
5029*c83a76b0SSuyog Pawar WORD32 i, count = 0;
5030*c83a76b0SSuyog Pawar ASSERT(i4_buf_id >= 0);
5031*c83a76b0SSuyog Pawar ps_ctxt->ai4_entropy_bit_consumption[ps_ctxt->i4_entropy_bit_count] =
5032*c83a76b0SSuyog Pawar i4_cur_entropy_consumption;
5033*c83a76b0SSuyog Pawar ps_ctxt->ai4_entropy_bit_consumption_buf_id[ps_ctxt->i4_entropy_bit_count] = i4_buf_id;
5034*c83a76b0SSuyog Pawar ps_ctxt->i4_entropy_bit_count = (ps_ctxt->i4_entropy_bit_count + 1) % NUM_BUF_RDOPT_ENT_CORRECT;
5035*c83a76b0SSuyog Pawar
5036*c83a76b0SSuyog Pawar for(i = 0; i < NUM_BUF_RDOPT_ENT_CORRECT; i++)
5037*c83a76b0SSuyog Pawar {
5038*c83a76b0SSuyog Pawar if(ps_ctxt->ai4_rdopt_bit_consumption_buf_id[i] >= 0 &&
5039*c83a76b0SSuyog Pawar (ps_ctxt->ai4_rdopt_bit_consumption_buf_id[i] ==
5040*c83a76b0SSuyog Pawar ps_ctxt->ai4_entropy_bit_consumption_buf_id[i]))
5041*c83a76b0SSuyog Pawar {
5042*c83a76b0SSuyog Pawar i4_error = ps_ctxt->ai4_rdopt_bit_consumption_estimate[i] -
5043*c83a76b0SSuyog Pawar ps_ctxt->ai4_entropy_bit_consumption[i];
5044*c83a76b0SSuyog Pawar //DBG_PRINTF("entropy mismatch error = %d\n",i4_error/ps_ctxt->ai4_rdopt_bit_consumption_estimate[i]);
5045*c83a76b0SSuyog Pawar ps_ctxt->ai4_rdopt_bit_consumption_estimate[i] = -1;
5046*c83a76b0SSuyog Pawar ps_ctxt->ai4_rdopt_bit_consumption_buf_id[i] = -1;
5047*c83a76b0SSuyog Pawar ps_ctxt->ai4_entropy_bit_consumption[i] = -1;
5048*c83a76b0SSuyog Pawar ps_ctxt->ai4_entropy_bit_consumption_buf_id[i] = -1;
5049*c83a76b0SSuyog Pawar /*accumulate mismatch along with gop level bit error that is propogated to next frame*/
5050*c83a76b0SSuyog Pawar /*error = rdopt - entropy so it is expected to be negative*/
5051*c83a76b0SSuyog Pawar rc_update_mismatch_error(ps_ctxt->rc_hdl, i4_error);
5052*c83a76b0SSuyog Pawar count++;
5053*c83a76b0SSuyog Pawar }
5054*c83a76b0SSuyog Pawar }
5055*c83a76b0SSuyog Pawar }
5056*c83a76b0SSuyog Pawar
5057*c83a76b0SSuyog Pawar /**
5058*c83a76b0SSuyog Pawar ******************************************************************************
5059*c83a76b0SSuyog Pawar *
5060*c83a76b0SSuyog Pawar * @name ihevce_rc_check_non_lap_scd
5061*c83a76b0SSuyog Pawar *
5062*c83a76b0SSuyog Pawar * @par Description Detects SCD frames as I_only_scds or non_I_scds based
5063*c83a76b0SSuyog Pawar on intrasatd & ME costs. Updates scd flags
5064*c83a76b0SSuyog Pawar *
5065*c83a76b0SSuyog Pawar * @param[in] ps_rc_ctxt - pointer to rc context
5066*c83a76b0SSuyog Pawar * ps_rc_lap_out
5067*c83a76b0SSuyog Pawar * @return void
5068*c83a76b0SSuyog Pawar *
5069*c83a76b0SSuyog Pawar ******************************************************************************
5070*c83a76b0SSuyog Pawar */
ihevce_rc_check_non_lap_scd(void * pv_rc_ctxt,rc_lap_out_params_t * ps_rc_lap_out)5071*c83a76b0SSuyog Pawar void ihevce_rc_check_non_lap_scd(void *pv_rc_ctxt, rc_lap_out_params_t *ps_rc_lap_out)
5072*c83a76b0SSuyog Pawar {
5073*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_rc_ctxt;
5074*c83a76b0SSuyog Pawar picture_type_e rc_pic_type = ihevce_rc_conv_pic_type(
5075*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_rc_lap_out->i4_rc_pic_type,
5076*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
5077*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_temporal_lyr_id,
5078*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_bottom_field,
5079*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
5080*c83a76b0SSuyog Pawar
5081*c83a76b0SSuyog Pawar /*Init to normal frames*/
5082*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_I_only_scd = 0;
5083*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_non_I_scd = 0;
5084*c83a76b0SSuyog Pawar
5085*c83a76b0SSuyog Pawar /*None of the above check is valid if marked as scene cut*/
5086*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_rc_scene_type == SCENE_TYPE_SCENE_CUT)
5087*c83a76b0SSuyog Pawar {
5088*c83a76b0SSuyog Pawar WORD32 i;
5089*c83a76b0SSuyog Pawar /*reset all older data*/
5090*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
5091*c83a76b0SSuyog Pawar {
5092*c83a76b0SSuyog Pawar ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_I_intra_raw_satd[i] = -1;
5093*c83a76b0SSuyog Pawar ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_pic_coarse_me_cost[i] = -1;
5094*c83a76b0SSuyog Pawar ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_pic_coarse_me_sad[i] = -1;
5095*c83a76b0SSuyog Pawar }
5096*c83a76b0SSuyog Pawar }
5097*c83a76b0SSuyog Pawar else
5098*c83a76b0SSuyog Pawar {
5099*c83a76b0SSuyog Pawar /*Check if it is I only reset case, lap_out is assumed to have latest data which is used to set the corresponding flags*/
5100*c83a76b0SSuyog Pawar /*For I pic check for I only reset case and for other pictures check for non-I scd case*/
5101*c83a76b0SSuyog Pawar if(rc_pic_type == I_PIC)
5102*c83a76b0SSuyog Pawar {
5103*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i8_pre_intra_satd <
5104*c83a76b0SSuyog Pawar (ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_I_intra_raw_satd[rc_pic_type] >> 1) ||
5105*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_pre_intra_satd >
5106*c83a76b0SSuyog Pawar (ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_I_intra_raw_satd[rc_pic_type] << 1))
5107*c83a76b0SSuyog Pawar {
5108*c83a76b0SSuyog Pawar /*Check if atleast one frame data is available*/
5109*c83a76b0SSuyog Pawar if(ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_I_intra_raw_satd[rc_pic_type] >= 0)
5110*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_I_only_scd = 1;
5111*c83a76b0SSuyog Pawar }
5112*c83a76b0SSuyog Pawar }
5113*c83a76b0SSuyog Pawar else if(
5114*c83a76b0SSuyog Pawar ((rc_pic_type == P_PIC) &&
5115*c83a76b0SSuyog Pawar (ps_rc_lap_out->i4_rc_quality_preset == IHEVCE_QUALITY_P6)) ||
5116*c83a76b0SSuyog Pawar (ps_rc_lap_out->i4_rc_quality_preset < IHEVCE_QUALITY_P6))
5117*c83a76b0SSuyog Pawar {
5118*c83a76b0SSuyog Pawar #define SAD_THREASHOLD_30FPS (2.5)
5119*c83a76b0SSuyog Pawar /*Choose threshold as 2.5 for 30 fps content and 1.75 for 60 fps. Scale accordingly for intermediate framerate*/
5120*c83a76b0SSuyog Pawar WORD32 i4_non_simple_repeat_prev_frame_detect = 0;
5121*c83a76b0SSuyog Pawar float sad_change_threshold =
5122*c83a76b0SSuyog Pawar (float)(-0.8f * ((float)ps_rc_ctxt->u4_max_frame_rate / 30000) + 3.05f); /*Change of SAD threshold for 30 fps content, this should be lowered for 60 fps*/
5123*c83a76b0SSuyog Pawar if(sad_change_threshold < 1.5f)
5124*c83a76b0SSuyog Pawar sad_change_threshold = 1.5f;
5125*c83a76b0SSuyog Pawar if(sad_change_threshold > 3.0f)
5126*c83a76b0SSuyog Pawar sad_change_threshold = 3.0f;
5127*c83a76b0SSuyog Pawar ASSERT(ps_rc_lap_out->i8_raw_l1_coarse_me_sad >= 0);
5128*c83a76b0SSuyog Pawar
5129*c83a76b0SSuyog Pawar /*block variance computed at 4x4 level in w/4*h/4,
5130*c83a76b0SSuyog Pawar percent dc blks is how many block's variance are less than or equal to 16*/
5131*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_perc_dc_blks < 85)
5132*c83a76b0SSuyog Pawar {
5133*c83a76b0SSuyog Pawar /*me sad is expected to be zero for repeat frames*/
5134*c83a76b0SSuyog Pawar if((ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_pic_coarse_me_sad[rc_pic_type] ==
5135*c83a76b0SSuyog Pawar 0) &&
5136*c83a76b0SSuyog Pawar (ps_rc_lap_out->i4_rc_temporal_lyr_id == ps_rc_ctxt->i4_max_temporal_lyr))
5137*c83a76b0SSuyog Pawar {
5138*c83a76b0SSuyog Pawar i4_non_simple_repeat_prev_frame_detect = 1;
5139*c83a76b0SSuyog Pawar }
5140*c83a76b0SSuyog Pawar }
5141*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i8_frame_acc_coarse_me_cost >
5142*c83a76b0SSuyog Pawar (sad_change_threshold *
5143*c83a76b0SSuyog Pawar ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_pic_coarse_me_cost[rc_pic_type]) &&
5144*c83a76b0SSuyog Pawar (ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_pic_coarse_me_cost[rc_pic_type] >= 0) &&
5145*c83a76b0SSuyog Pawar (!i4_non_simple_repeat_prev_frame_detect))
5146*c83a76b0SSuyog Pawar {
5147*c83a76b0SSuyog Pawar WORD32 one_per_pixel_sad_L1;
5148*c83a76b0SSuyog Pawar /*per pixel sad has to be greater than 1 to avoid repeat frames influence non-I scd detection*/
5149*c83a76b0SSuyog Pawar if((ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width) < 4000000)
5150*c83a76b0SSuyog Pawar {
5151*c83a76b0SSuyog Pawar /*1080*/
5152*c83a76b0SSuyog Pawar one_per_pixel_sad_L1 =
5153*c83a76b0SSuyog Pawar (ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width) >> 2;
5154*c83a76b0SSuyog Pawar }
5155*c83a76b0SSuyog Pawar else
5156*c83a76b0SSuyog Pawar {
5157*c83a76b0SSuyog Pawar /*4k*/
5158*c83a76b0SSuyog Pawar one_per_pixel_sad_L1 =
5159*c83a76b0SSuyog Pawar (ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width) >> 4;
5160*c83a76b0SSuyog Pawar }
5161*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i8_frame_acc_coarse_me_cost > one_per_pixel_sad_L1)
5162*c83a76b0SSuyog Pawar {
5163*c83a76b0SSuyog Pawar {
5164*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_non_I_scd = 1;
5165*c83a76b0SSuyog Pawar }
5166*c83a76b0SSuyog Pawar }
5167*c83a76b0SSuyog Pawar }
5168*c83a76b0SSuyog Pawar
5169*c83a76b0SSuyog Pawar if(rc_pic_type == P_PIC)
5170*c83a76b0SSuyog Pawar {
5171*c83a76b0SSuyog Pawar if(ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_pic_coarse_me_cost[rc_pic_type] < 0)
5172*c83a76b0SSuyog Pawar {
5173*c83a76b0SSuyog Pawar if(ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_I_intra_raw_satd[I_PIC] > 0)
5174*c83a76b0SSuyog Pawar {
5175*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i8_pre_intra_satd >
5176*c83a76b0SSuyog Pawar ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_I_intra_raw_satd[I_PIC] << 1)
5177*c83a76b0SSuyog Pawar {
5178*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_non_I_scd = 1;
5179*c83a76b0SSuyog Pawar }
5180*c83a76b0SSuyog Pawar }
5181*c83a76b0SSuyog Pawar }
5182*c83a76b0SSuyog Pawar }
5183*c83a76b0SSuyog Pawar }
5184*c83a76b0SSuyog Pawar }
5185*c83a76b0SSuyog Pawar
5186*c83a76b0SSuyog Pawar /*remember the previous frame stats*/
5187*c83a76b0SSuyog Pawar ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_I_intra_raw_satd[rc_pic_type] =
5188*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_pre_intra_satd; //ps_rc_lap_out->i8_pre_intra_satd;
5189*c83a76b0SSuyog Pawar ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_pic_coarse_me_cost[rc_pic_type] =
5190*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_frame_acc_coarse_me_cost; //ps_rc_lap_out->i8_frame_acc_coarse_me_sad;
5191*c83a76b0SSuyog Pawar ps_rc_ctxt->s_l1_state_metric.ai8_L1_prev_pic_coarse_me_sad[rc_pic_type] =
5192*c83a76b0SSuyog Pawar ps_rc_lap_out->i8_raw_l1_coarse_me_sad;
5193*c83a76b0SSuyog Pawar }
5194*c83a76b0SSuyog Pawar
5195*c83a76b0SSuyog Pawar /**
5196*c83a76b0SSuyog Pawar ******************************************************************************
5197*c83a76b0SSuyog Pawar *
5198*c83a76b0SSuyog Pawar * @name ihevce_rc_check_is_pre_enc_qp_valid
5199*c83a76b0SSuyog Pawar *
5200*c83a76b0SSuyog Pawar * @par Description checking whether enc thread has updated qp in reverse queue
5201*c83a76b0SSuyog Pawar *
5202*c83a76b0SSuyog Pawar * @param[in] ps_rc_ctxt - pointer to rc context
5203*c83a76b0SSuyog Pawar *
5204*c83a76b0SSuyog Pawar * @return zero on success
5205*c83a76b0SSuyog Pawar *
5206*c83a76b0SSuyog Pawar ******************************************************************************
5207*c83a76b0SSuyog Pawar */
5208*c83a76b0SSuyog Pawar /**only function accessed by encoder without using mutex lock*/
ihevce_rc_check_is_pre_enc_qp_valid(void * pv_rc_ctxt,volatile WORD32 * pi4_force_end_flag)5209*c83a76b0SSuyog Pawar WORD32 ihevce_rc_check_is_pre_enc_qp_valid(void *pv_rc_ctxt, volatile WORD32 *pi4_force_end_flag)
5210*c83a76b0SSuyog Pawar {
5211*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_rc_ctxt;
5212*c83a76b0SSuyog Pawar
5213*c83a76b0SSuyog Pawar volatile WORD32 i4_is_qp_valid;
5214*c83a76b0SSuyog Pawar volatile WORD32 *pi4_is_qp_valid;
5215*c83a76b0SSuyog Pawar
5216*c83a76b0SSuyog Pawar pi4_is_qp_valid =
5217*c83a76b0SSuyog Pawar (volatile WORD32 *)&ps_rc_ctxt->as_pre_enc_qp_queue[ps_rc_ctxt->i4_pre_enc_qp_read_index]
5218*c83a76b0SSuyog Pawar .i4_is_qp_valid;
5219*c83a76b0SSuyog Pawar i4_is_qp_valid = *pi4_is_qp_valid;
5220*c83a76b0SSuyog Pawar
5221*c83a76b0SSuyog Pawar /*Due to stagger between L1 IPE and L0 IPE, towards the end (when encoder is in flush mode) L0 IPE can race ahead of enc
5222*c83a76b0SSuyog Pawar since it will suddenly get stagger between L1 and L0 worth of free buffers. It could try to start L0 even before enc has
5223*c83a76b0SSuyog Pawar populated qp for such frames. qp = -1 is returned in such case which implies encoder should wait for qp to be pop*/
5224*c83a76b0SSuyog Pawar
5225*c83a76b0SSuyog Pawar while(i4_is_qp_valid == -1)
5226*c83a76b0SSuyog Pawar {
5227*c83a76b0SSuyog Pawar /*this rate control call is outside mutex lock to avoid deadlock. If this acquires mutex lock enc will not be able to
5228*c83a76b0SSuyog Pawar populate qp*/
5229*c83a76b0SSuyog Pawar i4_is_qp_valid = *pi4_is_qp_valid;
5230*c83a76b0SSuyog Pawar
5231*c83a76b0SSuyog Pawar if(1 == (*pi4_force_end_flag))
5232*c83a76b0SSuyog Pawar {
5233*c83a76b0SSuyog Pawar *pi4_is_qp_valid = 1;
5234*c83a76b0SSuyog Pawar i4_is_qp_valid = 1;
5235*c83a76b0SSuyog Pawar }
5236*c83a76b0SSuyog Pawar }
5237*c83a76b0SSuyog Pawar return 0;
5238*c83a76b0SSuyog Pawar }
5239*c83a76b0SSuyog Pawar
5240*c83a76b0SSuyog Pawar /*!
5241*c83a76b0SSuyog Pawar ******************************************************************************
5242*c83a76b0SSuyog Pawar * \if Function name : ihevce_compute_temporal_complexity_reset_Kp_Kb
5243*c83a76b0SSuyog Pawar *
5244*c83a76b0SSuyog Pawar * \brief
5245*c83a76b0SSuyog Pawar *
5246*c83a76b0SSuyog Pawar * \param[in] *pv_ctxt -> rc context
5247*c83a76b0SSuyog Pawar *
5248*c83a76b0SSuyog Pawar * \return
5249*c83a76b0SSuyog Pawar *
5250*c83a76b0SSuyog Pawar * \author
5251*c83a76b0SSuyog Pawar * Ittiam
5252*c83a76b0SSuyog Pawar *
5253*c83a76b0SSuyog Pawar *****************************************************************************
5254*c83a76b0SSuyog Pawar */
ihevce_compute_temporal_complexity_reset_Kp_Kb(rc_lap_out_params_t * ps_rc_lap_out,void * pv_rc_ctxt,WORD32 i4_Kp_Kb_reset_flag)5255*c83a76b0SSuyog Pawar void ihevce_compute_temporal_complexity_reset_Kp_Kb(
5256*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_out, void *pv_rc_ctxt, WORD32 i4_Kp_Kb_reset_flag)
5257*c83a76b0SSuyog Pawar {
5258*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_rc_ctxt;
5259*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_cur_rc_lap_out_temporal_offset,
5260*c83a76b0SSuyog Pawar *ps_cur_rc_lap_out_temporal_offset_scd_detect;
5261*c83a76b0SSuyog Pawar picture_type_e curr_rc_pic_type;
5262*c83a76b0SSuyog Pawar LWORD64 i8_total_acc_coarse_me_sad = 0, i8_avg_acc_coarse_me_sad = 0;
5263*c83a76b0SSuyog Pawar WORD8 i1_num_frames_in_Sub_GOP = 0, i = 0, i1_no_reset = 0;
5264*c83a76b0SSuyog Pawar WORD32 i4_inter_frame_interval = rc_get_inter_frame_interval(ps_rc_ctxt->rc_hdl);
5265*c83a76b0SSuyog Pawar WORD32 i4_frame_qp = 0, i4_temp_frame_qp = 0;
5266*c83a76b0SSuyog Pawar WORD32 ai4_offsets[5] = { -3, -2, 2, 6, 7 };
5267*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset = ps_rc_lap_out;
5268*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset_scd_detect = ps_rc_lap_out;
5269*c83a76b0SSuyog Pawar
5270*c83a76b0SSuyog Pawar curr_rc_pic_type = ihevce_rc_conv_pic_type(
5271*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_cur_rc_lap_out_temporal_offset->i4_rc_pic_type,
5272*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
5273*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset->i4_rc_temporal_lyr_id,
5274*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset->i4_is_bottom_field,
5275*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
5276*c83a76b0SSuyog Pawar
5277*c83a76b0SSuyog Pawar if(curr_rc_pic_type == I_PIC)
5278*c83a76b0SSuyog Pawar {
5279*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset_scd_detect =
5280*c83a76b0SSuyog Pawar (rc_lap_out_params_t *)ps_cur_rc_lap_out_temporal_offset->ps_rc_lap_out_next_encode;
5281*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset =
5282*c83a76b0SSuyog Pawar (rc_lap_out_params_t *)ps_cur_rc_lap_out_temporal_offset->ps_rc_lap_out_next_encode;
5283*c83a76b0SSuyog Pawar
5284*c83a76b0SSuyog Pawar if(NULL != ps_cur_rc_lap_out_temporal_offset)
5285*c83a76b0SSuyog Pawar {
5286*c83a76b0SSuyog Pawar curr_rc_pic_type = ihevce_rc_conv_pic_type(
5287*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_cur_rc_lap_out_temporal_offset->i4_rc_pic_type,
5288*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
5289*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset->i4_rc_temporal_lyr_id,
5290*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset->i4_is_bottom_field,
5291*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
5292*c83a76b0SSuyog Pawar }
5293*c83a76b0SSuyog Pawar else
5294*c83a76b0SSuyog Pawar return;
5295*c83a76b0SSuyog Pawar }
5296*c83a76b0SSuyog Pawar
5297*c83a76b0SSuyog Pawar if(ps_cur_rc_lap_out_temporal_offset->i4_L1_qp == -1)
5298*c83a76b0SSuyog Pawar return;
5299*c83a76b0SSuyog Pawar
5300*c83a76b0SSuyog Pawar if(ps_cur_rc_lap_out_temporal_offset->i4_L0_qp == -1)
5301*c83a76b0SSuyog Pawar i4_frame_qp = ps_cur_rc_lap_out_temporal_offset->i4_L1_qp;
5302*c83a76b0SSuyog Pawar else
5303*c83a76b0SSuyog Pawar i4_frame_qp = ps_cur_rc_lap_out_temporal_offset->i4_L0_qp;
5304*c83a76b0SSuyog Pawar
5305*c83a76b0SSuyog Pawar i1_num_frames_in_Sub_GOP = 0;
5306*c83a76b0SSuyog Pawar i = 0;
5307*c83a76b0SSuyog Pawar
5308*c83a76b0SSuyog Pawar i1_no_reset = 0;
5309*c83a76b0SSuyog Pawar do
5310*c83a76b0SSuyog Pawar {
5311*c83a76b0SSuyog Pawar if(ps_cur_rc_lap_out_temporal_offset != NULL)
5312*c83a76b0SSuyog Pawar {
5313*c83a76b0SSuyog Pawar if(curr_rc_pic_type != I_PIC)
5314*c83a76b0SSuyog Pawar i4_temp_frame_qp =
5315*c83a76b0SSuyog Pawar i4_frame_qp + ps_cur_rc_lap_out_temporal_offset->i4_rc_temporal_lyr_id + 1;
5316*c83a76b0SSuyog Pawar
5317*c83a76b0SSuyog Pawar i4_temp_frame_qp += ai4_offsets[curr_rc_pic_type];
5318*c83a76b0SSuyog Pawar i4_temp_frame_qp = CLIP3(i4_temp_frame_qp, 1, 51);
5319*c83a76b0SSuyog Pawar
5320*c83a76b0SSuyog Pawar {
5321*c83a76b0SSuyog Pawar if(curr_rc_pic_type != I_PIC)
5322*c83a76b0SSuyog Pawar {
5323*c83a76b0SSuyog Pawar i8_total_acc_coarse_me_sad +=
5324*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset
5325*c83a76b0SSuyog Pawar ->ai8_frame_acc_coarse_me_sad[i4_temp_frame_qp];
5326*c83a76b0SSuyog Pawar i1_num_frames_in_Sub_GOP++;
5327*c83a76b0SSuyog Pawar i++;
5328*c83a76b0SSuyog Pawar }
5329*c83a76b0SSuyog Pawar else
5330*c83a76b0SSuyog Pawar {
5331*c83a76b0SSuyog Pawar break;
5332*c83a76b0SSuyog Pawar }
5333*c83a76b0SSuyog Pawar }
5334*c83a76b0SSuyog Pawar
5335*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset =
5336*c83a76b0SSuyog Pawar (rc_lap_out_params_t *)ps_cur_rc_lap_out_temporal_offset->ps_rc_lap_out_next_encode;
5337*c83a76b0SSuyog Pawar
5338*c83a76b0SSuyog Pawar if(ps_cur_rc_lap_out_temporal_offset == NULL)
5339*c83a76b0SSuyog Pawar {
5340*c83a76b0SSuyog Pawar break;
5341*c83a76b0SSuyog Pawar }
5342*c83a76b0SSuyog Pawar curr_rc_pic_type = ihevce_rc_conv_pic_type(
5343*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_cur_rc_lap_out_temporal_offset->i4_rc_pic_type,
5344*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
5345*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset->i4_rc_temporal_lyr_id,
5346*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset->i4_is_bottom_field,
5347*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
5348*c83a76b0SSuyog Pawar }
5349*c83a76b0SSuyog Pawar else
5350*c83a76b0SSuyog Pawar {
5351*c83a76b0SSuyog Pawar i1_num_frames_in_Sub_GOP = 0;
5352*c83a76b0SSuyog Pawar break;
5353*c83a76b0SSuyog Pawar }
5354*c83a76b0SSuyog Pawar } while(
5355*c83a76b0SSuyog Pawar ((((curr_rc_pic_type != P_PIC) && ((curr_rc_pic_type != I_PIC))) ||
5356*c83a76b0SSuyog Pawar (curr_rc_pic_type == P_PIC)) &&
5357*c83a76b0SSuyog Pawar (i1_num_frames_in_Sub_GOP < i4_inter_frame_interval)));
5358*c83a76b0SSuyog Pawar
5359*c83a76b0SSuyog Pawar if((i1_num_frames_in_Sub_GOP) && (i1_no_reset == 0))
5360*c83a76b0SSuyog Pawar {
5361*c83a76b0SSuyog Pawar float f_hme_sad_per_pixel;
5362*c83a76b0SSuyog Pawar i8_avg_acc_coarse_me_sad = (i8_total_acc_coarse_me_sad / i1_num_frames_in_Sub_GOP);
5363*c83a76b0SSuyog Pawar f_hme_sad_per_pixel =
5364*c83a76b0SSuyog Pawar ((float)i8_avg_acc_coarse_me_sad /
5365*c83a76b0SSuyog Pawar (ps_rc_ctxt->i4_frame_height * ps_rc_ctxt->i4_frame_width));
5366*c83a76b0SSuyog Pawar f_hme_sad_per_pixel = CLIP3(f_hme_sad_per_pixel, 0.01f, 5.0f);
5367*c83a76b0SSuyog Pawar /*reset the QP offsets for the next sub GOP depending on the offline model based on the temporal complexity */
5368*c83a76b0SSuyog Pawar if(i4_Kp_Kb_reset_flag)
5369*c83a76b0SSuyog Pawar {
5370*c83a76b0SSuyog Pawar WORD32 i4_bin;
5371*c83a76b0SSuyog Pawar
5372*c83a76b0SSuyog Pawar rc_reset_Kp_Kb(
5373*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
5374*c83a76b0SSuyog Pawar 8.00,
5375*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_active_pic_type,
5376*c83a76b0SSuyog Pawar f_hme_sad_per_pixel,
5377*c83a76b0SSuyog Pawar &i4_bin,
5378*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_rc_pass);
5379*c83a76b0SSuyog Pawar }
5380*c83a76b0SSuyog Pawar else
5381*c83a76b0SSuyog Pawar {
5382*c83a76b0SSuyog Pawar rc_ba_get_qp_offset_offline_data(
5383*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
5384*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_offsets,
5385*c83a76b0SSuyog Pawar f_hme_sad_per_pixel,
5386*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_num_active_pic_type,
5387*c83a76b0SSuyog Pawar &ps_rc_lap_out->i4_complexity_bin);
5388*c83a76b0SSuyog Pawar
5389*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset = ps_rc_lap_out;
5390*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset->i4_offsets_set_flag = 1;
5391*c83a76b0SSuyog Pawar
5392*c83a76b0SSuyog Pawar curr_rc_pic_type = ihevce_rc_conv_pic_type(
5393*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_rc_lap_out->i4_rc_pic_type,
5394*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_field_pic,
5395*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_rc_temporal_lyr_id,
5396*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_is_bottom_field,
5397*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_top_field_first);
5398*c83a76b0SSuyog Pawar
5399*c83a76b0SSuyog Pawar if((curr_rc_pic_type == I_PIC) &&
5400*c83a76b0SSuyog Pawar ((rc_lap_out_params_t *)ps_cur_rc_lap_out_temporal_offset->ps_rc_lap_out_next_encode)
5401*c83a76b0SSuyog Pawar ->i4_rc_pic_type == P_PIC)
5402*c83a76b0SSuyog Pawar i1_num_frames_in_Sub_GOP++;
5403*c83a76b0SSuyog Pawar
5404*c83a76b0SSuyog Pawar for(i = 1; i < i1_num_frames_in_Sub_GOP; i++)
5405*c83a76b0SSuyog Pawar {
5406*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset =
5407*c83a76b0SSuyog Pawar (rc_lap_out_params_t *)
5408*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset->ps_rc_lap_out_next_encode;
5409*c83a76b0SSuyog Pawar memmove(
5410*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset->ai4_offsets,
5411*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_offsets,
5412*c83a76b0SSuyog Pawar sizeof(WORD32) * 5);
5413*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset->i4_complexity_bin =
5414*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_complexity_bin;
5415*c83a76b0SSuyog Pawar ps_cur_rc_lap_out_temporal_offset->i4_offsets_set_flag = 1;
5416*c83a76b0SSuyog Pawar }
5417*c83a76b0SSuyog Pawar }
5418*c83a76b0SSuyog Pawar }
5419*c83a76b0SSuyog Pawar }
5420*c83a76b0SSuyog Pawar
5421*c83a76b0SSuyog Pawar /**
5422*c83a76b0SSuyog Pawar ******************************************************************************
5423*c83a76b0SSuyog Pawar *
5424*c83a76b0SSuyog Pawar * @brief function to get delta QP or In frame RC bits estimate to avoid buffer underflow
5425*c83a76b0SSuyog Pawar *
5426*c83a76b0SSuyog Pawar * @par Description
5427*c83a76b0SSuyog Pawar * @param[in]
5428*c83a76b0SSuyog Pawar ******************************************************************************
5429*c83a76b0SSuyog Pawar */
5430*c83a76b0SSuyog Pawar
ihevce_ebf_based_rc_correction_to_avoid_overflow(rc_context_t * ps_rc_ctxt,rc_lap_out_params_t * ps_rc_lap_out,WORD32 * pi4_tot_bits_estimated)5431*c83a76b0SSuyog Pawar WORD32 ihevce_ebf_based_rc_correction_to_avoid_overflow(
5432*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt, rc_lap_out_params_t *ps_rc_lap_out, WORD32 *pi4_tot_bits_estimated)
5433*c83a76b0SSuyog Pawar {
5434*c83a76b0SSuyog Pawar WORD32 i4_modelQP, i4_clipQP, i4_maxEbfQP, i4_diffQP, i4_is_model_valid, i4_deltaQP = 0;
5435*c83a76b0SSuyog Pawar LWORD64 i8_bitsClipQP, i8_grwEbf; // i8_bitsComp;
5436*c83a76b0SSuyog Pawar WORD32 i4_is_offline_model_used;
5437*c83a76b0SSuyog Pawar WORD32 i4_vbv_buffer_size, i4_drain_rate, i4_currEbf, i4_maxEbf;
5438*c83a76b0SSuyog Pawar WORD32 i4_case = -1;
5439*c83a76b0SSuyog Pawar float f_thrsh_i_pic_delta_qp_1, f_thrsh_i_pic_delta_qp_2, f_thrsh_p_pic_delta_qp_1,
5440*c83a76b0SSuyog Pawar f_thrsh_p_pic_delta_qp_2;
5441*c83a76b0SSuyog Pawar float f_thrsh_br_pic_delta_qp_1, f_thrsh_br_pic_delta_qp_2, f_thrsh_bnr_pic_delta_qp_1,
5442*c83a76b0SSuyog Pawar f_thrsh_bnr_pic_delta_qp_2;
5443*c83a76b0SSuyog Pawar float f_vbv_thrsh_delta_qp;
5444*c83a76b0SSuyog Pawar
5445*c83a76b0SSuyog Pawar /*initialization of all the variables*/
5446*c83a76b0SSuyog Pawar rc_init_buffer_info(
5447*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl, &i4_vbv_buffer_size, &i4_currEbf, &i4_maxEbf, &i4_drain_rate);
5448*c83a76b0SSuyog Pawar
5449*c83a76b0SSuyog Pawar i4_is_model_valid = ps_rc_lap_out->i4_is_model_valid;
5450*c83a76b0SSuyog Pawar i4_modelQP = ps_rc_ctxt->s_rc_high_lvl_stat.i4_modelQP;
5451*c83a76b0SSuyog Pawar i4_clipQP = ps_rc_ctxt->s_rc_high_lvl_stat.i4_finalQP;
5452*c83a76b0SSuyog Pawar i4_maxEbfQP = ps_rc_ctxt->s_rc_high_lvl_stat.i4_maxEbfQP;
5453*c83a76b0SSuyog Pawar i8_bitsClipQP = ps_rc_ctxt->s_rc_high_lvl_stat.i8_bits_from_finalQP;
5454*c83a76b0SSuyog Pawar i4_is_offline_model_used = ps_rc_ctxt->s_rc_high_lvl_stat.i4_is_offline_model_used;
5455*c83a76b0SSuyog Pawar ASSERT(i4_clipQP != INVALID_QP);
5456*c83a76b0SSuyog Pawar
5457*c83a76b0SSuyog Pawar if(ps_rc_ctxt->i4_num_frame_parallel > 1)
5458*c83a76b0SSuyog Pawar {
5459*c83a76b0SSuyog Pawar f_thrsh_i_pic_delta_qp_1 = (float)VBV_THRSH_FRM_PRLL_I_PIC_DELTA_QP_1;
5460*c83a76b0SSuyog Pawar f_thrsh_i_pic_delta_qp_2 = (float)VBV_THRSH_FRM_PRLL_I_PIC_DELTA_QP_2;
5461*c83a76b0SSuyog Pawar f_thrsh_p_pic_delta_qp_1 = (float)VBV_THRSH_FRM_PRLL_P_PIC_DELTA_QP_1;
5462*c83a76b0SSuyog Pawar f_thrsh_p_pic_delta_qp_2 = (float)VBV_THRSH_FRM_PRLL_P_PIC_DELTA_QP_2;
5463*c83a76b0SSuyog Pawar f_thrsh_br_pic_delta_qp_1 = (float)VBV_THRSH_FRM_PRLL_BR_PIC_DELTA_QP_1;
5464*c83a76b0SSuyog Pawar f_thrsh_br_pic_delta_qp_2 = (float)VBV_THRSH_FRM_PRLL_BR_PIC_DELTA_QP_2;
5465*c83a76b0SSuyog Pawar f_thrsh_bnr_pic_delta_qp_1 = (float)VBV_THRSH_FRM_PRLL_BNR_PIC_DELTA_QP_1;
5466*c83a76b0SSuyog Pawar f_thrsh_bnr_pic_delta_qp_2 = (float)VBV_THRSH_FRM_PRLL_BNR_PIC_DELTA_QP_2;
5467*c83a76b0SSuyog Pawar f_vbv_thrsh_delta_qp = (float)VBV_THRSH_FRM_PRLL_DELTA_QP;
5468*c83a76b0SSuyog Pawar }
5469*c83a76b0SSuyog Pawar else
5470*c83a76b0SSuyog Pawar {
5471*c83a76b0SSuyog Pawar f_thrsh_i_pic_delta_qp_1 = (float)VBV_THRSH_I_PIC_DELTA_QP_1;
5472*c83a76b0SSuyog Pawar f_thrsh_i_pic_delta_qp_2 = (float)VBV_THRSH_I_PIC_DELTA_QP_2;
5473*c83a76b0SSuyog Pawar f_thrsh_p_pic_delta_qp_1 = (float)VBV_THRSH_P_PIC_DELTA_QP_1;
5474*c83a76b0SSuyog Pawar f_thrsh_p_pic_delta_qp_2 = (float)VBV_THRSH_P_PIC_DELTA_QP_2;
5475*c83a76b0SSuyog Pawar f_thrsh_br_pic_delta_qp_1 = (float)VBV_THRSH_BR_PIC_DELTA_QP_1;
5476*c83a76b0SSuyog Pawar f_thrsh_br_pic_delta_qp_2 = (float)VBV_THRSH_BR_PIC_DELTA_QP_2;
5477*c83a76b0SSuyog Pawar f_thrsh_bnr_pic_delta_qp_1 = (float)VBV_THRSH_BNR_PIC_DELTA_QP_1;
5478*c83a76b0SSuyog Pawar f_thrsh_bnr_pic_delta_qp_2 = (float)VBV_THRSH_BNR_PIC_DELTA_QP_2;
5479*c83a76b0SSuyog Pawar f_vbv_thrsh_delta_qp = (float)VBV_THRSH_DELTA_QP;
5480*c83a76b0SSuyog Pawar }
5481*c83a76b0SSuyog Pawar
5482*c83a76b0SSuyog Pawar /* function logic starts */
5483*c83a76b0SSuyog Pawar if(i4_is_model_valid)
5484*c83a76b0SSuyog Pawar {
5485*c83a76b0SSuyog Pawar ASSERT(i4_modelQP != INVALID_QP);
5486*c83a76b0SSuyog Pawar i8_grwEbf = i8_bitsClipQP - (LWORD64)i4_drain_rate;
5487*c83a76b0SSuyog Pawar if(((i4_currEbf + i8_grwEbf) > (0.6*i4_vbv_buffer_size)) /*&&
5488*c83a76b0SSuyog Pawar i4_modelQP >= i4_clipQP*/)
5489*c83a76b0SSuyog Pawar {
5490*c83a76b0SSuyog Pawar /* part of existing scene (i.e. no new scene)
5491*c83a76b0SSuyog Pawar In which case this is not first I/P/Bref/Bnref etc
5492*c83a76b0SSuyog Pawar The models for I/P/Bref/Bnref are all valid*/
5493*c83a76b0SSuyog Pawar if(((i4_currEbf + i8_grwEbf) <
5494*c83a76b0SSuyog Pawar i4_maxEbf)) /* does not matter whether this is 2pass, 1 pass, VBR, CBR etc*/
5495*c83a76b0SSuyog Pawar {
5496*c83a76b0SSuyog Pawar /* clipQP has been determined keeping in view certain other quality constraints like pusling etc.
5497*c83a76b0SSuyog Pawar So better to honour it if possible*/
5498*c83a76b0SSuyog Pawar //if (i8_bitsClipQP > i8_drain_rate)
5499*c83a76b0SSuyog Pawar {
5500*c83a76b0SSuyog Pawar LWORD64 i8_thrsh_for_deltaQP_2 = i4_vbv_buffer_size,
5501*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_1 = i4_vbv_buffer_size;
5502*c83a76b0SSuyog Pawar /*even when (modelQP - clipQP) = 0, we intend to QP increase as expected ebf is above 60%*/
5503*c83a76b0SSuyog Pawar i4_diffQP = MAX(i4_modelQP - i4_clipQP, 1);
5504*c83a76b0SSuyog Pawar switch(ps_rc_lap_out->i4_rc_pic_type)
5505*c83a76b0SSuyog Pawar {
5506*c83a76b0SSuyog Pawar case IV_I_FRAME:
5507*c83a76b0SSuyog Pawar case IV_IDR_FRAME:
5508*c83a76b0SSuyog Pawar {
5509*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_1 =
5510*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_i_pic_delta_qp_1 * i4_vbv_buffer_size);
5511*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_2 =
5512*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_i_pic_delta_qp_2 * i4_vbv_buffer_size);
5513*c83a76b0SSuyog Pawar break;
5514*c83a76b0SSuyog Pawar }
5515*c83a76b0SSuyog Pawar case IV_P_FRAME:
5516*c83a76b0SSuyog Pawar {
5517*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_1 =
5518*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_p_pic_delta_qp_1 * i4_vbv_buffer_size);
5519*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_2 =
5520*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_p_pic_delta_qp_2 * i4_vbv_buffer_size);
5521*c83a76b0SSuyog Pawar break;
5522*c83a76b0SSuyog Pawar }
5523*c83a76b0SSuyog Pawar case IV_B_FRAME:
5524*c83a76b0SSuyog Pawar {
5525*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_rc_is_ref_pic)
5526*c83a76b0SSuyog Pawar {
5527*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_1 =
5528*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_br_pic_delta_qp_1 * i4_vbv_buffer_size);
5529*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_2 =
5530*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_br_pic_delta_qp_2 * i4_vbv_buffer_size);
5531*c83a76b0SSuyog Pawar }
5532*c83a76b0SSuyog Pawar else
5533*c83a76b0SSuyog Pawar {
5534*c83a76b0SSuyog Pawar /*as of now using the same thresholds as B reference, later may have to tune if required*/
5535*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_1 =
5536*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_bnr_pic_delta_qp_1 * i4_vbv_buffer_size);
5537*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_2 =
5538*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_bnr_pic_delta_qp_2 * i4_vbv_buffer_size);
5539*c83a76b0SSuyog Pawar }
5540*c83a76b0SSuyog Pawar break;
5541*c83a76b0SSuyog Pawar }
5542*c83a76b0SSuyog Pawar default:
5543*c83a76b0SSuyog Pawar break;
5544*c83a76b0SSuyog Pawar }
5545*c83a76b0SSuyog Pawar
5546*c83a76b0SSuyog Pawar if((i4_currEbf + i8_grwEbf) > i8_thrsh_for_deltaQP_1)
5547*c83a76b0SSuyog Pawar {
5548*c83a76b0SSuyog Pawar /*For more than 2 QP chnage this means a larger scale issue and probably needs to be handled elsewhere ?*/
5549*c83a76b0SSuyog Pawar i4_deltaQP =
5550*c83a76b0SSuyog Pawar MIN(2, i4_diffQP); /* we dont intend to change QP by more than 2 */
5551*c83a76b0SSuyog Pawar i4_case = 0;
5552*c83a76b0SSuyog Pawar }
5553*c83a76b0SSuyog Pawar else if((i4_currEbf + i8_grwEbf) > i8_thrsh_for_deltaQP_2)
5554*c83a76b0SSuyog Pawar {
5555*c83a76b0SSuyog Pawar i4_deltaQP = MIN(1, i4_diffQP);
5556*c83a76b0SSuyog Pawar i4_case = 1;
5557*c83a76b0SSuyog Pawar }
5558*c83a76b0SSuyog Pawar }
5559*c83a76b0SSuyog Pawar /* else if (i8_bitsClipQP > i8_drain_rate)
5560*c83a76b0SSuyog Pawar {
5561*c83a76b0SSuyog Pawar we have no correection, buffer will be healthy after this.
5562*c83a76b0SSuyog Pawar However, there could be one problem if the currEbf is already close to say 80% of EBF.
5563*c83a76b0SSuyog Pawar This means we have not reacted well early - needs to be handled?
5564*c83a76b0SSuyog Pawar
5565*c83a76b0SSuyog Pawar This could be the case where it is a simple scene immediately following a complex scene
5566*c83a76b0SSuyog Pawar and is the I picture (not the first I since model is valid).
5567*c83a76b0SSuyog Pawar Is this possible - maybe, what to do - dont know?
5568*c83a76b0SSuyog Pawar }
5569*c83a76b0SSuyog Pawar */
5570*c83a76b0SSuyog Pawar }
5571*c83a76b0SSuyog Pawar else /*(i4_clipQP < i4_maxEbfQP)*/
5572*c83a76b0SSuyog Pawar {
5573*c83a76b0SSuyog Pawar i4_deltaQP = 2;
5574*c83a76b0SSuyog Pawar i4_case = 2;
5575*c83a76b0SSuyog Pawar }
5576*c83a76b0SSuyog Pawar }
5577*c83a76b0SSuyog Pawar if((i4_currEbf + i8_grwEbf) < (0.6 * i4_vbv_buffer_size))
5578*c83a76b0SSuyog Pawar {
5579*c83a76b0SSuyog Pawar *pi4_tot_bits_estimated = i8_bitsClipQP;
5580*c83a76b0SSuyog Pawar }
5581*c83a76b0SSuyog Pawar }
5582*c83a76b0SSuyog Pawar else
5583*c83a76b0SSuyog Pawar {
5584*c83a76b0SSuyog Pawar if(i4_is_offline_model_used)
5585*c83a76b0SSuyog Pawar {
5586*c83a76b0SSuyog Pawar /* this can be only for non-I SCD, where we reset RC */
5587*c83a76b0SSuyog Pawar WORD32 i4_bits_est_for_in_frm_rc = *pi4_tot_bits_estimated;
5588*c83a76b0SSuyog Pawar i8_grwEbf = i4_bits_est_for_in_frm_rc - i4_drain_rate;
5589*c83a76b0SSuyog Pawar if((i4_currEbf + i8_grwEbf) > (f_vbv_thrsh_delta_qp * i4_vbv_buffer_size))
5590*c83a76b0SSuyog Pawar {
5591*c83a76b0SSuyog Pawar i4_bits_est_for_in_frm_rc =
5592*c83a76b0SSuyog Pawar i4_drain_rate + (WORD32)(0.85 * i4_vbv_buffer_size) - i4_currEbf;
5593*c83a76b0SSuyog Pawar /* if pi4_tot_bits_estimated becomes less than zero or less than drain rate this indiactes that we are near or above 85% of the buffer */
5594*c83a76b0SSuyog Pawar /* this needs a reaction */
5595*c83a76b0SSuyog Pawar if(i4_bits_est_for_in_frm_rc < i4_drain_rate)
5596*c83a76b0SSuyog Pawar {
5597*c83a76b0SSuyog Pawar *pi4_tot_bits_estimated =
5598*c83a76b0SSuyog Pawar MAX((i4_drain_rate + (WORD32)(0.95 * i4_vbv_buffer_size) - i4_currEbf),
5599*c83a76b0SSuyog Pawar i4_drain_rate);
5600*c83a76b0SSuyog Pawar i4_deltaQP = 2; /* this needs some review, needs to be handled well */
5601*c83a76b0SSuyog Pawar }
5602*c83a76b0SSuyog Pawar }
5603*c83a76b0SSuyog Pawar i4_case = 3;
5604*c83a76b0SSuyog Pawar }
5605*c83a76b0SSuyog Pawar else
5606*c83a76b0SSuyog Pawar {
5607*c83a76b0SSuyog Pawar i8_bitsClipQP = *pi4_tot_bits_estimated;
5608*c83a76b0SSuyog Pawar i8_grwEbf = i8_bitsClipQP - i4_drain_rate;
5609*c83a76b0SSuyog Pawar
5610*c83a76b0SSuyog Pawar if(((i4_currEbf + i8_grwEbf) <
5611*c83a76b0SSuyog Pawar i4_maxEbf)) /* does not matter whether this is 2pass, 1 pass, VBR, CBR etc*/
5612*c83a76b0SSuyog Pawar {
5613*c83a76b0SSuyog Pawar /* clipQP has been determined keeping in view certain other quality constraints like pusling etc.
5614*c83a76b0SSuyog Pawar So better to honour it if possible*/
5615*c83a76b0SSuyog Pawar //if (i8_bitsClipQP > i8_drain_rate)
5616*c83a76b0SSuyog Pawar {
5617*c83a76b0SSuyog Pawar LWORD64 i8_thrsh_for_deltaQP_2 = i4_vbv_buffer_size,
5618*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_1 = i4_vbv_buffer_size;
5619*c83a76b0SSuyog Pawar
5620*c83a76b0SSuyog Pawar switch(ps_rc_lap_out->i4_rc_pic_type)
5621*c83a76b0SSuyog Pawar {
5622*c83a76b0SSuyog Pawar case IV_I_FRAME:
5623*c83a76b0SSuyog Pawar case IV_IDR_FRAME:
5624*c83a76b0SSuyog Pawar {
5625*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_1 =
5626*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_i_pic_delta_qp_1 * i4_vbv_buffer_size);
5627*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_2 =
5628*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_i_pic_delta_qp_2 * i4_vbv_buffer_size);
5629*c83a76b0SSuyog Pawar break;
5630*c83a76b0SSuyog Pawar }
5631*c83a76b0SSuyog Pawar case IV_P_FRAME:
5632*c83a76b0SSuyog Pawar {
5633*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_1 =
5634*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_p_pic_delta_qp_1 * i4_vbv_buffer_size);
5635*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_2 =
5636*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_p_pic_delta_qp_2 * i4_vbv_buffer_size);
5637*c83a76b0SSuyog Pawar break;
5638*c83a76b0SSuyog Pawar }
5639*c83a76b0SSuyog Pawar case IV_B_FRAME:
5640*c83a76b0SSuyog Pawar {
5641*c83a76b0SSuyog Pawar if(ps_rc_lap_out->i4_rc_is_ref_pic)
5642*c83a76b0SSuyog Pawar {
5643*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_1 =
5644*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_br_pic_delta_qp_1 * i4_vbv_buffer_size);
5645*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_2 =
5646*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_br_pic_delta_qp_2 * i4_vbv_buffer_size);
5647*c83a76b0SSuyog Pawar }
5648*c83a76b0SSuyog Pawar else
5649*c83a76b0SSuyog Pawar {
5650*c83a76b0SSuyog Pawar /*as of now using the same thresholds as B reference, later may have to tune if required*/
5651*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_1 =
5652*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_bnr_pic_delta_qp_1 * i4_vbv_buffer_size);
5653*c83a76b0SSuyog Pawar i8_thrsh_for_deltaQP_2 =
5654*c83a76b0SSuyog Pawar (LWORD64)(f_thrsh_bnr_pic_delta_qp_2 * i4_vbv_buffer_size);
5655*c83a76b0SSuyog Pawar }
5656*c83a76b0SSuyog Pawar break;
5657*c83a76b0SSuyog Pawar }
5658*c83a76b0SSuyog Pawar default:
5659*c83a76b0SSuyog Pawar break;
5660*c83a76b0SSuyog Pawar }
5661*c83a76b0SSuyog Pawar
5662*c83a76b0SSuyog Pawar if((i4_currEbf + i8_grwEbf) > i8_thrsh_for_deltaQP_1)
5663*c83a76b0SSuyog Pawar {
5664*c83a76b0SSuyog Pawar /*For more than 2 QP chnage this means a larger scale issue and probably needs to be handled elsewhere ?*/
5665*c83a76b0SSuyog Pawar i4_deltaQP = 2; /* we dont intend to change QP by more than 2 */
5666*c83a76b0SSuyog Pawar i4_case = 5;
5667*c83a76b0SSuyog Pawar }
5668*c83a76b0SSuyog Pawar else if((i4_currEbf + i8_grwEbf) > i8_thrsh_for_deltaQP_2)
5669*c83a76b0SSuyog Pawar {
5670*c83a76b0SSuyog Pawar i4_deltaQP = 1;
5671*c83a76b0SSuyog Pawar i4_case = 6;
5672*c83a76b0SSuyog Pawar }
5673*c83a76b0SSuyog Pawar }
5674*c83a76b0SSuyog Pawar }
5675*c83a76b0SSuyog Pawar else
5676*c83a76b0SSuyog Pawar {
5677*c83a76b0SSuyog Pawar i4_deltaQP = 2;
5678*c83a76b0SSuyog Pawar i4_case = 7;
5679*c83a76b0SSuyog Pawar }
5680*c83a76b0SSuyog Pawar }
5681*c83a76b0SSuyog Pawar }
5682*c83a76b0SSuyog Pawar return i4_deltaQP;
5683*c83a76b0SSuyog Pawar }
5684*c83a76b0SSuyog Pawar
5685*c83a76b0SSuyog Pawar /*###############################################*/
5686*c83a76b0SSuyog Pawar /******* END OF RC UTILS FUNCTIONS ***************/
5687*c83a76b0SSuyog Pawar /*###############################################*/
5688*c83a76b0SSuyog Pawar
5689*c83a76b0SSuyog Pawar /*########################################################*/
5690*c83a76b0SSuyog Pawar /******* START OF VBV COMPLIANCE FUNCTIONS ***************/
5691*c83a76b0SSuyog Pawar /*#######################################################*/
5692*c83a76b0SSuyog Pawar
5693*c83a76b0SSuyog Pawar /*!
5694*c83a76b0SSuyog Pawar ******************************************************************************
5695*c83a76b0SSuyog Pawar * \if Function name : ihevce_vbv_compliance_frame_level_update
5696*c83a76b0SSuyog Pawar *
5697*c83a76b0SSuyog Pawar * \brief
5698*c83a76b0SSuyog Pawar * this function initializes the hrd buffer level to be used for vbv compliance testing using the parameters feeded in VUI parameters
5699*c83a76b0SSuyog Pawar *
5700*c83a76b0SSuyog Pawar * \param[in] *pv_ctxt -> rc context
5701*c83a76b0SSuyog Pawar * i4_bits_generated -> bits generated from entropy
5702*c83a76b0SSuyog Pawar * i4_resolution_id -> info needed for log Dump
5703*c83a76b0SSuyog Pawar * i4_appln_bitrate_inst -> info needed for log Dump
5704*c83a76b0SSuyog Pawar * u4_cur_cpb_removal_delay_minus1 -> cbp removal delay of present frame
5705*c83a76b0SSuyog Pawar * \return
5706*c83a76b0SSuyog Pawar *
5707*c83a76b0SSuyog Pawar * \author
5708*c83a76b0SSuyog Pawar * Ittiam
5709*c83a76b0SSuyog Pawar *
5710*c83a76b0SSuyog Pawar *****************************************************************************
5711*c83a76b0SSuyog Pawar */
5712*c83a76b0SSuyog Pawar
ihevce_vbv_compliance_frame_level_update(void * pv_rc_ctxt,WORD32 i4_bits_generated,WORD32 i4_resolution_id,WORD32 i4_appln_bitrate_inst,UWORD32 u4_cur_cpb_removal_delay_minus1)5713*c83a76b0SSuyog Pawar void ihevce_vbv_compliance_frame_level_update(
5714*c83a76b0SSuyog Pawar void *pv_rc_ctxt,
5715*c83a76b0SSuyog Pawar WORD32 i4_bits_generated,
5716*c83a76b0SSuyog Pawar WORD32 i4_resolution_id,
5717*c83a76b0SSuyog Pawar WORD32 i4_appln_bitrate_inst,
5718*c83a76b0SSuyog Pawar UWORD32 u4_cur_cpb_removal_delay_minus1)
5719*c83a76b0SSuyog Pawar {
5720*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_rc_ctxt;
5721*c83a76b0SSuyog Pawar float f_max_vbv_buff_size = (float)ps_rc_ctxt->s_vbv_compliance.f_buffer_size;
5722*c83a76b0SSuyog Pawar WORD32 i4_cbp_removal_delay_diff = 1;
5723*c83a76b0SSuyog Pawar
5724*c83a76b0SSuyog Pawar if((ps_rc_ctxt->s_vbv_compliance.u4_prev_cpb_removal_delay_minus1 > 0) &&
5725*c83a76b0SSuyog Pawar (u4_cur_cpb_removal_delay_minus1 >
5726*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.u4_prev_cpb_removal_delay_minus1))
5727*c83a76b0SSuyog Pawar i4_cbp_removal_delay_diff =
5728*c83a76b0SSuyog Pawar (u4_cur_cpb_removal_delay_minus1 -
5729*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.u4_prev_cpb_removal_delay_minus1);
5730*c83a76b0SSuyog Pawar
5731*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level =
5732*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level - (float)i4_bits_generated +
5733*c83a76b0SSuyog Pawar (i4_cbp_removal_delay_diff * ps_rc_ctxt->s_vbv_compliance.f_drain_rate);
5734*c83a76b0SSuyog Pawar
5735*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level_unclip =
5736*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level;
5737*c83a76b0SSuyog Pawar
5738*c83a76b0SSuyog Pawar if(ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level < 0)
5739*c83a76b0SSuyog Pawar {
5740*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level = 0;
5741*c83a76b0SSuyog Pawar }
5742*c83a76b0SSuyog Pawar
5743*c83a76b0SSuyog Pawar if(ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level >
5744*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_buffer_size)
5745*c83a76b0SSuyog Pawar {
5746*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level =
5747*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_buffer_size;
5748*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level_unclip -=
5749*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_buffer_size;
5750*c83a76b0SSuyog Pawar }
5751*c83a76b0SSuyog Pawar else if(ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level_unclip > 0)
5752*c83a76b0SSuyog Pawar {
5753*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level_unclip = 0;
5754*c83a76b0SSuyog Pawar }
5755*c83a76b0SSuyog Pawar
5756*c83a76b0SSuyog Pawar if(ps_rc_ctxt->e_rate_control_type == VBR_STREAMING)
5757*c83a76b0SSuyog Pawar {
5758*c83a76b0SSuyog Pawar if(ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level_unclip > 0)
5759*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level_unclip = 0;
5760*c83a76b0SSuyog Pawar }
5761*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.u4_prev_cpb_removal_delay_minus1 = u4_cur_cpb_removal_delay_minus1;
5762*c83a76b0SSuyog Pawar }
5763*c83a76b0SSuyog Pawar
5764*c83a76b0SSuyog Pawar /*!
5765*c83a76b0SSuyog Pawar ******************************************************************************
5766*c83a76b0SSuyog Pawar * \if Function name : ihevce_vbv_complaince_init_level
5767*c83a76b0SSuyog Pawar *
5768*c83a76b0SSuyog Pawar * \brief
5769*c83a76b0SSuyog Pawar * this function initializes the hrd buffer level to be used for vbv compliance testing using the parameters feeded in VUI parameters
5770*c83a76b0SSuyog Pawar *
5771*c83a76b0SSuyog Pawar * \param[in] *pv_ctxt -> rc context
5772*c83a76b0SSuyog Pawar * *ps_vui -> VUI parameters
5773*c83a76b0SSuyog Pawar * \return
5774*c83a76b0SSuyog Pawar *
5775*c83a76b0SSuyog Pawar * \author
5776*c83a76b0SSuyog Pawar * Ittiam
5777*c83a76b0SSuyog Pawar *
5778*c83a76b0SSuyog Pawar *****************************************************************************
5779*c83a76b0SSuyog Pawar */
5780*c83a76b0SSuyog Pawar
ihevce_vbv_complaince_init_level(void * pv_ctxt,vui_t * ps_vui)5781*c83a76b0SSuyog Pawar void ihevce_vbv_complaince_init_level(void *pv_ctxt, vui_t *ps_vui)
5782*c83a76b0SSuyog Pawar {
5783*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
5784*c83a76b0SSuyog Pawar
5785*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_frame_rate =
5786*c83a76b0SSuyog Pawar (float)((float)ps_vui->u4_vui_time_scale / ps_vui->u4_vui_num_units_in_tick); //rc_get_frame_rate(ps_rc_ctxt->rc_hdl);
5787*c83a76b0SSuyog Pawar
5788*c83a76b0SSuyog Pawar if(1 == ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag)
5789*c83a76b0SSuyog Pawar {
5790*c83a76b0SSuyog Pawar ASSERT(1 == ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag);
5791*c83a76b0SSuyog Pawar
5792*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_bit_rate = (float)((
5793*c83a76b0SSuyog Pawar (ps_vui->s_vui_hrd_parameters.as_sub_layer_hrd_params[0].au4_bit_rate_du_value_minus1[0] +
5794*c83a76b0SSuyog Pawar 1)
5795*c83a76b0SSuyog Pawar << (6 + ps_vui->s_vui_hrd_parameters
5796*c83a76b0SSuyog Pawar .u4_bit_rate_scale))); //rc_get_bit_rate(ps_rc_ctxt->rc_hdl);
5797*c83a76b0SSuyog Pawar
5798*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_buffer_size = (float)((
5799*c83a76b0SSuyog Pawar (ps_vui->s_vui_hrd_parameters.as_sub_layer_hrd_params[0].au4_cpb_size_du_value_minus1[0] +
5800*c83a76b0SSuyog Pawar 1)
5801*c83a76b0SSuyog Pawar << (4 + ps_vui->s_vui_hrd_parameters
5802*c83a76b0SSuyog Pawar .u4_cpb_size_du_scale))); //ps_rc_ctxt->u4_max_vbv_buff_size;
5803*c83a76b0SSuyog Pawar }
5804*c83a76b0SSuyog Pawar else
5805*c83a76b0SSuyog Pawar {
5806*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_bit_rate = (float)((
5807*c83a76b0SSuyog Pawar (ps_vui->s_vui_hrd_parameters.as_sub_layer_hrd_params[0].au4_bit_rate_value_minus1[0] +
5808*c83a76b0SSuyog Pawar 1)
5809*c83a76b0SSuyog Pawar << (6 + ps_vui->s_vui_hrd_parameters
5810*c83a76b0SSuyog Pawar .u4_bit_rate_scale))); //rc_get_bit_rate(ps_rc_ctxt->rc_hdl);
5811*c83a76b0SSuyog Pawar
5812*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_buffer_size = (float)((
5813*c83a76b0SSuyog Pawar (ps_vui->s_vui_hrd_parameters.as_sub_layer_hrd_params[0].au4_cpb_size_value_minus1[0] +
5814*c83a76b0SSuyog Pawar 1)
5815*c83a76b0SSuyog Pawar << (4 + ps_vui->s_vui_hrd_parameters
5816*c83a76b0SSuyog Pawar .u4_cpb_size_scale))); //ps_rc_ctxt->u4_max_vbv_buff_size;
5817*c83a76b0SSuyog Pawar }
5818*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level =
5819*c83a76b0SSuyog Pawar (float)ps_rc_ctxt->s_vbv_compliance.f_buffer_size; //ps_rc_ctxt->u4_max_vbv_buff_size;
5820*c83a76b0SSuyog Pawar
5821*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_drain_rate =
5822*c83a76b0SSuyog Pawar ((ps_rc_ctxt->s_vbv_compliance.f_bit_rate) / ps_rc_ctxt->s_vbv_compliance.f_frame_rate);
5823*c83a76b0SSuyog Pawar
5824*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.u4_prev_cpb_removal_delay_minus1 = 0;
5825*c83a76b0SSuyog Pawar }
5826*c83a76b0SSuyog Pawar
5827*c83a76b0SSuyog Pawar /*########################################################*/
5828*c83a76b0SSuyog Pawar /******* END OF VBV COMPLIANCE FUNCTIONS *****************/
5829*c83a76b0SSuyog Pawar /*#######################################################*/
5830*c83a76b0SSuyog Pawar
5831*c83a76b0SSuyog Pawar /*################################################################*/
5832*c83a76b0SSuyog Pawar /******* START OF DYN CHANGE iN BITRATE FUNCTIONS *****************/
5833*c83a76b0SSuyog Pawar /*################################################################*/
5834*c83a76b0SSuyog Pawar /*!
5835*c83a76b0SSuyog Pawar ******************************************************************************
5836*c83a76b0SSuyog Pawar * \if Function name : change_bitrate_vbv_complaince
5837*c83a76b0SSuyog Pawar *
5838*c83a76b0SSuyog Pawar * \brief
5839*c83a76b0SSuyog Pawar * this function updates the new bitrate and re calculates the drain rate
5840*c83a76b0SSuyog Pawar *
5841*c83a76b0SSuyog Pawar * \param[in] *pv_ctxt -> rc context
5842*c83a76b0SSuyog Pawar * \return
5843*c83a76b0SSuyog Pawar *
5844*c83a76b0SSuyog Pawar * \author
5845*c83a76b0SSuyog Pawar * Ittiam
5846*c83a76b0SSuyog Pawar *
5847*c83a76b0SSuyog Pawar *****************************************************************************
5848*c83a76b0SSuyog Pawar */
change_bitrate_vbv_complaince(void * pv_ctxt,LWORD64 i8_new_bitrate,LWORD64 i8_buffer_size)5849*c83a76b0SSuyog Pawar void change_bitrate_vbv_complaince(void *pv_ctxt, LWORD64 i8_new_bitrate, LWORD64 i8_buffer_size)
5850*c83a76b0SSuyog Pawar {
5851*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
5852*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_buffer_size = (float)i8_buffer_size;
5853*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_bit_rate = (float)i8_new_bitrate;
5854*c83a76b0SSuyog Pawar if(ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level > i8_buffer_size)
5855*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_curr_buffer_level = (float)i8_buffer_size;
5856*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_drain_rate =
5857*c83a76b0SSuyog Pawar ps_rc_ctxt->s_vbv_compliance.f_bit_rate / ps_rc_ctxt->s_vbv_compliance.f_frame_rate;
5858*c83a76b0SSuyog Pawar }
5859*c83a76b0SSuyog Pawar /*!
5860*c83a76b0SSuyog Pawar ******************************************************************************
5861*c83a76b0SSuyog Pawar * \if Function name : ihevce_rc_register_dyn_change_bitrate
5862*c83a76b0SSuyog Pawar *
5863*c83a76b0SSuyog Pawar * \brief
5864*c83a76b0SSuyog Pawar * this function registers call to change bitrate dynamically.
5865*c83a76b0SSuyog Pawar *
5866*c83a76b0SSuyog Pawar * \param[in] *pv_ctxt -> rc context
5867*c83a76b0SSuyog Pawar *
5868*c83a76b0SSuyog Pawar * \return
5869*c83a76b0SSuyog Pawar *
5870*c83a76b0SSuyog Pawar * \author
5871*c83a76b0SSuyog Pawar * Ittiam
5872*c83a76b0SSuyog Pawar *
5873*c83a76b0SSuyog Pawar *****************************************************************************
5874*c83a76b0SSuyog Pawar */
5875*c83a76b0SSuyog Pawar
ihevce_rc_register_dyn_change_bitrate(void * pv_ctxt,LWORD64 i8_new_bitrate,LWORD64 i8_new_peak_bitrate)5876*c83a76b0SSuyog Pawar void ihevce_rc_register_dyn_change_bitrate(
5877*c83a76b0SSuyog Pawar void *pv_ctxt, LWORD64 i8_new_bitrate, LWORD64 i8_new_peak_bitrate)
5878*c83a76b0SSuyog Pawar {
5879*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
5880*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_new_bitrate = i8_new_bitrate;
5881*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_new_peak_bitrate = i8_new_peak_bitrate;
5882*c83a76b0SSuyog Pawar ps_rc_ctxt->i4_bitrate_changed = 1;
5883*c83a76b0SSuyog Pawar ASSERT(ps_rc_ctxt->i8_new_bitrate > 0);
5884*c83a76b0SSuyog Pawar ASSERT(ps_rc_ctxt->i8_new_peak_bitrate > 0);
5885*c83a76b0SSuyog Pawar }
5886*c83a76b0SSuyog Pawar
5887*c83a76b0SSuyog Pawar /*!
5888*c83a76b0SSuyog Pawar ******************************************************************************
5889*c83a76b0SSuyog Pawar * \if Function name : ihevce_rc_get_new_bitrate
5890*c83a76b0SSuyog Pawar *
5891*c83a76b0SSuyog Pawar * \brief
5892*c83a76b0SSuyog Pawar * get new bitrate
5893*c83a76b0SSuyog Pawar *
5894*c83a76b0SSuyog Pawar * \param[in] *pv_ctxt -> rc context
5895*c83a76b0SSuyog Pawar *
5896*c83a76b0SSuyog Pawar * \return
5897*c83a76b0SSuyog Pawar *
5898*c83a76b0SSuyog Pawar * \author
5899*c83a76b0SSuyog Pawar * Ittiam
5900*c83a76b0SSuyog Pawar *
5901*c83a76b0SSuyog Pawar *****************************************************************************
5902*c83a76b0SSuyog Pawar */
ihevce_rc_get_new_bitrate(void * pv_ctxt)5903*c83a76b0SSuyog Pawar LWORD64 ihevce_rc_get_new_bitrate(void *pv_ctxt)
5904*c83a76b0SSuyog Pawar {
5905*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
5906*c83a76b0SSuyog Pawar return ps_rc_ctxt->i8_new_bitrate;
5907*c83a76b0SSuyog Pawar }
5908*c83a76b0SSuyog Pawar /*!
5909*c83a76b0SSuyog Pawar ******************************************************************************
5910*c83a76b0SSuyog Pawar * \if Function name : ihevce_rc_get_new_peak_bitrate
5911*c83a76b0SSuyog Pawar *
5912*c83a76b0SSuyog Pawar * \brief
5913*c83a76b0SSuyog Pawar * get new peak rate
5914*c83a76b0SSuyog Pawar *
5915*c83a76b0SSuyog Pawar * \param[in] *pv_ctxt -> rc context
5916*c83a76b0SSuyog Pawar *
5917*c83a76b0SSuyog Pawar * \return
5918*c83a76b0SSuyog Pawar *
5919*c83a76b0SSuyog Pawar * \author
5920*c83a76b0SSuyog Pawar * Ittiam
5921*c83a76b0SSuyog Pawar *
5922*c83a76b0SSuyog Pawar *****************************************************************************
5923*c83a76b0SSuyog Pawar */
ihevce_rc_get_new_peak_bitrate(void * pv_ctxt)5924*c83a76b0SSuyog Pawar LWORD64 ihevce_rc_get_new_peak_bitrate(void *pv_ctxt)
5925*c83a76b0SSuyog Pawar {
5926*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
5927*c83a76b0SSuyog Pawar return ps_rc_ctxt->i8_new_peak_bitrate;
5928*c83a76b0SSuyog Pawar }
5929*c83a76b0SSuyog Pawar
5930*c83a76b0SSuyog Pawar /*!
5931*c83a76b0SSuyog Pawar ******************************************************************************
5932*c83a76b0SSuyog Pawar * \if Function name : ihevce_rc_change_avg_bitrate
5933*c83a76b0SSuyog Pawar *
5934*c83a76b0SSuyog Pawar * \brief
5935*c83a76b0SSuyog Pawar * change average bitrate configured based on new bitrate
5936*c83a76b0SSuyog Pawar *
5937*c83a76b0SSuyog Pawar * \param[in] *pv_ctxt -> rc context
5938*c83a76b0SSuyog Pawar *
5939*c83a76b0SSuyog Pawar * \return
5940*c83a76b0SSuyog Pawar *
5941*c83a76b0SSuyog Pawar * \author
5942*c83a76b0SSuyog Pawar * Ittiam
5943*c83a76b0SSuyog Pawar *
5944*c83a76b0SSuyog Pawar *****************************************************************************
5945*c83a76b0SSuyog Pawar */
ihevce_rc_change_avg_bitrate(void * pv_ctxt)5946*c83a76b0SSuyog Pawar LWORD64 ihevce_rc_change_avg_bitrate(void *pv_ctxt)
5947*c83a76b0SSuyog Pawar {
5948*c83a76b0SSuyog Pawar rc_context_t *ps_rc_ctxt = (rc_context_t *)pv_ctxt;
5949*c83a76b0SSuyog Pawar LWORD64 vbv_buffer_level_b4_change;
5950*c83a76b0SSuyog Pawar
5951*c83a76b0SSuyog Pawar ASSERT(ps_rc_ctxt->i8_new_bitrate != -1);
5952*c83a76b0SSuyog Pawar ASSERT(ps_rc_ctxt->i8_new_peak_bitrate != -1);
5953*c83a76b0SSuyog Pawar /*Get the VBV buffer level just before forcing bitrate change*/
5954*c83a76b0SSuyog Pawar vbv_buffer_level_b4_change = (LWORD64)rc_get_ebf(ps_rc_ctxt->rc_hdl);
5955*c83a76b0SSuyog Pawar
5956*c83a76b0SSuyog Pawar change_avg_bit_rate(
5957*c83a76b0SSuyog Pawar ps_rc_ctxt->rc_hdl,
5958*c83a76b0SSuyog Pawar (UWORD32)ps_rc_ctxt->i8_new_bitrate,
5959*c83a76b0SSuyog Pawar (UWORD32)ps_rc_ctxt->i8_new_peak_bitrate);
5960*c83a76b0SSuyog Pawar /*Once the request is serviced set new bitrate to -1*/
5961*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_new_bitrate = -1;
5962*c83a76b0SSuyog Pawar ps_rc_ctxt->i8_new_peak_bitrate = -1;
5963*c83a76b0SSuyog Pawar return vbv_buffer_level_b4_change;
5964*c83a76b0SSuyog Pawar }
5965*c83a76b0SSuyog Pawar
5966*c83a76b0SSuyog Pawar /*##############################################################*/
5967*c83a76b0SSuyog Pawar /******* END OF DYN CHNAGE iN BITRATE FUNCTIONS *****************/
5968*c83a76b0SSuyog Pawar /*##############################################################*/
5969