/* * Copyright (c) 2016, 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.
*/
// TODO(yunqing, any): Added suppression tag to quiet Doxygen warnings. Need to // adjust it while we work on documentation. /*!\cond */ // Number of frames required to test for scene cut detection #define SCENE_CUT_KEY_TEST_INTERVAL 16
// Lookahead index threshold to enable temporal filtering for second arf. #define TF_LOOKAHEAD_IDX_THR 7
// Rational number with an int64 numerator // This structure holds a fractional value typedefstruct aom_rational64 {
int64_t num; // fraction numerator int den; // fraction denominator
} aom_rational64_t; // alias for struct aom_rational
enum { // Good Quality Fast Encoding. The encoder balances quality with the amount of // time it takes to encode the output. Speed setting controls how fast.
GOOD, // Realtime Fast Encoding. Will force some restrictions on bitrate // constraints.
REALTIME, // All intra mode. All the frames are coded as intra frames.
ALLINTRA
} UENUM1BYTE(MODE);
#if CONFIG_FPMT_TEST enum {
PARALLEL_ENCODE = 0,
PARALLEL_SIMULATION_ENCODE,
NUM_FPMT_TEST_ENCODES
} UENUM1BYTE(FPMT_TEST_ENC_CFG); #endif// CONFIG_FPMT_TEST // 0 level frames are sometimes used for rate control purposes, but for // reference mapping purposes, the minimum level should be 1. #define MIN_PYR_LEVEL 1 staticinlineint get_true_pyr_level(int frame_level, int frame_order, int max_layer_depth) { if (frame_order == 0) { // Keyframe case return MIN_PYR_LEVEL;
} elseif (frame_level == MAX_ARF_LAYERS) { // Leaves return max_layer_depth;
} elseif (frame_level == (MAX_ARF_LAYERS + 1)) { // Altrefs return MIN_PYR_LEVEL;
} return AOMMAX(MIN_PYR_LEVEL, frame_level);
}
enum {
NO_AQ = 0,
VARIANCE_AQ = 1,
COMPLEXITY_AQ = 2,
CYCLIC_REFRESH_AQ = 3,
AQ_MODE_COUNT // This should always be the last member of the enum
} UENUM1BYTE(AQ_MODE); enum {
NO_DELTA_Q = 0,
DELTA_Q_OBJECTIVE = 1, // Modulation to improve objective quality
DELTA_Q_PERCEPTUAL = 2, // Modulation to improve video perceptual quality
DELTA_Q_PERCEPTUAL_AI = 3, // Perceptual quality opt for all intra mode
DELTA_Q_USER_RATING_BASED = 4, // User rating based delta q mode
DELTA_Q_HDR = 5, // QP adjustment based on HDR block pixel average
DELTA_Q_VARIANCE_BOOST =
6, // Variance Boost style modulation for all intra mode
DELTA_Q_MODE_COUNT // This should always be the last member of the enum
} UENUM1BYTE(DELTAQ_MODE);
enum {
RESIZE_NONE = 0, // No frame resizing allowed.
RESIZE_FIXED = 1, // All frames are coded at the specified scale.
RESIZE_RANDOM = 2, // All frames are coded at a random scale.
RESIZE_DYNAMIC = 3, // Frames coded at lower scale based on rate control.
RESIZE_MODES
} UENUM1BYTE(RESIZE_MODE);
enum {
DISABLE_SCENECUT, // For LAP, lag_in_frames < 19
ENABLE_SCENECUT_MODE_1, // For LAP, lag_in_frames >=19 and < 33
ENABLE_SCENECUT_MODE_2 // For twopass and LAP - lag_in_frames >=33
} UENUM1BYTE(SCENECUT_MODE);
/*!\enum COST_UPDATE_TYPE * \brief This enum controls how often the entropy costs should be updated. * \warning In case of any modifications/additions done to the enum * COST_UPDATE_TYPE, the enum INTERNAL_COST_UPDATE_TYPE needs to be updated as * well.
*/ typedefenum {
COST_UPD_SB, /*!< Update every sb. */
COST_UPD_SBROW, /*!< Update every sb rows inside a tile. */
COST_UPD_TILE, /*!< Update every tile. */
COST_UPD_OFF, /*!< Turn off cost updates. */
NUM_COST_UPDATE_TYPES, /*!< Number of cost update types. */
} COST_UPDATE_TYPE;
/*!\enum LOOPFILTER_CONTROL * \brief This enum controls to which frames loopfilter is applied.
*/ typedefenum {
LOOPFILTER_NONE = 0, /*!< Disable loopfilter on all frames. */
LOOPFILTER_ALL = 1, /*!< Enable loopfilter for all frames. */
LOOPFILTER_REFERENCE = 2, /*!< Disable loopfilter on non reference frames. */
LOOPFILTER_SELECTIVELY =
3, /*!< Disable loopfilter on frames with low motion. */
} LOOPFILTER_CONTROL;
/*!\enum SKIP_APPLY_POSTPROC_FILTER * \brief This enum controls the application of post-processing filters on a * reconstructed frame.
*/ typedefenum {
SKIP_APPLY_RESTORATION = 1 << 0,
SKIP_APPLY_SUPERRES = 1 << 1,
SKIP_APPLY_CDEF = 1 << 2,
SKIP_APPLY_LOOPFILTER = 1 << 3,
} SKIP_APPLY_POSTPROC_FILTER;
/*! * \brief Encoder config related to resize.
*/ typedefstruct { /*! * Indicates the frame resize mode to be used by the encoder.
*/
RESIZE_MODE resize_mode; /*! * Indicates the denominator for resize of inter frames, assuming 8 as the * numerator. Its value ranges between 8-16.
*/
uint8_t resize_scale_denominator; /*! * Indicates the denominator for resize of key frames, assuming 8 as the * numerator. Its value ranges between 8-16.
*/
uint8_t resize_kf_scale_denominator;
} ResizeCfg;
/*! * \brief Encoder config for coding block partitioning.
*/ typedefstruct { /*! * Flag to indicate if rectanguar partitions should be enabled.
*/ bool enable_rect_partitions; /*! * Flag to indicate if AB partitions should be enabled.
*/ bool enable_ab_partitions; /*! * Flag to indicate if 1:4 / 4:1 partitions should be enabled.
*/ bool enable_1to4_partitions; /*! * Indicates the minimum partition size that should be allowed. Both width and * height of a partition cannot be smaller than the min_partition_size.
*/
BLOCK_SIZE min_partition_size; /*! * Indicates the maximum partition size that should be allowed. Both width and * height of a partition cannot be larger than the max_partition_size.
*/
BLOCK_SIZE max_partition_size;
} PartitionCfg;
/*! * \brief Encoder flags for intra prediction.
*/ typedefstruct { /*! * Flag to indicate if intra edge filtering process should be enabled.
*/ bool enable_intra_edge_filter; /*! * Flag to indicate if recursive filtering based intra prediction should be * enabled.
*/ bool enable_filter_intra; /*! * Flag to indicate if smooth intra prediction modes should be enabled.
*/ bool enable_smooth_intra; /*! * Flag to indicate if PAETH intra prediction mode should be enabled.
*/ bool enable_paeth_intra; /*! * Flag to indicate if CFL uv intra mode should be enabled.
*/ bool enable_cfl_intra; /*! * Flag to indicate if directional modes should be enabled.
*/ bool enable_directional_intra; /*! * Flag to indicate if the subset of directional modes from D45 to D203 intra * should be enabled. Has no effect if directional modes are disabled.
*/ bool enable_diagonal_intra; /*! * Flag to indicate if delta angles for directional intra prediction should be * enabled.
*/ bool enable_angle_delta; /*! * Flag to indicate whether to automatically turn off several intral coding * tools. * This flag is only used when "--deltaq-mode=3" is true. * When set to 1, the encoder will analyze the reconstruction quality * as compared to the source image in the preprocessing pass. * If the recontruction quality is considered high enough, we disable * the following intra coding tools, for better encoding speed: * "--enable_smooth_intra", * "--enable_paeth_intra", * "--enable_cfl_intra", * "--enable_diagonal_intra".
*/ bool auto_intra_tools_off;
} IntraModeCfg;
/*! * \brief Encoder flags for transform sizes and types.
*/ typedefstruct { /*! * Flag to indicate if 64-pt transform should be enabled.
*/ bool enable_tx64; /*! * Flag to indicate if flip and identity transform types should be enabled.
*/ bool enable_flip_idtx; /*! * Flag to indicate if rectangular transform should be enabled.
*/ bool enable_rect_tx; /*! * Flag to indicate whether or not to use a default reduced set for ext-tx * rather than the potential full set of 16 transforms.
*/ bool reduced_tx_type_set; /*! * Flag to indicate if transform type for intra blocks should be limited to * DCT_DCT.
*/ bool use_intra_dct_only; /*! * Flag to indicate if transform type for inter blocks should be limited to * DCT_DCT.
*/ bool use_inter_dct_only; /*! * Flag to indicate if intra blocks should use default transform type * (mode-dependent) only.
*/ bool use_intra_default_tx_only; /*! * Flag to indicate if transform size search should be enabled.
*/ bool enable_tx_size_search;
} TxfmSizeTypeCfg;
/*! * \brief Encoder flags for compound prediction modes.
*/ typedefstruct { /*! * Flag to indicate if distance-weighted compound type should be enabled.
*/ bool enable_dist_wtd_comp; /*! * Flag to indicate if masked (wedge/diff-wtd) compound type should be * enabled.
*/ bool enable_masked_comp; /*! * Flag to indicate if smooth interintra mode should be enabled.
*/ bool enable_smooth_interintra; /*! * Flag to indicate if difference-weighted compound type should be enabled.
*/ bool enable_diff_wtd_comp; /*! * Flag to indicate if inter-inter wedge compound type should be enabled.
*/ bool enable_interinter_wedge; /*! * Flag to indicate if inter-intra wedge compound type should be enabled.
*/ bool enable_interintra_wedge;
} CompoundTypeCfg;
/*! * \brief Encoder config related to frame super-resolution.
*/ typedefstruct { /*! * Indicates the qindex based threshold to be used when AOM_SUPERRES_QTHRESH * mode is used for inter frames.
*/ int superres_qthresh; /*! * Indicates the qindex based threshold to be used when AOM_SUPERRES_QTHRESH * mode is used for key frames.
*/ int superres_kf_qthresh; /*! * Indicates the denominator of the fraction that specifies the ratio between * the superblock width before and after upscaling for inter frames. The * numerator of this fraction is equal to the constant SCALE_NUMERATOR.
*/
uint8_t superres_scale_denominator; /*! * Indicates the denominator of the fraction that specifies the ratio between * the superblock width before and after upscaling for key frames. The * numerator of this fraction is equal to the constant SCALE_NUMERATOR.
*/
uint8_t superres_kf_scale_denominator; /*! * Indicates the Super-resolution mode to be used by the encoder.
*/
aom_superres_mode superres_mode; /*! * Flag to indicate if super-resolution should be enabled for the sequence.
*/ bool enable_superres;
} SuperResCfg;
/*! * \brief Encoder config related to the coding of key frames.
*/ typedefstruct { /*! * Indicates the minimum distance to a key frame.
*/ int key_freq_min;
/*! * Indicates the maximum distance to a key frame.
*/ int key_freq_max;
/*! * Indicates if temporal filtering should be applied on keyframe.
*/ int enable_keyframe_filtering;
/*! * Indicates the number of frames after which a frame may be coded as an * S-Frame.
*/ int sframe_dist;
/*! * Indicates how an S-Frame should be inserted. * 1: the considered frame will be made into an S-Frame only if it is an * altref frame. 2: the next altref frame will be made into an S-Frame.
*/ int sframe_mode;
/*! * Indicates if encoder should autodetect cut scenes and set the keyframes.
*/ bool auto_key;
/*! * Indicates the forward key frame distance.
*/ int fwd_kf_dist;
/*! * Indicates if forward keyframe reference should be enabled.
*/ bool fwd_kf_enabled;
/*! * Indicates if S-Frames should be enabled for the sequence.
*/ bool enable_sframe;
/*! * Indicates if intra block copy prediction mode should be enabled or not.
*/ bool enable_intrabc;
} KeyFrameCfg;
/*! * \brief Encoder rate control configuration parameters
*/ typedefstruct { /*!\cond */ // BUFFERING PARAMETERS /*!\endcond */ /*! * Indicates the amount of data that will be buffered by the decoding * application prior to beginning playback, and is expressed in units of * time(milliseconds).
*/
int64_t starting_buffer_level_ms; /*! * Indicates the amount of data that the encoder should try to maintain in the * decoder's buffer, and is expressed in units of time(milliseconds).
*/
int64_t optimal_buffer_level_ms; /*! * Indicates the maximum amount of data that may be buffered by the decoding * application, and is expressed in units of time(milliseconds).
*/
int64_t maximum_buffer_size_ms;
/*! * Indicates the bandwidth to be used in bits per second.
*/
int64_t target_bandwidth;
/*! * Indicates average complexity of the corpus in single pass vbr based on * LAP. 0 indicates that corpus complexity vbr mode is disabled.
*/ unsignedint vbr_corpus_complexity_lap; /*! * Indicates the maximum allowed bitrate for any intra frame as % of bitrate * target.
*/ unsignedint max_intra_bitrate_pct; /*! * Indicates the maximum allowed bitrate for any inter frame as % of bitrate * target.
*/ unsignedint max_inter_bitrate_pct; /*! * Indicates the percentage of rate boost for golden frame in CBR mode.
*/ unsignedint gf_cbr_boost_pct; /*! * min_cr / 100 indicates the target minimum compression ratio for each * frame.
*/ unsignedint min_cr; /*! * Indicates the frame drop threshold.
*/ int drop_frames_water_mark; /*! * under_shoot_pct indicates the tolerance of the VBR algorithm to * undershoot and is used as a trigger threshold for more aggressive * adaptation of Q. It's value can range from 0-100.
*/ int under_shoot_pct; /*! * over_shoot_pct indicates the tolerance of the VBR algorithm to overshoot * and is used as a trigger threshold for more aggressive adaptation of Q. * It's value can range from 0-1000.
*/ int over_shoot_pct; /*! * Indicates the maximum qindex that can be used by the quantizer i.e. the * worst quality qindex.
*/ int worst_allowed_q; /*! * Indicates the minimum qindex that can be used by the quantizer i.e. the * best quality qindex.
*/ int best_allowed_q; /*! * Indicates the Constant/Constrained Quality level.
*/ int cq_level; /*! * Indicates if the encoding mode is vbr, cbr, constrained quality or * constant quality.
*/ enum aom_rc_mode mode; /*! * Indicates the bias (expressed on a scale of 0 to 100) for determining * target size for the current frame. The value 0 indicates the optimal CBR * mode value should be used, and 100 indicates the optimal VBR mode value * should be used.
*/ int vbrbias; /*! * Indicates the minimum bitrate to be used for a single frame as a percentage * of the target bitrate.
*/ int vbrmin_section; /*! * Indicates the maximum bitrate to be used for a single frame as a percentage * of the target bitrate.
*/ int vbrmax_section;
/*! * Indicates the maximum consecutive amount of frame drops, in units of time * (milliseconds). This is converted to frame units internally. Only used in * CBR mode.
*/ int max_consec_drop_ms;
} RateControlCfg;
/*!\cond */ typedefstruct { // Indicates the number of frames lag before encoding is started. int lag_in_frames; // Indicates the minimum gf/arf interval to be used. int min_gf_interval; // Indicates the maximum gf/arf interval to be used. int max_gf_interval; // Indicates the minimum height for GF group pyramid structure to be used. int gf_min_pyr_height; // Indicates the maximum height for GF group pyramid structure to be used. int gf_max_pyr_height; // Indicates if automatic set and use of altref frames should be enabled. bool enable_auto_arf; // Indicates if automatic set and use of (b)ackward (r)ef (f)rames should be // enabled. bool enable_auto_brf;
} GFConfig;
typedefstruct { // Indicates the number of tile groups. unsignedint num_tile_groups; // Indicates the MTU size for a tile group. If mtu is non-zero, // num_tile_groups is set to DEFAULT_MAX_NUM_TG. unsignedint mtu; // Indicates the number of tile columns in log2. int tile_columns; // Indicates the number of tile rows in log2. int tile_rows; // Indicates the number of widths in the tile_widths[] array. int tile_width_count; // Indicates the number of heights in the tile_heights[] array. int tile_height_count; // Indicates the tile widths, and may be empty. int tile_widths[MAX_TILE_COLS]; // Indicates the tile heights, and may be empty. int tile_heights[MAX_TILE_ROWS]; // Indicates if large scale tile coding should be used. bool enable_large_scale_tile; // Indicates if single tile decoding mode should be enabled. bool enable_single_tile_decoding; // Indicates if EXT_TILE_DEBUG should be enabled. bool enable_ext_tile_debug;
} TileConfig;
typedefstruct { // Indicates the width of the input frame. int width; // Indicates the height of the input frame. int height; // If forced_max_frame_width is non-zero then it is used to force the maximum // frame width written in write_sequence_header(). int forced_max_frame_width; // If forced_max_frame_width is non-zero then it is used to force the maximum // frame height written in write_sequence_header(). int forced_max_frame_height; // Indicates the frame width after applying both super-resolution and resize // to the coded frame. int render_width; // Indicates the frame height after applying both super-resolution and resize // to the coded frame. int render_height;
} FrameDimensionCfg;
typedefstruct { // Indicates if warped motion should be enabled. bool enable_warped_motion; // Indicates if warped motion should be evaluated or not. bool allow_warped_motion; // Indicates if OBMC motion should be enabled. bool enable_obmc;
} MotionModeCfg;
typedefstruct { // Timing info for each frame.
aom_timing_info_t timing_info; // Indicates the number of time units of a decoding clock.
uint32_t num_units_in_decoding_tick; // Indicates if decoder model information is present in the coded sequence // header. bool decoder_model_info_present_flag; // Indicates if display model information is present in the coded sequence // header. bool display_model_info_present_flag; // Indicates if timing info for each frame is present. bool timing_info_present;
} DecoderModelCfg;
typedefstruct { // Indicates the update frequency for coeff costs.
COST_UPDATE_TYPE coeff; // Indicates the update frequency for mode costs.
COST_UPDATE_TYPE mode; // Indicates the update frequency for mv costs.
COST_UPDATE_TYPE mv; // Indicates the update frequency for dv costs.
COST_UPDATE_TYPE dv;
} CostUpdateFreq;
typedefstruct { // Indicates the maximum number of reference frames allowed per frame. unsignedint max_reference_frames; // Indicates if the reduced set of references should be enabled. bool enable_reduced_reference_set; // Indicates if one-sided compound should be enabled. bool enable_onesided_comp;
} RefFrameCfg;
typedefstruct { // Indicates the color space that should be used.
aom_color_primaries_t color_primaries; // Indicates the characteristics of transfer function to be used.
aom_transfer_characteristics_t transfer_characteristics; // Indicates the matrix coefficients to be used for the transfer function.
aom_matrix_coefficients_t matrix_coefficients; // Indicates the chroma 4:2:0 sample position info.
aom_chroma_sample_position_t chroma_sample_position; // Indicates if a limited color range or full color range should be used.
aom_color_range_t color_range;
} ColorCfg;
typedefstruct { // Indicates if extreme motion vector unit test should be enabled or not. unsignedint motion_vector_unit_test; // Indicates if superblock multipass unit test should be enabled or not. unsignedint sb_multipass_unit_test;
} UnitTestCfg;
typedefstruct { // Indicates the file path to the VMAF model. constchar *vmaf_model_path; // Indicates the path to the film grain parameters. constchar *film_grain_table_filename; // Indicates the visual tuning metric.
aom_tune_metric tuning; // Indicates if the current content is screen or default type.
aom_tune_content content; // Indicates the film grain parameters. int film_grain_test_vector; // Indicates the in-block distortion metric to use.
aom_dist_metric dist_metric;
} TuneCfg;
typedefstruct { // Indicates the framerate of the input video. double init_framerate; // Indicates the bit-depth of the input video. unsignedint input_bit_depth; // Indicates the maximum number of frames to be encoded. unsignedint limit; // Indicates the chrome subsampling x value. unsignedint chroma_subsampling_x; // Indicates the chrome subsampling y value. unsignedint chroma_subsampling_y;
} InputCfg;
typedefstruct { // If true, encoder will use fixed QP offsets, that are either: // - Given by the user, and stored in 'fixed_qp_offsets' array, OR // - Picked automatically from cq_level. int use_fixed_qp_offsets; // Indicates the minimum flatness of the quantization matrix. int qm_minlevel; // Indicates the maximum flatness of the quantization matrix. int qm_maxlevel; // Indicates if adaptive quantize_b should be enabled. int quant_b_adapt; // Indicates the Adaptive Quantization mode to be used.
AQ_MODE aq_mode; // Indicates the delta q mode to be used.
DELTAQ_MODE deltaq_mode; // Indicates the delta q mode strength.
DELTAQ_MODE deltaq_strength; // Indicates if delta quantization should be enabled in chroma planes. bool enable_chroma_deltaq; // Indicates if delta quantization should be enabled for hdr video bool enable_hdr_deltaq; // Indicates if encoding with quantization matrices should be enabled. bool using_qm;
} QuantizationCfg;
/*!\endcond */ /*! * \brief Algorithm configuration parameters.
*/ typedefstruct { /*! * Controls the level at which rate-distortion optimization of transform * coefficients favors sharpness in the block. Has no impact on RD when set * to zero (default). * * For values 1-7, eob and skip block optimization are * avoided and rdmult is adjusted in favor of block sharpness. * * In all-intra mode: it also sets the `loop_filter_sharpness` syntax element * in the bitstream. Larger values increasingly reduce how much the filtering * can change the sample values on block edges to favor perceived sharpness.
*/ int sharpness;
/*! * Indicates the trellis optimization mode of quantized coefficients. * 0: disabled * 1: enabled * 2: enabled for rd search * 3: true for estimate yrd search
*/ int disable_trellis_quant;
/*! * The maximum number of frames used to create an arf.
*/ int arnr_max_frames;
/*! * The temporal filter strength for arf used when creating ARFs.
*/ int arnr_strength;
/*! * Indicates the CDF update mode * 0: no update * 1: update on every frame(default) * 2: selectively update
*/
uint8_t cdf_update_mode;
/*! * Indicates if RDO based on frame temporal dependency should be enabled.
*/ bool enable_tpl_model;
/*! * Indicates if coding of overlay frames for filtered ALTREF frames is * enabled.
*/ bool enable_overlay;
/*! * Controls loop filtering * 0: Loop filter is disabled for all frames * 1: Loop filter is enabled for all frames * 2: Loop filter is disabled for non-reference frames * 3: Loop filter is disables for the frames with low motion
*/
LOOPFILTER_CONTROL loopfilter_control;
/*! * Indicates if the application of post-processing filters should be skipped * on reconstructed frame.
*/ bool skip_postproc_filtering;
} AlgoCfg; /*!\cond */
typedefstruct { // Indicates the codec bit-depth.
aom_bit_depth_t bit_depth; // Indicates the superblock size that should be used by the encoder.
aom_superblock_size_t superblock_size; // Indicates if loopfilter modulation should be enabled. bool enable_deltalf_mode; // Indicates how CDEF should be applied.
CDEF_CONTROL cdef_control; // Indicates if loop restoration filter should be enabled. bool enable_restoration; // When enabled, video mode should be used even for single frame input. bool force_video_mode; // Indicates if the error resiliency features should be enabled. bool error_resilient_mode; // Indicates if frame parallel decoding feature should be enabled. bool frame_parallel_decoding_mode; // Indicates if the input should be encoded as monochrome. bool enable_monochrome; // When enabled, the encoder will use a full header even for still pictures. // When disabled, a reduced header is used for still pictures. bool full_still_picture_hdr; // Indicates if dual interpolation filters should be enabled. bool enable_dual_filter; // Indicates if frame order hint should be enabled or not. bool enable_order_hint; // Indicates if ref_frame_mvs should be enabled at the sequence level. bool ref_frame_mvs_present; // Indicates if ref_frame_mvs should be enabled at the frame level. bool enable_ref_frame_mvs; // Indicates if interintra compound mode is enabled. bool enable_interintra_comp; // Indicates if global motion should be enabled. bool enable_global_motion; // Indicates if palette should be enabled. bool enable_palette;
} ToolCfg;
/*!\endcond */ /*! * \brief Main encoder configuration data structure.
*/ typedefstruct AV1EncoderConfig { /*!\cond */ // Configuration related to the input video.
InputCfg input_cfg;
// Configuration related to frame-dimensions.
FrameDimensionCfg frm_dim_cfg;
/*!\endcond */ /*! * stats_in buffer contains all of the stats packets produced in the first * pass, concatenated.
*/
aom_fixed_buf_t twopass_stats_in; /*!\cond */
// Configuration related to encoder toolsets.
ToolCfg tool_cfg;
// Configuration related to Group of frames.
GFConfig gf_cfg;
// Tile related configuration parameters.
TileConfig tile_cfg;
// Configuration related to Tune.
TuneCfg tune_cfg;
// Configuration related to color.
ColorCfg color_cfg;
// Configuration related to decoder model.
DecoderModelCfg dec_model_cfg;
// Configuration related to reference frames.
RefFrameCfg ref_frm_cfg;
// Configuration related to unit tests.
UnitTestCfg unit_test_cfg;
// Flags related to motion mode.
MotionModeCfg motion_mode_cfg;
// Flags related to intra mode search.
IntraModeCfg intra_mode_cfg;
// Flags related to transform size/type.
TxfmSizeTypeCfg txfm_cfg;
// Flags related to compound type.
CompoundTypeCfg comp_type_cfg;
// Partition related information.
PartitionCfg part_cfg;
// Configuration related to frequency of cost update.
CostUpdateFreq cost_upd_freq;
#if CONFIG_DENOISE // Indicates the noise level. float noise_level; // Indicates the the denoisers block size. int noise_block_size; // Indicates whether to apply denoising to the frame to be encoded int enable_dnl_denoising; #endif
#if CONFIG_AV1_TEMPORAL_DENOISING // Noise sensitivity. int noise_sensitivity; #endif // Bit mask to specify which tier each of the 32 possible operating points // conforms to. unsignedint tier_mask;
// Indicates the number of pixels off the edge of a reference frame we're // allowed to go when forming an inter prediction. int border_in_pixels;
// Indicates the maximum number of threads that may be used by the encoder. int max_threads;
// Indicates the speed preset to be used. int speed;
// Indicates the target sequence level index for each operating point(OP).
AV1_LEVEL target_seq_level_idx[MAX_NUM_OPERATING_POINTS];
// Indicates the bitstream profile to be used.
BITSTREAM_PROFILE profile;
/*!\endcond */ /*! * Indicates the current encoder pass : * AOM_RC_ONE_PASS = One pass encode, * AOM_RC_FIRST_PASS = First pass of multiple-pass * AOM_RC_SECOND_PASS = Second pass of multiple-pass * AOM_RC_THIRD_PASS = Third pass of multiple-pass
*/ enum aom_enc_pass pass; /*!\cond */
// Total number of encoding passes. int passes;
// the name of the second pass output file when passes > 2 constchar *two_pass_output;
// the name of the second pass log file when passes > 2 constchar *second_pass_log;
// Indicates if the encoding is GOOD or REALTIME.
MODE mode;
// Indicates if row-based multi-threading should be enabled or not. bool row_mt;
// Indicates if frame parallel multi-threading should be enabled or not. bool fp_mt;
// Indicates if 16bit frame buffers are to be used i.e., the content is > // 8-bit. bool use_highbitdepth;
// Indicates the bitstream syntax mode. 0 indicates bitstream is saved as // Section 5 bitstream, while 1 indicates the bitstream is saved in Annex - B // format. bool save_as_annexb;
// The path for partition stats reading and writing, used in the experiment // CONFIG_PARTITION_SEARCH_ORDER. constchar *partition_info_path;
// The flag that indicates whether we use an external rate distribution to // guide adaptive quantization. It requires --deltaq-mode=3. The rate // distribution map file name is stored in |rate_distribution_info|. unsignedint enable_rate_guide_deltaq;
// The input file of rate distribution information used in all intra mode // to determine delta quantization. constchar *rate_distribution_info;
// Exit the encoder when it fails to encode to a given level. int strict_level_conformance;
// Max depth for the GOP after a key frame int kf_max_pyr_height;
// A flag to control if we enable the superblock qp sweep for a given lambda int sb_qp_sweep; /*!\endcond */
} AV1EncoderConfig;
/*! * \brief Encoder-side probabilities for pruning of various AV1 tools
*/ typedefstruct { /*! * obmc_probs[i][j] is the probability of OBMC being the best motion mode for * jth block size and ith frame update type, averaged over past frames. If * obmc_probs[i][j] < thresh, then OBMC search is pruned.
*/ int obmc_probs[FRAME_UPDATE_TYPES][BLOCK_SIZES_ALL];
/*! * warped_probs[i] is the probability of warped motion being the best motion * mode for ith frame update type, averaged over past frames. If * warped_probs[i] < thresh, then warped motion search is pruned.
*/ int warped_probs[FRAME_UPDATE_TYPES];
/*! * tx_type_probs[i][j][k] is the probability of kth tx_type being the best * for jth transform size and ith frame update type, averaged over past * frames. If tx_type_probs[i][j][k] < thresh, then transform search for that * type is pruned.
*/ int tx_type_probs[FRAME_UPDATE_TYPES][TX_SIZES_ALL][TX_TYPES];
/*! * switchable_interp_probs[i][j][k] is the probability of kth interpolation * filter being the best for jth filter context and ith frame update type, * averaged over past frames. If switchable_interp_probs[i][j][k] < thresh, * then interpolation filter search is pruned for that case.
*/ int switchable_interp_probs[FRAME_UPDATE_TYPES][SWITCHABLE_FILTER_CONTEXTS]
[SWITCHABLE_FILTERS];
} FrameProbInfo;
typedefstruct { int idx;
int64_t rd;
} RdIdxPair; // TODO(angiebird): This is an estimated size. We still need to figure what is // the maximum number of modes. #define MAX_INTER_MODES 1024 // TODO(any): rename this struct to something else. There is already another // struct called inter_mode_info, which makes this terribly confusing. /*!\endcond */ /*! * \brief Struct used to hold inter mode data for fast tx search. * * This struct is used to perform a full transform search only on winning * candidates searched with an estimate for transform coding RD.
*/ typedefstruct inter_modes_info { /*! * The number of inter modes for which data was stored in each of the * following arrays.
*/ int num; /*! * Mode info struct for each of the candidate modes.
*/
MB_MODE_INFO mbmi_arr[MAX_INTER_MODES]; /*! * The rate for each of the candidate modes.
*/ int mode_rate_arr[MAX_INTER_MODES]; /*! * The sse of the predictor for each of the candidate modes.
*/
int64_t sse_arr[MAX_INTER_MODES]; /*! * The estimated rd of the predictor for each of the candidate modes.
*/
int64_t est_rd_arr[MAX_INTER_MODES]; /*! * The rate and mode index for each of the candidate modes.
*/
RdIdxPair rd_idx_pair_arr[MAX_INTER_MODES]; /*! * The full rd stats for each of the candidate modes.
*/
RD_STATS rd_cost_arr[MAX_INTER_MODES]; /*! * The full rd stats of luma only for each of the candidate modes.
*/
RD_STATS rd_cost_y_arr[MAX_INTER_MODES]; /*! * The full rd stats of chroma only for each of the candidate modes.
*/
RD_STATS rd_cost_uv_arr[MAX_INTER_MODES];
} InterModesInfo;
/*!\cond */ typedefstruct { // TODO(kyslov): consider changing to 64bit
// This struct is used for computing variance in choose_partitioning(), where // the max number of samples within a superblock is 32x32 (with 4x4 avg). // With 8bit bitdepth, uint32_t is enough for sum_square_error (2^8 * 2^8 * 32 // * 32 = 2^26). For high bitdepth we need to consider changing this to 64 bit
uint32_t sum_square_error;
int32_t sum_error; int log2_count; int variance;
} VPartVar;
/*! * \brief Thresholds for variance based partitioning.
*/ typedefstruct { /*! * If block variance > threshold, then that block is forced to split. * thresholds[0] - threshold for 128x128; * thresholds[1] - threshold for 64x64; * thresholds[2] - threshold for 32x32; * thresholds[3] - threshold for 16x16; * thresholds[4] - threshold for 8x8;
*/
int64_t thresholds[5];
/*! * MinMax variance threshold for 8x8 sub blocks of a 16x16 block. If actual * minmax > threshold_minmax, the 16x16 is forced to split.
*/
int64_t threshold_minmax;
} VarBasedPartitionInfo;
/*! * \brief Encoder parameters for synchronization of row based multi-threading
*/ typedefstruct { #if CONFIG_MULTITHREAD /** * \name Synchronization objects for top-right dependency.
*/ /**@{*/
pthread_mutex_t *mutex_; /*!< Mutex lock object */
pthread_cond_t *cond_; /*!< Condition variable */ /**@}*/ #endif// CONFIG_MULTITHREAD /*! * Buffer to store the superblock whose encoding is complete. * num_finished_cols[i] stores the number of superblocks which finished * encoding in the ith superblock row.
*/ int *num_finished_cols; /*! * Denotes the superblock interval at which conditional signalling should * happen. Also denotes the minimum number of extra superblocks of the top row * to be complete to start encoding the current superblock. A value of 1 * indicates top-right dependency.
*/ int sync_range; /*! * Denotes the additional number of superblocks in the previous row to be * complete to start encoding the current superblock when intraBC tool is * enabled. This additional top-right delay is required to satisfy the * hardware constraints for intraBC tool when row multithreading is enabled.
*/ int intrabc_extra_top_right_sb_delay; /*! * Number of superblock rows.
*/ int rows; /*! * The superblock row (in units of MI blocks) to be processed next.
*/ int next_mi_row; /*! * Number of threads processing the current tile.
*/ int num_threads_working;
} AV1EncRowMultiThreadSync;
/*!\cond */
// TODO(jingning) All spatially adaptive variables should go to TileDataEnc. typedefstruct TileDataEnc {
TileInfo tile_info;
DECLARE_ALIGNED(16, FRAME_CONTEXT, tctx);
FRAME_CONTEXT *row_ctx;
uint64_t abs_sum_level;
uint8_t allow_update_cdf;
InterModeRdModel inter_mode_rd_models[BLOCK_SIZES_ALL];
AV1EncRowMultiThreadSync row_mt_sync;
MV firstpass_top_mv;
} TileDataEnc;
typedefstruct RD_COUNTS { int compound_ref_used_flag; int skip_mode_used_flag; int tx_type_used[TX_SIZES_ALL][TX_TYPES]; int obmc_used[BLOCK_SIZES_ALL][2]; int warped_used[2]; int newmv_or_intra_blocks;
uint64_t seg_tmp_pred_cost[2];
} RD_COUNTS;
typedefstruct ThreadData {
MACROBLOCK mb;
MvCosts *mv_costs_alloc;
IntraBCMVCosts *dv_costs_alloc;
RD_COUNTS rd_counts;
FRAME_COUNTS *counts;
PC_TREE_SHARED_BUFFERS shared_coeff_buf;
SIMPLE_MOTION_DATA_TREE *sms_tree;
SIMPLE_MOTION_DATA_TREE *sms_root;
uint32_t *hash_value_buffer[2][2];
OBMCBuffer obmc_buffer;
PALETTE_BUFFER *palette_buffer;
CompoundTypeRdBuffers comp_rd_buffer;
CONV_BUF_TYPE *tmp_conv_dst;
uint64_t abs_sum_level;
uint8_t *tmp_pred_bufs[2];
uint8_t *wiener_tmp_pred_buf; int intrabc_used; int deltaq_used; int coefficient_size; int max_mv_magnitude; int interp_filter_selected[SWITCHABLE];
FRAME_CONTEXT *tctx;
VP64x64 *vt64x64;
int32_t num_64x64_blocks;
PICK_MODE_CONTEXT *firstpass_ctx;
TemporalFilterData tf_data;
TplBuffers tpl_tmp_buffers;
TplTxfmStats tpl_txfm_stats;
GlobalMotionData gm_data; // Pointer to the array of structures to store gradient information of each // pixel in a superblock. The buffer constitutes of MAX_SB_SQUARE pixel level // structures for each of the plane types (PLANE_TYPE_Y and PLANE_TYPE_UV).
PixelLevelGradientInfo *pixel_gradient_info; // Pointer to the array of structures to store source variance information of // each 4x4 sub-block in a superblock. Block4x4VarInfo structure is used to // store source variance and log of source variance of each 4x4 sub-block // for subsequent retrieval.
Block4x4VarInfo *src_var_info_of_4x4_sub_blocks; // Pointer to pc tree root.
PC_TREE *pc_root;
} ThreadData;
struct EncWorkerData;
/*!\endcond */
/*! * \brief Encoder data related to row-based multi-threading
*/ typedefstruct { /*! * Number of tile rows for which row synchronization memory is allocated.
*/ int allocated_tile_rows; /*! * Number of tile cols for which row synchronization memory is allocated.
*/ int allocated_tile_cols; /*! * Number of rows for which row synchronization memory is allocated * per tile. During first-pass/look-ahead stage this equals the * maximum number of macroblock rows in a tile. During encode stage, * this equals the maximum number of superblock rows in a tile.
*/ int allocated_rows; /*! * Number of columns for which entropy context memory is allocated * per tile. During encode stage, this equals the maximum number of * superblock columns in a tile minus 1. The entropy context memory * is not allocated during first-pass/look-ahead stage.
*/ int allocated_cols;
/*! * thread_id_to_tile_id[i] indicates the tile id assigned to the ith thread.
*/ int thread_id_to_tile_id[MAX_NUM_THREADS];
/*! * num_tile_cols_done[i] indicates the number of tile columns whose encoding * is complete in the ith superblock row.
*/ int *num_tile_cols_done;
/*! * Number of superblock rows in a frame for which 'num_tile_cols_done' is * allocated.
*/ int allocated_sb_rows;
/*! * Initialized to false, set to true by the worker thread that encounters an * error in order to abort the processing of other worker threads.
*/ bool row_mt_exit;
/*! * Initialized to false, set to true during first pass encoding by the worker * thread that encounters an error in order to abort the processing of other * worker threads.
*/ bool firstpass_mt_exit;
/*! * Initialized to false, set to true in cal_mb_wiener_var_hook() by the worker * thread that encounters an error in order to abort the processing of other * worker threads.
*/ bool mb_wiener_mt_exit;
#if CONFIG_MULTITHREAD /*! * Mutex lock used while dispatching jobs.
*/
pthread_mutex_t *mutex_; /*! * Condition variable used to dispatch loopfilter jobs.
*/
pthread_cond_t *cond_; #endif
/*! * \brief Encoder data related to multi-threading for allintra deltaq-mode=3
*/ typedefstruct { #if CONFIG_MULTITHREAD /*! * Mutex lock used while dispatching jobs.
*/
pthread_mutex_t *mutex_; /*! * Condition variable used to dispatch loopfilter jobs.
*/
pthread_cond_t *cond_; #endif
/** * \name Row synchronization related function pointers for all intra mode
*/ /**@{*/ /*! * Reader.
*/ void (*intra_sync_read_ptr)(AV1EncRowMultiThreadSync *const, int, int); /*! * Writer.
*/ void (*intra_sync_write_ptr)(AV1EncRowMultiThreadSync *const, int, int, int); /**@}*/
} AV1EncAllIntraMultiThreadInfo;
/*! * \brief Max number of recodes used to track the frame probabilities.
*/ #define NUM_RECODES_PER_FRAME 10
/*! * \brief Max number of frames that can be encoded in a parallel encode set.
*/ #define MAX_PARALLEL_FRAMES 4
/*! * \brief Buffers to be backed up during parallel encode set to be restored * later.
*/ typedefstruct RestoreStateBuffers { /*! * Backup of original CDEF srcbuf.
*/
uint16_t *cdef_srcbuf;
/*! * Backup of original CDEF colbuf.
*/
uint16_t *cdef_colbuf[MAX_MB_PLANE];
/*! * Backup of original LR rst_tmpbuf.
*/
int32_t *rst_tmpbuf;
/*! * Backup of original LR rlbs.
*/
RestorationLineBuffers *rlbs;
} RestoreStateBuffers;
/*! * \brief Parameters related to restoration types.
*/ typedefstruct { /*! * Stores the best coefficients for Wiener restoration.
*/
WienerInfo wiener;
/*! * Stores the best coefficients for Sgrproj restoration.
*/
SgrprojInfo sgrproj;
/*! * The rtype to use for this unit given a frame rtype as index. Indices: * WIENER, SGRPROJ, SWITCHABLE.
*/
RestorationType best_rtype[RESTORE_TYPES - 1];
} RestUnitSearchInfo;
/*! * \brief Structure to hold search parameter per restoration unit and * intermediate buffer of Wiener filter used in pick filter stage of Loop * restoration.
*/ typedefstruct { /*! * Array of pointers to 'RestUnitSearchInfo' which holds data related to * restoration types.
*/
RestUnitSearchInfo *rusi[MAX_MB_PLANE];
/*! * Buffer used to hold dgd-avg data during SIMD call of Wiener filter.
*/
int16_t *dgd_avg;
} AV1LrPickStruct;
/*! * \brief Primary Encoder parameters related to multi-threading.
*/ typedefstruct PrimaryMultiThreadInfo { /*! * Number of workers created for multi-threading.
*/ int num_workers;
/*! * Number of workers used for different MT modules.
*/ int num_mod_workers[NUM_MT_MODULES];
/*! * Synchronization object used to launch job in the worker thread.
*/
AVxWorker *workers;
/*! * Data specific to each worker in encoder multi-threading. * tile_thr_data[i] stores the worker data of the ith thread.
*/ struct EncWorkerData *tile_thr_data;
/*! * Primary(Level 1) Synchronization object used to launch job in the worker * thread.
*/
AVxWorker *p_workers[MAX_PARALLEL_FRAMES];
/*! * Number of primary workers created for multi-threading.
*/ int p_num_workers;
/*! * Tracks the number of workers in encode stage multi-threading.
*/ int prev_num_enc_workers;
} PrimaryMultiThreadInfo;
/*! * \brief Encoder parameters related to multi-threading.
*/ typedefstruct MultiThreadInfo { /*! * Number of workers created for multi-threading.
*/ int num_workers;
/*! * Number of workers used for different MT modules.
*/ int num_mod_workers[NUM_MT_MODULES];
/*! * Synchronization object used to launch job in the worker thread.
*/
AVxWorker *workers;
/*! * Data specific to each worker in encoder multi-threading. * tile_thr_data[i] stores the worker data of the ith thread.
*/ struct EncWorkerData *tile_thr_data;
/*! * When set, indicates that row based multi-threading of the encoder is * enabled.
*/ bool row_mt_enabled;
/*! * When set, indicates that multi-threading for bitstream packing is enabled.
*/ bool pack_bs_mt_enabled;
/*! * Pointer to CDEF row multi-threading data for the frame.
*/
AV1CdefWorkerData *cdef_worker;
/*! * Buffers to be stored/restored before/after parallel encode.
*/
RestoreStateBuffers restore_state_buf;
/*! * In multi-threaded realtime encoding with row-mt enabled, pipeline * loop-filtering after encoding.
*/ int pipeline_lpf_mt_with_enc;
} MultiThreadInfo;
/*!\cond */
typedefstruct ActiveMap { int enabled; int update; unsignedchar *map;
} ActiveMap;
/*!\endcond */
/*! * \brief Encoder info used for decision on forcing integer motion vectors.
*/ typedefstruct { /*! * cs_rate_array[i] is the fraction of blocks in a frame which either match * with the collocated block or are smooth, where i is the rate_index.
*/ double cs_rate_array[32]; /*! * rate_index is used to index cs_rate_array.
*/ int rate_index; /*! * rate_size is the total number of entries populated in cs_rate_array.
*/ int rate_size;
} ForceIntegerMVInfo;
/*!\cond */
#if CONFIG_INTERNAL_STATS // types of stats enum {
STAT_Y,
STAT_U,
STAT_V,
STAT_ALL,
NUM_STAT_TYPES // This should always be the last member of the enum
} UENUM1BYTE(StatType);
typedefstruct { int ref_count;
YV12_BUFFER_CONFIG buf;
} EncRefCntBuffer;
/*!\endcond */
/*! * \brief Buffer to store mode information at mi_alloc_bsize (4x4 or 8x8) level * * This is used for bitstream preparation.
*/ typedefstruct { /*! * frame_base[mi_row * stride + mi_col] stores the mode information of * block (mi_row,mi_col).
*/
MB_MODE_INFO_EXT_FRAME *frame_base; /*! * Size of frame_base buffer.
*/ int alloc_size; /*! * Stride of frame_base buffer.
*/ int stride;
} MBMIExtFrameBufferInfo;
/*!\cond */
#if CONFIG_COLLECT_PARTITION_STATS typedefstruct FramePartitionTimingStats { int partition_decisions[6][EXT_PARTITION_TYPES]; int partition_attempts[6][EXT_PARTITION_TYPES];
int64_t partition_times[6][EXT_PARTITION_TYPES];
int partition_redo;
} FramePartitionTimingStats; #endif// CONFIG_COLLECT_PARTITION_STATS
#if CONFIG_COLLECT_COMPONENT_TIMING #include"aom_ports/aom_timer.h" // Adjust the following to add new components. enum {
av1_encode_strategy_time,
av1_get_one_pass_rt_params_time,
av1_get_second_pass_params_time,
denoise_and_encode_time,
apply_filtering_time,
av1_tpl_setup_stats_time,
encode_frame_to_data_rate_time,
encode_with_or_without_recode_time,
loop_filter_time,
cdef_time,
loop_restoration_time,
av1_pack_bitstream_final_time,
av1_encode_frame_time,
av1_compute_global_motion_time,
av1_setup_motion_field_time,
encode_sb_row_time,
staticinlinecharconst *get_component_name(int index) { switch (index) { case av1_encode_strategy_time: return"av1_encode_strategy_time"; case av1_get_one_pass_rt_params_time: return"av1_get_one_pass_rt_params_time"; case av1_get_second_pass_params_time: return"av1_get_second_pass_params_time"; case denoise_and_encode_time: return"denoise_and_encode_time"; case apply_filtering_time: return"apply_filtering_time"; case av1_tpl_setup_stats_time: return"av1_tpl_setup_stats_time"; case encode_frame_to_data_rate_time: return"encode_frame_to_data_rate_time"; case encode_with_or_without_recode_time: return"encode_with_or_without_recode_time"; case loop_filter_time: return"loop_filter_time"; case cdef_time: return"cdef_time"; case loop_restoration_time: return"loop_restoration_time"; case av1_pack_bitstream_final_time: return"av1_pack_bitstream_final_time"; case av1_encode_frame_time: return"av1_encode_frame_time"; case av1_compute_global_motion_time: return"av1_compute_global_motion_time"; case av1_setup_motion_field_time: return"av1_setup_motion_field_time"; case encode_sb_row_time: return"encode_sb_row_time";
case rd_pick_partition_time: return"rd_pick_partition_time"; case rd_use_partition_time: return"rd_use_partition_time"; case choose_var_based_partitioning_time: return"choose_var_based_partitioning_time"; case av1_prune_partitions_time: return"av1_prune_partitions_time"; case none_partition_search_time: return"none_partition_search_time"; case split_partition_search_time: return"split_partition_search_time"; case rectangular_partition_search_time: return"rectangular_partition_search_time"; case ab_partitions_search_time: return"ab_partitions_search_time"; case rd_pick_4partition_time: return"rd_pick_4partition_time"; case encode_sb_time: return"encode_sb_time";
case rd_pick_sb_modes_time: return"rd_pick_sb_modes_time"; case av1_rd_pick_intra_mode_sb_time: return"av1_rd_pick_intra_mode_sb_time"; case av1_rd_pick_inter_mode_sb_time: return"av1_rd_pick_inter_mode_sb_time"; case set_params_rd_pick_inter_mode_time: return"set_params_rd_pick_inter_mode_time"; case skip_inter_mode_time: return"skip_inter_mode_time"; case handle_inter_mode_time: return"handle_inter_mode_time"; case evaluate_motion_mode_for_winner_candidates_time: return"evaluate_motion_mode_for_winner_candidates_time"; case do_tx_search_time: return"do_tx_search_time"; case handle_intra_mode_time: return"handle_intra_mode_time"; case refine_winner_mode_tx_time: return"refine_winner_mode_tx_time"; case av1_search_palette_mode_time: return"av1_search_palette_mode_time"; case handle_newmv_time: return"handle_newmv_time"; case compound_type_rd_time: return"compound_type_rd_time"; case interpolation_filter_search_time: return"interpolation_filter_search_time"; case motion_mode_rd_time: return"motion_mode_rd_time";
case nonrd_use_partition_time: return"nonrd_use_partition_time"; case pick_sb_modes_nonrd_time: return"pick_sb_modes_nonrd_time"; case hybrid_intra_mode_search_time: return"hybrid_intra_mode_search_time"; case nonrd_pick_inter_mode_sb_time: return"nonrd_pick_inter_mode_sb_time"; case encode_b_nonrd_time: return"encode_b_nonrd_time";
default: assert(0);
} return"error";
} #endif
// The maximum number of internal ARFs except ALTREF_FRAME #define MAX_INTERNAL_ARFS (REF_FRAMES - BWDREF_FRAME - 1)
/*!\endcond */
/*! * \brief Parameters related to global motion search
*/ typedefstruct { /*! * Flag to indicate if global motion search needs to be rerun.
*/ bool search_done;
/*! * Array of pointers to the frame buffers holding the reference frames. * ref_buf[i] stores the pointer to the reference frame of the ith * reference frame type.
*/
YV12_BUFFER_CONFIG *ref_buf[REF_FRAMES];
/*! * Holds the number of valid reference frames in past and future directions * w.r.t. the current frame. num_ref_frames[i] stores the total number of * valid reference frames in 'i' direction.
*/ int num_ref_frames[MAX_DIRECTIONS];
/*! * Array of structure which stores the valid reference frames in past and * future directions and their corresponding distance from the source frame. * reference_frames[i][j] holds the jth valid reference frame type in the * direction 'i' and its temporal distance from the source frame .
*/
FrameDistPair reference_frames[MAX_DIRECTIONS][REF_FRAMES - 1];
/** * \name Dimensions for which segment map is allocated.
*/ /**@{*/ int segment_map_w; /*!< segment map width */ int segment_map_h; /*!< segment map height */ /**@}*/
} GlobalMotionInfo;
/*! * \brief Flags related to interpolation filter search
*/ typedefstruct { /*! * Stores the default value of skip flag depending on chroma format * Set as 1 for monochrome and 3 for other color formats
*/ int default_interp_skip_flags; /*! * Filter mask to allow certain interp_filter type.
*/
uint16_t interp_filter_search_mask;
} InterpSearchFlags;
/*! * \brief Parameters for motion vector search process
*/ typedefstruct { /*! * Largest MV component used in a frame. * The value from the previous frame is used to set the full pixel search * range for the current frame.
*/ int max_mv_magnitude; /*! * Parameter indicating initial search window to be used in full-pixel search. * Range [0, MAX_MVSEARCH_STEPS-2]. Lower value indicates larger window.
*/ int mv_step_param; /*! * Pointer to sub-pixel search function. * In encoder: av1_find_best_sub_pixel_tree * av1_find_best_sub_pixel_tree_pruned * av1_find_best_sub_pixel_tree_pruned_more * In MV unit test: av1_return_max_sub_pixel_mv * av1_return_min_sub_pixel_mv
*/
fractional_mv_step_fp *find_fractional_mv_step; /*! * Search site configuration for full-pel MV search. * search_site_cfg[SS_CFG_SRC]: Used in tpl, rd/non-rd inter mode loop, simple * motion search. search_site_cfg[SS_CFG_LOOKAHEAD]: Used in intraBC, temporal * filter search_site_cfg[SS_CFG_FPF]: Used during first pass and lookahead
*/
search_site_config search_site_cfg[SS_CFG_TOTAL][NUM_DISTINCT_SEARCH_METHODS];
--> --------------------
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.