// 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
#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 static inline int get_true_pyr_level(int frame_level, int frame_order,
int max_layer_depth) {
if (frame_order == 0) { // Keyframe case return MIN_PYR_LEVEL;
} else if (frame_level == MAX_ARF_LAYERS) { // Leaves return max_layer_depth;
} else if (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
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);
/*! *Indicatesaveragecomplexityofthecorpusinsinglepassvbrbasedon *LAP.0indicatesthatcorpuscomplexityvbrmodeisdisabled.
*/ unsigned int vbr_corpus_complexity_lap; /*! *Indicatesthemaximumallowedbitrateforanyintraframeas%ofbitrate *target.
*/ unsigned int max_intra_bitrate_pct; /*! *Indicatesthemaximumallowedbitrateforanyinterframeas%ofbitrate *target.
*/ unsigned int max_inter_bitrate_pct; /*! *IndicatesthepercentageofrateboostforgoldenframeinCBRmode.
*/ unsigned int gf_cbr_boost_pct; /*! *min_cr/100indicatesthetargetminimumcompressionratioforeach *frame.
*/ unsigned int min_cr; /*! *Indicatestheframedropthreshold.
*/
int drop_frames_water_mark; /*! *under_shoot_pctindicatesthetoleranceoftheVBRalgorithmto *undershootandisusedasatriggerthresholdformoreaggressive *adaptationofQ.It'svaluecanrangefrom0-100.
*/
int under_shoot_pct; /*! *over_shoot_pctindicatesthetoleranceoftheVBRalgorithmtoovershoot *andisusedasatriggerthresholdformoreaggressiveadaptationofQ. *It'svaluecanrangefrom0-1000.
*/
int over_shoot_pct; /*! *Indicatesthemaximumqindexthatcanbeusedbythequantizeri.e.the *worstqualityqindex.
*/
int worst_allowed_q; /*! *Indicatestheminimumqindexthatcanbeusedbythequantizeri.e.the *bestqualityqindex.
*/
int best_allowed_q; /*! *IndicatestheConstant/ConstrainedQualitylevel.
*/
int cq_level; /*! *Indicatesiftheencodingmodeisvbr,cbr,constrainedqualityor *constantquality.
*/
enum aom_rc_mode mode; /*! *Indicatesthebias(expressedonascaleof0to100)fordetermining *targetsizeforthecurrentframe.Thevalue0indicatestheoptimalCBR *modevalueshouldbeused,and100indicatestheoptimalVBRmodevalue *shouldbeused.
*/
int vbrbias; /*! *Indicatestheminimumbitratetobeusedforasingleframeasapercentage *ofthetargetbitrate.
*/
int vbrmin_section; /*! *Indicatesthemaximumbitratetobeusedforasingleframeasapercentage *ofthetargetbitrate.
*/
int vbrmax_section;
/*! *Indicatesthemaximumconsecutiveamountofframedrops,inunitsoftime *(milliseconds).Thisisconvertedtoframeunitsinternally.Onlyusedin *CBRmode.
*/
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. unsigned int 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. unsigned int 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. unsigned int 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. unsigned int motion_vector_unit_test; // Indicates if superblock multipass unit test should be enabled or not. unsigned int sb_multipass_unit_test;
} UnitTestCfg;
typedefstruct { // Indicates the file path to the VMAF model. const char *vmaf_model_path; // Indicates the path to the film grain parameters. const char *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 actual bit-depth of the input source. unsigned int input_bit_depth; // Indicates the maximum number of frames to be encoded. unsigned int limit; // Indicates the chrome subsampling x value. unsigned int chroma_subsampling_x; // Indicates the chrome subsampling y value. unsigned int chroma_subsampling_y;
} InputCfg;
typedefstruct { // Controls how the encoder applies fixed QP offsets. // If the value is 0, QP offsets are chosen adaptively. // If the value is 1, fixed QP offsets are picked automatically from cq_level. // If the value is 2, no QP offsets will be applied.
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. unsigned int 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;
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 */ /*! *\briefMainencoderconfigurationdatastructure.
*/ typedefstruct AV1EncoderConfig { /*!\cond */ // Configuration related to the input video.
InputCfg input_cfg;
// Configuration related to frame-dimensions.
FrameDimensionCfg frm_dim_cfg;
// 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. unsigned int 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;
// Enable the low complexity decode mode. unsigned int enable_low_complexity_decode;
// 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;
// the name of the second pass output file when passes > 2 const char *two_pass_output;
// the name of the second pass log file when passes > 2 const char *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. const char *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|. unsigned int enable_rate_guide_deltaq;
// The input file of rate distribution information used in all intra mode // to determine delta quantization. const char *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;
typedefstruct FRAME_COUNTS { // Note: This structure should only contain 'unsigned int' fields, or // aggregates built solely from 'unsigned int' fields/elements #if CONFIG_ENTROPY_STATS unsigned int kf_y_mode[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS][INTRA_MODES]; unsigned int angle_delta[DIRECTIONAL_MODES][2 * MAX_ANGLE_DELTA + 1]; unsigned int y_mode[BLOCK_SIZE_GROUPS][INTRA_MODES]; unsigned int uv_mode[CFL_ALLOWED_TYPES][INTRA_MODES][UV_INTRA_MODES]; unsigned int cfl_sign[CFL_JOINT_SIGNS]; unsigned int cfl_alpha[CFL_ALPHA_CONTEXTS][CFL_ALPHABET_SIZE]; unsigned int palette_y_mode[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS][2]; unsigned int palette_uv_mode[PALETTE_UV_MODE_CONTEXTS][2]; unsigned int palette_y_size[PALATTE_BSIZE_CTXS][PALETTE_SIZES]; unsigned int palette_uv_size[PALATTE_BSIZE_CTXS][PALETTE_SIZES]; unsigned int palette_y_color_index[PALETTE_SIZES]
[PALETTE_COLOR_INDEX_CONTEXTS]
[PALETTE_COLORS]; unsigned int palette_uv_color_index[PALETTE_SIZES]
[PALETTE_COLOR_INDEX_CONTEXTS]
[PALETTE_COLORS]; unsigned int partition[PARTITION_CONTEXTS][EXT_PARTITION_TYPES]; unsigned int txb_skip[TOKEN_CDF_Q_CTXS][TX_SIZES][TXB_SKIP_CONTEXTS][2]; unsigned int eob_extra[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
[EOB_COEF_CONTEXTS][2]; unsigned int dc_sign[PLANE_TYPES][DC_SIGN_CONTEXTS][2]; unsigned int coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE - 1][LEVEL_CONTEXTS]
[2]; unsigned int eob_flag[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS][2]; unsigned int eob_multi16[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][5]; unsigned int eob_multi32[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][6]; unsigned int eob_multi64[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][7]; unsigned int eob_multi128[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][8]; unsigned int eob_multi256[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][9]; unsigned int eob_multi512[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][10]; unsigned int eob_multi1024[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][11]; unsigned int coeff_lps_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
[LEVEL_CONTEXTS][BR_CDF_SIZE]; unsigned int coeff_base_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
[SIG_COEF_CONTEXTS][NUM_BASE_LEVELS + 2]; unsigned int coeff_base_eob_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
[SIG_COEF_CONTEXTS_EOB][NUM_BASE_LEVELS + 1]; unsigned int newmv_mode[NEWMV_MODE_CONTEXTS][2]; unsigned int zeromv_mode[GLOBALMV_MODE_CONTEXTS][2]; unsigned int refmv_mode[REFMV_MODE_CONTEXTS][2]; unsigned int drl_mode[DRL_MODE_CONTEXTS][2]; unsigned int inter_compound_mode[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES]; unsigned int wedge_idx[BLOCK_SIZES_ALL][16]; unsigned int interintra[BLOCK_SIZE_GROUPS][2]; unsigned int interintra_mode[BLOCK_SIZE_GROUPS][INTERINTRA_MODES]; unsigned int wedge_interintra[BLOCK_SIZES_ALL][2]; unsigned int compound_type[BLOCK_SIZES_ALL][MASKED_COMPOUND_TYPES]; unsigned int motion_mode[BLOCK_SIZES_ALL][MOTION_MODES]; unsigned int obmc[BLOCK_SIZES_ALL][2]; unsigned int intra_inter[INTRA_INTER_CONTEXTS][2]; unsigned int comp_inter[COMP_INTER_CONTEXTS][2]; unsigned int comp_ref_type[COMP_REF_TYPE_CONTEXTS][2]; unsigned int uni_comp_ref[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1][2]; unsigned int single_ref[REF_CONTEXTS][SINGLE_REFS - 1][2]; unsigned int comp_ref[REF_CONTEXTS][FWD_REFS - 1][2]; unsigned int comp_bwdref[REF_CONTEXTS][BWD_REFS - 1][2]; unsigned int intrabc[2];
unsigned int txfm_partition[TXFM_PARTITION_CONTEXTS][2]; unsigned int intra_tx_size[MAX_TX_CATS][TX_SIZE_CONTEXTS][MAX_TX_DEPTH + 1]; unsigned int skip_mode[SKIP_MODE_CONTEXTS][2]; unsigned int skip_txfm[SKIP_CONTEXTS][2]; unsigned int compound_index[COMP_INDEX_CONTEXTS][2]; unsigned int comp_group_idx[COMP_GROUP_IDX_CONTEXTS][2]; unsigned int delta_q[DELTA_Q_PROBS][2]; unsigned int delta_lf_multi[FRAME_LF_COUNT][DELTA_LF_PROBS][2]; unsigned int delta_lf[DELTA_LF_PROBS][2];
unsigned int inter_ext_tx[EXT_TX_SETS_INTER][EXT_TX_SIZES][TX_TYPES]; unsigned int intra_ext_tx[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
[TX_TYPES]; unsigned int filter_intra_mode[FILTER_INTRA_MODES]; unsigned int filter_intra[BLOCK_SIZES_ALL][2]; unsigned int switchable_restore[RESTORE_SWITCHABLE_TYPES]; unsigned int wiener_restore[2]; unsigned int sgrproj_restore[2]; #endif// CONFIG_ENTROPY_STATS
unsigned int switchable_interp[SWITCHABLE_FILTER_CONTEXTS]
[SWITCHABLE_FILTERS];
} FRAME_COUNTS;
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 */ /*! *\briefStructusedtoholdintermodedataforfasttxsearch. * *Thisstructisusedtoperformafulltransformsearchonlyonwinning *candidatessearchedwithanestimatefortransformcodingRD.
*/ typedefstruct inter_modes_info { /*! *Thenumberofintermodesforwhichdatawasstoredineachofthe *followingarrays.
*/
int num; /*! *Modeinfostructforeachofthecandidatemodes.
*/
MB_MODE_INFO mbmi_arr[MAX_INTER_MODES]; /*! *Therateforeachofthecandidatemodes.
*/
int mode_rate_arr[MAX_INTER_MODES]; /*! *Thesseofthepredictorforeachofthecandidatemodes.
*/
int64_t sse_arr[MAX_INTER_MODES]; /*! *Theestimatedrdofthepredictorforeachofthecandidatemodes.
*/
int64_t est_rd_arr[MAX_INTER_MODES]; /*! *Therateandmodeindexforeachofthecandidatemodes.
*/
RdIdxPair rd_idx_pair_arr[MAX_INTER_MODES]; /*! *Thefullrdstatsforeachofthecandidatemodes.
*/
RD_STATS rd_cost_arr[MAX_INTER_MODES]; /*! *Thefullrdstatsoflumaonlyforeachofthecandidatemodes.
*/
RD_STATS rd_cost_y_arr[MAX_INTER_MODES]; /*! *Thefullrdstatsofchromaonlyforeachofthecandidatemodes.
*/
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;
// 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; // buffers are AOM_BUFFER_SIZE_FOR_BLOCK_HASH elements long
uint32_t *hash_value_buffer[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 *upsample_pred;
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 */
/*! *\briefEncoderdatarelatedtorow-basedmulti-threading
*/ typedefstruct { /*! *Numberoftilerowsforwhichrowsynchronizationmemoryisallocated.
*/
int allocated_tile_rows; /*! *Numberoftilecolsforwhichrowsynchronizationmemoryisallocated.
*/
int allocated_tile_cols; /*! *Numberofrowsforwhichrowsynchronizationmemoryisallocated *pertile.Duringfirst-pass/look-aheadstagethisequalsthe *maximumnumberofmacroblockrowsinatile.Duringencodestage, *thisequalsthemaximumnumberofsuperblockrowsinatile.
*/
int allocated_rows; /*! *Numberofcolumnsforwhichentropycontextmemoryisallocated *pertile.Duringencodestage,thisequalsthemaximumnumberof *superblockcolumnsinatileminus1.Theentropycontextmemory *isnotallocatedduringfirst-pass/look-aheadstage.
*/
int allocated_cols;
/*! *thread_id_to_tile_id[i]indicatesthetileidassignedtotheiththread.
*/
int thread_id_to_tile_id[MAX_NUM_THREADS];
/*! *num_tile_cols_done[i]indicatesthenumberoftilecolumnswhoseencoding *iscompleteintheithsuperblockrow.
*/
int *num_tile_cols_done;
/*! *Numberofsuperblockrowsinaframeforwhich'num_tile_cols_done'is *allocated.
*/
int allocated_sb_rows;
#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);
static inline char const *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)
typedefstruct {
int frame_width;
int frame_height;
int mi_rows;
int mi_cols;
int mb_rows;
int mb_cols;
int num_mbs;
aom_bit_depth_t bit_depth;
int subsampling_x;
int subsampling_y;
} FRAME_INFO;
#if !CONFIG_REALTIME_ONLY /*!\cond */ // DUCKY_ENCODE_FRAME_MODE is c version of EncodeFrameMode
enum {
DUCKY_ENCODE_FRAME_MODE_NONE, // Let native AV1 determine q index and rdmult
DUCKY_ENCODE_FRAME_MODE_QINDEX, // DuckyEncode determines q index and AV1 // determines rdmult
DUCKY_ENCODE_FRAME_MODE_QINDEX_RDMULT, // DuckyEncode determines q index and // rdmult
} UENUM1BYTE(DUCKY_ENCODE_FRAME_MODE);
typedefstruct DuckyEncodeFrameInfo {
DUCKY_ENCODE_FRAME_MODE qp_mode;
DUCKY_ENCODE_GOP_MODE gop_mode;
int q_index;
int rdmult; // These two arrays are equivalent to std::vector<SuperblockEncodeParameters>
int *superblock_encode_qindex;
int *superblock_encode_rdmult;
int delta_q_enabled;
} DuckyEncodeFrameInfo;
typedefstruct DuckyEncodeFrameResult {
int global_order_idx;
int q_index;
int rdmult;
int rate;
int64_t dist; double psnr;
} DuckyEncodeFrameResult;
/*! *AflagtoindicatewhethertheencoderiscontrolledbyDuckyEncodeornot. *1:yes0:no
*/
int use_ducky_encode;
#if !CONFIG_REALTIME_ONLY /*! A structure that facilitates the communication between DuckyEncode and AV1 *encoder.
*/
DuckyEncodeInfo ducky_encode_info; #endif// CONFIG_REALTIME_ONLY // /*! *Framessincelastframewithcdfupdate.
*/
int frames_since_last_update;
/*! *Blocklevelthresholdstoforcezeromv-skipatpartitionlevel.
*/ unsigned int zeromv_skip_thresh_exit_part[BLOCK_SIZES_ALL];
int av1_use_as_reference(int *ext_ref_frame_flags, int ref_frame_flags);
int av1_copy_reference_enc(AV1_COMP *cpi, int idx, YV12_BUFFER_CONFIG *sd);
int av1_set_reference_enc(AV1_COMP *cpi, int idx, YV12_BUFFER_CONFIG *sd);
void av1_set_frame_size(AV1_COMP *cpi, int width, int height);
void av1_set_mv_search_params(AV1_COMP *cpi);
int av1_set_roi_map(AV1_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols, int delta_q[8], int delta_lf[8],
int skip[8], int ref_frame[8]);
int av1_set_active_map(AV1_COMP *cpi, unsigned char *map, int rows, int cols);
int av1_get_active_map(AV1_COMP *cpi, unsigned char *map, int rows, int cols);
int av1_set_internal_size(AV1EncoderConfig *const oxcf,
ResizePendingParams *resize_pending_params,
AOM_SCALING_MODE horiz_mode,
AOM_SCALING_MODE vert_mode);
int av1_get_quantizer(struct AV1_COMP *cpi);
// This function assumes that the input buffer contains valid OBUs. It should // not be called on untrusted input.
int av1_convert_sect5obus_to_annexb(uint8_t *buffer, size_t buffer_size,
size_t *input_size);
uint8_t av1_find_dominant_value(const uint8_t *src, int stride, int rows,
int cols);
void av1_dilate_block(const uint8_t *src, int src_stride, uint8_t *dilated,
int dilated_stride, int rows, int cols);
// Set screen content options. // This function estimates whether to use screen content tools, by counting // the portion of blocks that have few luma colors. // Modifies: // cpi->commom.features.allow_screen_content_tools // cpi->common.features.allow_intrabc // cpi->use_screen_content_tools // cpi->is_screen_content_type // However, the estimation is not accurate and may misclassify videos. // A slower but more accurate approach that determines whether to use screen // content tools is employed later. See av1_determine_sc_tools_with_encoding(). void av1_set_screen_content_options(struct AV1_COMP *cpi,
FeatureFlags *features);
typedefstruct {
int pyr_level;
int disp_order;
} RefFrameMapPair;
static inline void init_ref_map_pair(
AV1_COMP *cpi, RefFrameMapPair ref_frame_map_pairs[REF_FRAMES]) {
if (cpi->ppi->gf_group.update_type[cpi->gf_frame_index] == KF_UPDATE) {
memset(ref_frame_map_pairs, -1, sizeof(*ref_frame_map_pairs) * REF_FRAMES); return;
}
memset(ref_frame_map_pairs, 0, sizeof(*ref_frame_map_pairs) * REF_FRAMES);
for (int map_idx = 0; map_idx < REF_FRAMES; map_idx++) { // Get reference frame buffer. const RefCntBuffer *const buf = cpi->common.ref_frame_map[map_idx];
if (ref_frame_map_pairs[map_idx].disp_order == -1) continue;
if (buf == NULL) {
ref_frame_map_pairs[map_idx].disp_order = -1;
ref_frame_map_pairs[map_idx].pyr_level = -1; continue;
} else if (buf->ref_count > 1) { // Once the keyframe is coded, the slots in ref_frame_map will all // point to the same frame. In that case, all subsequent pointers // matching the current are considered "free" slots. This will find // the next occurrence of the current pointer if ref_count indicates // there are multiple instances of it and mark it as free.
for (int idx2 = map_idx + 1; idx2 < REF_FRAMES; ++idx2) { const RefCntBuffer *const buf2 = cpi->common.ref_frame_map[idx2];
if (buf2 == buf) {
ref_frame_map_pairs[idx2].disp_order = -1;
ref_frame_map_pairs[idx2].pyr_level = -1;
}
}
}
ref_frame_map_pairs[map_idx].disp_order = (int)buf->display_order_hint;
ref_frame_map_pairs[map_idx].pyr_level = buf->pyramid_level;
}
}
#if CONFIG_FPMT_TEST static inline void calc_frame_data_update_flag(
GF_GROUP *const gf_group, int gf_frame_index, bool *const do_frame_data_update) {
*do_frame_data_update = true; // Set the flag to false for all frames in a given parallel encode set except // the last frame in the set with frame_parallel_level = 2.
if (gf_group->frame_parallel_level[gf_frame_index] == 1) {
*do_frame_data_update = false;
} else if (gf_group->frame_parallel_level[gf_frame_index] == 2) { // Check if this is the last frame in the set with frame_parallel_level = 2.
for (int i = gf_frame_index + 1; i < gf_group->size; i++) {
if ((gf_group->frame_parallel_level[i] == 0 &&
(gf_group->update_type[i] == ARF_UPDATE ||
gf_group->update_type[i] == INTNL_ARF_UPDATE)) ||
gf_group->frame_parallel_level[i] == 1) { break;
} else if (gf_group->frame_parallel_level[i] == 2) {
*do_frame_data_update = false; break;
}
}
}
} #endif
// av1 uses 10,000,000 ticks/second as time stamp #define TICKS_PER_SEC 10000000LL
// Get the allocated token size for a tile. It does the same calculation as in // the frame token allocation. static inline unsigned int allocated_tokens(const TileInfo *tile,
int sb_size_log2, int num_planes) {
int tile_mb_rows =
ROUND_POWER_OF_TWO(tile->mi_row_end - tile->mi_row_start, 2);
int tile_mb_cols =
ROUND_POWER_OF_TWO(tile->mi_col_end - tile->mi_col_start, 2);
// Helper function to compute number of blocks on either side of the frame. static inline int get_num_blocks(const int frame_length, const int mb_length) { return (frame_length + mb_length - 1) / mb_length;
}
// Don't allow a show_existing_frame to coincide with an error resilient // frame. An exception can be made for a forward keyframe since it has no // previous dependencies. static inline int encode_show_existing_frame(const AV1_COMMON *cm) { return cm->show_existing_frame && (!cm->features.error_resilient_mode ||
cm->current_frame.frame_type == KEY_FRAME);
}
// Get index into the 'cpi->mbmi_ext_info.frame_base' array for the given // 'mi_row' and 'mi_col'. static inline int get_mi_ext_idx(const int mi_row, const int mi_col, const BLOCK_SIZE mi_alloc_bsize, const int mbmi_ext_stride) { const int mi_ext_size_1d = mi_size_wide[mi_alloc_bsize]; const int mi_ext_row = mi_row / mi_ext_size_1d; const int mi_ext_col = mi_col / mi_ext_size_1d; return mi_ext_row * mbmi_ext_stride + mi_ext_col;
}
// Lighter version of set_offsets that only sets the mode info // pointers. static inline void set_mode_info_offsets( const CommonModeInfoParams *const mi_params, const MBMIExtFrameBufferInfo *const mbmi_ext_info, MACROBLOCK *const x,
MACROBLOCKD *const xd, int mi_row, int mi_col) {
set_mi_offsets(mi_params, xd, mi_row, mi_col); const int ext_idx = get_mi_ext_idx(mi_row, mi_col, mi_params->mi_alloc_bsize,
mbmi_ext_info->stride);
x->mbmi_ext_frame = mbmi_ext_info->frame_base + ext_idx;
}
// Check to see if the given partition size is allowed for a specified number // of mi block rows and columns remaining in the image. // If not then return the largest allowed partition size static inline BLOCK_SIZE find_partition_size(BLOCK_SIZE bsize, int rows_left,
int cols_left, int *bh, int *bw) {
int int_size = (int)bsize;
if (rows_left <= 0 || cols_left <= 0) { return AOMMIN(bsize, BLOCK_8X8);
} else {
for (; int_size > 0; int_size -= 3) {
*bh = mi_size_high[int_size];
*bw = mi_size_wide[int_size];
if ((*bh <= rows_left) && (*bw <= cols_left)) { break;
}
}
} return (BLOCK_SIZE)int_size;
}
// When more than 'max_allowed_refs' are available, we reduce the number of // reference frames one at a time based on this order. staticconst MV_REFERENCE_FRAME disable_order[] = {
LAST3_FRAME,
LAST2_FRAME,
ALTREF2_FRAME,
BWDREF_FRAME,
};
static inline int get_ref_frame_flags(const SPEED_FEATURES *const sf, const int use_one_pass_rt_params, const YV12_BUFFER_CONFIG **ref_frames, const int ext_ref_frame_flags) { // cpi->ext_flags.ref_frame_flags allows certain reference types to be // disabled by the external interface. These are set by // av1_apply_encoding_flags(). Start with what the external interface allows, // then suppress any reference types which we have found to be duplicates.
int flags = ext_ref_frame_flags;
for (int i = 1; i < INTER_REFS_PER_FRAME; ++i) { const YV12_BUFFER_CONFIG *const this_ref = ref_frames[i]; // If this_ref has appeared before, mark the corresponding ref frame as // invalid. For one_pass_rt mode, only disable GOLDEN_FRAME if it's the // same as LAST_FRAME or ALTREF_FRAME (if ALTREF is being used in nonrd).
int index =
(use_one_pass_rt_params && ref_frame_priority_order[i] == GOLDEN_FRAME)
? (1 + sf->rt_sf.use_nonrd_altref_frame)
: i;
for (int j = 0; j < index; ++j) { // If this_ref has appeared before (same as the reference corresponding // to lower index j), remove it as a reference only if that reference // (for index j) is actually used as a reference.
if (this_ref == ref_frames[j] &&
(flags & (1 << (ref_frame_priority_order[j] - 1)))) {
flags &= ~(1 << (ref_frame_priority_order[i] - 1)); break;
}
}
} return flags;
}
// Returns a Sequence Header OBU stored in an aom_fixed_buf_t, or NULL upon // failure. When a non-NULL aom_fixed_buf_t pointer is returned by this // function, the memory must be freed by the caller. Both the buf member of the // aom_fixed_buf_t, and the aom_fixed_buf_t pointer itself must be freed. Memory // returned must be freed via call to free(). // // Note: The OBU returned is in Low Overhead Bitstream Format. Specifically, // the obu_has_size_field bit is set, and the buffer contains the obu_size // field.
aom_fixed_buf_t *av1_get_global_headers(AV1_PRIMARY *ppi);
static inline int is_frame_eligible_for_ref_pruning(const GF_GROUP *gf_group,
int selective_ref_frame,
int prune_ref_frames,
int gf_index) { return (selective_ref_frame > 0) && (prune_ref_frames > 0) &&
!is_frame_tpl_eligible(gf_group, gf_index);
}
// Get update type of the current frame. static inline FRAME_UPDATE_TYPE get_frame_update_type(const GF_GROUP *gf_group,
int gf_frame_index) { return gf_group->update_type[gf_frame_index];
}
// Check if loop filter is used. static inline int is_loopfilter_used(const AV1_COMMON *const cm) { return !cm->features.coded_lossless && !cm->tiles.large_scale;
}
// Check if CDEF is used. static inline int is_cdef_used(const AV1_COMMON *const cm) { return cm->seq_params->enable_cdef && !cm->features.coded_lossless &&
!cm->tiles.large_scale;
}
// Check if loop restoration filter is used. static inline int is_restoration_used(const AV1_COMMON *const cm) { return cm->seq_params->enable_restoration && !cm->features.all_lossless &&
!cm->tiles.large_scale;
}
// Checks if post-processing filters need to be applied. // NOTE: This function decides if the application of different post-processing // filters on the reconstructed frame can be skipped at the encoder side. // However the computation of different filter parameters that are signaled in // the bitstream is still required. static inline unsigned int derive_skip_apply_postproc_filters( const AV1_COMP *cpi, int use_loopfilter, int use_cdef, int use_superres,
int use_restoration) { // Though CDEF parameter selection should be dependent on // deblocked/loop-filtered pixels for cdef_pick_method <= // CDEF_FAST_SEARCH_LVL5, CDEF strength values are calculated based on the // pixel values that are not loop-filtered in svc real-time encoding mode. // Hence this case is handled separately using the condition below.
if (cpi->ppi->rtc_ref.non_reference_frame) return (SKIP_APPLY_LOOPFILTER | SKIP_APPLY_CDEF);
if (!cpi->oxcf.algo_cfg.skip_postproc_filtering || cpi->ppi->b_calculate_psnr) return0;
assert(cpi->oxcf.mode == ALLINTRA);
// The post-processing filters are applied one after the other in the // following order: deblocking->cdef->superres->restoration. In case of // ALLINTRA encoding, the reconstructed frame is not used as a reference // frame. Hence, the application of these filters can be skipped when // 1. filter parameters of the subsequent stages are not dependent on the // filtered output of the current stage or // 2. subsequent filtering stages are disabled
if (use_restoration) return SKIP_APPLY_RESTORATION;
if (use_superres) return SKIP_APPLY_SUPERRES;
if (use_cdef) { // CDEF parameter selection is not dependent on the deblocked frame if // cdef_pick_method is CDEF_PICK_FROM_Q. Hence the application of deblocking // filters and cdef filters can be skipped in this case. return (cpi->sf.lpf_sf.cdef_pick_method == CDEF_PICK_FROM_Q &&
use_loopfilter)
? (SKIP_APPLY_LOOPFILTER | SKIP_APPLY_CDEF)
: SKIP_APPLY_CDEF;
}
if (use_loopfilter) return SKIP_APPLY_LOOPFILTER;
// If we reach here, all post-processing stages are disabled, so none need to // be skipped. return0;
}
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.