/*
* Copyright ( c ) 2020 , Alliance for Open Media . All rights reserved .
*
* This source code is subject to the terms of the BSD 2 Clause License and
* the Alliance for Open Media Patent License 1 . 0 . If the BSD 2 Clause License
* was not distributed with this source code in the LICENSE file , you can
* obtain it at www . aomedia . org / license / software . If the Alliance for Open
* Media Patent License 1 . 0 was not distributed with this source code in the
* PATENTS file , you can obtain it at www . aomedia . org / license / patent .
*/
#ifndef AOM_AV1_ENCODER_INTERP_FILTER_SEARCH_H_
#define AOM_AV1_ENCODER_INTERP_FILTER_SEARCH_H_
#include "av1/encoder/block.h"
#include "av1/encoder/encoder.h"
#include "av1/encoder/rdopt_utils.h"
#ifdef __cplusplus
extern "C" {
#endif
/*!\cond */
#define MAX_INTERP_FILTER_STATS 128
#define DUAL_FILTER_SET_SIZE (SWITCHABLE_FILTERS * SWITCHABLE_FILTERS)
typedef struct {
int_interpfilters filters;
int_mv mv[2 ];
int8_t ref_frames[2 ];
COMPOUND_TYPE comp_type;
int compound_idx;
int64_t rd;
unsigned int pred_sse;
} INTERPOLATION_FILTER_STATS;
/*!\endcond */
/*!\brief Miscellaneous arguments for inter mode search.
*/
typedef struct HandleInterModeArgs {
/*!
* Buffer for the above predictor in OBMC
*/
uint8_t *above_pred_buf[MAX_MB_PLANE];
/*!
* Stride for the above predictor in OBMC
*/
int above_pred_stride[MAX_MB_PLANE];
/*!
* Buffer for the left predictor in OBMC
*/
uint8_t *left_pred_buf[MAX_MB_PLANE];
/*!
* Stride for the left predictor in OBMC
*/
int left_pred_stride[MAX_MB_PLANE];
/*!
* Pointer to the first member in a 2 D array which holds
* single reference mode motion vectors to be used as a starting
* point in the mv search for compound modes . Each array is length REF_FRAMES ,
* meaning there is a slot for a single reference motion vector for
* each possible reference frame . The 2 D array consists of N of these arrays ,
* where N is the length of the reference mv stack computed for the single
* reference case for that particular reference frame .
*/
int_mv (*single_newmv)[REF_FRAMES];
/*!
* Pointer to the first array of a 2 D array with the same setup as
* single_newmv array above . This is a 2 D array to hold the rate
* corresponding to each of the single reference mode motion vectors
* held in single_newmv .
*/
int (*single_newmv_rate)[REF_FRAMES];
/*!
* Pointer to the first array of a 2 D array with the same setup as
* single_newmv array above . This is a 2 D array to hold a 0 or 1
* validity value corresponding to each of the single reference mode motion
* vectors held in single_newmv .
*/
int (*single_newmv_valid)[REF_FRAMES];
/*!
* Pointer to the first array in a 3 D array of predicted rate - distortion .
* The dimensions of this structure are :
* ( number of possible inter modes ) X
* ( number of reference MVs ) X
* ( number of reference frames ) .
*/
int64_t (*modelled_rd)[MAX_REF_MV_SEARCH][REF_FRAMES];
/*!
* Holds an estimated entropy cost for picking the current reference frame .
* This is used to compute an rd estimate .
*/
int ref_frame_cost;
/*!
* Holds an estimated entropy cost for picking single or compound
* reference . This is used to compute an rd estimate .
*/
int single_comp_cost;
/*!
* Pointer to the first element in a 3 D array holding rd ' s of
* SIMPLE_TRANSLATION used to prune out the motion mode search in single ref
* modes used to determine compound ref modes . The full structure is :
* ( number of inter modes ) X ( length of refmv list ) X ( number of ref frames )
*/
int64_t (*simple_rd)[MAX_REF_MV_SEARCH][REF_FRAMES];
/*!
* An integer value 0 or 1 which indicates whether or not to skip the motion
* mode search and default to SIMPLE_TRANSLATION as a speed feature .
*/
int skip_motion_mode;
/*!
* Initialized to false . If true , skips interpolation filter search and uses
* the default EIGHTTAP_REGULAR .
*/
bool skip_ifs;
/*!
* A pointer to the first element in an array of INTERINTRA_MODE types . This
* contains the best inter_intra mode for each reference frame .
*/
INTERINTRA_MODE *inter_intra_mode;
/*!
* Array of saved interpolation filter stats collected to avoid repeating
* an interpolation filter search when the mv and ref_frame are the same
* as a previous search .
*/
INTERPOLATION_FILTER_STATS interp_filter_stats[MAX_INTERP_FILTER_STATS];
/*!
* Stack to store full pixel search start mv of NEWMV mode .
*/
FULLPEL_MV start_mv_stack[MAX_REF_MV_SEARCH * 2 ];
/*!
* Stack to store ref_mv_idx of NEWMV mode .
*/
uint8_t ref_mv_idx_stack[MAX_REF_MV_SEARCH * 2 ];
/*!
* Count of mvs in start mv stack .
*/
int start_mv_cnt;
/*!
* Index of the last set of saved stats in the interp_filter_stats array .
*/
int interp_filter_stats_idx;
/*!
* Estimated wedge index .
*/
int wedge_index;
/*!
* Estimated wedge sign .
*/
int wedge_sign;
/*!
* Estimated diff wtd index .
*/
int diffwtd_index;
/*!
* Estimated cmp mode .
*/
int cmp_mode[MODE_CTX_REF_FRAMES];
/*!
* The best sse during single new_mv search . Note that the sse here comes from
* single_motion_search , and not from interpolation_filter_search . This has
* two implications :
* 1 . The mv used to calculate the sse here does not have to be the best sse
* found in handle_inter_mode .
* 2 . Even if the mvs agree , the sse here can differ from the sse in \ ref
* MACROBLOCK : : pred_sse due to different interpolation filter used .
*/
unsigned int best_single_sse_in_refs[REF_FRAMES];
/*!
* Holds the sse of best mode so far in the mode evaluation process . This is
* used in intermediate termination of NEWMV mode evaluation .
*/
unsigned int best_pred_sse;
} HandleInterModeArgs;
/*!\cond */
static const int_interpfilters filter_sets[DUAL_FILTER_SET_SIZE] = {
{ 0 x00000000 }, { 0 x00010000 }, { 0 x00020000 }, // y = 0
{ 0 x00000001 }, { 0 x00010001 }, { 0 x00020001 }, // y = 1
{ 0 x00000002 }, { 0 x00010002 }, { 0 x00020002 }, // y = 2
};
int64_t av1_interpolation_filter_search(
MACROBLOCK *const x, const AV1_COMP *const cpi,
const TileDataEnc *tile_data, BLOCK_SIZE bsize,
const BUFFER_SET *const tmp_dst, const BUFFER_SET *const orig_dst,
int64_t *const rd, int *const switchable_rate, int *skip_build_pred,
HandleInterModeArgs *args, int64_t ref_best_rd);
/*!\endcond */
#ifdef __cplusplus
} // extern "C"
#endif
#endif // AOM_AV1_ENCODER_INTERP_FILTER_SEARCH_H_
Messung V0.5 in Prozent C=77 H=100 G=89
¤ Dauer der Verarbeitung: 0.16 Sekunden
(vorverarbeitet am 2026-08-26)
¤
*© Formatika GbR, Deutschland