/****************************************************************************** * * 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_intra_modes_eval.h * * @brief * This file contains declarations of routines that perform rate distortion * analysis on a macroblock if coded as intra. * * @author * ittiam * * @remarks * none * ******************************************************************************* */ #ifndef IH264E_INTRA_MODES_EVAL_H_ #define IH264E_INTRA_MODES_EVAL_H_ /*****************************************************************************/ /* Extern Function Declarations */ /*****************************************************************************/ /** ****************************************************************************** * * @brief * derivation process for macroblock availability * * @par Description * Calculates the availability of the left, top, topright and topleft macroblocks. * * @param[in] ps_proc_ctxt * pointer to proc context (handle) * * @remarks Based on section 6.4.5 in H264 spec * * @return none * ****************************************************************************** */ void ih264e_derive_nghbr_avbl_of_mbs ( process_ctxt_t *ps_proc_ctxt ); /** ****************************************************************************** * * @brief * derivation process for subblock/partition availability * * @par Description * Calculates the availability of the left, top, topright and topleft subblock * or partitions. * * @param[in] ps_proc_ctxt * pointer to macroblock context (handle) * * @param[in] i1_pel_pos_x * column position of the pel wrt the current block * * @param[in] i1_pel_pos_y * row position of the pel in wrt current block * * @remarks Assumptions: before calling this function it is assumed that * the neighbor availability of the current macroblock is already derived. * Based on table 6-3 of H264 specification * * @return availability status (yes or no) * ****************************************************************************** */ UWORD8 ih264e_derive_ngbr_avbl_of_mb_partitions ( block_neighbors_t *s_ngbr_avbl, WORD8 i1_pel_pos_x, WORD8 i1_pel_pos_y ); /** ****************************************************************************** * * @brief * evaluate best intra 16x16 mode (rate distortion opt off) * * @par Description * This function evaluates all the possible intra 16x16 modes and finds the mode * that best represents the macro-block (least distortion) and occupies fewer * bits in the bit-stream. * * @param[in] ps_proc_ctxt * pointer to process context (handle) * * @remarks * Ideally the cost of encoding a macroblock is calculated as * (distortion + lambda*rate). Where distortion is SAD/SATD,... between the * input block and the reconstructed block and rate is the number of bits taken * to place the macroblock in the bit-stream. In this routine the rate does not * exactly point to the total number of bits it takes, rather it points to header * bits necessary for encoding the macroblock. Assuming the deltaQP, cbp bits * and residual bits fall in to texture bits the number of bits taken to encoding * mbtype is considered as rate, we compute cost. Further we will approximate * the distortion as the deviation b/w input and the predicted block as opposed * to input and reconstructed block. * * NOTE: As per the Document JVT-O079, for intra 16x16 macroblock, * the SAD and cost are one and the same. * * @return none * ****************************************************************************** */ void ih264e_evaluate_intra16x16_modes_for_least_cost_rdoptoff ( process_ctxt_t *ps_proc_ctxt ); /** ****************************************************************************** * * @brief * evaluate best intra 8x8 mode (rate distortion opt on) * * @par Description * This function evaluates all the possible intra 8x8 modes and finds the mode * that best represents the macro-block (least distortion) and occupies fewer * bits in the bit-stream. * * @param[in] ps_proc_ctxt * pointer to proc ctxt * * @remarks Ideally the cost of encoding a macroblock is calculated as * (distortion + lambda*rate). Where distortion is SAD/SATD,... between the * input block and the reconstructed block and rate is the number of bits taken * to place the macroblock in the bit-stream. In this routine the rate does not * exactly point to the total number of bits it takes, rather it points to header * bits necessary for encoding the macroblock. Assuming the deltaQP, cbp bits * and residual bits fall in to texture bits the number of bits taken to encoding * mbtype is considered as rate, we compute cost. Further we will approximate * the distortion as the deviation b/w input and the predicted block as opposed * to input and reconstructed block. * * NOTE: TODO: This function needs to be tested * * @return none * ****************************************************************************** */ void ih264e_evaluate_intra8x8_modes_for_least_cost_rdoptoff ( process_ctxt_t *ps_proc_ctxt ); /** ****************************************************************************** * * @brief * evaluate best intra 4x4 mode (rate distortion opt on) * * @par Description * This function evaluates all the possible intra 4x4 modes and finds the mode * that best represents the macro-block (least distortion) and occupies fewer * bits in the bit-stream. * * @param[in] ps_proc_ctxt * pointer to proc ctxt * * @remarks * Ideally the cost of encoding a macroblock is calculated as * (distortion + lambda*rate). Where distortion is SAD/SATD,... between the * input block and the reconstructed block and rate is the number of bits taken * to place the macroblock in the bit-stream. In this routine the rate does not * exactly point to the total number of bits it takes, rather it points to header * bits necessary for encoding the macroblock. Assuming the deltaQP, cbp bits * and residual bits fall in to texture bits the number of bits taken to encoding * mbtype is considered as rate, we compute cost. Further we will approximate * the distortion as the deviation b/w input and the predicted block as opposed * to input and reconstructed block. * * NOTE: As per the Document JVT-O079, for the whole intra 4x4 macroblock, * 24*lambda is added to the SAD before comparison with the best SAD for * inter prediction. This is an empirical value to prevent using too many intra * blocks. * * @return none * ****************************************************************************** */ void ih264e_evaluate_intra4x4_modes_for_least_cost_rdopton ( process_ctxt_t *ps_proc_ctxt ); /** ****************************************************************************** * * @brief * evaluate best intra 4x4 mode (rate distortion opt off) * * @par Description * This function evaluates all the possible intra 4x4 modes and finds the mode * that best represents the macro-block (least distortion) and occupies fewer * bits in the bit-stream. * * @param[in] ps_proc_ctxt * pointer to proc ctxt * * @remarks * Ideally the cost of encoding a macroblock is calculated as * (distortion + lambda*rate). Where distortion is SAD/SATD,... between the * input block and the reconstructed block and rate is the number of bits taken * to place the macroblock in the bit-stream. In this routine the rate does not * exactly point to the total number of bits it takes, rather it points to header * bits necessary for encoding the macroblock. Assuming the deltaQP, cbp bits * and residual bits fall in to texture bits the number of bits taken to encoding * mbtype is considered as rate, we compute cost. Further we will approximate * the distortion as the deviation b/w input and the predicted block as opposed * to input and reconstructed block. * * NOTE: As per the Document JVT-O079, for the whole intra 4x4 macroblock, * 24*lambda is added to the SAD before comparison with the best SAD for * inter prediction. This is an empirical value to prevent using too many intra * blocks. * * @return none * ****************************************************************************** */ void ih264e_evaluate_intra4x4_modes_for_least_cost_rdoptoff ( process_ctxt_t *ps_proc_ctxt ); /** ****************************************************************************** * * @brief * evaluate best chroma intra 8x8 mode (rate distortion opt off) * * @par Description * This function evaluates all the possible chroma intra 8x8 modes and finds * the mode that best represents the macroblock (least distortion) and occupies * fewer bits in the bitstream. * * @param[in] ps_proc_ctxt * pointer to macroblock context (handle) * * @remarks * For chroma best intra pred mode is calculated based only on SAD * * @returns none * ****************************************************************************** */ void ih264e_evaluate_chroma_intra8x8_modes_for_least_cost_rdoptoff ( process_ctxt_t *ps_proc_ctxt ); /** ****************************************************************************** * * @brief * Evaluate best intra 16x16 mode (among VERT, HORZ and DC) and do the * prediction. * * @par Description * This function evaluates first three 16x16 modes and compute corresponding sad * and return the buffer predicted with best mode. * * @param[in] pu1_src * UWORD8 pointer to the source * * @param[in] pu1_ngbr_pels_i16 * UWORD8 pointer to neighbouring pels * * @param[out] pu1_dst * UWORD8 pointer to the destination * * @param[in] src_strd * integer source stride * * @param[in] dst_strd * integer destination stride * * @param[in] u4_n_avblty * availability of neighbouring pixels * * @param[in] u4_intra_mode * Pointer to the variable in which best mode is returned * * @param[in] pu4_sadmin * Pointer to the variable in which minimum sad is returned * * @param[in] u4_valid_intra_modes * Says what all modes are valid * * @returns none * ****************************************************************************** */ typedef void ih264e_evaluate_intra_modes_ft(UWORD8 *pu1_src, UWORD8 *pu1_ngbr_pels_i16, UWORD8 *pu1_dst, UWORD32 src_strd, UWORD32 dst_strd, WORD32 u4_n_avblty, UWORD32 *u4_intra_mode, WORD32 *pu4_sadmin, UWORD32 u4_valid_intra_modes); ih264e_evaluate_intra_modes_ft ih264e_evaluate_intra16x16_modes; ih264e_evaluate_intra_modes_ft ih264e_evaluate_intra_chroma_modes; /* assembly */ ih264e_evaluate_intra_modes_ft ih264e_evaluate_intra16x16_modes_a9q; ih264e_evaluate_intra_modes_ft ih264e_evaluate_intra_chroma_modes_a9q; ih264e_evaluate_intra_modes_ft ih264e_evaluate_intra16x16_modes_av8; ih264e_evaluate_intra_modes_ft ih264e_evaluate_intra_chroma_modes_av8; /* x86 intrinsics */ ih264e_evaluate_intra_modes_ft ih264e_evaluate_intra16x16_modes_ssse3; ih264e_evaluate_intra_modes_ft ih264e_evaluate_intra_chroma_modes_ssse3; /** ****************************************************************************** * * @brief * Evaluate best intra 4x4 mode and perform prediction. * * @par Description * This function evaluates 4x4 modes and compute corresponding sad * and return the buffer predicted with best mode. * * @param[in] pu1_src * UWORD8 pointer to the source * * @param[in] pu1_ngbr_pels * UWORD8 pointer to neighbouring pels * * @param[out] pu1_dst * UWORD8 pointer to the destination * * @param[in] src_strd * integer source stride * * @param[in] dst_strd * integer destination stride * * @param[in] u4_n_avblty * availability of neighbouring pixels * * @param[in] u4_intra_mode * Pointer to the variable in which best mode is returned * * @param[in] pu4_sadmin * Pointer to the variable in which minimum cost is returned * * @param[in] u4_valid_intra_modes * Says what all modes are valid * * @param[in] u4_lambda * Lamda value for computing cost from SAD * * @param[in] u4_predictd_mode * Predicted mode for cost computation * * @returns none * ****************************************************************************** */ typedef void ih264e_evaluate_intra_4x4_modes_ft(UWORD8 *pu1_src, UWORD8 *pu1_ngbr_pels, UWORD8 *pu1_dst, UWORD32 src_strd, UWORD32 dst_strd, WORD32 u4_n_avblty, UWORD32 *u4_intra_mode, WORD32 *pu4_sadmin, UWORD32 u4_valid_intra_modes, UWORD32 u4_lambda, UWORD32 u4_predictd_mode); ih264e_evaluate_intra_4x4_modes_ft ih264e_evaluate_intra_4x4_modes; /* x86 intrinsics */ ih264e_evaluate_intra_4x4_modes_ft ih264e_evaluate_intra_4x4_modes_ssse3; /* assembly */ ih264e_evaluate_intra_4x4_modes_ft ih264e_evaluate_intra_4x4_modes_a9q; ih264e_evaluate_intra_4x4_modes_ft ih264e_evaluate_intra_4x4_modes_av8; #endif /* IH264E_INTRA_MODES_EVAL_H_ */