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 /* File Includes */ 23 /*****************************************************************************/ 24 25 /* System include files */ 26 #include <stdio.h> 27 28 /* User include files */ 29 #include "irc_datatypes.h" 30 #include "irc_cntrl_param.h" 31 #include "irc_common.h" 32 #include "irc_mem_req_and_acq.h" 33 #include "irc_fixed_point_error_bits.h" 34 #include "irc_cbr_buffer_control.h" 35 #include "irc_trace_support.h" 36 37 typedef struct cbr_buffer_t 38 { 39 /* Buffer size = Delay * Bitrate*/ 40 WORD32 i4_buffer_size; 41 42 /* Constant drain rate */ 43 WORD32 i4_drain_bits_per_frame[MAX_NUM_DRAIN_RATES]; 44 45 /* Encoder Buffer Fullness */ 46 WORD32 i4_ebf; 47 48 /* Upper threshold of the Buffer */ 49 WORD32 i4_upr_thr[MAX_PIC_TYPE]; 50 51 /* Lower threshold of the Buffer */ 52 WORD32 i4_low_thr[MAX_PIC_TYPE]; 53 54 /* Stuffing threshold equal to error bits per second in the drain bits 55 * fixed point computation */ 56 WORD32 i4_stuffing_threshold; 57 58 /* For error due to bits per frame calculation */ 59 error_bits_handle aps_bpf_error_bits[MAX_NUM_DRAIN_RATES]; 60 61 /* Whether the buffer model is used for CBR or VBR streaming */ 62 WORD32 i4_is_cbr_mode; 63 64 /* Input parameters stored for initialization */ 65 WORD32 ai4_bit_rate[MAX_NUM_DRAIN_RATES]; 66 67 WORD32 i4_max_delay; 68 69 WORD32 ai4_num_pics_in_delay_period[MAX_PIC_TYPE]; 70 71 WORD32 i4_tgt_frm_rate; 72 73 UWORD32 u4_max_vbv_buf_size; 74 75 } cbr_buffer_t; 76 77 WORD32 irc_cbr_buffer_num_fill_use_free_memtab(cbr_buffer_t **pps_cbr_buffer, 78 itt_memtab_t *ps_memtab, 79 ITT_FUNC_TYPE_E e_func_type) 80 { 81 WORD32 i4_mem_tab_idx = 0, i; 82 cbr_buffer_t s_cbr_buffer_temp; 83 84 /* 85 * Hack for all alloc, during which we don't have any state memory. 86 * Dereferencing can cause issues 87 */ 88 if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB) 89 (*pps_cbr_buffer) = &s_cbr_buffer_temp; 90 91 if(e_func_type != GET_NUM_MEMTAB) 92 { 93 fill_memtab(&ps_memtab[i4_mem_tab_idx], sizeof(cbr_buffer_t), 94 ALIGN_128_BYTE, PERSISTENT, DDR); 95 use_or_fill_base(&ps_memtab[0], (void**)pps_cbr_buffer, e_func_type); 96 } 97 i4_mem_tab_idx++; 98 99 for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) 100 { 101 i4_mem_tab_idx += irc_error_bits_num_fill_use_free_memtab( 102 &pps_cbr_buffer[0]->aps_bpf_error_bits[i], 103 &ps_memtab[i4_mem_tab_idx], e_func_type); 104 } 105 return (i4_mem_tab_idx); 106 } 107 108 /****************************************************************************** 109 * @brief Initialize the CBR VBV buffer state. 110 * This could however be used for VBR streaming VBV also 111 * 112 ******************************************************************************/ 113 void irc_init_cbr_buffer(cbr_buffer_t *ps_cbr_buffer, 114 WORD32 i4_buffer_delay, 115 WORD32 i4_tgt_frm_rate, 116 WORD32 *i4_bit_rate, 117 UWORD32 *u4_num_pics_in_delay_prd, 118 UWORD32 u4_vbv_buf_size) 119 { 120 WORD32 i4_i, i4_bits_per_frm[MAX_NUM_DRAIN_RATES]; 121 int i; 122 123 for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) 124 { 125 X_PROD_Y_DIV_Z(i4_bit_rate[i], 1000, i4_tgt_frm_rate, 126 i4_bits_per_frm[i]); 127 /* Drain rate = bitrate/(framerate/1000) */ 128 ps_cbr_buffer->i4_drain_bits_per_frame[i] = i4_bits_per_frm[i]; 129 /* Initialize the bits per frame error bits calculation */ 130 irc_init_error_bits(ps_cbr_buffer->aps_bpf_error_bits[i], 131 i4_tgt_frm_rate, i4_bit_rate[i]); 132 } 133 134 /* Bitrate * delay = buffer size, divide by 1000 as delay is in ms*/ 135 /* This would mean CBR mode */ 136 if(i4_bit_rate[0] == i4_bit_rate[1]) 137 { 138 X_PROD_Y_DIV_Z(i4_bit_rate[0], i4_buffer_delay, 1000, 139 ps_cbr_buffer->i4_buffer_size); 140 ps_cbr_buffer->i4_is_cbr_mode = 1; 141 } 142 else 143 { 144 /* VBR streaming case which has different drain rates for I and P */ 145 ps_cbr_buffer->i4_buffer_size = u4_num_pics_in_delay_prd[0] 146 * ps_cbr_buffer->i4_drain_bits_per_frame[0] 147 + u4_num_pics_in_delay_prd[1] 148 * ps_cbr_buffer->i4_drain_bits_per_frame[1]; 149 150 ps_cbr_buffer->i4_is_cbr_mode = 0; 151 } 152 153 if(ps_cbr_buffer->i4_buffer_size > (WORD32)u4_vbv_buf_size) 154 { 155 ps_cbr_buffer->i4_buffer_size = u4_vbv_buf_size; 156 } 157 158 /* Initially Encoder buffer fullness is zero */ 159 ps_cbr_buffer->i4_ebf = 0; 160 161 /* tgt_frame_rate is divided by 1000 because, an approximate value is fine 162 * as this is just a threshold below which stuffing is done to avoid buffer 163 * underflow due to fixed point error in drain rate 164 */ 165 ps_cbr_buffer->i4_stuffing_threshold = (i4_bit_rate[0] 166 - (i4_bits_per_frm[0] * (i4_tgt_frm_rate / 1000))); 167 168 for(i4_i = 0; i4_i < MAX_PIC_TYPE; i4_i++) 169 { 170 /* 171 * Upper threshold for 172 * I frame = 1 * bits per frame 173 * P Frame = 4 * bits per frame. 174 * The threshold for I frame is only 1 * bits per frame as the threshold 175 * should only account for error in estimated bits. 176 * In P frame it should account for difference bets bits consumed by 177 * I(Scene change) and P frame I to P complexity is assumed to be 5. 178 */ 179 WORD32 i4_index; 180 i4_index = i4_i > 0 ? 1 : 0; 181 ps_cbr_buffer->i4_upr_thr[i4_i] = ps_cbr_buffer->i4_buffer_size 182 - (ps_cbr_buffer->i4_buffer_size >> 3); 183 184 /* 185 * For both I and P frame Lower threshold is equal to drain rate.Even if 186 * the encoder consumes zero bits it should have enough bits to drain 187 */ 188 ps_cbr_buffer->i4_low_thr[i4_i] = i4_bits_per_frm[i4_index]; 189 } 190 191 /* Storing the input parameters for using it for change functions */ 192 for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) 193 { 194 ps_cbr_buffer->ai4_bit_rate[i] = i4_bit_rate[i]; 195 } 196 197 for(i = 0; i < MAX_PIC_TYPE; i++) 198 { 199 ps_cbr_buffer->ai4_num_pics_in_delay_period[i] = 200 u4_num_pics_in_delay_prd[i]; 201 } 202 ps_cbr_buffer->i4_tgt_frm_rate = i4_tgt_frm_rate; 203 ps_cbr_buffer->i4_max_delay = i4_buffer_delay; 204 ps_cbr_buffer->u4_max_vbv_buf_size = u4_vbv_buf_size; 205 } 206 207 /****************************************************************************** 208 * @brief Condition check for constraining the number of bits allocated based on 209 * bufer size 210 ******************************************************************************/ 211 WORD32 irc_cbr_buffer_constraint_check(cbr_buffer_t *ps_cbr_buffer, 212 WORD32 i4_tgt_bits, 213 picture_type_e e_pic_type) 214 { 215 WORD32 i4_max_tgt_bits, i4_min_tgt_bits; 216 WORD32 i4_drain_bits_per_frame = (e_pic_type == I_PIC) ? 217 ps_cbr_buffer->i4_drain_bits_per_frame[0] : 218 ps_cbr_buffer->i4_drain_bits_per_frame[1]; 219 220 /* Max tgt bits = Upper threshold - current encoder buffer fullness */ 221 i4_max_tgt_bits = ps_cbr_buffer->i4_upr_thr[e_pic_type] 222 - ps_cbr_buffer->i4_ebf; 223 /* Max tgt bits cannot be negative */ 224 if(i4_max_tgt_bits < 0) 225 i4_max_tgt_bits = 0; 226 227 /* 228 * Min tgt bits , least number of bits in the Encoder after 229 * draining such that it is greater than lower threshold 230 */ 231 i4_min_tgt_bits = ps_cbr_buffer->i4_low_thr[e_pic_type] 232 - (ps_cbr_buffer->i4_ebf - i4_drain_bits_per_frame); 233 /* Min tgt bits cannot be negative */ 234 if(i4_min_tgt_bits < 0) 235 i4_min_tgt_bits = 0; 236 237 /* Current tgt bits should be between max and min tgt bits */ 238 CLIP(i4_tgt_bits, i4_max_tgt_bits, i4_min_tgt_bits); 239 return i4_tgt_bits; 240 } 241 242 /* ***************************************************************************** 243 * @brief constaints the bit allocation based on buffer size 244 * 245 ******************************************************************************/ 246 WORD32 irc_vbr_stream_buffer_constraint_check(cbr_buffer_t *ps_cbr_buffer, 247 WORD32 i4_tgt_bits, 248 picture_type_e e_pic_type) 249 { 250 WORD32 i4_max_tgt_bits; 251 252 /* Max tgt bits = Upper threshold - current encoder buffer fullness */ 253 i4_max_tgt_bits = ps_cbr_buffer->i4_upr_thr[e_pic_type] 254 - ps_cbr_buffer->i4_ebf; 255 256 /* Max tgt bits cannot be negative */ 257 if(i4_max_tgt_bits < 0) 258 i4_max_tgt_bits = 0; 259 260 if(i4_tgt_bits > i4_max_tgt_bits) 261 i4_tgt_bits = i4_max_tgt_bits; 262 263 return i4_tgt_bits; 264 } 265 266 /* ***************************************************************************** 267 * @brief Verifies the buffer state and returns whether it is overflowing, 268 * underflowing or normal 269 * 270 ******************************************************************************/ 271 vbv_buf_status_e irc_get_cbr_buffer_status(cbr_buffer_t *ps_cbr_buffer, 272 WORD32 i4_tot_consumed_bits, 273 WORD32 *pi4_num_bits_to_prevent_overflow, 274 picture_type_e e_pic_type) 275 { 276 vbv_buf_status_e e_buf_status; 277 WORD32 i4_cur_enc_buf; 278 WORD32 i4_error_bits = (e_pic_type == I_PIC) ? 279 irc_get_error_bits(ps_cbr_buffer 280 ->aps_bpf_error_bits[0]) : 281 irc_get_error_bits(ps_cbr_buffer 282 ->aps_bpf_error_bits[1]); 283 284 WORD32 i4_drain_bits_per_frame = (e_pic_type == I_PIC) ? 285 ps_cbr_buffer->i4_drain_bits_per_frame[0] : 286 ps_cbr_buffer->i4_drain_bits_per_frame[1]; 287 288 /* Add the tot consumed bits to the Encoder Buffer*/ 289 i4_cur_enc_buf = ps_cbr_buffer->i4_ebf + i4_tot_consumed_bits; 290 291 /* If the Encoder exceeds the Buffer Size signal an Overflow*/ 292 if(i4_cur_enc_buf > ps_cbr_buffer->i4_buffer_size) 293 { 294 e_buf_status = VBV_OVERFLOW; 295 i4_cur_enc_buf = ps_cbr_buffer->i4_buffer_size; 296 } 297 else 298 { 299 /* 300 * Subtract the constant drain bits and error bits due to fixed point 301 * implementation 302 */ 303 i4_cur_enc_buf -= (i4_drain_bits_per_frame + i4_error_bits); 304 305 /* 306 * If the buffer is less than stuffing threshold an Underflow is 307 * signaled else its NORMAL 308 */ 309 if(i4_cur_enc_buf < ps_cbr_buffer->i4_stuffing_threshold) 310 { 311 e_buf_status = VBV_UNDERFLOW; 312 } 313 else 314 { 315 e_buf_status = VBV_NORMAL; 316 } 317 318 if(i4_cur_enc_buf < 0) 319 i4_cur_enc_buf = 0; 320 } 321 322 /* 323 * The RC lib models the encoder buffer, but the VBV buffer characterizes 324 * the decoder buffer 325 */ 326 if(e_buf_status == VBV_OVERFLOW) 327 { 328 e_buf_status = VBV_UNDERFLOW; 329 } 330 else if(e_buf_status == VBV_UNDERFLOW) 331 { 332 e_buf_status = VBV_OVERFLOW; 333 } 334 335 pi4_num_bits_to_prevent_overflow[0] = (ps_cbr_buffer->i4_buffer_size 336 - i4_cur_enc_buf); 337 338 return e_buf_status; 339 } 340 341 /******************************************************************************* 342 * @brief Based on the bits consumed the buffer model is updated 343 ******************************************************************************/ 344 void irc_update_cbr_buffer(cbr_buffer_t *ps_cbr_buffer, 345 WORD32 i4_tot_consumed_bits, 346 picture_type_e e_pic_type) 347 { 348 WORD32 i4_error_bits = (e_pic_type == I_PIC) ? 349 irc_get_error_bits(ps_cbr_buffer-> 350 aps_bpf_error_bits[0]) : 351 irc_get_error_bits( ps_cbr_buffer-> 352 aps_bpf_error_bits[1]); 353 354 WORD32 i4_drain_bits_per_frame = (e_pic_type == I_PIC) ? 355 ps_cbr_buffer->i4_drain_bits_per_frame[0] : 356 ps_cbr_buffer->i4_drain_bits_per_frame[1]; 357 358 /* Update the Encoder buffer with the total consumed bits*/ 359 ps_cbr_buffer->i4_ebf += i4_tot_consumed_bits; 360 361 /* 362 * Subtract the drain bits and error bits due to fixed point 363 * implementation 364 */ 365 ps_cbr_buffer->i4_ebf -= (i4_drain_bits_per_frame + i4_error_bits); 366 367 if(ps_cbr_buffer->i4_ebf < 0) 368 ps_cbr_buffer->i4_ebf = 0; 369 370 /*SS - Fix for lack of stuffing*/ 371 if(ps_cbr_buffer->i4_ebf > ps_cbr_buffer->i4_buffer_size) 372 { 373 trace_printf( 374 (const WORD8*)"Error: Should not be coming here with stuffing\n"); 375 ps_cbr_buffer->i4_ebf = ps_cbr_buffer->i4_buffer_size; 376 } 377 } 378 379 /******************************************************************************* 380 * @brief If the buffer underflows then return the number of bits to prevent 381 * underflow 382 * 383 ******************************************************************************/ 384 WORD32 irc_get_cbr_bits_to_stuff(cbr_buffer_t *ps_cbr_buffer, 385 WORD32 i4_tot_consumed_bits, 386 picture_type_e e_pic_type) 387 { 388 WORD32 i4_bits_to_stuff; 389 WORD32 i4_error_bits = (e_pic_type == I_PIC) ? 390 irc_get_error_bits(ps_cbr_buffer 391 ->aps_bpf_error_bits[0]) : 392 irc_get_error_bits(ps_cbr_buffer 393 ->aps_bpf_error_bits[1]); 394 395 WORD32 i4_drain_bits_per_frame = (e_pic_type == I_PIC) ? 396 ps_cbr_buffer->i4_drain_bits_per_frame[0] : 397 ps_cbr_buffer->i4_drain_bits_per_frame[1]; 398 399 /* 400 * Stuffing bits got from the following equation 401 * Stuffing_threshold = ebf + tcb - drain bits - error bits + stuff_bits 402 */ 403 i4_bits_to_stuff = i4_drain_bits_per_frame + i4_error_bits 404 + ps_cbr_buffer->i4_stuffing_threshold 405 - (ps_cbr_buffer->i4_ebf + i4_tot_consumed_bits); 406 407 return i4_bits_to_stuff; 408 } 409 410 /******************************************************************************* 411 * @brief Update the state for change in number of pics in the delay period 412 * 413 ******************************************************************************/ 414 void irc_change_cbr_vbv_num_pics_in_delay_period(cbr_buffer_t *ps_cbr_buffer, 415 UWORD32 *u4_num_pics_in_delay_prd) 416 { 417 WORD32 i; 418 419 if(!ps_cbr_buffer->i4_is_cbr_mode) 420 { 421 ps_cbr_buffer->i4_buffer_size = 422 u4_num_pics_in_delay_prd[0] 423 * ps_cbr_buffer->i4_drain_bits_per_frame[0] 424 + u4_num_pics_in_delay_prd[1] 425 * ps_cbr_buffer->i4_drain_bits_per_frame[1]; 426 427 if(ps_cbr_buffer->i4_buffer_size 428 > (WORD32)ps_cbr_buffer->u4_max_vbv_buf_size) 429 { 430 ps_cbr_buffer->i4_buffer_size = ps_cbr_buffer->u4_max_vbv_buf_size; 431 } 432 for(i = 0; i < MAX_PIC_TYPE; i++) 433 { 434 ps_cbr_buffer->i4_upr_thr[i] = ps_cbr_buffer->i4_buffer_size 435 - (ps_cbr_buffer->i4_buffer_size >> 3); 436 } 437 438 /* Re-initialize the number of pics in delay period */ 439 for(i = 0; i < MAX_PIC_TYPE; i++) 440 { 441 ps_cbr_buffer->ai4_num_pics_in_delay_period[i] = 442 u4_num_pics_in_delay_prd[i]; 443 } 444 } 445 } 446 447 /****************************************************************************** 448 * @brief update the state for change in target frame rate 449 * 450 ******************************************************************************/ 451 void irc_change_cbr_vbv_tgt_frame_rate(cbr_buffer_t *ps_cbr_buffer, 452 WORD32 i4_tgt_frm_rate) 453 { 454 WORD32 i4_i, i4_bits_per_frm[MAX_NUM_DRAIN_RATES]; 455 int i; 456 457 for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) 458 { 459 X_PROD_Y_DIV_Z(ps_cbr_buffer->ai4_bit_rate[i], 1000, i4_tgt_frm_rate, 460 i4_bits_per_frm[i]); 461 /* Drain rate = bitrate/(framerate/1000) */ 462 ps_cbr_buffer->i4_drain_bits_per_frame[i] = i4_bits_per_frm[i]; 463 /* Initialize the bits per frame error bits calculation */ 464 irc_change_frm_rate_in_error_bits(ps_cbr_buffer->aps_bpf_error_bits[i], 465 i4_tgt_frm_rate); 466 } 467 468 /* Bitrate * delay = buffer size, divide by 1000 as delay is in ms*/ 469 if(!ps_cbr_buffer->i4_is_cbr_mode) 470 { 471 /* VBR streaming case which has different drain rates for I and P */ 472 ps_cbr_buffer->i4_buffer_size = 473 ps_cbr_buffer->ai4_num_pics_in_delay_period[0] 474 * ps_cbr_buffer->i4_drain_bits_per_frame[0] 475 + ps_cbr_buffer->ai4_num_pics_in_delay_period[1] 476 * ps_cbr_buffer->i4_drain_bits_per_frame[1]; 477 } 478 479 if(ps_cbr_buffer->i4_buffer_size 480 > (WORD32)ps_cbr_buffer->u4_max_vbv_buf_size) 481 { 482 ps_cbr_buffer->i4_buffer_size = ps_cbr_buffer->u4_max_vbv_buf_size; 483 } 484 485 /* 486 * Tgt_frame_rate is divided by 1000 because an approximate value is fine as 487 * this is just a threshold below which stuffing is done to avoid buffer 488 * underflow due to fixed point error in drain rate 489 */ 490 ps_cbr_buffer->i4_stuffing_threshold = (ps_cbr_buffer->ai4_bit_rate[0] 491 - (i4_bits_per_frm[0] * (i4_tgt_frm_rate / 1000))); 492 493 for(i4_i = 0; i4_i < MAX_PIC_TYPE; i4_i++) 494 { 495 /* 496 * Upper threshold for 497 * I frame = 1 * bits per frame 498 * P Frame = 4 * bits per frame. 499 * The threshold for I frame is only 1 * bits per frame as the threshold should 500 * only account for error in estimated bits. 501 * In P frame it should account for difference bets bits consumed by I(Scene change) 502 * and P frame I to P complexity is assumed to be 5. 503 */ 504 WORD32 i4_index; 505 i4_index = i4_i > 0 ? 1 : 0; 506 ps_cbr_buffer->i4_upr_thr[i4_i] = ps_cbr_buffer->i4_buffer_size 507 - (ps_cbr_buffer->i4_buffer_size >> 3); 508 509 /* 510 * For both I and P frame Lower threshold is equal to drain rate. 511 * Even if the encoder consumes zero bits it should have enough bits to 512 * drain 513 */ 514 ps_cbr_buffer->i4_low_thr[i4_i] = i4_bits_per_frm[i4_index]; 515 } 516 517 /* Storing the input parameters for using it for change functions */ 518 ps_cbr_buffer->i4_tgt_frm_rate = i4_tgt_frm_rate; 519 } 520 521 /******************************************************************************* 522 * @brief Change the state for change in bit rate 523 * 524 ******************************************************************************/ 525 void irc_change_cbr_vbv_bit_rate(cbr_buffer_t *ps_cbr_buffer, 526 WORD32 *i4_bit_rate) 527 { 528 WORD32 i4_i, i4_bits_per_frm[MAX_NUM_DRAIN_RATES]; 529 int i; 530 531 for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) 532 { 533 X_PROD_Y_DIV_Z(i4_bit_rate[i], 1000, ps_cbr_buffer->i4_tgt_frm_rate, 534 i4_bits_per_frm[i]); 535 /* Drain rate = bitrate/(framerate/1000) */ 536 ps_cbr_buffer->i4_drain_bits_per_frame[i] = i4_bits_per_frm[i]; 537 /* Initialize the bits per frame error bits calculation */ 538 irc_change_bitrate_in_error_bits(ps_cbr_buffer->aps_bpf_error_bits[i], 539 i4_bit_rate[i]); 540 } 541 542 /* Bitrate * delay = buffer size, divide by 1000 as delay is in ms*/ 543 if(i4_bit_rate[0] == i4_bit_rate[1]) /* This would mean CBR mode */ 544 { 545 X_PROD_Y_DIV_Z(i4_bit_rate[0], ps_cbr_buffer->i4_max_delay, 1000, 546 ps_cbr_buffer->i4_buffer_size); 547 ps_cbr_buffer->i4_is_cbr_mode = 1; 548 } 549 else 550 { 551 /* VBR streaming case which has different drain rates for I and P */ 552 ps_cbr_buffer->i4_buffer_size = 553 ps_cbr_buffer->ai4_num_pics_in_delay_period[0] 554 * ps_cbr_buffer->i4_drain_bits_per_frame[0] 555 + ps_cbr_buffer->ai4_num_pics_in_delay_period[1] 556 * ps_cbr_buffer->i4_drain_bits_per_frame[1]; 557 558 ps_cbr_buffer->i4_is_cbr_mode = 0; 559 } 560 561 if(ps_cbr_buffer->i4_buffer_size 562 > (WORD32)ps_cbr_buffer->u4_max_vbv_buf_size) 563 { 564 ps_cbr_buffer->i4_buffer_size = ps_cbr_buffer->u4_max_vbv_buf_size; 565 } 566 567 /* 568 * tgt_frame_rate is divided by 1000 because 569 * an approximate value is fine as this is just a threshold below which 570 * stuffing is done to avoid buffer underflow due to fixed point 571 * error in drain rate 572 */ 573 ps_cbr_buffer->i4_stuffing_threshold = (i4_bit_rate[0] 574 - (i4_bits_per_frm[0] 575 * (ps_cbr_buffer->i4_tgt_frm_rate / 1000))); 576 577 for(i4_i = 0; i4_i < MAX_PIC_TYPE; i4_i++) 578 { 579 /* 580 * Upper threshold for 581 * I frame = 1 * bits per frame 582 * P Frame = 4 * bits per frame. 583 * The threshold for I frame is only 1 * bits per frame as the threshold 584 * should only account for error in estimated bits. 585 * In P frame it should account for difference bets bits consumed by 586 * I(Scene change) and P frame I to P complexity is assumed to be 5. 587 */ 588 589 WORD32 i4_index; 590 i4_index = i4_i > 0 ? 1 : 0; 591 ps_cbr_buffer->i4_upr_thr[i4_i] = ps_cbr_buffer->i4_buffer_size 592 - (ps_cbr_buffer->i4_buffer_size >> 3); 593 594 /* For both I and P frame Lower threshold is equal to drain rate. 595 * Even if the encoder consumes zero bits it should have enough bits to 596 * drain 597 */ 598 ps_cbr_buffer->i4_low_thr[i4_i] = i4_bits_per_frm[i4_index]; 599 } 600 601 /* Storing the input parameters for using it for change functions */ 602 for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) 603 { 604 ps_cbr_buffer->ai4_bit_rate[i] = i4_bit_rate[i]; 605 } 606 } 607 608 void irc_change_cbr_buffer_delay(cbr_buffer_t *ps_cbr_buffer, 609 WORD32 i4_buffer_delay) 610 { 611 WORD32 i4_i; 612 613 /* Bitrate * delay = buffer size, divide by 1000 as delay is in ms*/ 614 if(ps_cbr_buffer->i4_is_cbr_mode) 615 { 616 X_PROD_Y_DIV_Z(ps_cbr_buffer->ai4_bit_rate[0], i4_buffer_delay, 1000, 617 ps_cbr_buffer->i4_buffer_size); 618 } 619 620 if(ps_cbr_buffer->i4_buffer_size 621 > (WORD32)ps_cbr_buffer->u4_max_vbv_buf_size) 622 { 623 ps_cbr_buffer->i4_buffer_size = ps_cbr_buffer->u4_max_vbv_buf_size; 624 } 625 626 for(i4_i = 0; i4_i < MAX_PIC_TYPE; i4_i++) 627 { 628 /* 629 * Upper threshold for 630 * I frame = 1 * bits per frame 631 * P Frame = 4 * bits per frame. 632 * The threshold for I frame is only 1 * bits per frame as the threshold 633 * should only account for error in estimated bits. 634 * In P frame it should account for difference bets bits consumed by I 635 * (Scene change) and P frame I to P complexity is assumed to be 5. 636 */ 637 ps_cbr_buffer->i4_upr_thr[i4_i] = ps_cbr_buffer->i4_buffer_size 638 - (ps_cbr_buffer->i4_buffer_size >> 3); 639 } 640 641 /* Storing the input parameters for using it for change functions */ 642 ps_cbr_buffer->i4_max_delay = i4_buffer_delay; 643 } 644 645 WORD32 irc_get_cbr_buffer_delay(cbr_buffer_t *ps_cbr_buffer) 646 { 647 return (ps_cbr_buffer->i4_max_delay); 648 } 649 650 WORD32 irc_get_cbr_buffer_size(cbr_buffer_t *ps_cbr_buffer) 651 { 652 return (ps_cbr_buffer->i4_buffer_size); 653 } 654