/******************************************************************************
 *
 * 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                                                             */
/*****************************************************************************/

/* User include files */
#include "irc_datatypes.h"
#include "irc_cntrl_param.h"
#include "irc_mem_req_and_acq.h"
#include "irc_mb_model_based.h"

typedef struct mb_rate_control_t
{
    /* Frame Qp */
    UWORD8 u1_frm_qp;

    /*
     * Estimated average activity for the current frame (updated with the
     * previous frame activity since it is independent of picture type whether
     * it is I or P)
     */
    WORD32 i4_avg_activity;

} mb_rate_control_t;

WORD32 irc_mbrc_num_fill_use_free_memtab(mb_rate_control_t **pps_mb_rate_control,
                                         itt_memtab_t *ps_memtab,
                                         ITT_FUNC_TYPE_E e_func_type)
{
    WORD32 i4_mem_tab_idx = 0;
    static mb_rate_control_t s_mb_rate_control_temp;

    /*
     * Hack for al 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_mb_rate_control) = &s_mb_rate_control_temp;
    }

    /*For src rate control state structure*/
    if(e_func_type != GET_NUM_MEMTAB)
    {
        fill_memtab(&ps_memtab[i4_mem_tab_idx], sizeof(mb_rate_control_t),
                    ALIGN_128_BYTE, PERSISTENT, DDR);
        use_or_fill_base(&ps_memtab[0], (void**)pps_mb_rate_control,
                         e_func_type);
    }
    i4_mem_tab_idx++;

    return (i4_mem_tab_idx);
}

/*******************************************************************************
 MB LEVEL API FUNCTIONS
 ******************************************************************************/

/******************************************************************************
 Description     : Initialize the mb model and the average activity to default
                   values
 ******************************************************************************/
void irc_init_mb_level_rc(mb_rate_control_t *ps_mb_rate_control)
{
    /* Set values to default */
    ps_mb_rate_control->i4_avg_activity = 0;
}

/******************************************************************************
 Description     : Initialize the mb state with frame level decisions
 *********************************************************************************/
void irc_mb_init_frame_level(mb_rate_control_t *ps_mb_rate_control,
                             UWORD8 u1_frame_qp)
{
    /* Update frame level QP */
    ps_mb_rate_control->u1_frm_qp = u1_frame_qp;
}

/******************************************************************************
 Description     : Reset the mb activity - Whenever there is SCD
                   the mb activity is reset
 *********************************************************************************/
void irc_reset_mb_activity(mb_rate_control_t *ps_mb_rate_control)
{
    ps_mb_rate_control->i4_avg_activity = 0;
}

/******************************************************************************
 Description     : Calculates the mb level qp
 *********************************************************************************/
void irc_get_mb_qp(mb_rate_control_t *ps_mb_rate_control,
                   WORD32 i4_cur_mb_activity,
                   WORD32 *pi4_mb_qp)
{
    WORD32 i4_qp;
    /* Initialize the mb level qp with the frame level qp */
    i4_qp = ps_mb_rate_control->u1_frm_qp;

    /*
     * Store the model based QP - This is used for updating the rate control model
     */
    pi4_mb_qp[0] = i4_qp;

    /* Modulate the Qp based on the activity */
    if((ps_mb_rate_control->i4_avg_activity) && (i4_qp < 100))
    {
        i4_qp =((((2 * i4_cur_mb_activity))
               + ps_mb_rate_control->i4_avg_activity)* i4_qp
               + ((i4_cur_mb_activity + 2 * ps_mb_rate_control->i4_avg_activity)
               >> 1))/ (i4_cur_mb_activity + 2 * ps_mb_rate_control->i4_avg_activity);

        if(i4_qp > ((3 * ps_mb_rate_control->u1_frm_qp) >> 1))
        {
            i4_qp = ((3 * ps_mb_rate_control->u1_frm_qp) >> 1);
        }
    }

    /* Store the qp modulated by mb activity - This is used for encoding the MB */
    pi4_mb_qp[1] = i4_qp;
}

/*******************************************************************************
 Description     : Returns the stored frame level QP
 ******************************************************************************/
UWORD8 irc_get_frm_level_qp(mb_rate_control_t *ps_mb_rate_control)
{
    return (ps_mb_rate_control->u1_frm_qp);
}

/*******************************************************************************
 Description     : Update the frame level info collected
 ******************************************************************************/
void irc_mb_update_frame_level(mb_rate_control_t *ps_mb_rate_control,
                               WORD32 i4_avg_activity)
{
     /* Update the Average Activity */
     ps_mb_rate_control->i4_avg_activity = i4_avg_activity;
}
