You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
6.4 KiB
185 lines
6.4 KiB
/****************************************************************************** |
|
* |
|
* 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; |
|
} |
|
|
|
|