Home | History | Annotate | Download | only in encoder
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2015 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 
     21 /*****************************************************************************/
     22 /* File Includes                                                             */
     23 /*****************************************************************************/
     24 
     25 /* User include files */
     26 #include "irc_datatypes.h"
     27 #include "irc_cntrl_param.h"
     28 #include "irc_mem_req_and_acq.h"
     29 #include "irc_mb_model_based.h"
     30 
     31 typedef struct mb_rate_control_t
     32 {
     33     /* Frame Qp */
     34     UWORD8 u1_frm_qp;
     35 
     36     /*
     37      * Estimated average activity for the current frame (updated with the
     38      * previous frame activity since it is independent of picture type whether
     39      * it is I or P)
     40      */
     41     WORD32 i4_avg_activity;
     42 
     43 } mb_rate_control_t;
     44 
     45 WORD32 irc_mbrc_num_fill_use_free_memtab(mb_rate_control_t **pps_mb_rate_control,
     46                                          itt_memtab_t *ps_memtab,
     47                                          ITT_FUNC_TYPE_E e_func_type)
     48 {
     49     WORD32 i4_mem_tab_idx = 0;
     50     mb_rate_control_t s_mb_rate_control_temp;
     51 
     52     /*
     53      * Hack for al alloc, during which we don't have any state memory.
     54      * Dereferencing can cause issues
     55      */
     56     if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
     57     {
     58         (*pps_mb_rate_control) = &s_mb_rate_control_temp;
     59     }
     60 
     61     /*For src rate control state structure*/
     62     if(e_func_type != GET_NUM_MEMTAB)
     63     {
     64         fill_memtab(&ps_memtab[i4_mem_tab_idx], sizeof(mb_rate_control_t),
     65                     ALIGN_128_BYTE, PERSISTENT, DDR);
     66         use_or_fill_base(&ps_memtab[0], (void**)pps_mb_rate_control,
     67                          e_func_type);
     68     }
     69     i4_mem_tab_idx++;
     70 
     71     return (i4_mem_tab_idx);
     72 }
     73 
     74 /*******************************************************************************
     75  MB LEVEL API FUNCTIONS
     76  ******************************************************************************/
     77 
     78 /******************************************************************************
     79  Description     : Initialize the mb model and the average activity to default
     80                    values
     81  ******************************************************************************/
     82 void irc_init_mb_level_rc(mb_rate_control_t *ps_mb_rate_control)
     83 {
     84     /* Set values to default */
     85     ps_mb_rate_control->i4_avg_activity = 0;
     86 }
     87 
     88 /******************************************************************************
     89  Description     : Initialize the mb state with frame level decisions
     90  *********************************************************************************/
     91 void irc_mb_init_frame_level(mb_rate_control_t *ps_mb_rate_control,
     92                              UWORD8 u1_frame_qp)
     93 {
     94     /* Update frame level QP */
     95     ps_mb_rate_control->u1_frm_qp = u1_frame_qp;
     96 }
     97 
     98 /******************************************************************************
     99  Description     : Reset the mb activity - Whenever there is SCD
    100                    the mb activity is reset
    101  *********************************************************************************/
    102 void irc_reset_mb_activity(mb_rate_control_t *ps_mb_rate_control)
    103 {
    104     ps_mb_rate_control->i4_avg_activity = 0;
    105 }
    106 
    107 /******************************************************************************
    108  Description     : Calculates the mb level qp
    109  *********************************************************************************/
    110 void irc_get_mb_qp(mb_rate_control_t *ps_mb_rate_control,
    111                    WORD32 i4_cur_mb_activity,
    112                    WORD32 *pi4_mb_qp)
    113 {
    114     WORD32 i4_qp;
    115     /* Initialize the mb level qp with the frame level qp */
    116     i4_qp = ps_mb_rate_control->u1_frm_qp;
    117 
    118     /*
    119      * Store the model based QP - This is used for updating the rate control model
    120      */
    121     pi4_mb_qp[0] = i4_qp;
    122 
    123     /* Modulate the Qp based on the activity */
    124     if((ps_mb_rate_control->i4_avg_activity) && (i4_qp < 100))
    125     {
    126         i4_qp =((((2 * i4_cur_mb_activity))
    127                + ps_mb_rate_control->i4_avg_activity)* i4_qp
    128                + ((i4_cur_mb_activity + 2 * ps_mb_rate_control->i4_avg_activity)
    129                >> 1))/ (i4_cur_mb_activity + 2 * ps_mb_rate_control->i4_avg_activity);
    130 
    131         if(i4_qp > ((3 * ps_mb_rate_control->u1_frm_qp) >> 1))
    132         {
    133             i4_qp = ((3 * ps_mb_rate_control->u1_frm_qp) >> 1);
    134         }
    135     }
    136 
    137     /* Store the qp modulated by mb activity - This is used for encoding the MB */
    138     pi4_mb_qp[1] = i4_qp;
    139 }
    140 
    141 /*******************************************************************************
    142  Description     : Returns the stored frame level QP
    143  ******************************************************************************/
    144 UWORD8 irc_get_frm_level_qp(mb_rate_control_t *ps_mb_rate_control)
    145 {
    146     return (ps_mb_rate_control->u1_frm_qp);
    147 }
    148 
    149 /*******************************************************************************
    150  Description     : Update the frame level info collected
    151  ******************************************************************************/
    152 void irc_mb_update_frame_level(mb_rate_control_t *ps_mb_rate_control,
    153                                WORD32 i4_avg_activity)
    154 {
    155      /* Update the Average Activity */
    156      ps_mb_rate_control->i4_avg_activity = i4_avg_activity;
    157 }
    158