1 /****************************************************************************** 2 * 3 * Copyright (C) 2015 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 21 /*****************************************************************************/ 22 /* Includes */ 23 /*****************************************************************************/ 24 25 /* System include files */ 26 #include "stdio.h" 27 28 /* User include files */ 29 #include "irc_datatypes.h" 30 #include "irc_common.h" 31 #include "irc_cntrl_param.h" 32 #include "irc_mem_req_and_acq.h" 33 #include "irc_rd_model.h" 34 #include "irc_est_sad.h" 35 #include "irc_fixed_point_error_bits.h" 36 #include "irc_vbr_storage_vbv.h" 37 #include "irc_picture_type.h" 38 #include "irc_bit_allocation.h" 39 #include "irc_mb_model_based.h" 40 #include "irc_cbr_buffer_control.h" 41 #include "irc_vbr_str_prms.h" 42 #include "irc_rate_control_api.h" 43 #include "irc_rate_control_api_structs.h" 44 #include "irc_trace_support.h" 45 46 47 #define MIN(a,b) (((a) < (b)) ? (a) : (b)) 48 #define MAX(a,b) (((a) > (b)) ? (a) : (b)) 49 50 #define DEV_Q 4 /*Q format(Shift) for Deviation range factor */ 51 #define HI_DEV_FCTR 22 /* 1.4*16 */ 52 #define LO_DEV_FCTR 12 /* 0.75*16 */ 53 #define GET_HI_DEV_QP(Qprev) (( ((WORD32) Qprev)*HI_DEV_FCTR + (1<<(DEV_Q-1)))>>DEV_Q) 54 #define GET_LO_DEV_QP(Qprev) (( ((WORD32) Qprev)*LO_DEV_FCTR + (1<<(DEV_Q-1)))>>DEV_Q) 55 #define CLIP_QP(Qc, hi_d, lo_d) (((Qc) < (lo_d))?((lo_d)):(((Qc) > (hi_d))?(hi_d):(Qc))) 56 57 /*****************************************************************************/ 58 /* Restricts the quantization parameter variation within delta */ 59 /*****************************************************************************/ 60 /* static WORD32 restrict_swing(WORD32 cur_qp, WORD32 prev_qp, WORD32 delta_qp) 61 { 62 if((cur_qp) - (prev_qp) > (delta_qp)) (cur_qp) = (prev_qp) + (delta_qp) ; 63 if((prev_qp) - (cur_qp) > (delta_qp)) (cur_qp) = (prev_qp) - (delta_qp) ; 64 return cur_qp; 65 }*/ 66 67 /***************************************************************************** 68 Function Name : rate_control_get_init_free_memtab 69 Description : Takes or gives memtab 70 Inputs : pps_rate_control_api - pointer to RC api pointer 71 ps_memtab - Memtab pointer 72 i4_use_base - Set during init, else 0 73 i4_fill_base - Set during free, else 0 74 *****************************************************************************/ 75 WORD32 irc_rate_control_num_fill_use_free_memtab(rate_control_handle *pps_rate_control_api, 76 itt_memtab_t *ps_memtab, 77 ITT_FUNC_TYPE_E e_func_type) 78 { 79 WORD32 i4_mem_tab_idx = 0, i; 80 rate_control_api_t s_temp_rc_api; 81 82 /* 83 * Hack for al alloc, during which we dont have any state memory. 84 * Dereferencing can cause issues 85 */ 86 if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB) 87 (*pps_rate_control_api) = &s_temp_rc_api; 88 89 /*for src rate control state structure*/ 90 if(e_func_type != GET_NUM_MEMTAB) 91 { 92 fill_memtab(&ps_memtab[i4_mem_tab_idx], sizeof(rate_control_api_t), 93 ALIGN_128_BYTE, PERSISTENT, DDR); 94 use_or_fill_base(&ps_memtab[0], (void**)pps_rate_control_api, 95 e_func_type); 96 } 97 i4_mem_tab_idx++; 98 99 /* Get the memory requirement of lower modules */ 100 i4_mem_tab_idx += irc_ba_num_fill_use_free_memtab( 101 &pps_rate_control_api[0]->ps_bit_allocation, 102 &ps_memtab[i4_mem_tab_idx], e_func_type); 103 104 i4_mem_tab_idx += irc_cbr_buffer_num_fill_use_free_memtab( 105 &pps_rate_control_api[0]->ps_cbr_buffer, 106 &ps_memtab[i4_mem_tab_idx], e_func_type); 107 108 i4_mem_tab_idx += irc_est_sad_num_fill_use_free_memtab( 109 &pps_rate_control_api[0]->ps_est_sad, 110 &ps_memtab[i4_mem_tab_idx], e_func_type); 111 112 i4_mem_tab_idx += irc_mbrc_num_fill_use_free_memtab( 113 &pps_rate_control_api[0]->ps_mb_rate_control, 114 &ps_memtab[i4_mem_tab_idx], e_func_type); 115 116 i4_mem_tab_idx += irc_vbr_vbv_num_fill_use_free_memtab( 117 &pps_rate_control_api[0]->ps_vbr_storage_vbv, 118 &ps_memtab[i4_mem_tab_idx], e_func_type); 119 120 for(i = 0; i < MAX_PIC_TYPE; i++) 121 { 122 i4_mem_tab_idx += irc_rd_model_num_fill_use_free_memtab( 123 &pps_rate_control_api[0]->aps_rd_model[i], 124 &ps_memtab[i4_mem_tab_idx], e_func_type); 125 } 126 i4_mem_tab_idx += irc_pic_handling_num_fill_use_free_memtab( 127 &pps_rate_control_api[0]->ps_pic_handling, 128 &ps_memtab[i4_mem_tab_idx], e_func_type); 129 130 return (i4_mem_tab_idx); 131 } 132 133 /***************************************************************************** 134 Function Name : irc_initialise_rate_control 135 Description : Initialise the rate control structure 136 Inputs : ps_rate_control_api - api struct 137 e_rate_control_type - VBR, CBR (NLDRC/LDRC), VBR_STREAMING 138 u1_is_mb_level_rc_on - enabling mb level RC 139 u4_avg_bit_rate - bit rate to achieved across the entire 140 file size 141 u4_peak_bit_rate - max possible drain rate 142 u4_frame_rate - number of frames in 1000 seconds 143 u4_intra_frame_interval - num frames between two I frames 144 *au1_init_qp - init_qp for I,P,B 145 *****************************************************************************/ 146 void irc_initialise_rate_control(rate_control_api_t *ps_rate_control_api, 147 rc_type_e e_rate_control_type, 148 UWORD8 u1_is_mb_level_rc_on, 149 UWORD32 u4_avg_bit_rate, 150 UWORD32 *pu4_peak_bit_rate, 151 UWORD32 u4_min_bit_rate, 152 UWORD32 u4_frame_rate, 153 UWORD32 u4_max_delay, 154 UWORD32 u4_intra_frame_interval, 155 WORD32 i4_inter_frm_int, 156 UWORD8 *pu1_init_qp, 157 UWORD32 u4_max_vbv_buff_size, 158 WORD32 i4_max_inter_frm_int, 159 WORD32 i4_is_gop_closed, 160 UWORD8 *pu1_min_max_qp, 161 WORD32 i4_use_est_intra_sad, 162 UWORD32 u4_src_ticks, 163 UWORD32 u4_tgt_ticks) 164 { 165 WORD32 i; 166 UWORD32 u4_frms_in_delay_prd = (u4_frame_rate * u4_max_delay) / 1000000; 167 ps_rate_control_api->e_rc_type = e_rate_control_type; 168 ps_rate_control_api->u1_is_mb_level_rc_on = u1_is_mb_level_rc_on; 169 170 trace_printf((const WORD8*)"RC type = %d\n", e_rate_control_type); 171 172 /* Set the avg_bitrate_changed flag for each pic_type to 0 */ 173 for(i = 0; i < MAX_PIC_TYPE; i++) 174 { 175 ps_rate_control_api->au1_avg_bitrate_changed[i] = 0; 176 } 177 178 /* Initialize the pic_handling module */ 179 irc_init_pic_handling(ps_rate_control_api->ps_pic_handling, 180 (WORD32)u4_intra_frame_interval, 181 i4_inter_frm_int, i4_max_inter_frm_int, 182 i4_is_gop_closed); 183 184 /*** Initialize the rate control modules ***/ 185 if(ps_rate_control_api->e_rc_type != CONST_QP) 186 { 187 UWORD32 au4_num_pics_in_delay_prd[MAX_PIC_TYPE]; 188 189 /* Initialize the model parameter structures */ 190 for(i = 0; i < MAX_PIC_TYPE; i++) 191 { 192 irc_init_frm_rc_rd_model(ps_rate_control_api->aps_rd_model[i], 193 MAX_FRAMES_MODELLED); 194 } 195 196 /* Initialize the buffer mechanism */ 197 if((ps_rate_control_api->e_rc_type == VBR_STORAGE) 198 || (ps_rate_control_api->e_rc_type 199 == VBR_STORAGE_DVD_COMP)) 200 { 201 /* Assuming both the peak bit rates are same for a VBR_STORAGE and 202 VBR_STORAGE_DVD_COMP */ 203 if(pu4_peak_bit_rate[0] != pu4_peak_bit_rate[1]) 204 { 205 trace_printf((const WORD8*)"For VBR_STORAGE and VBR_STORAGE_DVD_COMP the peak bit rates should be same\n"); 206 } 207 irc_init_vbr_vbv(ps_rate_control_api->ps_vbr_storage_vbv, 208 (WORD32)pu4_peak_bit_rate[0], 209 (WORD32)u4_frame_rate, 210 (WORD32)u4_max_vbv_buff_size); 211 } 212 else if(ps_rate_control_api->e_rc_type == CBR_NLDRC) 213 { 214 UWORD32 u4_avg_bit_rate_copy[MAX_NUM_DRAIN_RATES]; 215 for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) 216 { 217 u4_avg_bit_rate_copy[i] = u4_avg_bit_rate; 218 } 219 /* In case of CBR the num pics in delay is ignored */ 220 for(i = 0; i < MAX_PIC_TYPE; i++) 221 au4_num_pics_in_delay_prd[i] = 0; 222 223 irc_init_cbr_buffer(ps_rate_control_api->ps_cbr_buffer, 224 u4_max_delay, u4_frame_rate, 225 (WORD32 *)u4_avg_bit_rate_copy, 226 au4_num_pics_in_delay_prd, 227 u4_max_vbv_buff_size); 228 } 229 else if(ps_rate_control_api->e_rc_type == VBR_STREAMING) 230 { 231 irc_init_vbv_str_prms(&ps_rate_control_api->s_vbr_str_prms, 232 u4_intra_frame_interval, u4_src_ticks, 233 u4_tgt_ticks, u4_frms_in_delay_prd); 234 235 /* Get the number of pics of each type in delay period */ 236 irc_get_vsp_num_pics_in_dly_prd( 237 &ps_rate_control_api->s_vbr_str_prms, 238 au4_num_pics_in_delay_prd); 239 240 irc_init_cbr_buffer(ps_rate_control_api->ps_cbr_buffer, 241 u4_max_delay, u4_frame_rate, 242 (WORD32 *)pu4_peak_bit_rate, 243 au4_num_pics_in_delay_prd, 244 u4_max_vbv_buff_size); 245 } 246 247 /* Initialize the SAD estimation module */ 248 irc_init_est_sad(ps_rate_control_api->ps_est_sad, i4_use_est_intra_sad); 249 250 /* Initialize the bit allocation module according to VBR or CBR */ 251 if((ps_rate_control_api->e_rc_type == VBR_STORAGE) 252 || (ps_rate_control_api->e_rc_type == VBR_STREAMING) 253 || (ps_rate_control_api->e_rc_type 254 == VBR_STORAGE_DVD_COMP)) 255 { 256 irc_ba_init_bit_allocation(ps_rate_control_api->ps_bit_allocation, 257 ps_rate_control_api->ps_pic_handling, 258 VBR_BIT_ALLOC_PERIOD, u4_avg_bit_rate, 259 u4_frame_rate, 260 (WORD32 *)pu4_peak_bit_rate, 261 u4_min_bit_rate); 262 } 263 else if(ps_rate_control_api->e_rc_type == CBR_NLDRC) 264 { 265 irc_ba_init_bit_allocation(ps_rate_control_api->ps_bit_allocation, 266 ps_rate_control_api->ps_pic_handling, 267 CBR_BIT_ALLOC_PERIOD, u4_avg_bit_rate, 268 u4_frame_rate, 269 (WORD32 *)pu4_peak_bit_rate, 270 u4_min_bit_rate); 271 } 272 273 /* 274 * u1_scd_detected will be initialized to 1 when a Scene change is 275 * detected 276 */ 277 ps_rate_control_api->u1_scd_detected = 0; 278 } 279 280 /* Initialize the init_qp */ 281 for(i = 0; i < MAX_PIC_TYPE; i++) 282 { 283 ps_rate_control_api->au1_init_qp[i] = pu1_init_qp[i]; 284 ps_rate_control_api->au1_prev_frm_qp[i] = pu1_init_qp[i]; 285 ps_rate_control_api->au1_min_max_qp[(i << 1)] = 286 pu1_min_max_qp[(i << 1)]; 287 ps_rate_control_api->au1_min_max_qp[(i << 1) + 1] = pu1_min_max_qp[(i 288 << 1) + 1]; 289 } 290 291 /* Initialize the is_first_frm_encoded */ 292 for(i = 0; i < MAX_PIC_TYPE; i++) 293 { 294 ps_rate_control_api->au1_is_first_frm_coded[i] = 0; 295 } 296 ps_rate_control_api->u1_is_first_frm = 1; 297 298 /* 299 * Control flag for delayed impact after a change in peak bitrate has been 300 * made 301 */ 302 ps_rate_control_api->u4_frms_in_delay_prd_for_peak_bit_rate_change = 0; 303 for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) 304 { 305 ps_rate_control_api->au4_new_peak_bit_rate[i] = pu4_peak_bit_rate[i]; 306 } 307 308 /* Initialize the mb level rate control module */ 309 irc_init_mb_level_rc(ps_rate_control_api->ps_mb_rate_control); 310 ps_rate_control_api->i4_prev_frm_est_bits = u4_avg_bit_rate * 1000 311 / u4_frame_rate; 312 313 ps_rate_control_api->prev_ref_pic_type = I_PIC; 314 } 315 316 /****************************************************************************** 317 *Description : calls irc_add_pic_to_stack 318 ******************************************************************************/ 319 void irc_add_picture_to_stack(rate_control_api_t *rate_control_api, 320 WORD32 i4_enc_pic_id) 321 { 322 /* Call the routine to add the pic to stack in encode order */ 323 irc_add_pic_to_stack(rate_control_api->ps_pic_handling, i4_enc_pic_id); 324 } 325 326 void irc_add_picture_to_stack_re_enc(rate_control_api_t *rate_control_api, 327 WORD32 i4_enc_pic_id, 328 picture_type_e e_pic_type) 329 { 330 /* 331 * In case of a re-encoder, the pics will come in the encode order itself. 332 * So, there is no need to buffer the pics up 333 */ 334 irc_add_pic_to_stack_re_enc(rate_control_api->ps_pic_handling, 335 i4_enc_pic_id, e_pic_type); 336 } 337 338 /******************************************************************************* 339 Description : Decides the picture type based on the state 340 ******************************************************************************/ 341 void irc_get_picture_details(rate_control_handle rate_control_api, 342 WORD32 *pi4_pic_id, 343 WORD32 *pi4_pic_disp_order_no, 344 picture_type_e *pe_pic_type) 345 { 346 /* Call to get the pic_details */ 347 irc_get_pic_from_stack(rate_control_api->ps_pic_handling, pi4_pic_id, 348 pi4_pic_disp_order_no, pe_pic_type); 349 } 350 351 /******************************************************************************* 352 * Description : Gets the frame level qp for the given picture type 353 ******************************************************************************/ 354 UWORD8 irc_get_frame_level_qp(rate_control_api_t *ps_rate_control_api, 355 picture_type_e e_pic_type, 356 WORD32 i4_ud_max_bits) 357 { 358 UWORD8 u1_frame_qp, i; 359 360 if((ps_rate_control_api->e_rc_type != VBR_STORAGE) 361 && (ps_rate_control_api->e_rc_type != VBR_STORAGE_DVD_COMP) 362 && (ps_rate_control_api->e_rc_type != CBR_NLDRC) 363 && (ps_rate_control_api->e_rc_type != CONST_QP) 364 && (ps_rate_control_api->e_rc_type != VBR_STREAMING)) 365 { 366 trace_printf((const WORD8*)(const WORD8*)" Only VBR,NLDRC and CONST QP supported for now \n"); 367 return (0); 368 } 369 370 if(ps_rate_control_api->e_rc_type != CONST_QP) 371 { 372 UWORD8 u1_is_first_frm_coded = 1; 373 374 /* Check whether at least one frame of a each picture type gets encoded*/ 375 /* Check whether it is an IPP or IPB kind of encoding */ 376 if((ps_rate_control_api->au1_is_first_frm_coded[I_PIC] 377 && ps_rate_control_api->au1_is_first_frm_coded[P_PIC]) 378 || ((irc_pic_type_get_intra_frame_interval( 379 ps_rate_control_api->ps_pic_handling) 380 == 1) 381 && (ps_rate_control_api->au1_is_first_frm_coded[I_PIC]))) 382 { 383 if(e_pic_type != B_PIC) 384 u1_is_first_frm_coded = 1; 385 else 386 { 387 for(i = 0; i < MAX_PIC_TYPE; i++) 388 { 389 u1_is_first_frm_coded &= 390 ps_rate_control_api->au1_is_first_frm_coded[i]; 391 } 392 } 393 } 394 else 395 { 396 u1_is_first_frm_coded = 0; 397 } 398 399 if(u1_is_first_frm_coded) 400 { 401 WORD32 i4_cur_est_texture_bits, i4_cur_est_header_bits; 402 WORD32 i4_cur_est_bits; 403 UWORD32 u4_estimated_sad; 404 405 /* Force I frame updation of rem_bits_in_frame*/ 406 if(irc_get_forced_I_frame_cur_frm_flag( 407 ps_rate_control_api->ps_pic_handling) == 1) 408 { 409 irc_ba_change_rem_bits_in_prd_at_force_I_frame( 410 ps_rate_control_api->ps_bit_allocation, 411 ps_rate_control_api->ps_pic_handling); 412 irc_reset_forced_I_frame_cur_frm_flag( 413 ps_rate_control_api->ps_pic_handling); 414 } 415 416 /* Get the estimated texture bits allocated for the current frame*/ 417 i4_cur_est_texture_bits = irc_ba_get_cur_frm_est_texture_bits( 418 ps_rate_control_api->ps_bit_allocation, 419 ps_rate_control_api->aps_rd_model, 420 ps_rate_control_api->ps_est_sad, 421 ps_rate_control_api->ps_pic_handling, e_pic_type); 422 423 /* Get the estimated header bits*/ 424 i4_cur_est_header_bits = irc_ba_get_cur_frm_est_header_bits( 425 ps_rate_control_api->ps_bit_allocation, e_pic_type); 426 427 /* Total estimated bits */ 428 i4_cur_est_bits = i4_cur_est_header_bits + i4_cur_est_texture_bits; 429 430 trace_printf((const WORD8*)"ft %d, etb = %d, eb %d, ", e_pic_type, 431 i4_cur_est_texture_bits, i4_cur_est_bits); 432 433 /* Threshold the estimated bits based on the buffer fullness*/ 434 if(ps_rate_control_api->e_rc_type == VBR_STORAGE) 435 { 436 WORD32 i4_cur_frm_max_bit_possible; 437 i4_cur_frm_max_bit_possible = irc_get_max_target_bits( 438 ps_rate_control_api->ps_vbr_storage_vbv); 439 440 if(i4_cur_est_bits > i4_cur_frm_max_bit_possible) 441 { 442 /* Assuming header would consume the same amount of bits */ 443 i4_cur_est_texture_bits = i4_cur_frm_max_bit_possible 444 - i4_cur_est_header_bits; 445 } 446 } 447 else if(ps_rate_control_api->e_rc_type == VBR_STORAGE_DVD_COMP) 448 { 449 WORD32 i4_rem_bits_in_gop, i4_rem_frms_in_gop, i; 450 WORD32 i4_cur_frm_max_bit_possible, 451 ai4_rem_frms_in_gop[MAX_PIC_TYPE]; 452 irc_pic_type_get_rem_frms_in_gop( 453 ps_rate_control_api->ps_pic_handling, 454 ai4_rem_frms_in_gop); 455 i4_rem_bits_in_gop = irc_get_rem_bits_in_period( 456 ps_rate_control_api); 457 i4_rem_frms_in_gop = 0; 458 for(i = 0; i < MAX_PIC_TYPE; i++) 459 i4_rem_frms_in_gop += ai4_rem_frms_in_gop[i]; 460 461 /* Threshold the bits based on estimated buffer fullness */ 462 i4_cur_frm_max_bit_possible = irc_get_max_tgt_bits_dvd_comp( 463 ps_rate_control_api->ps_vbr_storage_vbv, 464 i4_rem_bits_in_gop, i4_rem_frms_in_gop, 465 e_pic_type); 466 467 if(i4_cur_est_bits > i4_cur_frm_max_bit_possible) 468 { 469 /* Assuming header would consume the same amount of bits */ 470 i4_cur_est_texture_bits = i4_cur_frm_max_bit_possible 471 - i4_cur_est_header_bits; 472 473 } 474 } 475 else if(ps_rate_control_api->e_rc_type == CBR_NLDRC) 476 { 477 WORD32 i4_cur_frm_bits_acc_buffer = 478 irc_cbr_buffer_constraint_check( 479 ps_rate_control_api->ps_cbr_buffer, 480 i4_cur_est_bits, e_pic_type); 481 482 /* Assuming the header would consume the same amount of bits */ 483 i4_cur_est_texture_bits = i4_cur_frm_bits_acc_buffer 484 - i4_cur_est_header_bits; 485 486 } 487 else if(ps_rate_control_api->e_rc_type == VBR_STREAMING) 488 { 489 WORD32 i4_cur_frm_bits_acc_buffer = 490 irc_vbr_stream_buffer_constraint_check( 491 ps_rate_control_api->ps_cbr_buffer, 492 i4_cur_est_bits, e_pic_type); 493 494 /* Assuming the header would consume the same amount of bits */ 495 i4_cur_est_texture_bits = i4_cur_frm_bits_acc_buffer 496 - i4_cur_est_header_bits; 497 } 498 499 trace_printf((const WORD8*)"emtb = %d, ", i4_cur_est_texture_bits); 500 501 /* 502 * If the estimated texture bits go to values less than zero 503 * due to buffer underflow, make the estimated target bits to go 504 * to zero 505 */ 506 if(i4_cur_est_texture_bits < 0) 507 i4_cur_est_texture_bits = 0; 508 509 ps_rate_control_api->i4_prev_frm_est_bits = (i4_cur_est_texture_bits 510 + i4_cur_est_header_bits); 511 512 /* Clip est_texture_bits according to the user-defined max value */ 513 if((i4_cur_est_texture_bits 514 > (i4_ud_max_bits - i4_cur_est_header_bits)) 515 && (e_pic_type != I_PIC)) 516 { 517 i4_cur_est_texture_bits = (i4_ud_max_bits 518 - i4_cur_est_header_bits); 519 trace_printf((const WORD8*)"udcb = %d, ", 520 i4_ud_max_bits - i4_cur_est_header_bits); 521 } 522 523 /* Calculate the estimated SAD for corresponding frame*/ 524 u4_estimated_sad = irc_get_est_sad(ps_rate_control_api->ps_est_sad, 525 e_pic_type); 526 527 /* Query the model for the Qp for the corresponding frame*/ 528 529 /* 530 * The check is because the model gives a negative QP when the 531 * i4_cur_est_texture_bits is less than or equal to 0 532 * [This is a bug in the model]. As a temporary fix, the frame QP 533 * is being set to the max QP allowed 534 */ 535 if(i4_cur_est_texture_bits > 0) 536 { 537 u1_frame_qp = irc_find_qp_for_target_bits( 538 ps_rate_control_api->aps_rd_model[e_pic_type], 539 i4_cur_est_texture_bits, 540 u4_estimated_sad, 541 ps_rate_control_api->au1_min_max_qp[(e_pic_type 542 << 1)], 543 ps_rate_control_api->au1_min_max_qp[(e_pic_type 544 << 1) + 1]); 545 } 546 else 547 { 548 u1_frame_qp = ps_rate_control_api->au1_min_max_qp[(e_pic_type 549 << 1) + 1]; 550 } 551 552 trace_printf((const WORD8*)"ehb %d, etb %d, fqp %d, es %d, eb %d, ", 553 i4_cur_est_header_bits, i4_cur_est_texture_bits, 554 u1_frame_qp, u4_estimated_sad, i4_cur_est_bits); 555 556 /* Restricting the QP swing if the average bit rate has changed */ 557 if(ps_rate_control_api->au1_avg_bitrate_changed[e_pic_type] == 0) 558 { 559 WORD32 prev_qp; 560 WORD32 hi_dev_qp, lo_dev_qp; 561 /* Restricting the qp swing */ 562 prev_qp = ps_rate_control_api->au1_prev_frm_qp[ps_rate_control_api->prev_ref_pic_type]; 563 564 if(ps_rate_control_api->prev_ref_pic_type != e_pic_type) 565 { 566 if(e_pic_type == I_PIC) 567 { 568 /* 569 * Constrain I-frame QP to be within specified limit of 570 * prev_ref_qp/Kp 571 */ 572 prev_qp = (P_TO_I_RATIO * prev_qp + (1 << (K_Q - 1))) 573 >> (K_Q); 574 } 575 else if(e_pic_type == P_PIC) 576 { 577 /* 578 * Constrain P-frame QP to be within specified limit of 579 * Kp*prev_ref_qp 580 */ 581 prev_qp = (I_TO_P_RATIO * prev_qp + (1 << (K_Q - 1))) 582 >> (K_Q); 583 } 584 else if(ps_rate_control_api->prev_ref_pic_type == P_PIC) 585 { 586 /* current frame is B-pic */ 587 /* Constrain B-frame QP to be within specified limit of 588 * prev_ref_qp/Kb 589 */ 590 prev_qp = (P_TO_B_RATIO * prev_qp + (1 << (K_Q - 1))) 591 >> (K_Q); 592 } 593 else /* if(ps_rate_control_api->prev_ref_pic_type == I_PIC*/ 594 { 595 /* current frame is B-pic */ 596 /* 597 * Constrain B-frame QP to be within specified limit of 598 * prev_ref_qp/Kb 599 */ 600 prev_qp = (P_TO_B_RATIO * I_TO_P_RATIO * prev_qp 601 + (1 << (K_Q + K_Q - 1))) 602 >> (K_Q + K_Q); 603 } 604 } 605 606 /* 607 * Due to the inexact nature of translation tables, QP may 608 * get locked at some values. This is because of the inexactness of 609 * the tables causing a change of +-1 in back and forth translations. 610 * In that case, if we restrict the QP swing to +-1, we will get 611 * the lock up condition. Hence we make it such that we will have 612 * a swing of atleast +- 2 from prev_qp 613 */ 614 615 lo_dev_qp = GET_LO_DEV_QP(prev_qp); 616 lo_dev_qp = MIN(lo_dev_qp, prev_qp - 2); 617 lo_dev_qp = MAX(lo_dev_qp, ps_rate_control_api->au1_min_max_qp[(e_pic_type << 1)]); 618 619 hi_dev_qp = GET_HI_DEV_QP(prev_qp); 620 hi_dev_qp = MAX(hi_dev_qp, prev_qp + 2); 621 hi_dev_qp = MIN(hi_dev_qp, ps_rate_control_api->au1_min_max_qp[(e_pic_type << 1) + 1]); 622 623 u1_frame_qp = (UWORD8)CLIP_QP((WORD32)u1_frame_qp, hi_dev_qp , lo_dev_qp); 624 625 } 626 else 627 { 628 ps_rate_control_api->au1_avg_bitrate_changed[e_pic_type] = 0; 629 } 630 } 631 else 632 { 633 /* 634 * The u1_is_first_frm_coded gets reset 635 * a) at start of sequence 636 * b) whenever there is a scene change. 637 * In both cases since we do not have any estimate about the 638 * current frame, we just send in the previous frame qp value.IN 639 * Scene change case the previous QP is incremented by 4 , This is 640 * done because the Scene changed VOP will have over consumed and 641 * chances of future frames skipping is very high. For the init 642 * case, the previous frame QP is initialized with the init qp 643 */ 644 if((ps_rate_control_api->u1_scd_detected) 645 && (ps_rate_control_api->e_rc_type != CONST_QP)) 646 { 647 /* 648 * If scene change is detected, I frame Qp would have been 649 * updated 650 */ 651 /* Use a QP calculated in the prev update fxn */ 652 u1_frame_qp = ps_rate_control_api->u1_frm_qp_after_scd; 653 } 654 else 655 { 656 u1_frame_qp = ps_rate_control_api->au1_prev_frm_qp[e_pic_type]; 657 } 658 } 659 } 660 else 661 { 662 u1_frame_qp = ps_rate_control_api->au1_init_qp[e_pic_type]; 663 } 664 665 trace_printf((const WORD8*)"fqp %d\n", u1_frame_qp); 666 667 return (u1_frame_qp); 668 } 669 670 /******************************************************************************* 671 *Function Name : irc_get_buffer_status 672 *Description : Gets the state of VBV buffer 673 *Outputs : 0 = normal, 1 = underflow, 2= overflow 674 *Returns : vbv_buf_status_e 675 ******************************************************************************/ 676 vbv_buf_status_e irc_get_buffer_status(rate_control_api_t *ps_rate_control_api, 677 WORD32 i4_total_frame_bits, 678 picture_type_e e_pic_type, 679 WORD32 *pi4_num_bits_to_prevent_vbv_underflow) 680 { 681 vbv_buf_status_e e_buf_status = VBV_NORMAL; 682 683 /* Get the buffer status for the current total consumed bits and error bits*/ 684 if(ps_rate_control_api->e_rc_type == VBR_STORAGE_DVD_COMP) 685 { 686 e_buf_status = irc_get_vbv_buffer_status( 687 ps_rate_control_api->ps_vbr_storage_vbv, 688 i4_total_frame_bits, 689 pi4_num_bits_to_prevent_vbv_underflow); 690 691 trace_printf((const WORD8*)"e_buf_status = %d\n", e_buf_status); 692 } 693 else if(ps_rate_control_api->e_rc_type == VBR_STORAGE) 694 { 695 /* For VBR case since there is not underflow returning the max value */ 696 pi4_num_bits_to_prevent_vbv_underflow[0] = irc_get_max_vbv_buf_size( 697 ps_rate_control_api->ps_vbr_storage_vbv); 698 e_buf_status = VBV_NORMAL; 699 } 700 else if(ps_rate_control_api->e_rc_type == CBR_NLDRC) 701 { 702 e_buf_status = irc_get_cbr_buffer_status( 703 ps_rate_control_api->ps_cbr_buffer, i4_total_frame_bits, 704 pi4_num_bits_to_prevent_vbv_underflow, e_pic_type); 705 706 } 707 else if(ps_rate_control_api->e_rc_type == VBR_STREAMING) 708 { 709 /* For VBR_streaming, error bits are computed according to peak bitrate*/ 710 e_buf_status = irc_get_cbr_buffer_status( 711 ps_rate_control_api->ps_cbr_buffer, i4_total_frame_bits, 712 pi4_num_bits_to_prevent_vbv_underflow, e_pic_type); 713 } 714 return e_buf_status; 715 } 716 717 /******************************************************************************* 718 Function Name : irc_update_pic_handling_state 719 Description : If the forward path and the backward path of rate control 720 ******************************************************************************/ 721 void irc_update_pic_handling_state(rate_control_api_t *ps_rate_control_api, 722 picture_type_e e_pic_type) 723 { 724 irc_update_pic_handling(ps_rate_control_api->ps_pic_handling, e_pic_type); 725 } 726 727 /****************************************************************************** 728 Function Name : irc_update_frame_level_info 729 Description : Updates the frame level information into the rate control 730 structure 731 ******************************************************************************/ 732 void irc_update_frame_level_info(rate_control_api_t *ps_rate_control_api, 733 picture_type_e e_pic_type, 734 WORD32 *pi4_mb_type_sad, 735 WORD32 i4_total_frame_bits, 736 WORD32 i4_model_updation_hdr_bits, 737 WORD32 *pi4_mb_type_tex_bits, 738 WORD32 *pi4_tot_mb_type_qp, 739 WORD32 *pi4_tot_mb_in_type, 740 WORD32 i4_avg_activity, 741 UWORD8 u1_is_scd, 742 WORD32 i4_is_it_a_skip, 743 WORD32 i4_intra_frm_cost, 744 WORD32 i4_is_pic_handling_done) 745 { 746 UWORD8 u1_num_skips = 0; 747 WORD32 i; 748 UWORD32 u4_frame_sad = 0; 749 WORD32 i4_tot_texture_bits = 0; 750 WORD32 i4_tot_mbs = 0; 751 WORD32 i4_avg_qp = 0; 752 753 /* SCD not supported in case of IPB encoder */ 754 if(u1_is_scd && (irc_pic_type_get_inter_frame_interval( 755 ps_rate_control_api->ps_pic_handling) > 1)) 756 { 757 u1_is_scd = 0; 758 } 759 /* For frames that contain plane areas that differ from reference frames, encoder 760 * might generate more INTRA MBs because of lower SAD compared with INTER MBs. 761 * Such cases should not be treated as scene change. 762 * For such frames bits consumed will be lesser than the allocated bits. 763 */ 764 if(i4_total_frame_bits < ps_rate_control_api->i4_prev_frm_est_bits) 765 { 766 u1_is_scd = 0; 767 } 768 769 trace_printf((const WORD8*)"i4_total_frame_bits %d\n", i4_total_frame_bits); 770 771 if(!i4_is_it_a_skip && !i4_is_pic_handling_done) 772 { 773 /* Update the pic_handling struct */ 774 irc_update_pic_handling(ps_rate_control_api->ps_pic_handling, 775 e_pic_type); 776 } 777 778 if(ps_rate_control_api->e_rc_type != CONST_QP) 779 { 780 if(!i4_is_it_a_skip) 781 { 782 WORD32 i4_new_period_flag; 783 /****************************************************************** 784 Calculate the total values from the individual values 785 ******************************************************************/ 786 for(i = 0; i < MAX_MB_TYPE; i++) 787 u4_frame_sad += pi4_mb_type_sad[i]; 788 for(i = 0; i < MAX_MB_TYPE; i++) 789 i4_tot_texture_bits += pi4_mb_type_tex_bits[i]; 790 for(i = 0; i < MAX_MB_TYPE; i++) 791 i4_avg_qp += pi4_tot_mb_type_qp[i]; 792 for(i = 0; i < MAX_MB_TYPE; i++) 793 i4_tot_mbs += pi4_tot_mb_in_type[i]; 794 i4_avg_qp /= i4_tot_mbs; /* Calculate the average QP */ 795 796 if(ps_rate_control_api->u1_is_mb_level_rc_on) 797 { 798 /* 799 * The model needs to take into consideration the average 800 * activity of the entire frame while estimating the QP. Thus 801 * the frame sad values are scaled by the average activity 802 * before updating it into the model. 803 */ 804 if(!i4_avg_activity) 805 i4_avg_activity = 1; 806 i4_intra_frm_cost *= i4_avg_activity; 807 u4_frame_sad *= i4_avg_activity; 808 } 809 810 /****************************************************************** 811 Update the bit allocation module 812 NOTE: For bit allocation module, the pic_type should not be 813 modified to that of 'I', in case of a SCD. 814 ******************************************************************/ 815 i4_new_period_flag = irc_is_last_frame_in_gop( 816 ps_rate_control_api->ps_pic_handling); 817 irc_ba_update_cur_frm_consumed_bits( 818 ps_rate_control_api->ps_bit_allocation, 819 ps_rate_control_api->ps_pic_handling, 820 i4_total_frame_bits, i4_model_updation_hdr_bits, 821 e_pic_type, u1_is_scd, i4_new_period_flag); 822 823 if(1 == i4_new_period_flag 824 && ((ps_rate_control_api->e_rc_type == VBR_STORAGE) 825 || (ps_rate_control_api->e_rc_type 826 == VBR_STORAGE_DVD_COMP))) 827 { 828 irc_ba_check_and_update_bit_allocation( 829 ps_rate_control_api->ps_bit_allocation, 830 ps_rate_control_api->ps_pic_handling, 831 irc_get_cur_vbv_buf_size( 832 ps_rate_control_api->ps_vbr_storage_vbv), 833 irc_get_max_vbv_buf_size( 834 ps_rate_control_api->ps_vbr_storage_vbv), 835 irc_get_max_bits_per_tgt_frm( 836 ps_rate_control_api->ps_vbr_storage_vbv), 837 i4_total_frame_bits); 838 } 839 } 840 841 /********************************************************************** 842 Update the buffer status 843 *********************************************************************/ 844 /* 845 * This update is done after overflow and underflow handling to 846 * account for the actual bits dumped 847 */ 848 if((ps_rate_control_api->e_rc_type == VBR_STORAGE) 849 || (ps_rate_control_api->e_rc_type 850 == VBR_STORAGE_DVD_COMP)) 851 { 852 irc_update_vbr_vbv(ps_rate_control_api->ps_vbr_storage_vbv, 853 i4_total_frame_bits); 854 } 855 else if(ps_rate_control_api->e_rc_type == CBR_NLDRC) 856 { 857 irc_update_cbr_buffer(ps_rate_control_api->ps_cbr_buffer, 858 i4_total_frame_bits, e_pic_type); 859 } 860 else if(ps_rate_control_api->e_rc_type == VBR_STREAMING) 861 { 862 UWORD32 au4_num_pics_in_delay_prd[MAX_PIC_TYPE]; 863 864 irc_get_vsp_num_pics_in_dly_prd( 865 &ps_rate_control_api->s_vbr_str_prms, 866 au4_num_pics_in_delay_prd); 867 868 irc_update_cbr_buffer(ps_rate_control_api->ps_cbr_buffer, 869 i4_total_frame_bits, e_pic_type); 870 871 irc_update_vbr_str_prms(&ps_rate_control_api->s_vbr_str_prms, 872 e_pic_type); 873 874 irc_change_cbr_vbv_num_pics_in_delay_period( 875 ps_rate_control_api->ps_cbr_buffer, 876 au4_num_pics_in_delay_prd); 877 878 /* 879 * If the change_in_peak_bitrate flag is set, after the delay period 880 * update the peak_bitrate and the buffer parameters 881 */ 882 if(!ps_rate_control_api->u4_frms_in_delay_prd_for_peak_bit_rate_change) 883 { 884 irc_ba_change_ba_peak_bit_rate( 885 ps_rate_control_api->ps_bit_allocation, 886 (WORD32 *)&ps_rate_control_api->au4_new_peak_bit_rate[0]); 887 irc_change_cbr_vbv_bit_rate( 888 ps_rate_control_api->ps_cbr_buffer, 889 (WORD32 *)&ps_rate_control_api->au4_new_peak_bit_rate[0]); 890 } 891 if(ps_rate_control_api->u4_frms_in_delay_prd_for_peak_bit_rate_change) 892 ps_rate_control_api->u4_frms_in_delay_prd_for_peak_bit_rate_change--; 893 } 894 895 if(!i4_is_it_a_skip) 896 { 897 /******************************************************************* 898 Handle the SCENE CHANGE DETECTED 899 1) Make the picture type as I, so that updation happens as if it is 900 an I frame 901 2) Reset model, SAD and flag to restart the estimation process 902 ******************************************************************/ 903 if(u1_is_scd) 904 { 905 WORD32 i4_frm_qp_after_scd; 906 UWORD32 u4_prev_I_frm_sad; 907 908 e_pic_type = I_PIC; 909 910 /* Scale scd qp based on SCD Frm sad and previous I Frm sad */ 911 /* frm_qp_after_scd = (avg_qp * cur_frm_sad)/prev_I_frm_sad */ 912 913 /* 914 * QP for the next frame should take care of 915 * 1) due to scene change, the current picture has consumed more 916 * bits 917 * 2) relative complexity of the previous scene and the current 918 * scene 919 */ 920 921 /* Get the intra SAD for the previous scene */ 922 u4_prev_I_frm_sad = irc_get_est_sad( 923 ps_rate_control_api->ps_est_sad, I_PIC); 924 925 /* 926 * Scale the QP based on the SAD ratio of the current pic and 927 * previous scene intra SAD 928 */ 929 X_PROD_Y_DIV_Z(i4_avg_qp, u4_frame_sad, u4_prev_I_frm_sad, 930 i4_frm_qp_after_scd); 931 932 /* Limit the next frame qp by 50% across both the sides */ 933 if(i4_frm_qp_after_scd > ((i4_avg_qp * 3) >> 1)) 934 { 935 i4_frm_qp_after_scd = (i4_avg_qp * 3) >> 1; 936 } 937 else if(i4_frm_qp_after_scd < (i4_avg_qp >> 1)) 938 { 939 i4_frm_qp_after_scd = (i4_avg_qp >> 1); 940 } 941 942 /* 943 * Ensure that the next frame QP is within the min_max limit of 944 * QP allowed 945 */ 946 if(i4_frm_qp_after_scd 947 > ps_rate_control_api->au1_min_max_qp[(e_pic_type 948 << 1) + 1]) 949 { 950 i4_frm_qp_after_scd = 951 ps_rate_control_api->au1_min_max_qp[(e_pic_type 952 << 1) + 1]; 953 } 954 else if(i4_frm_qp_after_scd 955 < ps_rate_control_api->au1_min_max_qp[(e_pic_type 956 << 1)]) 957 { 958 i4_frm_qp_after_scd = 959 ps_rate_control_api->au1_min_max_qp[(e_pic_type 960 << 1)]; 961 } 962 963 /* Update the state var */ 964 ps_rate_control_api->u1_frm_qp_after_scd = 965 (UWORD8)i4_frm_qp_after_scd; 966 967 /* re-set model */ 968 for(i = 0; i < MAX_PIC_TYPE; i++) 969 { 970 irc_reset_frm_rc_rd_model( 971 ps_rate_control_api->aps_rd_model[i]); 972 } 973 974 /* Reset the SAD estimation module */ 975 irc_reset_est_sad(ps_rate_control_api->ps_est_sad); 976 977 /* Reset flag */ 978 for(i = 0; i < MAX_PIC_TYPE; i++) 979 { 980 ps_rate_control_api->au1_is_first_frm_coded[i] = 0; 981 } 982 983 /* Reset the MB Rate control */ 984 irc_init_mb_level_rc(ps_rate_control_api->ps_mb_rate_control); 985 986 /*Set u1_scd_detected flag*/ 987 ps_rate_control_api->u1_scd_detected = 1; 988 989 /* 990 * Adjust the average QP for the frame based on bits 991 * consumption 992 */ 993 /* 994 * Initialize the QP for each picture type according to the 995 * average QP of the SCD pic 996 */ 997 ps_rate_control_api->au1_prev_frm_qp[I_PIC] = (UWORD8)i4_avg_qp; 998 999 trace_printf((const WORD8*)"SCD DETECTED\n"); 1000 } 1001 else 1002 { 1003 ps_rate_control_api->u1_scd_detected = 0; 1004 /************************************************************** 1005 Update the Qp used by the current frame 1006 **************************************************************/ 1007 ps_rate_control_api->au1_prev_frm_qp[e_pic_type] = 1008 (UWORD8)i4_avg_qp; 1009 } 1010 1011 /******************************************************************** 1012 Update the model of the correponding picture type 1013 NOTE: For SCD, we force the frame type from 'P' to that of a 'I' 1014 ******************************************************************/ 1015 /* 1016 * For very simple sequences no bits are consumed by texture. These 1017 * frames do not add any information to the model and so not added 1018 */ 1019 if(i4_tot_texture_bits && u4_frame_sad) 1020 { 1021 irc_add_frame_to_rd_model( 1022 ps_rate_control_api->aps_rd_model[e_pic_type], 1023 i4_tot_texture_bits, (UWORD8)i4_avg_qp, 1024 u4_frame_sad, u1_num_skips); 1025 1026 /* 1027 * At least one proper frame in added into the model. Until that 1028 * keep using the initial QP 1029 */ 1030 ps_rate_control_api->au1_is_first_frm_coded[e_pic_type] = 1; 1031 } 1032 1033 if(i4_avg_activity) 1034 { 1035 /* Update the mb_level model */ 1036 irc_mb_update_frame_level( 1037 ps_rate_control_api->ps_mb_rate_control, 1038 i4_avg_activity); 1039 } 1040 1041 /****************************************************************** 1042 Update the sad estimation module 1043 NOTE: For SCD, we force the frame type from 'P' to that of a 'I' 1044 ******************************************************************/ 1045 if(u4_frame_sad) 1046 { 1047 irc_update_actual_sad(ps_rate_control_api->ps_est_sad, 1048 u4_frame_sad, e_pic_type); 1049 1050 irc_update_actual_sad_for_intra(ps_rate_control_api->ps_est_sad, 1051 i4_intra_frm_cost); 1052 } 1053 1054 /* 1055 * Update the variable which denotes that a frame has been 1056 * encountered 1057 */ 1058 ps_rate_control_api->u1_is_first_frm = 0; 1059 1060 } 1061 } 1062 1063 /* Store the prev encoded picture type for restricting Qp swing */ 1064 if((e_pic_type == I_PIC) || (e_pic_type == P_PIC)) 1065 { 1066 ps_rate_control_api->prev_ref_pic_type = e_pic_type; 1067 } 1068 1069 trace_printf((const WORD8*)"ft %d,hb %d,tb %d,qp %d,fs %d\n", e_pic_type, 1070 i4_model_updation_hdr_bits, i4_tot_texture_bits, i4_avg_qp, 1071 u4_frame_sad); 1072 1073 return; 1074 } 1075 1076 /******************************************************************************* 1077 MB Level API functions 1078 ******************************************************************************/ 1079 1080 /****************************************************************************** 1081 Function Name : irc_init_mb_rc_frame_level 1082 Description : Initialise the frame level details required for a mb level 1083 ******************************************************************************/ 1084 1085 void irc_init_mb_rc_frame_level(rate_control_api_t *ps_rate_control_api, 1086 UWORD8 u1_frame_qp) 1087 { 1088 irc_mb_init_frame_level(ps_rate_control_api->ps_mb_rate_control, 1089 u1_frame_qp); 1090 } 1091 1092 /****************************************************************************** 1093 Function Name : irc_get_mb_level_qp 1094 Description : Get the mb level qp 1095 *****************************************************************************/ 1096 void irc_get_mb_level_qp(rate_control_api_t *ps_rate_control_api, 1097 WORD32 i4_cur_mb_activity, 1098 WORD32 *pi4_mb_qp, 1099 picture_type_e e_pic_type) 1100 { 1101 if(ps_rate_control_api->u1_is_mb_level_rc_on) 1102 { 1103 irc_get_mb_qp(ps_rate_control_api->ps_mb_rate_control, 1104 i4_cur_mb_activity, pi4_mb_qp); 1105 1106 /* Truncating the QP to the Max and Min Qp values possible */ 1107 if(pi4_mb_qp[1] < ps_rate_control_api->au1_min_max_qp[e_pic_type << 1]) 1108 { 1109 pi4_mb_qp[1] = ps_rate_control_api->au1_min_max_qp[e_pic_type << 1]; 1110 } 1111 if(pi4_mb_qp[1] 1112 > ps_rate_control_api->au1_min_max_qp[(e_pic_type << 1) 1113 + 1]) 1114 { 1115 pi4_mb_qp[1] = ps_rate_control_api->au1_min_max_qp[(e_pic_type << 1) 1116 + 1]; 1117 } 1118 } 1119 else 1120 { 1121 WORD32 i4_qp; 1122 i4_qp = irc_get_frm_level_qp(ps_rate_control_api->ps_mb_rate_control); 1123 /* Both the qp are used for */ 1124 pi4_mb_qp[0] = i4_qp; /* Used as feedback for the rate control */ 1125 pi4_mb_qp[1] = i4_qp; /* Used for quantising the MB*/ 1126 } 1127 } 1128 1129 /**************************************************************************** 1130 Function Name : irc_get_bits_to_stuff 1131 Description : Gets the bits to stuff to prevent Underflow of Encoder Buffer 1132 *****************************************************************************/ 1133 WORD32 irc_get_bits_to_stuff(rate_control_api_t *ps_rate_control_api, 1134 WORD32 i4_tot_consumed_bits, 1135 picture_type_e e_pic_type) 1136 { 1137 WORD32 i4_bits_to_stuff; 1138 /* Get the CBR bits to stuff*/ 1139 i4_bits_to_stuff = irc_get_cbr_bits_to_stuff( 1140 ps_rate_control_api->ps_cbr_buffer, i4_tot_consumed_bits, 1141 e_pic_type); 1142 return i4_bits_to_stuff; 1143 } 1144 1145 /**************************************************************************** 1146 Function Name : irc_get_prev_frm_est_bits 1147 Description : Returns previous frame estimated bits 1148 *****************************************************************************/ 1149 WORD32 irc_get_prev_frm_est_bits(rate_control_api_t *ps_rate_control_api) 1150 { 1151 return (ps_rate_control_api->i4_prev_frm_est_bits); 1152 } 1153 1154 /****************************************************************************** 1155 Control Level API functions 1156 Logic: The control call sets the state structure of the rate control api 1157 accordingly such that the next process call would implement the same. 1158 ******************************************************************************/ 1159 1160 void irc_change_inter_frm_int_call(rate_control_api_t *ps_rate_control_api, 1161 WORD32 i4_inter_frm_int) 1162 { 1163 irc_pic_handling_register_new_inter_frm_interval( 1164 ps_rate_control_api->ps_pic_handling, i4_inter_frm_int); 1165 } 1166 1167 void irc_change_intra_frm_int_call(rate_control_api_t *ps_rate_control_api, 1168 WORD32 i4_intra_frm_int) 1169 { 1170 irc_pic_handling_register_new_int_frm_interval( 1171 ps_rate_control_api->ps_pic_handling, i4_intra_frm_int); 1172 1173 if(ps_rate_control_api->e_rc_type == VBR_STREAMING) 1174 { 1175 irc_change_vsp_ifi(&ps_rate_control_api->s_vbr_str_prms, 1176 i4_intra_frm_int); 1177 } 1178 } 1179 1180 /**************************************************************************** 1181 Function Name : irc_change_avg_bit_rate 1182 Description : Whenever the average bit rate changes, the excess bits is 1183 between the changed bit rate and the old one is re-distributed 1184 in the bit allocation module 1185 *****************************************************************************/ 1186 void irc_change_avg_bit_rate(rate_control_api_t *ps_rate_control_api, 1187 UWORD32 u4_average_bit_rate) 1188 { 1189 int i; 1190 if(ps_rate_control_api->e_rc_type != CONST_QP) 1191 { 1192 /* 1193 * Bit Allocation Module: distribute the excess/deficit bits between the 1194 * old and the new frame rate to all the remaining frames 1195 */ 1196 irc_ba_change_remaining_bits_in_period( 1197 ps_rate_control_api->ps_bit_allocation, 1198 ps_rate_control_api->ps_pic_handling, 1199 u4_average_bit_rate, 1200 irc_ba_get_frame_rate( 1201 ps_rate_control_api->ps_bit_allocation), 1202 (WORD32 *)(ps_rate_control_api->au4_new_peak_bit_rate)); 1203 } 1204 if(ps_rate_control_api->e_rc_type == CBR_NLDRC) 1205 { 1206 UWORD32 u4_average_bit_rate_copy[MAX_NUM_DRAIN_RATES]; 1207 for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) 1208 { 1209 u4_average_bit_rate_copy[i] = u4_average_bit_rate; 1210 } 1211 irc_change_cbr_vbv_bit_rate(ps_rate_control_api->ps_cbr_buffer, 1212 (WORD32 *)(u4_average_bit_rate_copy)); 1213 } 1214 1215 /* 1216 * This is done only for average bitrate changing somewhere after the model 1217 * stabilizes.Here it is assumed that user will not do this call after 1218 * first few frames. If we dont have this check, what would happen is since 1219 * the model has not stabilized, also bitrate has changed before the first 1220 * frame, we dont restrict the qp. Qp can go to very bad values after init 1221 * qp since if swing is disabled. 1222 * This check will become buggy if change bitrate is called say somewhere 1223 * after first two frames.Bottom line - RC init is done during create and 1224 * this call is done just before first process.And we want to differentiate 1225 * between this call done before first process and the call which is done 1226 * during run time 1227 */ 1228 if(ps_rate_control_api->u1_is_first_frm == 0) 1229 { 1230 for(i = 0; i < MAX_PIC_TYPE; i++) 1231 { 1232 ps_rate_control_api->au1_avg_bitrate_changed[i] = 1; 1233 } 1234 } 1235 } 1236 1237 /**************************************************************************** 1238 Function Name : irc_change_frame_rate 1239 Description : Does the necessary changes whenever there is a change in 1240 frame rate 1241 *****************************************************************************/ 1242 void irc_change_frame_rate(rate_control_api_t *ps_rate_control_api, 1243 UWORD32 u4_frame_rate, 1244 UWORD32 u4_src_ticks, 1245 UWORD32 u4_tgt_ticks) 1246 { 1247 1248 if(ps_rate_control_api->e_rc_type != CONST_QP) 1249 { 1250 UWORD32 u4_frms_in_delay_prd = ((u4_frame_rate 1251 * irc_get_cbr_buffer_delay( 1252 ps_rate_control_api->ps_cbr_buffer)) 1253 / 1000000); 1254 if((ps_rate_control_api->e_rc_type == VBR_STORAGE) 1255 || (ps_rate_control_api->e_rc_type 1256 == VBR_STORAGE_DVD_COMP)) 1257 { 1258 irc_change_vbr_vbv_frame_rate( 1259 ps_rate_control_api->ps_vbr_storage_vbv, 1260 u4_frame_rate); 1261 } 1262 else if(ps_rate_control_api->e_rc_type == CBR_NLDRC) 1263 { 1264 irc_change_cbr_vbv_tgt_frame_rate( 1265 ps_rate_control_api->ps_cbr_buffer, u4_frame_rate); 1266 } 1267 else if(ps_rate_control_api->e_rc_type == VBR_STREAMING) 1268 { 1269 UWORD32 au4_num_pics_in_delay_prd[MAX_PIC_TYPE]; 1270 irc_change_vsp_tgt_ticks(&ps_rate_control_api->s_vbr_str_prms, 1271 u4_tgt_ticks); 1272 irc_change_vsp_src_ticks(&ps_rate_control_api->s_vbr_str_prms, 1273 u4_src_ticks); 1274 irc_change_vsp_fidp(&ps_rate_control_api->s_vbr_str_prms, 1275 u4_frms_in_delay_prd); 1276 1277 irc_get_vsp_num_pics_in_dly_prd( 1278 &ps_rate_control_api->s_vbr_str_prms, 1279 au4_num_pics_in_delay_prd); 1280 irc_change_cbr_vbv_tgt_frame_rate( 1281 ps_rate_control_api->ps_cbr_buffer, u4_frame_rate); 1282 irc_change_cbr_vbv_num_pics_in_delay_period( 1283 ps_rate_control_api->ps_cbr_buffer, 1284 au4_num_pics_in_delay_prd); 1285 } 1286 1287 /* 1288 * Bit Allocation Module: distribute the excess/deficit bits between the 1289 * old and the new frame rate to all the remaining frames 1290 */ 1291 irc_ba_change_remaining_bits_in_period( 1292 ps_rate_control_api->ps_bit_allocation, 1293 ps_rate_control_api->ps_pic_handling, 1294 irc_ba_get_bit_rate( 1295 ps_rate_control_api->ps_bit_allocation), 1296 u4_frame_rate, 1297 (WORD32 *)(ps_rate_control_api->au4_new_peak_bit_rate)); 1298 } 1299 } 1300 1301 /**************************************************************************** 1302 Function Name : irc_change_frm_rate_for_bit_alloc 1303 Description : Does the necessary changes only in the bit_allocation module 1304 there is a change in frame rate 1305 *****************************************************************************/ 1306 void irc_change_frm_rate_for_bit_alloc(rate_control_api_t *ps_rate_control_api, 1307 UWORD32 u4_frame_rate) 1308 { 1309 1310 if(ps_rate_control_api->e_rc_type != CONST_QP) 1311 { 1312 /* 1313 * Bit Allocation Module: distribute the excess/deficit bits between the 1314 * old and the new frame rate to all the remaining frames 1315 */ 1316 irc_ba_change_remaining_bits_in_period( 1317 ps_rate_control_api->ps_bit_allocation, 1318 ps_rate_control_api->ps_pic_handling, 1319 irc_ba_get_bit_rate( 1320 ps_rate_control_api->ps_bit_allocation), 1321 u4_frame_rate, 1322 (WORD32 *)(ps_rate_control_api->au4_new_peak_bit_rate)); 1323 1324 if(ps_rate_control_api->e_rc_type == VBR_STORAGE 1325 || ps_rate_control_api->e_rc_type 1326 == VBR_STORAGE_DVD_COMP) 1327 { 1328 irc_change_vbr_max_bits_per_tgt_frm( 1329 ps_rate_control_api->ps_vbr_storage_vbv, 1330 u4_frame_rate); 1331 } 1332 } 1333 } 1334 1335 void irc_change_init_qp(rate_control_api_t *ps_rate_control_api, 1336 UWORD8 *pu1_init_qp) 1337 { 1338 WORD32 i; 1339 /* Initialize the init_qp */ 1340 for(i = 0; i < MAX_PIC_TYPE; i++) 1341 { 1342 ps_rate_control_api->au1_init_qp[i] = pu1_init_qp[i]; 1343 ps_rate_control_api->au1_prev_frm_qp[i] = pu1_init_qp[i]; 1344 } 1345 } 1346 1347 void irc_change_min_max_qp(rate_control_api_t *ps_rate_control_api, 1348 UWORD8 *pu1_min_max_qp) 1349 { 1350 WORD32 i; 1351 for(i = 0; i < MAX_PIC_TYPE; i++) 1352 { 1353 ps_rate_control_api->au1_min_max_qp[(i << 1)] = 1354 pu1_min_max_qp[(i << 1)]; 1355 ps_rate_control_api->au1_min_max_qp[(i << 1) + 1] = pu1_min_max_qp[(i 1356 << 1) + 1]; 1357 } 1358 } 1359 1360 /**************************************************************************** 1361 Function Name : irc_change_peak_bit_rate 1362 Description : Does the necessary changes whenever there is a change in 1363 peak bit rate 1364 *****************************************************************************/ 1365 WORD32 irc_change_peak_bit_rate(rate_control_api_t *ps_rate_control_api, 1366 UWORD32 *pu4_peak_bit_rate) 1367 { 1368 WORD32 i4_ret_val = RC_OK; 1369 int i; 1370 1371 /* 1372 * Buffer Mechanism Module: Re-initialize the number of bits consumed per 1373 * frame 1374 */ 1375 if(ps_rate_control_api->e_rc_type == VBR_STORAGE 1376 || ps_rate_control_api->e_rc_type == VBR_STORAGE_DVD_COMP) 1377 { 1378 /* Send the new peak bit rate and the old frame rate */ 1379 irc_change_vbr_vbv_bit_rate(ps_rate_control_api->ps_vbr_storage_vbv, 1380 pu4_peak_bit_rate[0]); 1381 irc_ba_change_ba_peak_bit_rate(ps_rate_control_api->ps_bit_allocation, 1382 (WORD32 *)pu4_peak_bit_rate); 1383 1384 for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) 1385 { 1386 ps_rate_control_api->au4_new_peak_bit_rate[i] = 1387 pu4_peak_bit_rate[i]; 1388 } 1389 } 1390 else if(ps_rate_control_api->e_rc_type == VBR_STREAMING) 1391 { 1392 if(ps_rate_control_api->u4_frms_in_delay_prd_for_peak_bit_rate_change) 1393 { 1394 /* 1395 * Means that change in peak bit rate has been made twice before the 1396 * previous change could take effect 1397 */ 1398 i4_ret_val = RC_BENIGN_ERR; 1399 } 1400 /* 1401 * If the change happens before encoding the first frame make the 1402 * effect immediately else delay the effect 1403 */ 1404 if(ps_rate_control_api->u1_is_first_frm) 1405 { 1406 for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) 1407 { 1408 ps_rate_control_api->au4_new_peak_bit_rate[i] = 1409 pu4_peak_bit_rate[i]; 1410 } 1411 irc_ba_change_ba_peak_bit_rate( 1412 ps_rate_control_api->ps_bit_allocation, 1413 (WORD32 *)pu4_peak_bit_rate); 1414 irc_change_cbr_vbv_bit_rate(ps_rate_control_api->ps_cbr_buffer, 1415 (WORD32 *)pu4_peak_bit_rate); 1416 } 1417 else 1418 { 1419 UWORD32 au4_num_pics_in_delay_prd[MAX_NUM_DRAIN_RATES]; 1420 /* 1421 * Else store the number of frames after which the effect should 1422 * happen and then update the peak bitrate 1423 */ 1424 ps_rate_control_api->u4_frms_in_delay_prd_for_peak_bit_rate_change = 1425 irc_get_vsp_num_pics_in_dly_prd( 1426 &ps_rate_control_api->s_vbr_str_prms, 1427 au4_num_pics_in_delay_prd); 1428 for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) 1429 { 1430 ps_rate_control_api->au4_new_peak_bit_rate[i] = 1431 pu4_peak_bit_rate[i]; 1432 } 1433 } 1434 } 1435 1436 return (i4_ret_val); 1437 } 1438 1439 void irc_change_buffer_delay(rate_control_api_t *ps_rate_control_api, 1440 UWORD32 u4_buffer_delay) 1441 { 1442 UWORD32 u4_frms_in_delay_prd = ((irc_ba_get_frame_rate( 1443 ps_rate_control_api->ps_bit_allocation) * u4_buffer_delay) 1444 / 1000000); 1445 1446 /* Initialize the rate control modules */ 1447 if(ps_rate_control_api->e_rc_type == CBR_NLDRC) 1448 { 1449 irc_change_cbr_buffer_delay(ps_rate_control_api->ps_cbr_buffer, 1450 u4_buffer_delay); 1451 } 1452 else if(ps_rate_control_api->e_rc_type == VBR_STORAGE 1453 || ps_rate_control_api->e_rc_type == VBR_STORAGE_DVD_COMP) 1454 { 1455 UWORD32 au4_num_pics_in_delay_prd[MAX_PIC_TYPE]; 1456 1457 irc_change_vsp_fidp(&ps_rate_control_api->s_vbr_str_prms, 1458 u4_frms_in_delay_prd); 1459 1460 /* Get the number of pics of each type in delay period */ 1461 irc_get_vsp_num_pics_in_dly_prd(&ps_rate_control_api->s_vbr_str_prms, 1462 au4_num_pics_in_delay_prd); 1463 1464 irc_change_cbr_vbv_num_pics_in_delay_period( 1465 ps_rate_control_api->ps_cbr_buffer, 1466 au4_num_pics_in_delay_prd); 1467 } 1468 } 1469 1470 /* Getter functions to get the current rate control parameters */ 1471 UWORD32 irc_get_frame_rate(rate_control_api_t *ps_rate_control_api) 1472 { 1473 return (irc_ba_get_frame_rate(ps_rate_control_api->ps_bit_allocation)); 1474 } 1475 1476 UWORD32 irc_get_bit_rate(rate_control_api_t *ps_rate_control_api) 1477 { 1478 return (irc_ba_get_bit_rate(ps_rate_control_api->ps_bit_allocation)); 1479 } 1480 1481 UWORD32 irc_get_peak_bit_rate(rate_control_api_t *ps_rate_control_api, 1482 WORD32 i4_index) 1483 { 1484 return (ps_rate_control_api->au4_new_peak_bit_rate[i4_index]); 1485 } 1486 1487 UWORD32 irc_get_intra_frame_interval(rate_control_api_t *ps_rate_control_api) 1488 { 1489 return (irc_pic_type_get_intra_frame_interval( 1490 ps_rate_control_api->ps_pic_handling)); 1491 } 1492 1493 UWORD32 irc_get_inter_frame_interval(rate_control_api_t *ps_rate_control_api) 1494 { 1495 return (irc_pic_type_get_inter_frame_interval( 1496 ps_rate_control_api->ps_pic_handling)); 1497 } 1498 1499 rc_type_e irc_get_rc_type(rate_control_api_t *ps_rate_control_api) 1500 { 1501 return (ps_rate_control_api->e_rc_type); 1502 } 1503 1504 WORD32 irc_get_bits_per_frame(rate_control_api_t *ps_rate_control_api) 1505 { 1506 WORD32 i4_bits_per_frm; 1507 1508 X_PROD_Y_DIV_Z(irc_ba_get_bit_rate(ps_rate_control_api->ps_bit_allocation), 1509 (UWORD32)1000, 1510 irc_ba_get_frame_rate(ps_rate_control_api->ps_bit_allocation), 1511 i4_bits_per_frm); 1512 1513 return (i4_bits_per_frm); 1514 } 1515 1516 UWORD32 irc_get_max_delay(rate_control_api_t *ps_rate_control_api) 1517 { 1518 return (irc_get_cbr_buffer_delay(ps_rate_control_api->ps_cbr_buffer)); 1519 } 1520 1521 UWORD32 irc_get_seq_no(rate_control_api_t *ps_rate_control_api) 1522 { 1523 return (irc_pic_type_get_disp_order_no(ps_rate_control_api->ps_pic_handling)); 1524 } 1525 1526 UWORD32 irc_get_rem_frames_in_gop(rate_control_api_t *ps_rate_control_api) 1527 { 1528 WORD32 ai4_rem_frms_in_period[MAX_PIC_TYPE]; 1529 WORD32 j; 1530 UWORD32 u4_rem_frms_in_period = 0; 1531 1532 /* Get the rem_frms_in_gop & the frms_in_gop from the pic_type state struct */ 1533 irc_pic_type_get_rem_frms_in_gop(ps_rate_control_api->ps_pic_handling, 1534 ai4_rem_frms_in_period); 1535 1536 /* Depending on the number of gops in a period, find the num_frms_in_prd */ 1537 for(j = 0; j < MAX_PIC_TYPE; j++) 1538 { 1539 u4_rem_frms_in_period += ai4_rem_frms_in_period[j]; 1540 } 1541 1542 return (u4_rem_frms_in_period); 1543 } 1544 1545 /**************************************************************************** 1546 Function Name : irc_flush_buf_frames 1547 Description : API call to flush the buffered up frames 1548 *****************************************************************************/ 1549 void irc_flush_buf_frames(rate_control_api_t *ps_rate_control_api) 1550 { 1551 irc_flush_frame_from_pic_stack(ps_rate_control_api->ps_pic_handling); 1552 } 1553 1554 /**************************************************************************** 1555 Function Name : irc_flush_buf_frames 1556 Description : API call to flush the buffered up frames 1557 *****************************************************************************/ 1558 1559 void irc_post_encode_frame_skip(rate_control_api_t *ps_rate_control_api, 1560 picture_type_e e_pic_type) 1561 { 1562 irc_skip_encoded_frame(ps_rate_control_api->ps_pic_handling, e_pic_type); 1563 } 1564 1565 /**************************************************************************** 1566 Function Name : irc_force_I_frame 1567 Description : API call to force an I frame 1568 *****************************************************************************/ 1569 void irc_force_I_frame(rate_control_api_t *ps_rate_control_api) 1570 { 1571 irc_set_force_I_frame_flag(ps_rate_control_api->ps_pic_handling); 1572 } 1573 1574 /**************************************************************************** 1575 * Function Name : rc_get_rem_bits_in_gop 1576 * Description : API call to get remaining bits in GOP 1577 * *****************************************************************************/ 1578 WORD32 irc_get_rem_bits_in_period(rate_control_api_t *ps_rate_control_api) 1579 { 1580 return (irc_ba_get_rem_bits_in_period( 1581 ps_rate_control_api->ps_bit_allocation, 1582 ps_rate_control_api->ps_pic_handling)); 1583 } 1584 1585 /**************************************************************************** 1586 * Function Name : irc_get_vbv_buf_fullness 1587 * Description : API call to get VBV buffer fullness 1588 ******************************************************************************/ 1589 WORD32 irc_get_vbv_buf_fullness(rate_control_api_t *ps_rate_control_api) 1590 { 1591 return (irc_get_cur_vbv_buf_size(ps_rate_control_api->ps_vbr_storage_vbv)); 1592 } 1593 1594 WORD32 irc_get_vbv_buf_size(rate_control_api_t *ps_rate_control_api) 1595 { 1596 if(ps_rate_control_api->e_rc_type == CBR_NLDRC 1597 || ps_rate_control_api->e_rc_type == VBR_STREAMING) 1598 { 1599 return (irc_get_cbr_buffer_size(ps_rate_control_api->ps_cbr_buffer)); 1600 } 1601 else 1602 { 1603 return (irc_get_max_vbv_buf_size( 1604 ps_rate_control_api->ps_vbr_storage_vbv)); 1605 } 1606 } 1607 1608 WORD32 irc_get_vbv_fulness_with_cur_bits(rate_control_api_t *ps_rate_control_api, 1609 UWORD32 u4_bits) 1610 { 1611 return (irc_vbv_get_vbv_buf_fullness( 1612 ps_rate_control_api->ps_vbr_storage_vbv, u4_bits)); 1613 } 1614 1615 void irc_set_avg_mb_act(rate_control_api_t *ps_rate_control_api, 1616 WORD32 i4_avg_activity) 1617 { 1618 irc_mb_update_frame_level(ps_rate_control_api->ps_mb_rate_control, 1619 i4_avg_activity); 1620 return; 1621 } 1622