C++程序  |  184行  |  7.16 KB

/******************************************************************************
 *
 * Copyright (C) 2018 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 mb_model_based.c
*
* \brief
*    This file contain mb level API functions
*
* \date
*
* \author
*    ittiam
*
******************************************************************************
*/
/*****************************************************************************/
/* File Includes                                                             */
/*****************************************************************************/
/* User include files */
#include "ittiam_datatypes.h"
#include "rc_common.h"
#include "rc_cntrl_param.h"
#include "var_q_operator.h"
#include "mem_req_and_acq.h"
#include "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 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 dont 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),
            MEM_TAB_ALIGNMENT,
            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
********************************************************************************/
/******************************************************************************
  Function Name   : init_mb_level_rc
  Description     : Initialise the mb model and the average activity to default values
  Arguments       :
  Return Values   : void
  Revision History:
                    13 03 2008   KJN  Creation
*********************************************************************************/
void init_mb_level_rc(mb_rate_control_t *ps_mb_rate_control)
{
    /* Set values to default */
    ps_mb_rate_control->i4_avg_activity = 0;
}
/******************************************************************************
  Function Name   : mb_init_frame_level
  Description     : Initialise the mb state with frame level decisions
  Arguments       : u1_frame_qp - Frame level qp
  Return Values   : void
  Revision History:
                    13 03 2008   KJN  Creation
*********************************************************************************/
void 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;
}
/******************************************************************************
  Function Name   : reset_mb_activity
  Description     : Reset the mb activity - Whenever there is SCD
                    the mb activity is reset
  Arguments       :
  Return Values   : void
  Revision History:
                    13 03 2008   KJN  Creation
*********************************************************************************/
void reset_mb_activity(mb_rate_control_t *ps_mb_rate_control)
{
    ps_mb_rate_control->i4_avg_activity = 0;
}

/******************************************************************************
  Function Name   : get_mb_qp
  Description     : Calculates the mb level qp
  Arguments       : i4_cur_mb_activity - current frame mb activity
                    pi4_mb_qp - Array of 2 values for before and after mb activity
                                modulation
  Return Values   : void

  Revision History:
                    13 03 2008   KJN  Creation
*********************************************************************************/
void get_mb_qp(mb_rate_control_t *ps_mb_rate_control, WORD32 i4_cur_mb_activity, WORD32 *pi4_mb_qp)
{
    WORD32 i4_qp;
    /* Initialise 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;
}
/******************************************************************************
  Function Name   : get_frm_level_qp
  Description     : Returns the stored frame level QP
  Arguments       :
  Revision History:
                    13 03 2008   KJN  Creation
*********************************************************************************/
UWORD8 get_frm_level_qp(mb_rate_control_t *ps_mb_rate_control)
{
    return (ps_mb_rate_control->u1_frm_qp);
}
/******************************************************************************
  Function Name   : mb_update_frame_level
  Description     : Update the frame level info collected
  Arguments       : i4_avg_activity - Average activity fot frame
  Return Values   :
  Revision History:
                    13 03 2008   KJN  Creation
*********************************************************************************/
void 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;
}