/****************************************************************************** * * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ /*****************************************************************************/ /* File Includes */ /*****************************************************************************/ /* System include files */ #include <stdio.h> /* User include files */ #include "irc_datatypes.h" #include "irc_common.h" #include "irc_cntrl_param.h" #include "irc_mem_req_and_acq.h" #include "irc_fixed_point_error_bits.h" typedef struct error_bits_t { /* Max tgt frm rate so that dynamic change in frm rate can be handled */ WORD32 i4_max_tgt_frm_rate; /* Cur frm rate */ WORD32 i4_cur_tgt_frm_rate; /* tgt frame rate*/ WORD32 i4_tgt_frm_rate; /* tgt frm rate increment */ WORD32 i4_tgt_frm_rate_incr; /* flag to indicate 1 second is up */ UWORD8 u1_compute_error_bits; /* Bitrate/frame rate value added over a period */ WORD32 i4_accum_bitrate; /* bitrate */ WORD32 i4_bitrate; } error_bits_t; WORD32 irc_error_bits_num_fill_use_free_memtab(error_bits_t **pps_error_bits, itt_memtab_t *ps_memtab, ITT_FUNC_TYPE_E e_func_type) { WORD32 i4_mem_tab_idx = 0; error_bits_t s_error_bits_temp; /* * Hack for all alloc, during which we don't have any state memory. * Dereferencing can cause issues */ if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB) (*pps_error_bits) = &s_error_bits_temp; /* For src rate control state structure */ if(e_func_type != GET_NUM_MEMTAB) { fill_memtab(&ps_memtab[i4_mem_tab_idx], sizeof(error_bits_t), ALIGN_128_BYTE, PERSISTENT, DDR); use_or_fill_base(&ps_memtab[0], (void**)pps_error_bits, e_func_type); } i4_mem_tab_idx++; return (i4_mem_tab_idx); } /******************************************************************************* * @brief Calculates the error bits due to fixed point divisions ******************************************************************************/ void irc_init_error_bits(error_bits_t *ps_error_bits, WORD32 i4_max_tgt_frm_rate, WORD32 i4_bitrate) { /* Initializing the parameters*/ ps_error_bits->i4_cur_tgt_frm_rate = 0; ps_error_bits->i4_max_tgt_frm_rate = i4_max_tgt_frm_rate; /* Value by which i4_cur_tgt_frm_rate is incremented every VOP*/ ps_error_bits->i4_tgt_frm_rate_incr = 1000; /*Compute error bits is set to 1 at the end of 1 second*/ ps_error_bits->u1_compute_error_bits = 0; ps_error_bits->i4_tgt_frm_rate = i4_max_tgt_frm_rate; ps_error_bits->i4_accum_bitrate = 0; ps_error_bits->i4_bitrate = i4_bitrate; } /******************************************************************************* * @brief Updates the error state ******************************************************************************/ void irc_update_error_bits(error_bits_t *ps_error_bits) { WORD32 i4_bits_per_frame; X_PROD_Y_DIV_Z(ps_error_bits->i4_bitrate, 1000, ps_error_bits->i4_tgt_frm_rate, i4_bits_per_frame); /* * This value is incremented every at the end of every VOP by * i4_tgt_frm_rate_incr */ ps_error_bits->i4_cur_tgt_frm_rate += ps_error_bits->i4_tgt_frm_rate_incr; if(ps_error_bits->u1_compute_error_bits == 1) { ps_error_bits->i4_accum_bitrate = 0; } ps_error_bits->i4_accum_bitrate += i4_bits_per_frame; /* * When current tgt frm rate is equal or greater than max tgt frame rate * 1 second is up , compute the error bits */ if(ps_error_bits->i4_cur_tgt_frm_rate >= ps_error_bits->i4_max_tgt_frm_rate) { ps_error_bits->i4_cur_tgt_frm_rate -= ps_error_bits->i4_max_tgt_frm_rate; ps_error_bits->u1_compute_error_bits = 1; } else { ps_error_bits->u1_compute_error_bits = 0; } } /******************************************************************************* * @brief Returns the error bits for the current frame if there are any * ******************************************************************************/ WORD32 irc_get_error_bits(error_bits_t *ps_error_bits) { WORD32 i4_error_bits = 0; /*If 1s is up calculate error for the last 1s worth of frames*/ if(ps_error_bits->u1_compute_error_bits == 1) { /*Error = Actual bitrate - bits_per_frame * num of frames*/ i4_error_bits = ps_error_bits->i4_bitrate - ps_error_bits->i4_accum_bitrate; } return (i4_error_bits); } /* ***************************************************************************** * * @brief Change the frame rate parameter for the error bits state * ******************************************************************************/ void irc_change_frm_rate_in_error_bits(error_bits_t *ps_error_bits, WORD32 i4_tgt_frm_rate) { /* Value by which i4_cur_tgt_frm_rate is incremented every VOP*/ ps_error_bits->i4_tgt_frm_rate_incr = (ps_error_bits->i4_max_tgt_frm_rate * 1000) / i4_tgt_frm_rate; ps_error_bits->i4_tgt_frm_rate = i4_tgt_frm_rate; } /******************************************************************************* * @brief Change the bitrate value for error bits module ******************************************************************************/ void irc_change_bitrate_in_error_bits(error_bits_t *ps_error_bits, WORD32 i4_bitrate) { ps_error_bits->i4_bitrate = i4_bitrate; }