You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1020 lines
35 KiB
1020 lines
35 KiB
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2018 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 hme_utils.h
|
|
*
|
|
* \brief
|
|
* Prototypes for various utilities used by coarse/refinement/subpel fxns
|
|
*
|
|
* \date
|
|
* 18/09/2012
|
|
*
|
|
* \author
|
|
* Ittiam
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
|
|
#ifndef _HME_UTILS_H_
|
|
#define _HME_UTILS_H_
|
|
|
|
/*****************************************************************************/
|
|
/* Functions */
|
|
/*****************************************************************************/
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_init_histogram(
|
|
*
|
|
* @brief Top level entry point for Coarse ME. Runs across blocks and does the
|
|
* needful by calling other low level routines.
|
|
*
|
|
* @param[in,out] ps_hist : the histogram structure
|
|
*
|
|
* @param[in] i4_max_mv_x : Maximum mv allowed in x direction (fpel units)
|
|
*
|
|
* @param[in] i4_max_mv_y : Maximum mv allowed in y direction (fpel units)
|
|
*
|
|
* @return None
|
|
********************************************************************************
|
|
*/
|
|
void hme_init_histogram(mv_hist_t *ps_hist, S32 i4_max_mv_x, S32 i4_max_mv_y);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_update_histogram(
|
|
*
|
|
* @brief Updates the histogram given an mv entry
|
|
*
|
|
* @param[in,out] ps_hist : the histogram structure
|
|
*
|
|
* @param[in] i4_mv_x : x component of the mv (fpel units)
|
|
*
|
|
* @param[in] i4_mv_y : y component of the mv (fpel units)
|
|
*
|
|
* @return None
|
|
********************************************************************************
|
|
*/
|
|
void hme_update_histogram(mv_hist_t *ps_hist, S32 i4_mv_x, S32 i4_mv_y);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_get_global_mv(
|
|
*
|
|
* @brief returns the global mv of a previous picture. Accounts for the fact
|
|
* that the delta poc of the previous picture may have been different
|
|
* from delta poc of current picture. Delta poc is POC difference
|
|
* between a picture and its reference.
|
|
*
|
|
* @param[out] ps_mv: mv_t structure where the motion vector is returned
|
|
*
|
|
* @param[in] i4_delta_poc: the delta poc for the current pic w.r.t. reference
|
|
*
|
|
* @return None
|
|
********************************************************************************
|
|
*/
|
|
void hme_get_global_mv(layer_ctxt_t *ps_prev_layer, hme_mv_t *ps_mv, S32 i4_delta_poc);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_calculate_global_mv(
|
|
*
|
|
* @brief Calculates global mv for a given histogram
|
|
*
|
|
* @param[in] ps_hist : the histogram structure
|
|
*
|
|
* @param[in] ps_mv : used to return the global mv
|
|
*
|
|
* @param[in] e_lobe_type : refer to GMV_MVTYPE_T
|
|
*
|
|
* @return None
|
|
********************************************************************************
|
|
*/
|
|
void hme_calculate_global_mv(mv_hist_t *ps_hist, hme_mv_t *ps_mv, GMV_MVTYPE_T e_lobe_type);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_collate_fpel_results(search_results_t *ps_search_results,
|
|
* S32 i1_ref_idx, S32 i1_idx_to_merge)
|
|
*
|
|
* @brief After full pel search and result seeding in every search iteration
|
|
* results, this function called to collapse a given search iteration
|
|
* results into another.
|
|
*
|
|
* @param[in,out] ps_search_results : Search results data structure
|
|
* @param[in] i1_ref_idx: id of the search iteration where the results
|
|
will be collapsed
|
|
* @param[in] i1_idx_to_merge : id of the search iteration from which the
|
|
* results are picked up.
|
|
|
|
*
|
|
* @return None
|
|
********************************************************************************
|
|
*/
|
|
void hme_collate_fpel_results(
|
|
search_results_t *ps_search_results, S08 i1_ref_idx, S08 i1_idx_to_merge);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_map_mvs_to_grid(mv_grid_t **pps_mv_grid,
|
|
search_results_t *ps_search_results, S32 i4_num_ref)
|
|
*
|
|
* @brief For a given CU whose results are in ps_search_results, the 17x17
|
|
* mv grid is updated for future use within the CTB
|
|
*
|
|
* @param[in] ps_search_results : Search results data structure
|
|
*
|
|
* @param[out] pps_mv_grid: The mv grid (as many as num ref)
|
|
*
|
|
* @param[in] i4_num_ref: nuber of search iterations to update
|
|
*
|
|
* @param[in] mv_res_shift: Shift for resolution of mv (fpel/qpel)
|
|
*
|
|
* @return None
|
|
********************************************************************************
|
|
*/
|
|
void hme_map_mvs_to_grid(
|
|
mv_grid_t **pps_mv_grid,
|
|
search_results_t *ps_search_results,
|
|
U08 *pu1_pred_dir_searched,
|
|
S32 i4_num_pred_dir);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_create_valid_part_ids(S32 i4_part_mask, S32 *pi4_valid_part_ids)
|
|
*
|
|
* @brief Expands the part mask to a list of valid part ids terminated by -1
|
|
*
|
|
* @param[in] i4_part_mask : bit mask of active partitino ids
|
|
*
|
|
* @param[out] pi4_valid_part_ids : array, each entry has one valid part id
|
|
* Terminated by -1 to signal end.
|
|
*
|
|
* @return number of partitions
|
|
********************************************************************************
|
|
*/
|
|
S32 hme_create_valid_part_ids(S32 i4_part_mask, S32 *pi4_valid_part_ids);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn get_num_blks_in_ctb(S32 i4_ctb_x,
|
|
S32 i4_ctb_y,
|
|
S32 i4_pic_wd,
|
|
S32 i4_pic_ht,
|
|
S32 i4_blk_size)
|
|
*
|
|
* @brief returns the number of blks in the ctb (64x64 ctb)
|
|
*
|
|
* @param[in] i4_ctb_x : pixel x offset of the top left corner of ctb in pic
|
|
*
|
|
* @param[in] i4_ctb_y : pixel y offset of the top left corner of ctb in pic
|
|
*
|
|
* @param[in] i4_ctb_x : width of the picture in pixels
|
|
*
|
|
* @param[in] i4_pic_ht : height of hte picture in pixels
|
|
*
|
|
* @param[in] i4_blk_size : Size of the blk in pixels
|
|
*
|
|
* @return number of blks in the ctb
|
|
********************************************************************************
|
|
*/
|
|
S32 get_num_blks_in_ctb(S32 i4_ctb_x, S32 i4_ctb_y, S32 i4_pic_wd, S32 i4_pic_ht, S32 i4_blk_size);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hevc_avg_2d(U08 *pu1_src1,
|
|
* U08 *pu1_src2,
|
|
* S32 i4_src1_stride,
|
|
* S32 i4_src2_stride,
|
|
* S32 i4_blk_wd,
|
|
* S32 i4_blk_ht,
|
|
* U08 *pu1_dst,
|
|
* S32 i4_dst_stride)
|
|
*
|
|
*
|
|
* @brief point wise average of two buffers into a third buffer
|
|
*
|
|
* @param[in] pu1_src1 : first source buffer
|
|
*
|
|
* @param[in] pu1_src2 : 2nd source buffer
|
|
*
|
|
* @param[in] i4_src1_stride : stride of source 1 buffer
|
|
*
|
|
* @param[in] i4_src2_stride : stride of source 2 buffer
|
|
*
|
|
* @param[in] i4_blk_wd : block width
|
|
*
|
|
* @param[in] i4_blk_ht : block height
|
|
*
|
|
* @param[out] pu1_dst : destination buffer
|
|
*
|
|
* @param[in] i4_dst_stride : stride of the destination buffer
|
|
*
|
|
* @return void
|
|
********************************************************************************
|
|
*/
|
|
void hevc_avg_2d(
|
|
U08 *pu1_src1,
|
|
U08 *pu1_src2,
|
|
S32 i4_src1_stride,
|
|
S32 i4_src2_stride,
|
|
S32 i4_blk_wd,
|
|
S32 i4_blk_ht,
|
|
U08 *pu1_dst,
|
|
S32 i4_dst_stride);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_pick_back_search_node(search_results_t *ps_search_results,
|
|
* search_node_t *ps_search_node_fwd,
|
|
* S32 i4_part_idx,
|
|
* layer_ctxt_t *ps_curr_layer)
|
|
*
|
|
*
|
|
* @brief returns the search node corresponding to a ref idx in same or
|
|
* opp direction. Preference is given to opp direction, but if that
|
|
* does not yield results, same direction is attempted.
|
|
*
|
|
* @param[in] ps_search_results: search results overall
|
|
*
|
|
* @param[in] ps_search_node_fwd: search node corresponding to "fwd" direction
|
|
*
|
|
* @param[in] i4_part_idx : partition id
|
|
*
|
|
* @param[in] ps_curr_layer : layer context for current layer.
|
|
*
|
|
* @return search node corresponding to hte "other direction"
|
|
********************************************************************************
|
|
*/
|
|
search_node_t *hme_pick_back_search_node(
|
|
search_results_t *ps_search_results,
|
|
search_node_t *ps_search_node_fwd,
|
|
S32 i4_part_idx,
|
|
layer_ctxt_t *ps_curr_layer);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_study_input_segmentation(U08 *pu1_inp,
|
|
* S32 i4_inp_stride,
|
|
* S32 limit_active_partitions)
|
|
*
|
|
*
|
|
* @brief Examines input 16x16 for possible edges and orientations of those,
|
|
* and returns a bit mask of partitions that should be searched for
|
|
*
|
|
* @param[in] pu1_inp : input buffer
|
|
*
|
|
* @param[in] i4_inp_stride: input stride
|
|
*
|
|
* @param[in] limit_active_partitions : 1: Edge algo done and partitions are
|
|
* limited, 0 : Brute force, all partitions considered
|
|
*
|
|
* @return part mask (bit mask of active partitions to search)
|
|
********************************************************************************
|
|
*/
|
|
S32 hme_study_input_segmentation(U08 *pu1_inp, S32 i4_inp_stride, S32 limit_active_partitions);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_init_search_results(search_results_t *ps_search_results,
|
|
* S32 i4_num_ref,
|
|
* S32 i4_num_best_results,
|
|
* S32 i4_num_results_per_part,
|
|
* BLK_SIZE_T e_blk_size,
|
|
* S32 i4_x_off,
|
|
* S32 i4_y_off)
|
|
*
|
|
* @brief Initializes the search results structure with some key attributes
|
|
*
|
|
* @param[out] ps_search_results : search results structure to initialise
|
|
*
|
|
* @param[in] i4_num_Ref: corresponds to the number of ref ids searched
|
|
*
|
|
* @param[in] i4_num_best_results: Number of best results for the CU to
|
|
* be maintained in the result structure
|
|
*
|
|
* @param[in] i4_num_results_per_part: Per active partition the number of best
|
|
* results to be maintained
|
|
*
|
|
* @param[in] e_blk_size: blk size of the CU for which this structure used
|
|
*
|
|
* @param[in] i4_x_off: x offset of the top left of CU from CTB top left
|
|
*
|
|
* @param[in] i4_y_off: y offset of the top left of CU from CTB top left
|
|
*
|
|
* @return void
|
|
********************************************************************************
|
|
*/
|
|
void hme_init_search_results(
|
|
search_results_t *ps_search_results,
|
|
S32 i4_num_ref,
|
|
S32 i4_num_best_results,
|
|
S32 i4_num_results_per_part,
|
|
BLK_SIZE_T e_blk_size,
|
|
S32 i4_x_off,
|
|
S32 i4_y_off,
|
|
U08 *pu1_is_past);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_reset_search_results((search_results_t *ps_search_results,
|
|
* S32 i4_part_mask)
|
|
*
|
|
*
|
|
* @brief Resets the best results to maximum values, so as to allow search
|
|
* for the new CU's partitions. The existing results may be from an
|
|
* older CU using same structure.
|
|
*
|
|
* @param[in] ps_search_results: search results structure
|
|
*
|
|
* @param[in] i4_part_mask : bit mask of active partitions
|
|
*
|
|
* @param[in] mv_res : Resolution of the mv predictors (fpel/qpel)
|
|
*
|
|
* @return void
|
|
********************************************************************************
|
|
*/
|
|
void hme_reset_search_results(search_results_t *ps_search_results, S32 i4_part_mask, S32 mv_res);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_clamp_grid_by_mvrange(search_node_t *ps_search_node,
|
|
* S32 i4_step,
|
|
* range_prms_t *ps_mvrange)
|
|
*
|
|
* @brief Given a central pt within mv range, and a grid of points surrounding
|
|
* this pt, this function returns a grid mask of pts within search rng
|
|
*
|
|
* @param[in] ps_search_node: the centre pt of the grid
|
|
*
|
|
* @param[in] i4_step: step size of grid
|
|
*
|
|
* @param[in] ps_mvrange: structure containing the current mv range
|
|
*
|
|
* @return bitmask of the pts in grid within search range
|
|
********************************************************************************
|
|
*/
|
|
S32 hme_clamp_grid_by_mvrange(search_node_t *ps_search_node, S32 i4_step, range_prms_t *ps_mvrange);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn layer_ctxt_t *hme_get_past_layer_ctxt(me_ctxt_t *ps_ctxt,
|
|
S32 i4_layer_id)
|
|
*
|
|
* @brief returns the layer ctxt of the layer with given id from the temporally
|
|
* previous frame
|
|
*
|
|
* @param[in] ps_ctxt : ME context
|
|
*
|
|
* @param[in] i4_layer_id : id of layer required
|
|
*
|
|
* @return layer ctxt of given layer id in temporally previous frame
|
|
********************************************************************************
|
|
*/
|
|
layer_ctxt_t *hme_get_past_layer_ctxt(
|
|
me_ctxt_t *ps_ctxt, me_frm_ctxt_t *ps_frm_ctxt, S32 i4_layer_id, S32 i4_num_me_frm_pllel);
|
|
|
|
layer_ctxt_t *hme_coarse_get_past_layer_ctxt(coarse_me_ctxt_t *ps_ctxt, S32 i4_layer_id);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn void hme_init_mv_bank(layer_ctxt_t *ps_layer_ctxt,
|
|
BLK_SIZE_T e_blk_size,
|
|
S32 i4_num_ref,
|
|
S32 i4_num_results_per_part)
|
|
*
|
|
* @brief Given a blk size to be used for this layer, this function initialize
|
|
* the mv bank to make it ready to store and return results.
|
|
*
|
|
* @param[in, out] ps_layer_ctxt: pointer to layer ctxt
|
|
*
|
|
* @param[in] e_blk_size : resolution at which mvs are stored
|
|
*
|
|
* @param[in] i4_num_ref: number of reference frames corresponding to which
|
|
* results are stored.
|
|
*
|
|
* @param[in] e_blk_size : resolution at which mvs are stored
|
|
*
|
|
* @param[in] i4_num_results_per_part : Number of results to be stored per
|
|
* ref idx. So these many best results stored
|
|
*
|
|
* @return void
|
|
********************************************************************************
|
|
*/
|
|
void hme_init_mv_bank(
|
|
layer_ctxt_t *ps_layer_ctxt,
|
|
BLK_SIZE_T e_blk_size,
|
|
S32 i4_num_ref,
|
|
S32 i4_num_results_per_part,
|
|
U08 u1_enc);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn void hme_derive_search_range(range_prms_t *ps_range,
|
|
* range_prms_t *ps_pic_limit,
|
|
* range_prms_t *ps_mv_limit,
|
|
* S32 i4_x,
|
|
* S32 i4_y,
|
|
* S32 blk_wd,
|
|
* S32 blk_ht)
|
|
*
|
|
* @brief given picture limits and blk dimensions and mv search limits, obtains
|
|
* teh valid search range such that the blk stays within pic boundaries,
|
|
* where picture boundaries include padded portions of picture
|
|
*
|
|
* @param[out] ps_range: updated with actual search range
|
|
*
|
|
* @param[in] ps_pic_limit : picture boundaries
|
|
*
|
|
* @param[in] ps_mv_limit: Search range limits for the mvs
|
|
*
|
|
* @param[in] i4_x : x coordinate of the blk
|
|
*
|
|
* @param[in] i4_y : y coordinate of the blk
|
|
*
|
|
* @param[in] blk_wd : blk width
|
|
*
|
|
* @param[in] blk_ht : blk height
|
|
*
|
|
* @return void
|
|
********************************************************************************
|
|
*/
|
|
void hme_derive_search_range(
|
|
range_prms_t *ps_range,
|
|
range_prms_t *ps_pic_limit,
|
|
range_prms_t *ps_mv_limit,
|
|
S32 i4_x,
|
|
S32 i4_y,
|
|
S32 blk_wd,
|
|
S32 blk_ht);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn void hme_get_spatial_candt(layer_ctxt_t *ps_curr_layer,
|
|
* BLK_SIZE_T e_search_blk_size,
|
|
* S32 blk_x,
|
|
* S32 blk_y,
|
|
* S08 i1_ref_idx,
|
|
* search_node_t *ps_top_neighbours,
|
|
* search_node_t *ps_left_neighbours,
|
|
* S32 i4_result_id);
|
|
*
|
|
* @brief Obtains top, top left, top right and left adn bottom left candts
|
|
*
|
|
* @param[in] ps_curr_layer: layer ctxt, has the mv bank structure pointer
|
|
*
|
|
* @param[in] e_search_blk_size : search blk size of current layer
|
|
*
|
|
* @param[in] i4_blk_x : x coordinate of the block in mv bank
|
|
*
|
|
* @param[in] i4_blk_y : y coordinate of the block in mv bank
|
|
*
|
|
* @param[in] i1_ref_idx : Corresponds to ref idx from which to pick up mv
|
|
* results, useful if multiple ref idx candts maintained separately.
|
|
*
|
|
* @param[out] ps_top_neighbours : T, TL, TR candts are output here
|
|
*
|
|
* @param[out] ps_left_neighbours : L BL candts outptu here
|
|
*
|
|
* @param[in] i4_result_id : If multiple results stored per ref idx, this
|
|
* pts to the id of the result
|
|
*
|
|
* @return void
|
|
********************************************************************************
|
|
*/
|
|
void hme_get_spatial_candt(
|
|
layer_ctxt_t *ps_curr_layer,
|
|
BLK_SIZE_T e_search_blk_size,
|
|
S32 blk_x,
|
|
S32 blk_y,
|
|
S08 i1_ref_idx,
|
|
search_node_t *ps_top_neighbours,
|
|
search_node_t *ps_left_neighbours,
|
|
S32 i4_result_id,
|
|
S32 i4_tr_avail,
|
|
S32 i4_bl_avail,
|
|
S32 encode);
|
|
|
|
void hme_get_spatial_candt_in_l1_me(
|
|
layer_ctxt_t *ps_curr_layer,
|
|
BLK_SIZE_T e_search_blk_size,
|
|
S32 i4_blk_x,
|
|
S32 i4_blk_y,
|
|
S08 i1_ref_idx,
|
|
U08 u1_pred_dir,
|
|
search_node_t *ps_top_neighbours,
|
|
search_node_t *ps_left_neighbours,
|
|
S32 i4_result_id,
|
|
S32 tr_avail,
|
|
S32 bl_avail,
|
|
S32 i4_num_act_ref_l0,
|
|
S32 i4_num_act_ref_l1);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn void hme_fill_ctb_neighbour_mvs(layer_ctxt_t *ps_curr_layer,
|
|
* S32 i4_blk_x,
|
|
* S32 i4_blk_y,
|
|
* mvgrid_t *ps_mv_grid ,
|
|
* S32 i1_ref_id)
|
|
*
|
|
* @brief The 18x18 MV grid for a ctb, is filled in first row and 1st col
|
|
* this corresponds to neighbours (TL, T, TR, L, BL)
|
|
*
|
|
* @param[in] ps_curr_layer: layer ctxt, has the mv bank structure pointer
|
|
*
|
|
* @param[in] blk_x : x coordinate of the block in mv bank
|
|
*
|
|
* @param[in] blk_y : y coordinate of the block in mv bank
|
|
*
|
|
* @param[in] ps_mv_grid : Grid (18x18 mvs at 4x4 level)
|
|
*
|
|
* @param[in] u1_pred_lx : Corresponds to pred dir from which to pick up mv
|
|
* results
|
|
*
|
|
* @return void
|
|
********************************************************************************
|
|
*/
|
|
void hme_fill_ctb_neighbour_mvs(
|
|
layer_ctxt_t *ps_curr_layer,
|
|
S32 blk_x,
|
|
S32 blk_y,
|
|
mv_grid_t *ps_mv_grid,
|
|
U08 u1_pred_dir_ctr,
|
|
U08 u1_default_ref_id,
|
|
S32 i4_num_act_ref_l0);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn void *hme_get_wkg_mem(buf_mgr_t *ps_buf_mgr, S32 i4_size)
|
|
*
|
|
* @brief Allocates a block of size = i4_size from working memory and returns
|
|
*
|
|
* @param[in,out] ps_buf_mgr: Buffer manager for wkg memory
|
|
*
|
|
* @param[in] i4_size : size required
|
|
*
|
|
* @return void pointer to allocated memory, NULL if failure
|
|
********************************************************************************
|
|
*/
|
|
void *hme_get_wkg_mem(buf_mgr_t *ps_buf_mgr, S32 i4_size);
|
|
|
|
void hme_reset_wkg_mem(buf_mgr_t *ps_buf_mgr);
|
|
|
|
void hme_init_wkg_mem(buf_mgr_t *ps_buf_mgr, U08 *pu1_mem, S32 size);
|
|
|
|
void hme_reset_ctb_mem_mgr(ctb_mem_mgr_t *ps_ctb_mem_mgr);
|
|
|
|
void hme_init_ctb_mem_mgr(ctb_mem_mgr_t *ps_ctb_mem_mgr, U08 *pu1_mem, S32 size);
|
|
|
|
void hme_fill_mvbank_intra(layer_ctxt_t *ps_layer_ctxt);
|
|
|
|
void hme_scale_mv_grid(mv_grid_t *ps_mv_grid);
|
|
|
|
void hme_downscale_mv_grid(mv_grid_t *ps_mv_grid);
|
|
|
|
void hme_create_parent_ctb(
|
|
ctb_node_t *ps_ctb_node_parent,
|
|
ctb_node_t *ps_ctb_child_tl,
|
|
ctb_node_t *ps_ctb_child_tr,
|
|
ctb_node_t *ps_ctb_child_bl,
|
|
ctb_node_t *ps_ctb_child_br,
|
|
CU_SIZE_T e_cu_size_parent,
|
|
buf_mgr_t *ps_buf_mgr);
|
|
|
|
void hme_create_merged_ctbs(
|
|
search_results_t *ps_results_merged,
|
|
ctb_mem_mgr_t *ps_ctb_mem_mgr,
|
|
buf_mgr_t *ps_buf_mgr,
|
|
ctb_node_t **pps_ctb_list_unified,
|
|
S32 num_candts);
|
|
|
|
void hme_init_mv_grid(mv_grid_t *ps_mv_grid);
|
|
|
|
typedef void (*pf_get_wt_inp)(
|
|
layer_ctxt_t *ps_curr_layer,
|
|
wgt_pred_ctxt_t *ps_wt_inp_prms,
|
|
S32 dst_stride,
|
|
S32 pos_x,
|
|
S32 pos_y,
|
|
S32 size,
|
|
S32 num_ref,
|
|
U08 u1_is_wt_pred_on);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn void hme_pad_left(U08 *pu1_dst, S32 stride, S32 pad_wd, S32 pad_ht)
|
|
*
|
|
* @brief Pads horizontally to left side. Each pixel replicated across a line
|
|
*
|
|
* @param[in] pu1_dst : destination pointer. Points to the pixel to be repeated
|
|
*
|
|
* @param[in] stride : stride of destination buffer
|
|
*
|
|
* @param[in] pad_wd : Amt of horizontal padding to be done
|
|
*
|
|
* @param[in] pad_ht : Number of lines for which horizontal padding to be done
|
|
*
|
|
* @return void
|
|
********************************************************************************
|
|
*/
|
|
void hme_pad_left(U08 *pu1_dst, S32 stride, S32 pad_wd, S32 pad_ht);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn void hme_pad_right(U08 *pu1_dst, S32 stride, S32 pad_wd, S32 pad_ht)
|
|
*
|
|
* @brief Pads horizontally to rt side. Each pixel replicated across a line
|
|
*
|
|
* @param[in] pu1_dst : destination pointer. Points to the pixel to be repeated
|
|
*
|
|
* @param[in] stride : stride of destination buffer
|
|
*
|
|
* @param[in] pad_wd : Amt of horizontal padding to be done
|
|
*
|
|
* @param[in] pad_ht : Number of lines for which horizontal padding to be done
|
|
*
|
|
* @return void
|
|
********************************************************************************
|
|
*/
|
|
void hme_pad_right(U08 *pu1_dst, S32 stride, S32 pad_wd, S32 pad_ht);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn void hme_pad_top(U08 *pu1_dst, S32 stride, S32 pad_ht, S32 pad_wd)
|
|
*
|
|
* @brief Pads vertically on the top. Repeats the top line for top padding
|
|
*
|
|
* @param[in] pu1_dst : destination pointer. Points to the line to be repeated
|
|
*
|
|
* @param[in] stride : stride of destination buffer
|
|
*
|
|
* @param[in] pad_ht : Amt of vertical padding to be done
|
|
*
|
|
* @param[in] pad_wd : Number of columns for which vertical padding to be done
|
|
*
|
|
* @return void
|
|
********************************************************************************
|
|
*/
|
|
void hme_pad_top(U08 *pu1_dst, S32 stride, S32 pad_ht, S32 pad_wd);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn void hme_pad_bot(U08 *pu1_dst, S32 stride, S32 pad_ht, S32 pad_wd)
|
|
*
|
|
* @brief Pads vertically on the bot. Repeats the top line for top padding
|
|
*
|
|
* @param[in] pu1_dst : destination pointer. Points to the line to be repeated
|
|
*
|
|
* @param[in] stride : stride of destination buffer
|
|
*
|
|
* @param[in] pad_ht : Amt of vertical padding to be done
|
|
*
|
|
* @param[in] pad_wd : Number of columns for which vertical padding to be done
|
|
*
|
|
* @return void
|
|
********************************************************************************
|
|
*/
|
|
void hme_pad_bot(U08 *pu1_dst, S32 stride, S32 pad_ht, S32 pad_wd);
|
|
|
|
/**
|
|
**************************************************************************************************
|
|
* @fn hme_populate_pus(search_results_t *ps_search_results, inter_cu_results_t *ps_cu_results)
|
|
*
|
|
* @brief Population the pu_results structure with the results after the subpel refinement
|
|
*
|
|
* This is called post subpel refinmenent for 16x16s, 8x8s and
|
|
* for post merge evaluation for 32x32,64x64 CUs
|
|
*
|
|
* @param[in,out] ps_search_results : Search results data structure
|
|
* - ps_cu_results : cu_results data structure
|
|
* ps_pu_result : Pointer to the memory for storing PU's
|
|
*
|
|
****************************************************************************************************
|
|
*/
|
|
void hme_populate_pus(
|
|
me_ctxt_t *ps_thrd_ctxt,
|
|
me_frm_ctxt_t *ps_ctxt,
|
|
hme_subpel_prms_t *ps_subpel_prms,
|
|
search_results_t *ps_search_results,
|
|
inter_cu_results_t *ps_cu_results,
|
|
inter_pu_results_t *ps_pu_results,
|
|
pu_result_t *ps_pu_result,
|
|
inter_ctb_prms_t *ps_inter_ctb_prms,
|
|
wgt_pred_ctxt_t *ps_wt_prms,
|
|
layer_ctxt_t *ps_curr_layer,
|
|
U08 *pu1_pred_dir_searched,
|
|
WORD32 i4_num_active_ref);
|
|
|
|
void hme_populate_pus_8x8_cu(
|
|
me_ctxt_t *ps_thrd_ctxt,
|
|
me_frm_ctxt_t *ps_ctxt,
|
|
hme_subpel_prms_t *ps_subpel_prms,
|
|
search_results_t *ps_search_results,
|
|
inter_cu_results_t *ps_cu_results,
|
|
inter_pu_results_t *ps_pu_results,
|
|
pu_result_t *ps_pu_result,
|
|
inter_ctb_prms_t *ps_inter_ctb_prms,
|
|
U08 *pu1_pred_dir_searched,
|
|
WORD32 i4_num_active_ref,
|
|
U08 u1_blk_8x8_mask);
|
|
|
|
S32 hme_recompute_lambda_from_min_8x8_act_in_ctb(
|
|
me_frm_ctxt_t *ps_ctxt, ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_update_dynamic_search_params
|
|
*
|
|
* @brief Update the Dynamic search params based on the current MVs
|
|
*
|
|
* @param[in,out] ps_dyn_range_prms [inout] : Dyn. Range Param str.
|
|
* i2_mvy [in] : current MV y comp.
|
|
*
|
|
* @return None
|
|
********************************************************************************
|
|
*/
|
|
void hme_update_dynamic_search_params(dyn_range_prms_t *ps_dyn_range_prms, WORD16 i2_mvy);
|
|
|
|
S32 hme_create_child_nodes_cu_tree(
|
|
cur_ctb_cu_tree_t *ps_cu_tree_root,
|
|
cur_ctb_cu_tree_t *ps_cu_tree_cur_node,
|
|
S32 nodes_already_created);
|
|
|
|
void hme_add_new_node_to_a_sorted_array(
|
|
search_node_t *ps_result_node,
|
|
search_node_t **pps_sorted_array,
|
|
U08 *pu1_shifts,
|
|
U32 u4_num_results_updated,
|
|
U08 u1_shift);
|
|
|
|
S32 hme_find_pos_of_implicitly_stored_ref_id(
|
|
S08 *pi1_ref_idx, S08 i1_ref_idx, S32 i4_result_id, S32 i4_num_results);
|
|
|
|
S32 hme_populate_search_candidates(fpel_srch_cand_init_data_t *ps_ctxt);
|
|
|
|
void hme_init_pred_buf_info(
|
|
hme_pred_buf_info_t (*ps_info)[MAX_NUM_INTER_PARTS],
|
|
hme_pred_buf_mngr_t *ps_buf_mngr,
|
|
U08 u1_pu1_wd,
|
|
U08 u1_pu1_ht,
|
|
PART_TYPE_T e_part_type);
|
|
|
|
void hme_debrief_bipred_eval(
|
|
part_type_results_t *ps_part_type_result,
|
|
hme_pred_buf_info_t (*ps_pred_buf_info)[MAX_NUM_INTER_PARTS],
|
|
hme_pred_buf_mngr_t *ps_pred_buf_mngr,
|
|
U08 *pu1_allocated_pred_buf_array_indixes,
|
|
ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list);
|
|
|
|
U08 hme_decide_search_candidate_priority_in_l1_and_l2_me(
|
|
SEARCH_CANDIDATE_TYPE_T e_cand_type, ME_QUALITY_PRESETS_T e_quality_preset);
|
|
|
|
U08 hme_decide_search_candidate_priority_in_l0_me(SEARCH_CANDIDATE_TYPE_T e_cand_type, U08 u1_index);
|
|
|
|
void hme_search_cand_data_init(
|
|
S32 *pi4_id_Z,
|
|
S32 *pi4_id_coloc,
|
|
S32 *pi4_num_coloc_cands,
|
|
U08 *pu1_search_candidate_list_index,
|
|
S32 i4_num_act_ref_l0,
|
|
S32 i4_num_act_ref_l1,
|
|
U08 u1_is_bidir_enabled,
|
|
U08 u1_4x4_blk_in_l1me);
|
|
|
|
void hme_compute_variance_for_all_parts(
|
|
U08 *pu1_data,
|
|
S32 i4_data_stride,
|
|
S32 *pi4_valid_part_array,
|
|
U32 *pu4_variance,
|
|
S32 i4_num_valid_parts,
|
|
U08 u1_cu_size);
|
|
|
|
void hme_compute_sigmaX_and_sigmaXSquared(
|
|
U08 *pu1_data,
|
|
S32 i4_buf_stride,
|
|
void *pv_sigmaX,
|
|
void *pv_sigmaXSquared,
|
|
U08 u1_base_blk_wd,
|
|
U08 u1_base_blk_ht,
|
|
U08 u1_blk_wd,
|
|
U08 u1_blk_ht,
|
|
U08 u1_is_sigma_pointer_size_32_bit,
|
|
U08 u1_array_stride);
|
|
|
|
void hme_compute_final_sigma_of_pu_from_base_blocks(
|
|
U32 *pu4_SigmaX,
|
|
U32 *pu4_SigmaXSquared,
|
|
ULWORD64 *pu8_final_sigmaX,
|
|
ULWORD64 *pu8_final_sigmaX_Squared,
|
|
U08 u1_cu_size,
|
|
U08 u1_base_block_size,
|
|
S32 i4_part_id,
|
|
U08 u1_base_blk_array_stride);
|
|
|
|
void hme_compute_stim_injected_distortion_for_all_parts(
|
|
U08 *pu1_pred,
|
|
S32 i4_pred_stride,
|
|
S32 *pi4_valid_part_array,
|
|
ULWORD64 *pu8_src_sigmaX,
|
|
ULWORD64 *pu8_src_sigmaXSquared,
|
|
S32 *pi4_sad_array,
|
|
S32 i4_alpha_stim_multiplier,
|
|
S32 i4_inv_wt,
|
|
S32 i4_inv_wt_shift_val,
|
|
S32 i4_num_valid_parts,
|
|
S32 i4_wpred_log_wdc,
|
|
U08 u1_cu_size);
|
|
|
|
void sigma_for_cusize_16_and_baseblock_size_16(
|
|
U08 *pu1_data, S32 i4_data_stride, U32 *pu4_sigmaX, U32 *pu4_sigmaXSquared);
|
|
|
|
void sigma_for_cusize_16_and_baseblock_size_8(
|
|
U08 *pu1_data, S32 i4_data_stride, U32 *pu4_sigmaX, U32 *pu4_sigmaXSquared, U08 diff_cu_size);
|
|
|
|
void sigma_for_cusize_16_and_baseblock_size_4(
|
|
U08 *pu1_data, S32 i4_data_stride, U32 *pu4_sigmaX, U32 *pu4_sigmaXSquared);
|
|
|
|
void sigma_for_cusize_32_and_baseblock_size_32(
|
|
U08 *pu1_data, S32 i4_data_stride, U32 *pu4_sigmaX, U32 *pu4_sigmaXSquared);
|
|
|
|
void sigma_for_cusize_64_and_baseblock_size_64(
|
|
U08 *pu1_data, S32 i4_data_stride, U32 *pu4_sigmaX, U32 *pu4_sigmaXSquared);
|
|
|
|
void hme_choose_best_noise_preserver_amongst_fpel_and_subpel_winners(
|
|
fullpel_refine_ctxt_t *ps_fullpel_winner_data,
|
|
search_node_t **pps_part_results,
|
|
layer_ctxt_t *ps_curr_layer,
|
|
wgt_pred_ctxt_t *ps_wt_inp_prms,
|
|
U32 *pu4_src_variance,
|
|
S32 i4_cu_x_off_in_ctb,
|
|
S32 i4_cu_y_off_in_ctb,
|
|
S32 i4_ctb_x_off,
|
|
S32 i4_ctb_y_off,
|
|
S32 i4_inp_stride,
|
|
S32 i4_alpha_stim_multiplier,
|
|
U08 u1_subpel_uses_satd);
|
|
|
|
#if TEMPORAL_NOISE_DETECT
|
|
WORD32 ihevce_16x16block_temporal_noise_detect(
|
|
WORD32 had_block_size,
|
|
WORD32 ctb_width,
|
|
WORD32 ctb_height,
|
|
ihevce_ctb_noise_params *ps_ctb_noise_params,
|
|
fpel_srch_cand_init_data_t *s_proj_srch_cand_init_data,
|
|
hme_search_prms_t *s_search_prms_blk,
|
|
me_frm_ctxt_t *ps_ctxt,
|
|
WORD32 num_pred_dir,
|
|
WORD32 i4_num_act_ref_l0,
|
|
WORD32 i4_num_act_ref_l1,
|
|
WORD32 i4_cu_x_off,
|
|
WORD32 i4_cu_y_off,
|
|
wgt_pred_ctxt_t *ps_wt_inp_prms,
|
|
WORD32 input_stride,
|
|
WORD32 index_8x8_block,
|
|
WORD32 num_horz_blocks,
|
|
WORD32 num_8x8_in_ctb_row,
|
|
WORD32 i4_index_variance);
|
|
#endif
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_decide_part_types(search_results_t *ps_search_results)
|
|
*
|
|
* @brief Does uni/bi evaluation accross various partition types,
|
|
* decides best inter partition types for the CU, compares
|
|
* intra cost and decides the best K results for the CU
|
|
*
|
|
* This is called post subpel refinmenent for 16x16s, 8x8s and
|
|
* for post merge evaluation for 32x32,64x64 CUs
|
|
*
|
|
* @param[in,out] ps_search_results : Search results data structure
|
|
* - In : 2 lists of upto 2mvs & refids, active partition mask
|
|
* - Out: Best results for final rdo evaluation of the cu
|
|
*
|
|
* @param[in] ps_subpel_prms : Sub pel params data structure
|
|
|
|
*
|
|
* @par Description
|
|
* --------------------------------------------------------------------------------
|
|
* Flow:
|
|
* for each category (SMP,AMP,2Nx2N based on part mask)
|
|
* {
|
|
* for each part_type
|
|
* {
|
|
* for each part
|
|
* pick best candidate from each list
|
|
* combine uni part type
|
|
* update best results for part type
|
|
* }
|
|
* pick the best part type for given category (for SMP & AMP)
|
|
* }
|
|
* ||
|
|
* ||
|
|
* \/
|
|
* for upto 3 best part types
|
|
* {
|
|
* for each part
|
|
* {
|
|
* compute fixed size had for all uni and remember coeffs
|
|
* compute bisatd
|
|
* uni vs bi and gives upto two results
|
|
* also gives the pt level pred buffer
|
|
* }
|
|
* }
|
|
* ||
|
|
* ||
|
|
* \/
|
|
* select X candidates for tu recursion as per the Note below
|
|
* tu_rec_on_part_type (reuse transform coeffs)
|
|
* ||
|
|
* ||
|
|
* \/
|
|
* insert intra nodes at appropriate result id
|
|
* ||
|
|
* ||
|
|
* \/
|
|
* populate y best resuls for rdo based on preset
|
|
*
|
|
* Note :
|
|
* number of TU rec for P pics : 2 2nx2n + 1 smp + 1 amp for ms or 9 for hq
|
|
* number of TU rec for B pics : 1 2nx2n + 1 smp + 1 amp for ms or 2 uni 2nx2n + 1 smp + 1 amp for ms or 9 for hq
|
|
* --------------------------------------------------------------------------------
|
|
*
|
|
* @return None
|
|
********************************************************************************
|
|
*/
|
|
void hme_decide_part_types(
|
|
inter_cu_results_t *ps_cu_results,
|
|
inter_pu_results_t *ps_pu_results,
|
|
inter_ctb_prms_t *ps_inter_ctb_prms,
|
|
me_frm_ctxt_t *ps_ctxt,
|
|
ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list,
|
|
ihevce_me_optimised_function_list_t *ps_me_optimised_function_list);
|
|
|
|
void hme_compute_pred_and_evaluate_bi(
|
|
inter_cu_results_t *ps_cu_results,
|
|
inter_pu_results_t *ps_pu_results,
|
|
inter_ctb_prms_t *ps_inter_ctb_prms,
|
|
part_type_results_t *ps_part_type_result,
|
|
ULWORD64 *pu8_winning_pred_sigmaXSquare,
|
|
ULWORD64 *pu8_winning_pred_sigmaX,
|
|
ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list,
|
|
ihevce_me_optimised_function_list_t *ps_me_optimised_function_list);
|
|
|
|
/**
|
|
********************************************************************************
|
|
* @fn hme_insert_intra_nodes_post_bipred
|
|
*
|
|
* @brief Compares intra costs (populated by IPE) with the best inter costs
|
|
* (populated after evaluating bi-pred) and updates the best results
|
|
* if intra cost is better
|
|
*
|
|
* @param[in,out] ps_cu_results [inout] : Best results structure of CU
|
|
* ps_cur_ipe_ctb [in] : intra results for the current CTB
|
|
* i4_frm_qstep [in] : current frame quantizer(qscale)*
|
|
*
|
|
* @return None
|
|
********************************************************************************
|
|
*/
|
|
void hme_insert_intra_nodes_post_bipred(
|
|
inter_cu_results_t *ps_cu_results,
|
|
ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb,
|
|
WORD32 i4_frm_qstep);
|
|
|
|
void hme_set_mv_limit_using_dvsr_data(
|
|
me_frm_ctxt_t *ps_ctxt,
|
|
layer_ctxt_t *ps_curr_layer,
|
|
range_prms_t *ps_mv_limit,
|
|
S16 *pi2_prev_enc_frm_max_mv_y,
|
|
U08 u1_num_act_ref_pics);
|
|
|
|
S32 hme_part_mask_populator(
|
|
U08 *pu1_inp,
|
|
S32 i4_inp_stride,
|
|
U08 u1_limit_active_partitions,
|
|
U08 u1_is_bPic,
|
|
U08 u1_is_refPic,
|
|
U08 u1_blk_8x8_mask,
|
|
ME_QUALITY_PRESETS_T e_me_quality_preset);
|
|
|
|
#endif /* #ifndef _HME_UTILS_H_ */
|