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