| /****************************************************************************** |
| * |
| * 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 |
| * ih264e_me.h |
| * |
| * @brief |
| * Contains declarations of global variables for H264 encoder |
| * |
| * @author |
| * ittiam |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| |
| #ifndef IH264E_ME_H_ |
| #define IH264E_ME_H_ |
| |
| /*****************************************************************************/ |
| /* Constant Macros */ |
| /*****************************************************************************/ |
| |
| /** |
| ****************************************************************************** |
| * @brief Skip Bias value for P slice |
| ****************************************************************************** |
| */ |
| #define SKIP_BIAS_P 0 |
| |
| /** |
| ****************************************************************************** |
| * @brief Skip Bias value for B slice |
| ****************************************************************************** |
| */ |
| #define SKIP_BIAS_B 0 |
| |
| |
| /*****************************************************************************/ |
| /* Function Macros */ |
| /*****************************************************************************/ |
| |
| /** |
| ****************************************************************************** |
| * @brief compute median of 3 elements (a, b, c) and store the output |
| * in to result. This is used for mv prediction |
| ****************************************************************************** |
| */ |
| |
| #define MEDIAN(a, b, c, result) if (a > b){\ |
| if (b > c)\ |
| result = b;\ |
| else {\ |
| if (a > c)\ |
| result = c;\ |
| else \ |
| result = a;\ |
| }\ |
| }\ |
| else {\ |
| if (c > b)\ |
| result = b;\ |
| else {\ |
| if (c > a)\ |
| result = c;\ |
| else \ |
| result = a;\ |
| }\ |
| } |
| |
| /*****************************************************************************/ |
| /* Extern Function Declarations */ |
| /*****************************************************************************/ |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief |
| * This function populates the length of the codewords for motion vectors in the |
| * range (-search range, search range) in pixels |
| * |
| * @param[in] ps_me |
| * Pointer to me ctxt |
| * |
| * @param[out] pu1_mv_bits |
| * length of the codeword for all mv's |
| * |
| * @remarks The length of the code words are derived from signed exponential |
| * goloumb codes. |
| * |
| ******************************************************************************* |
| */ |
| void ih264e_init_mv_bits(me_ctxt_t *ps_me); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief The function computes the parameters for a P skip MB |
| * |
| * @par Description: |
| * The function computes the parameters for a P skip MB |
| * |
| * @param[in] ps_proc |
| * Process context |
| * |
| * @param[in] u4_for_me |
| * Flag to indicate the purpose of computing skip |
| * |
| * @param[out] ps_pred_mv |
| * Flag to indicate the current active refernce list |
| * |
| * @returns |
| * 1) Updates skip MV in proc |
| * 2) Returns if the current MB can be coded as skip or not |
| * |
| * @remarks The code implements the logic as described in sec 8.4.1.1 in H264 |
| * specification. |
| * |
| ******************************************************************************* |
| */ |
| ih264e_skip_params_ft ih264e_find_pskip_params; |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief The function computes the parameters for a P skip MB |
| * |
| * @par Description: |
| * The function computes the parameters for a P skip MB |
| * |
| * @param[in] ps_proc |
| * Process context |
| * |
| * @param[in] u4_for_me |
| * Flag to indicate the purpose of computing skip |
| * |
| * @param[out] ps_pred_mv |
| * Flag to indicate the current active refernce list |
| * |
| * @returns |
| * 1) Updates skip MV in proc |
| * 2) Returns if the current MB can be coded as skip or not |
| * |
| * @remarks The code implements the logic as described in sec 8.4.1.1 in H264 |
| * specification. |
| * |
| ******************************************************************************* |
| */ |
| ih264e_skip_params_ft ih264e_find_pskip_params_me; |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief The function computes the parameters for a B skip MB |
| * |
| * @par Description: |
| * The function computes the parameters for a B skip MB |
| * |
| * @param[in] ps_proc |
| * Process context |
| * |
| * @param[in] u4_for_me |
| * Flag to indicate the purpose of computing skip |
| * |
| * @param[out] ps_pred_mv |
| * Flag to indicate the current active refernce list |
| * |
| * @returns |
| * 1) Updates skip MV in proc |
| * 2) Returns if the current MB can be coded as skip or not |
| * |
| * @remarks The code implements the logic as described in sec 8.4.1.1 in H264 |
| * specification. |
| * |
| ******************************************************************************* |
| */ |
| ih264e_skip_params_ft ih264e_find_bskip_params; |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief The function computes the parameters for a B skip MB |
| * |
| * @par Description: |
| * The function computes the parameters for a B skip MB |
| * |
| * @param[in] ps_proc |
| * Process context |
| * |
| * @param[in] u4_for_me |
| * Flag to indicate the purpose of computing skip |
| * |
| * @param[out] ps_pred_mv |
| * Flag to indicate the current active refernce list |
| * |
| * @returns |
| * 1) Updates skip MV in proc |
| * 2) The type of SKIP [L0/L1/BI] |
| * |
| * @remarks |
| ******************************************************************************* |
| */ |
| ih264e_skip_params_ft ih264e_find_bskip_params_me; |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief motion vector predictor |
| * |
| * @par Description: |
| * The routine calculates the motion vector predictor for a given block, |
| * given the candidate MV predictors. |
| * |
| * @param[in] ps_left_mb_pu |
| * pointer to left mb motion vector info |
| * |
| * @param[in] ps_top_row_pu |
| * pointer to top & top right mb motion vector info |
| * |
| * @param[out] ps_pred_mv |
| * pointer to candidate predictors for the current block |
| * |
| * @returns The x & y components of the MV predictor. |
| * |
| * @remarks The code implements the logic as described in sec 8.4.1.3 in H264 |
| * specification. |
| * Assumptions : 1. Assumes Only partition of size 16x16 |
| * |
| ******************************************************************************* |
| */ |
| void ih264e_get_mv_predictor(enc_pu_t *ps_left_mb_pu, enc_pu_t *ps_top_row_pu, |
| enc_pu_mv_t *ps_pred_mv, WORD32 i4_ref_list); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief This fucntion evalues ME for 2 reference lists |
| * |
| * @par Description: |
| * It evaluates skip, full-pel an half-pel and assigns the correct MV in proc |
| * |
| * @param[in] ps_proc |
| * Process context corresponding to the job |
| * |
| * @returns none |
| * |
| * @remarks none |
| * |
| ******************************************************************************* |
| */ |
| ih264e_compute_me_ft ih264e_compute_me_multi_reflist; |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief This fucntion evalues ME for single reflist [Pred L0] |
| * |
| * @par Description: |
| * It evaluates skip, full-pel an half-pel and assigns the correct MV in proc |
| * |
| * @param[in] ps_proc |
| * Process context corresponding to the job |
| * |
| * @returns none |
| * |
| * @remarks none |
| * |
| ******************************************************************************* |
| */ |
| ih264e_compute_me_ft ih264e_compute_me_single_reflist; |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief This function initializes me ctxt |
| * |
| * @par Description: |
| * Before dispatching the current job to me thread, the me context associated |
| * with the job is initialized. |
| * |
| * @param[in] ps_proc |
| * Process context corresponding to the job |
| * |
| * @returns none |
| * |
| * @remarks none |
| * |
| ******************************************************************************* |
| */ |
| void ih264e_init_me(process_ctxt_t *ps_proc); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief This function performs motion estimation for the current NMB |
| * |
| * @par Description: |
| * Intializes input and output pointers required by the function ih264e_compute_me |
| * and calls the function ih264e_compute_me in a loop to process NMBs. |
| * |
| * @param[in] ps_proc |
| * Process context corresponding to the job |
| * |
| * @returns |
| * |
| * @remarks none |
| * |
| ******************************************************************************* |
| */ |
| void ih264e_compute_me_nmb(process_ctxt_t *ps_proc, UWORD32 u4_nmb_count); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief This function performs MV prediction |
| * |
| * @par Description: |
| * |
| * @param[in] ps_proc |
| * Process context corresponding to the job |
| * |
| * @returns none |
| * |
| * @remarks none |
| * This function will update the MB availability since intra inter decision |
| * should be done before the call |
| * |
| ******************************************************************************* |
| */ |
| void ih264e_mv_pred(process_ctxt_t *ps_proc, WORD32 i4_reflist); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief This function approximates Pred. MV |
| * |
| * @par Description: |
| * |
| * @param[in] ps_proc |
| * Process context corresponding to the job |
| * |
| * @returns none |
| * |
| * @remarks none |
| * Motion estimation happens at nmb level. For cost calculations, mv is appro |
| * ximated using this function |
| * |
| ******************************************************************************* |
| */ |
| void ih264e_mv_pred_me(process_ctxt_t *ps_proc, WORD32 i4_ref_list); |
| |
| #endif /* IH264E_ME_H_ */ |