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  *******************************************************************************
     23  * @file
     24  *  ih264e_me.h
     25  *
     26  * @brief
     27  *  Contains declarations of global variables for H264 encoder
     28  *
     29  * @author
     30  *  ittiam
     31  *
     32  * @remarks
     33  *
     34  *******************************************************************************
     35  */
     36 
     37 #ifndef IH264E_ME_H_
     38 #define IH264E_ME_H_
     39 
     40 /*****************************************************************************/
     41 /* Function Macros                                                           */
     42 /*****************************************************************************/
     43 
     44 /**
     45  ******************************************************************************
     46  *  @brief      compute median of 3 elements (a, b, c) and store the output
     47  *  in to result. This is used for mv prediction
     48  ******************************************************************************
     49  */
     50 
     51 #define MEDIAN(a, b, c, result) if (a > b){\
     52                                     if (b > c)\
     53                                         result = b;\
     54                                     else {\
     55                                         if (a > c)\
     56                                             result = c;\
     57                                         else \
     58                                             result = a;\
     59                                     }\
     60                                 }\
     61                                 else {\
     62                                     if (c > b)\
     63                                         result = b;\
     64                                     else {\
     65                                         if (c > a)\
     66                                             result = c;\
     67                                         else \
     68                                             result = a;\
     69                                     }\
     70                                 }
     71 
     72 /*****************************************************************************/
     73 /* Extern Function Declarations                                              */
     74 /*****************************************************************************/
     75 
     76 /**
     77  *******************************************************************************
     78  *
     79  * @brief
     80  *  This function populates the length of the codewords for motion vectors in the
     81  *  range (-search range, search range) in pixels
     82  *
     83  * @param[in] ps_me
     84  *  Pointer to me ctxt
     85  *
     86  * @param[out] pu1_mv_bits
     87  *  length of the codeword for all mv's
     88  *
     89  * @remarks The length of the code words are derived from signed exponential
     90  * goloumb codes.
     91  *
     92  *******************************************************************************
     93  */
     94 void ih264e_init_mv_bits(me_ctxt_t *ps_me);
     95 
     96 /**
     97  *******************************************************************************
     98  *
     99  * @brief The function computes the parameters for a P skip MB
    100  *
    101  * @par Description:
    102  *  The function computes the parameters for a P skip MB
    103  *
    104  * @param[in] ps_proc
    105  *  Process context
    106  *
    107  * @param[in] u4_for_me
    108  *  Flag to indicate the purpose of computing skip
    109  *
    110  * @param[out] ps_pred_mv
    111  *  Flag to indicate the current active refernce list
    112  *
    113  * @returns
    114  *       1) Updates skip MV in proc
    115  *       2) Returns if the current MB can be coded as skip or not
    116  *
    117  * @remarks The code implements the logic as described in sec 8.4.1.1 in H264
    118  *   specification.
    119  *
    120  *******************************************************************************
    121 */
    122 ih264e_skip_params_ft  ih264e_find_pskip_params;
    123 
    124 /**
    125  *******************************************************************************
    126  *
    127  * @brief The function computes the parameters for a P skip MB
    128  *
    129  * @par Description:
    130  *  The function computes the parameters for a P skip MB
    131  *
    132  * @param[in] ps_proc
    133  *  Process context
    134  *
    135  * @param[in] u4_for_me
    136  *  Flag to indicate the purpose of computing skip
    137  *
    138  * @param[out] ps_pred_mv
    139  *  Flag to indicate the current active refernce list
    140  *
    141  * @returns
    142  *       1) Updates skip MV in proc
    143  *       2) Returns if the current MB can be coded as skip or not
    144  *
    145  * @remarks The code implements the logic as described in sec 8.4.1.1 in H264
    146  *   specification.
    147  *
    148  *******************************************************************************
    149 */
    150 ih264e_skip_params_ft  ih264e_find_pskip_params_me;
    151 
    152 /**
    153  *******************************************************************************
    154  *
    155  * @brief The function computes the parameters for a B skip MB
    156  *
    157  * @par Description:
    158  *  The function computes the parameters for a B skip MB
    159  *
    160  * @param[in] ps_proc
    161  *  Process context
    162  *
    163  * @param[in] u4_for_me
    164  *  Flag to indicate the purpose of computing skip
    165  *
    166  * @param[out] ps_pred_mv
    167  *  Flag to indicate the current active refernce list
    168  *
    169  * @returns
    170  *       1) Updates skip MV in proc
    171  *       2) Returns if the current MB can be coded as skip or not
    172  *
    173  * @remarks The code implements the logic as described in sec 8.4.1.1 in H264
    174  *   specification.
    175  *
    176  *******************************************************************************
    177 */
    178 ih264e_skip_params_ft  ih264e_find_bskip_params;
    179 
    180 /**
    181  *******************************************************************************
    182  *
    183  * @brief The function computes the parameters for a B skip MB
    184  *
    185  * @par Description:
    186  *  The function computes the parameters for a B skip MB
    187  *
    188  * @param[in] ps_proc
    189  *  Process context
    190  *
    191  * @param[in] u4_for_me
    192  *  Flag to indicate the purpose of computing skip
    193  *
    194  * @param[out] ps_pred_mv
    195  *  Flag to indicate the current active refernce list
    196  *
    197  * @returns
    198  *       1) Updates skip MV in proc
    199  *       2) The type of SKIP [L0/L1/BI]
    200  *
    201  * @remarks
    202  *******************************************************************************
    203 */
    204 ih264e_skip_params_ft  ih264e_find_bskip_params_me;
    205 
    206 /**
    207  *******************************************************************************
    208  *
    209  * @brief motion vector predictor
    210  *
    211  * @par Description:
    212  *  The routine calculates the motion vector predictor for a given block,
    213  *  given the candidate MV predictors.
    214  *
    215  * @param[in] ps_left_mb_pu
    216  *  pointer to left mb motion vector info
    217  *
    218  * @param[in] ps_top_row_pu
    219  *  pointer to top & top right mb motion vector info
    220  *
    221  * @param[out] ps_pred_mv
    222  *  pointer to candidate predictors for the current block
    223  *
    224  * @returns  The x & y components of the MV predictor.
    225  *
    226  * @remarks The code implements the logic as described in sec 8.4.1.3 in H264
    227  *   specification.
    228  *   Assumptions : 1. Assumes Only partition of size 16x16
    229  *
    230  *******************************************************************************
    231  */
    232 void ih264e_get_mv_predictor(enc_pu_t *ps_left_mb_pu, enc_pu_t *ps_top_row_pu,
    233                              enc_pu_mv_t *ps_pred_mv, WORD32 i4_ref_list);
    234 
    235 /**
    236  *******************************************************************************
    237  *
    238  * @brief This fucntion evalues ME for 2 reference lists
    239  *
    240  * @par Description:
    241  *  It evaluates skip, full-pel an half-pel and assigns the correct MV in proc
    242  *
    243  * @param[in] ps_proc
    244  *  Process context corresponding to the job
    245  *
    246  * @returns  none
    247  *
    248  * @remarks none
    249  *
    250  *******************************************************************************
    251  */
    252 ih264e_compute_me_ft  ih264e_compute_me_multi_reflist;
    253 
    254 /**
    255  *******************************************************************************
    256  *
    257  * @brief This fucntion evalues ME for single reflist [Pred L0]
    258  *
    259  * @par Description:
    260  *  It evaluates skip, full-pel an half-pel and assigns the correct MV in proc
    261  *
    262  * @param[in] ps_proc
    263  *  Process context corresponding to the job
    264  *
    265  * @returns  none
    266  *
    267  * @remarks none
    268  *
    269  *******************************************************************************
    270  */
    271 ih264e_compute_me_ft  ih264e_compute_me_single_reflist;
    272 
    273 /**
    274  *******************************************************************************
    275  *
    276  * @brief This function initializes me ctxt
    277  *
    278  * @par Description:
    279  *  Before dispatching the current job to me thread, the me context associated
    280  *  with the job is initialized.
    281  *
    282  * @param[in] ps_proc
    283  *  Process context corresponding to the job
    284  *
    285  * @returns  none
    286  *
    287  * @remarks none
    288  *
    289  *******************************************************************************
    290  */
    291 void ih264e_init_me(process_ctxt_t *ps_proc);
    292 
    293 /**
    294  *******************************************************************************
    295  *
    296  * @brief This function performs motion estimation for the current NMB
    297  *
    298  * @par Description:
    299  *  Intializes input and output pointers required by the function ih264e_compute_me
    300  *  and calls the function ih264e_compute_me in a loop to process NMBs.
    301  *
    302  * @param[in] ps_proc
    303  *  Process context corresponding to the job
    304  *
    305  * @returns
    306  *
    307  * @remarks none
    308  *
    309  *******************************************************************************
    310  */
    311 void ih264e_compute_me_nmb(process_ctxt_t *ps_proc, UWORD32 u4_nmb_count);
    312 
    313 /**
    314  *******************************************************************************
    315  *
    316  * @brief This function performs MV prediction
    317  *
    318  * @par Description:
    319  *
    320  * @param[in] ps_proc
    321  *  Process context corresponding to the job
    322  *
    323  * @returns  none
    324  *
    325  * @remarks none
    326  *  This function will update the MB availability since intra inter decision
    327  *  should be done before the call
    328  *
    329  *******************************************************************************
    330  */
    331 void ih264e_mv_pred(process_ctxt_t *ps_proc, WORD32 i4_reflist);
    332 
    333 /**
    334  *******************************************************************************
    335  *
    336  * @brief This function approximates Pred. MV
    337  *
    338  * @par Description:
    339  *
    340  * @param[in] ps_proc
    341  *  Process context corresponding to the job
    342  *
    343  * @returns  none
    344  *
    345  * @remarks none
    346  *  Motion estimation happens at nmb level. For cost calculations, mv is appro
    347  *  ximated using this function
    348  *
    349  *******************************************************************************
    350  */
    351 void ih264e_mv_pred_me(process_ctxt_t *ps_proc, WORD32 i4_ref_list);
    352 
    353 #endif /* IH264E_ME_H_ */
    354