/******************************************************************************
 *
 * 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;
    static 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;
}

