| /****************************************************************************** |
| * |
| * 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_ */ |