Bug Summary

File:root/firefox-clang/third_party/aom/av1/encoder/encoder.h
Warning:line 2890, column 16
Excessive padding in 'struct AV1_COMP' (107 padding bytes, where 11 is optimal). Optimal fields order: common, enc_quant_dequant_params, td, ppi, coeff_buffer_base, source, last_source, unscaled_source, unscaled_last_source, unfiltered_source, tpl_rdmult_scaling_factors, cdef_search_ctx, last_show_frame_buf, ambient_err, framerate, cyclic_refresh, tile_data, new_framerate, film_grain_table, denoise_and_model, ssim_rdmult_scaling_factors, consec_zero_mv, available_bs_size, mb_weber_stats, prep_rate_estimates, ext_rate_distribution, ext_rate_scale, norm_wiener_variance, mb_delta_q, second_pass_log_stream, src_sad_blk_64x64, rec_sse, mbmi_ext_info, enc_seg, active_map, firstpass_data, coeff_buffer_pool, time_stamps, pick_lr_ctxt, twopass_frame, vbp_info, scaled_ref_buf, ducky_encode_info, ext_part_controller, roi, lr_ctxt, gm_info, scaled_source, scaled_last_source, orig_source, last_frame_uf, trial_frame_rst, force_intpel_info, rc, svc, tf_ctx, coding_context, oxcf, sf, mt_info, token_info, mv_search_params, rd, skip_tpl_setup_stats, rt_reduce_num_ref_buffers, ref_frame_flags, speed, all_one_sided_refs, droppable, frame_index_set, data_alloc_width, data_alloc_height, initial_mbs, last_coded_width, last_coded_height, allocated_tiles, vaq_refresh, num_frame_recode, do_update_vbr_bits_off_target_fast, existing_fb_idx_to_show, intrabc_used, prune_ref_frame_mask, use_screen_content_tools, is_screen_content_type, frame_header_count, deltaq_used, num_tg, superres_mode, consec_zero_mv_alloc_size, sb_counter, ref_refresh_index, ref_idx_to_skip, use_ducky_encode, frames_since_last_update, palette_pixel_num, scaled_last_source_available, resize_pending_params, interp_search_flags, ext_flags, ref_frame_dist_info, noise_estimate, frame_info, do_update_frame_probs_txtype, do_update_frame_probs_obmc, do_update_frame_probs_warp, do_update_frame_probs_interpfilter, winner_mode_params, mv_stats, zeromv_skip_thresh_exit_part, counts, frame_new_probs, gf_frame_index, frame_size_related_setup_done, compressor_stage, last_frame_type, fp_block_size, refresh_idx_available, do_frame_data_update, weber_bsize, is_dropped_frame, alloc_pyramid, refresh_frame, optimize_seg_arr, consider reordering the fields or adding explicit padding members

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name av1_cx_iface.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/media/libaom -fcoverage-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/media/libaom -resource-dir /usr/lib/llvm-21/lib/clang/21 -include /root/firefox-clang/obj-x86_64-pc-linux-gnu/mozilla-config.h -U _FORTIFY_SOURCE -D _FORTIFY_SOURCE=2 -D _GLIBCXX_ASSERTIONS -D DEBUG=1 -D MOZ_HAS_MOZGLUE -I /root/firefox-clang/media/libaom -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/media/libaom -I /root/firefox-clang/media/libaom/config/linux/x64 -I /root/firefox-clang/media/libaom/config -I /root/firefox-clang/third_party/aom -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nspr -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nss -D MOZILLA_CLIENT -internal-isystem /usr/lib/llvm-21/lib/clang/21/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-error=tautological-type-limit-compare -Wno-range-loop-analysis -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=free-nonheap-object -Wno-error=atomic-alignment -Wno-error=deprecated-builtins -Wno-psabi -Wno-error=builtin-macro-redefined -Wno-unknown-warning-option -Wno-sign-compare -Wno-unused-function -Wno-unreachable-code -Wno-unneeded-internal-declaration -ferror-limit 19 -fstrict-flex-arrays=1 -stack-protector 2 -fstack-clash-protection -ftrivial-auto-var-init=pattern -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2025-06-27-100320-3286336-1 -x c /root/firefox-clang/third_party/aom/av1/av1_cx_iface.c
1/*
2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
3 *
4 * This source code is subject to the terms of the BSD 2 Clause License and
5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 * was not distributed with this source code in the LICENSE file, you can
7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 * Media Patent License 1.0 was not distributed with this source code in the
9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10 */
11
12/*!\file
13 * \brief Declares top-level encoder structures and functions.
14 */
15#ifndef AOM_AV1_ENCODER_ENCODER_H_
16#define AOM_AV1_ENCODER_ENCODER_H_
17
18#include <stdbool.h>
19#include <stdio.h>
20
21#include "config/aom_config.h"
22
23#include "aom/aomcx.h"
24#include "aom_util/aom_pthread.h"
25
26#include "av1/common/alloccommon.h"
27#include "av1/common/av1_common_int.h"
28#include "av1/common/blockd.h"
29#include "av1/common/entropymode.h"
30#include "av1/common/enums.h"
31#include "av1/common/reconintra.h"
32#include "av1/common/resize.h"
33#include "av1/common/thread_common.h"
34#include "av1/common/timing.h"
35
36#include "av1/encoder/aq_cyclicrefresh.h"
37#include "av1/encoder/av1_quantize.h"
38#include "av1/encoder/block.h"
39#include "av1/encoder/context_tree.h"
40#include "av1/encoder/enc_enums.h"
41#include "av1/encoder/encodemb.h"
42#include "av1/encoder/external_partition.h"
43#include "av1/encoder/firstpass.h"
44#include "av1/encoder/global_motion.h"
45#include "av1/encoder/level.h"
46#include "av1/encoder/lookahead.h"
47#include "av1/encoder/mcomp.h"
48#include "av1/encoder/pickcdef.h"
49#include "av1/encoder/ratectrl.h"
50#include "av1/encoder/rd.h"
51#include "av1/encoder/speed_features.h"
52#include "av1/encoder/svc_layercontext.h"
53#include "av1/encoder/temporal_filter.h"
54#if CONFIG_THREE_PASS0
55#include "av1/encoder/thirdpass.h"
56#endif
57#include "av1/encoder/tokenize.h"
58#include "av1/encoder/tpl_model.h"
59#include "av1/encoder/av1_noise_estimate.h"
60#include "av1/encoder/bitstream.h"
61
62#if CONFIG_INTERNAL_STATS0
63#include "aom_dsp/ssim.h"
64#endif
65#include "aom_dsp/variance.h"
66#if CONFIG_DENOISE1
67#include "aom_dsp/noise_model.h"
68#endif
69#if CONFIG_TUNE_VMAF0
70#include "av1/encoder/tune_vmaf.h"
71#endif
72#if CONFIG_AV1_TEMPORAL_DENOISING0
73#include "av1/encoder/av1_temporal_denoiser.h"
74#endif
75#if CONFIG_TUNE_BUTTERAUGLI0
76#include "av1/encoder/tune_butteraugli.h"
77#endif
78
79#include "aom/internal/aom_codec_internal.h"
80
81#ifdef __cplusplus
82extern "C" {
83#endif
84
85// TODO(yunqing, any): Added suppression tag to quiet Doxygen warnings. Need to
86// adjust it while we work on documentation.
87/*!\cond */
88// Number of frames required to test for scene cut detection
89#define SCENE_CUT_KEY_TEST_INTERVAL16 16
90
91// Lookahead index threshold to enable temporal filtering for second arf.
92#define TF_LOOKAHEAD_IDX_THR7 7
93
94#define HDR_QP_LEVELS10 10
95#define CHROMA_CB_QP_SCALE1.04 1.04
96#define CHROMA_CR_QP_SCALE1.04 1.04
97#define CHROMA_QP_SCALE-0.46 -0.46
98#define CHROMA_QP_OFFSET9.26 9.26
99#define QP_SCALE_FACTOR2.0 2.0
100#define DISABLE_HDR_LUMA_DELTAQ1 1
101
102// Rational number with an int64 numerator
103// This structure holds a fractional value
104typedef struct aom_rational64 {
105 int64_t num; // fraction numerator
106 int den; // fraction denominator
107} aom_rational64_t; // alias for struct aom_rational
108
109enum {
110 // Good Quality Fast Encoding. The encoder balances quality with the amount of
111 // time it takes to encode the output. Speed setting controls how fast.
112 GOOD,
113 // Realtime Fast Encoding. Will force some restrictions on bitrate
114 // constraints.
115 REALTIME,
116 // All intra mode. All the frames are coded as intra frames.
117 ALLINTRA
118} UENUM1BYTE(MODE); typedef uint8_t MODE;
119
120enum {
121 FRAMEFLAGS_KEY = 1 << 0,
122 FRAMEFLAGS_GOLDEN = 1 << 1,
123 FRAMEFLAGS_BWDREF = 1 << 2,
124 // TODO(zoeliu): To determine whether a frame flag is needed for ALTREF2_FRAME
125 FRAMEFLAGS_ALTREF = 1 << 3,
126 FRAMEFLAGS_INTRAONLY = 1 << 4,
127 FRAMEFLAGS_SWITCH = 1 << 5,
128 FRAMEFLAGS_ERROR_RESILIENT = 1 << 6,
129} UENUM1BYTE(FRAMETYPE_FLAGS); typedef uint8_t FRAMETYPE_FLAGS;
130
131#if CONFIG_FPMT_TEST0
132enum {
133 PARALLEL_ENCODE = 0,
134 PARALLEL_SIMULATION_ENCODE,
135 NUM_FPMT_TEST_ENCODES
136} UENUM1BYTE(FPMT_TEST_ENC_CFG); typedef uint8_t FPMT_TEST_ENC_CFG;
137#endif // CONFIG_FPMT_TEST
138// 0 level frames are sometimes used for rate control purposes, but for
139// reference mapping purposes, the minimum level should be 1.
140#define MIN_PYR_LEVEL1 1
141static inline int get_true_pyr_level(int frame_level, int frame_order,
142 int max_layer_depth) {
143 if (frame_order == 0) {
144 // Keyframe case
145 return MIN_PYR_LEVEL1;
146 } else if (frame_level == MAX_ARF_LAYERS6) {
147 // Leaves
148 return max_layer_depth;
149 } else if (frame_level == (MAX_ARF_LAYERS6 + 1)) {
150 // Altrefs
151 return MIN_PYR_LEVEL1;
152 }
153 return AOMMAX(MIN_PYR_LEVEL, frame_level)(((1) > (frame_level)) ? (1) : (frame_level));
154}
155
156enum {
157 NO_AQ = 0,
158 VARIANCE_AQ = 1,
159 COMPLEXITY_AQ = 2,
160 CYCLIC_REFRESH_AQ = 3,
161 AQ_MODE_COUNT // This should always be the last member of the enum
162} UENUM1BYTE(AQ_MODE); typedef uint8_t AQ_MODE;
163enum {
164 NO_DELTA_Q = 0,
165 DELTA_Q_OBJECTIVE = 1, // Modulation to improve objective quality
166 DELTA_Q_PERCEPTUAL = 2, // Modulation to improve video perceptual quality
167 DELTA_Q_PERCEPTUAL_AI = 3, // Perceptual quality opt for all intra mode
168 DELTA_Q_USER_RATING_BASED = 4, // User rating based delta q mode
169 DELTA_Q_HDR = 5, // QP adjustment based on HDR block pixel average
170 DELTA_Q_VARIANCE_BOOST =
171 6, // Variance Boost style modulation for all intra mode
172 DELTA_Q_MODE_COUNT // This should always be the last member of the enum
173} UENUM1BYTE(DELTAQ_MODE); typedef uint8_t DELTAQ_MODE;
174
175enum {
176 RESIZE_NONE = 0, // No frame resizing allowed.
177 RESIZE_FIXED = 1, // All frames are coded at the specified scale.
178 RESIZE_RANDOM = 2, // All frames are coded at a random scale.
179 RESIZE_DYNAMIC = 3, // Frames coded at lower scale based on rate control.
180 RESIZE_MODES
181} UENUM1BYTE(RESIZE_MODE); typedef uint8_t RESIZE_MODE;
182
183enum {
184 SS_CFG_SRC = 0,
185 SS_CFG_LOOKAHEAD = 1,
186 SS_CFG_FPF = 2,
187 SS_CFG_TOTAL = 3
188} UENUM1BYTE(SS_CFG_OFFSET); typedef uint8_t SS_CFG_OFFSET;
189
190enum {
191 DISABLE_SCENECUT, // For LAP, lag_in_frames < 19
192 ENABLE_SCENECUT_MODE_1, // For LAP, lag_in_frames >=19 and < 33
193 ENABLE_SCENECUT_MODE_2 // For twopass and LAP - lag_in_frames >=33
194} UENUM1BYTE(SCENECUT_MODE); typedef uint8_t SCENECUT_MODE;
195
196#define MAX_VBR_CORPUS_COMPLEXITY10000 10000
197
198typedef enum {
199 MOD_FP, // First pass
200 MOD_TF, // Temporal filtering
201 MOD_TPL, // TPL
202 MOD_GME, // Global motion estimation
203 MOD_ENC, // Encode stage
204 MOD_LPF, // Deblocking loop filter
205 MOD_CDEF_SEARCH, // CDEF search
206 MOD_CDEF, // CDEF frame
207 MOD_LR, // Loop restoration filtering
208 MOD_PACK_BS, // Pack bitstream
209 MOD_FRAME_ENC, // Frame Parallel encode
210 MOD_AI, // All intra
211 NUM_MT_MODULES
212} MULTI_THREADED_MODULES;
213
214/*!\endcond */
215
216/*!\enum COST_UPDATE_TYPE
217 * \brief This enum controls how often the entropy costs should be updated.
218 * \warning In case of any modifications/additions done to the enum
219 * COST_UPDATE_TYPE, the enum INTERNAL_COST_UPDATE_TYPE needs to be updated as
220 * well.
221 */
222typedef enum {
223 COST_UPD_SB, /*!< Update every sb. */
224 COST_UPD_SBROW, /*!< Update every sb rows inside a tile. */
225 COST_UPD_TILE, /*!< Update every tile. */
226 COST_UPD_OFF, /*!< Turn off cost updates. */
227 NUM_COST_UPDATE_TYPES, /*!< Number of cost update types. */
228} COST_UPDATE_TYPE;
229
230/*!\enum LOOPFILTER_CONTROL
231 * \brief This enum controls to which frames loopfilter is applied.
232 */
233typedef enum {
234 LOOPFILTER_NONE = 0, /*!< Disable loopfilter on all frames. */
235 LOOPFILTER_ALL = 1, /*!< Enable loopfilter for all frames. */
236 LOOPFILTER_REFERENCE = 2, /*!< Disable loopfilter on non reference frames. */
237 LOOPFILTER_SELECTIVELY =
238 3, /*!< Disable loopfilter on frames with low motion. */
239} LOOPFILTER_CONTROL;
240
241/*!\enum SKIP_APPLY_POSTPROC_FILTER
242 * \brief This enum controls the application of post-processing filters on a
243 * reconstructed frame.
244 */
245typedef enum {
246 SKIP_APPLY_RESTORATION = 1 << 0,
247 SKIP_APPLY_SUPERRES = 1 << 1,
248 SKIP_APPLY_CDEF = 1 << 2,
249 SKIP_APPLY_LOOPFILTER = 1 << 3,
250} SKIP_APPLY_POSTPROC_FILTER;
251
252/*!
253 * \brief Encoder config related to resize.
254 */
255typedef struct {
256 /*!
257 * Indicates the frame resize mode to be used by the encoder.
258 */
259 RESIZE_MODE resize_mode;
260 /*!
261 * Indicates the denominator for resize of inter frames, assuming 8 as the
262 * numerator. Its value ranges between 8-16.
263 */
264 uint8_t resize_scale_denominator;
265 /*!
266 * Indicates the denominator for resize of key frames, assuming 8 as the
267 * numerator. Its value ranges between 8-16.
268 */
269 uint8_t resize_kf_scale_denominator;
270} ResizeCfg;
271
272/*!
273 * \brief Encoder config for coding block partitioning.
274 */
275typedef struct {
276 /*!
277 * Flag to indicate if rectanguar partitions should be enabled.
278 */
279 bool_Bool enable_rect_partitions;
280 /*!
281 * Flag to indicate if AB partitions should be enabled.
282 */
283 bool_Bool enable_ab_partitions;
284 /*!
285 * Flag to indicate if 1:4 / 4:1 partitions should be enabled.
286 */
287 bool_Bool enable_1to4_partitions;
288 /*!
289 * Indicates the minimum partition size that should be allowed. Both width and
290 * height of a partition cannot be smaller than the min_partition_size.
291 */
292 BLOCK_SIZE min_partition_size;
293 /*!
294 * Indicates the maximum partition size that should be allowed. Both width and
295 * height of a partition cannot be larger than the max_partition_size.
296 */
297 BLOCK_SIZE max_partition_size;
298} PartitionCfg;
299
300/*!
301 * \brief Encoder flags for intra prediction.
302 */
303typedef struct {
304 /*!
305 * Flag to indicate if intra edge filtering process should be enabled.
306 */
307 bool_Bool enable_intra_edge_filter;
308 /*!
309 * Flag to indicate if recursive filtering based intra prediction should be
310 * enabled.
311 */
312 bool_Bool enable_filter_intra;
313 /*!
314 * Flag to indicate if smooth intra prediction modes should be enabled.
315 */
316 bool_Bool enable_smooth_intra;
317 /*!
318 * Flag to indicate if PAETH intra prediction mode should be enabled.
319 */
320 bool_Bool enable_paeth_intra;
321 /*!
322 * Flag to indicate if CFL uv intra mode should be enabled.
323 */
324 bool_Bool enable_cfl_intra;
325 /*!
326 * Flag to indicate if directional modes should be enabled.
327 */
328 bool_Bool enable_directional_intra;
329 /*!
330 * Flag to indicate if the subset of directional modes from D45 to D203 intra
331 * should be enabled. Has no effect if directional modes are disabled.
332 */
333 bool_Bool enable_diagonal_intra;
334 /*!
335 * Flag to indicate if delta angles for directional intra prediction should be
336 * enabled.
337 */
338 bool_Bool enable_angle_delta;
339 /*!
340 * Flag to indicate whether to automatically turn off several intral coding
341 * tools.
342 * This flag is only used when "--deltaq-mode=3" is true.
343 * When set to 1, the encoder will analyze the reconstruction quality
344 * as compared to the source image in the preprocessing pass.
345 * If the recontruction quality is considered high enough, we disable
346 * the following intra coding tools, for better encoding speed:
347 * "--enable_smooth_intra",
348 * "--enable_paeth_intra",
349 * "--enable_cfl_intra",
350 * "--enable_diagonal_intra".
351 */
352 bool_Bool auto_intra_tools_off;
353} IntraModeCfg;
354
355/*!
356 * \brief Encoder flags for transform sizes and types.
357 */
358typedef struct {
359 /*!
360 * Flag to indicate if 64-pt transform should be enabled.
361 */
362 bool_Bool enable_tx64;
363 /*!
364 * Flag to indicate if flip and identity transform types should be enabled.
365 */
366 bool_Bool enable_flip_idtx;
367 /*!
368 * Flag to indicate if rectangular transform should be enabled.
369 */
370 bool_Bool enable_rect_tx;
371 /*!
372 * Flag to indicate whether or not to use a default reduced set for ext-tx
373 * rather than the potential full set of 16 transforms.
374 */
375 bool_Bool reduced_tx_type_set;
376 /*!
377 * Flag to indicate if transform type for intra blocks should be limited to
378 * DCT_DCT.
379 */
380 bool_Bool use_intra_dct_only;
381 /*!
382 * Flag to indicate if transform type for inter blocks should be limited to
383 * DCT_DCT.
384 */
385 bool_Bool use_inter_dct_only;
386 /*!
387 * Flag to indicate if intra blocks should use default transform type
388 * (mode-dependent) only.
389 */
390 bool_Bool use_intra_default_tx_only;
391 /*!
392 * Flag to indicate if transform size search should be enabled.
393 */
394 bool_Bool enable_tx_size_search;
395} TxfmSizeTypeCfg;
396
397/*!
398 * \brief Encoder flags for compound prediction modes.
399 */
400typedef struct {
401 /*!
402 * Flag to indicate if distance-weighted compound type should be enabled.
403 */
404 bool_Bool enable_dist_wtd_comp;
405 /*!
406 * Flag to indicate if masked (wedge/diff-wtd) compound type should be
407 * enabled.
408 */
409 bool_Bool enable_masked_comp;
410 /*!
411 * Flag to indicate if smooth interintra mode should be enabled.
412 */
413 bool_Bool enable_smooth_interintra;
414 /*!
415 * Flag to indicate if difference-weighted compound type should be enabled.
416 */
417 bool_Bool enable_diff_wtd_comp;
418 /*!
419 * Flag to indicate if inter-inter wedge compound type should be enabled.
420 */
421 bool_Bool enable_interinter_wedge;
422 /*!
423 * Flag to indicate if inter-intra wedge compound type should be enabled.
424 */
425 bool_Bool enable_interintra_wedge;
426} CompoundTypeCfg;
427
428/*!
429 * \brief Encoder config related to frame super-resolution.
430 */
431typedef struct {
432 /*!
433 * Indicates the qindex based threshold to be used when AOM_SUPERRES_QTHRESH
434 * mode is used for inter frames.
435 */
436 int superres_qthresh;
437 /*!
438 * Indicates the qindex based threshold to be used when AOM_SUPERRES_QTHRESH
439 * mode is used for key frames.
440 */
441 int superres_kf_qthresh;
442 /*!
443 * Indicates the denominator of the fraction that specifies the ratio between
444 * the superblock width before and after upscaling for inter frames. The
445 * numerator of this fraction is equal to the constant SCALE_NUMERATOR.
446 */
447 uint8_t superres_scale_denominator;
448 /*!
449 * Indicates the denominator of the fraction that specifies the ratio between
450 * the superblock width before and after upscaling for key frames. The
451 * numerator of this fraction is equal to the constant SCALE_NUMERATOR.
452 */
453 uint8_t superres_kf_scale_denominator;
454 /*!
455 * Indicates the Super-resolution mode to be used by the encoder.
456 */
457 aom_superres_mode superres_mode;
458 /*!
459 * Flag to indicate if super-resolution should be enabled for the sequence.
460 */
461 bool_Bool enable_superres;
462} SuperResCfg;
463
464/*!
465 * \brief Encoder config related to the coding of key frames.
466 */
467typedef struct {
468 /*!
469 * Indicates the minimum distance to a key frame.
470 */
471 int key_freq_min;
472
473 /*!
474 * Indicates the maximum distance to a key frame.
475 */
476 int key_freq_max;
477
478 /*!
479 * Indicates if temporal filtering should be applied on keyframe.
480 */
481 int enable_keyframe_filtering;
482
483 /*!
484 * Indicates the number of frames after which a frame may be coded as an
485 * S-Frame.
486 */
487 int sframe_dist;
488
489 /*!
490 * Indicates how an S-Frame should be inserted.
491 * 1: the considered frame will be made into an S-Frame only if it is an
492 * altref frame. 2: the next altref frame will be made into an S-Frame.
493 */
494 int sframe_mode;
495
496 /*!
497 * Indicates if encoder should autodetect cut scenes and set the keyframes.
498 */
499 bool_Bool auto_key;
500
501 /*!
502 * Indicates the forward key frame distance.
503 */
504 int fwd_kf_dist;
505
506 /*!
507 * Indicates if forward keyframe reference should be enabled.
508 */
509 bool_Bool fwd_kf_enabled;
510
511 /*!
512 * Indicates if S-Frames should be enabled for the sequence.
513 */
514 bool_Bool enable_sframe;
515
516 /*!
517 * Indicates if intra block copy prediction mode should be enabled or not.
518 */
519 bool_Bool enable_intrabc;
520} KeyFrameCfg;
521
522/*!
523 * \brief Encoder rate control configuration parameters
524 */
525typedef struct {
526 /*!\cond */
527 // BUFFERING PARAMETERS
528 /*!\endcond */
529 /*!
530 * Indicates the amount of data that will be buffered by the decoding
531 * application prior to beginning playback, and is expressed in units of
532 * time(milliseconds).
533 */
534 int64_t starting_buffer_level_ms;
535 /*!
536 * Indicates the amount of data that the encoder should try to maintain in the
537 * decoder's buffer, and is expressed in units of time(milliseconds).
538 */
539 int64_t optimal_buffer_level_ms;
540 /*!
541 * Indicates the maximum amount of data that may be buffered by the decoding
542 * application, and is expressed in units of time(milliseconds).
543 */
544 int64_t maximum_buffer_size_ms;
545
546 /*!
547 * Indicates the bandwidth to be used in bits per second.
548 */
549 int64_t target_bandwidth;
550
551 /*!
552 * Indicates average complexity of the corpus in single pass vbr based on
553 * LAP. 0 indicates that corpus complexity vbr mode is disabled.
554 */
555 unsigned int vbr_corpus_complexity_lap;
556 /*!
557 * Indicates the maximum allowed bitrate for any intra frame as % of bitrate
558 * target.
559 */
560 unsigned int max_intra_bitrate_pct;
561 /*!
562 * Indicates the maximum allowed bitrate for any inter frame as % of bitrate
563 * target.
564 */
565 unsigned int max_inter_bitrate_pct;
566 /*!
567 * Indicates the percentage of rate boost for golden frame in CBR mode.
568 */
569 unsigned int gf_cbr_boost_pct;
570 /*!
571 * min_cr / 100 indicates the target minimum compression ratio for each
572 * frame.
573 */
574 unsigned int min_cr;
575 /*!
576 * Indicates the frame drop threshold.
577 */
578 int drop_frames_water_mark;
579 /*!
580 * under_shoot_pct indicates the tolerance of the VBR algorithm to
581 * undershoot and is used as a trigger threshold for more aggressive
582 * adaptation of Q. It's value can range from 0-100.
583 */
584 int under_shoot_pct;
585 /*!
586 * over_shoot_pct indicates the tolerance of the VBR algorithm to overshoot
587 * and is used as a trigger threshold for more aggressive adaptation of Q.
588 * It's value can range from 0-1000.
589 */
590 int over_shoot_pct;
591 /*!
592 * Indicates the maximum qindex that can be used by the quantizer i.e. the
593 * worst quality qindex.
594 */
595 int worst_allowed_q;
596 /*!
597 * Indicates the minimum qindex that can be used by the quantizer i.e. the
598 * best quality qindex.
599 */
600 int best_allowed_q;
601 /*!
602 * Indicates the Constant/Constrained Quality level.
603 */
604 int cq_level;
605 /*!
606 * Indicates if the encoding mode is vbr, cbr, constrained quality or
607 * constant quality.
608 */
609 enum aom_rc_mode mode;
610 /*!
611 * Indicates the bias (expressed on a scale of 0 to 100) for determining
612 * target size for the current frame. The value 0 indicates the optimal CBR
613 * mode value should be used, and 100 indicates the optimal VBR mode value
614 * should be used.
615 */
616 int vbrbias;
617 /*!
618 * Indicates the minimum bitrate to be used for a single frame as a percentage
619 * of the target bitrate.
620 */
621 int vbrmin_section;
622 /*!
623 * Indicates the maximum bitrate to be used for a single frame as a percentage
624 * of the target bitrate.
625 */
626 int vbrmax_section;
627
628 /*!
629 * Indicates the maximum consecutive amount of frame drops, in units of time
630 * (milliseconds). This is converted to frame units internally. Only used in
631 * CBR mode.
632 */
633 int max_consec_drop_ms;
634} RateControlCfg;
635
636/*!\cond */
637typedef struct {
638 // Indicates the number of frames lag before encoding is started.
639 int lag_in_frames;
640 // Indicates the minimum gf/arf interval to be used.
641 int min_gf_interval;
642 // Indicates the maximum gf/arf interval to be used.
643 int max_gf_interval;
644 // Indicates the minimum height for GF group pyramid structure to be used.
645 int gf_min_pyr_height;
646 // Indicates the maximum height for GF group pyramid structure to be used.
647 int gf_max_pyr_height;
648 // Indicates if automatic set and use of altref frames should be enabled.
649 bool_Bool enable_auto_arf;
650 // Indicates if automatic set and use of (b)ackward (r)ef (f)rames should be
651 // enabled.
652 bool_Bool enable_auto_brf;
653} GFConfig;
654
655typedef struct {
656 // Indicates the number of tile groups.
657 unsigned int num_tile_groups;
658 // Indicates the MTU size for a tile group. If mtu is non-zero,
659 // num_tile_groups is set to DEFAULT_MAX_NUM_TG.
660 unsigned int mtu;
661 // Indicates the number of tile columns in log2.
662 int tile_columns;
663 // Indicates the number of tile rows in log2.
664 int tile_rows;
665 // Indicates the number of widths in the tile_widths[] array.
666 int tile_width_count;
667 // Indicates the number of heights in the tile_heights[] array.
668 int tile_height_count;
669 // Indicates the tile widths, and may be empty.
670 int tile_widths[MAX_TILE_COLS64];
671 // Indicates the tile heights, and may be empty.
672 int tile_heights[MAX_TILE_ROWS64];
673 // Indicates if large scale tile coding should be used.
674 bool_Bool enable_large_scale_tile;
675 // Indicates if single tile decoding mode should be enabled.
676 bool_Bool enable_single_tile_decoding;
677 // Indicates if EXT_TILE_DEBUG should be enabled.
678 bool_Bool enable_ext_tile_debug;
679} TileConfig;
680
681typedef struct {
682 // Indicates the width of the input frame.
683 int width;
684 // Indicates the height of the input frame.
685 int height;
686 // If forced_max_frame_width is non-zero then it is used to force the maximum
687 // frame width written in write_sequence_header().
688 int forced_max_frame_width;
689 // If forced_max_frame_width is non-zero then it is used to force the maximum
690 // frame height written in write_sequence_header().
691 int forced_max_frame_height;
692 // Indicates the frame width after applying both super-resolution and resize
693 // to the coded frame.
694 int render_width;
695 // Indicates the frame height after applying both super-resolution and resize
696 // to the coded frame.
697 int render_height;
698} FrameDimensionCfg;
699
700typedef struct {
701 // Indicates if warped motion should be enabled.
702 bool_Bool enable_warped_motion;
703 // Indicates if warped motion should be evaluated or not.
704 bool_Bool allow_warped_motion;
705 // Indicates if OBMC motion should be enabled.
706 bool_Bool enable_obmc;
707} MotionModeCfg;
708
709typedef struct {
710 // Timing info for each frame.
711 aom_timing_info_t timing_info;
712 // Indicates the number of time units of a decoding clock.
713 uint32_t num_units_in_decoding_tick;
714 // Indicates if decoder model information is present in the coded sequence
715 // header.
716 bool_Bool decoder_model_info_present_flag;
717 // Indicates if display model information is present in the coded sequence
718 // header.
719 bool_Bool display_model_info_present_flag;
720 // Indicates if timing info for each frame is present.
721 bool_Bool timing_info_present;
722} DecoderModelCfg;
723
724typedef struct {
725 // Indicates the update frequency for coeff costs.
726 COST_UPDATE_TYPE coeff;
727 // Indicates the update frequency for mode costs.
728 COST_UPDATE_TYPE mode;
729 // Indicates the update frequency for mv costs.
730 COST_UPDATE_TYPE mv;
731 // Indicates the update frequency for dv costs.
732 COST_UPDATE_TYPE dv;
733} CostUpdateFreq;
734
735typedef struct {
736 // Indicates the maximum number of reference frames allowed per frame.
737 unsigned int max_reference_frames;
738 // Indicates if the reduced set of references should be enabled.
739 bool_Bool enable_reduced_reference_set;
740 // Indicates if one-sided compound should be enabled.
741 bool_Bool enable_onesided_comp;
742} RefFrameCfg;
743
744typedef struct {
745 // Indicates the color space that should be used.
746 aom_color_primaries_t color_primaries;
747 // Indicates the characteristics of transfer function to be used.
748 aom_transfer_characteristics_t transfer_characteristics;
749 // Indicates the matrix coefficients to be used for the transfer function.
750 aom_matrix_coefficients_t matrix_coefficients;
751 // Indicates the chroma 4:2:0 sample position info.
752 aom_chroma_sample_position_t chroma_sample_position;
753 // Indicates if a limited color range or full color range should be used.
754 aom_color_range_t color_range;
755} ColorCfg;
756
757typedef struct {
758 // Indicates if extreme motion vector unit test should be enabled or not.
759 unsigned int motion_vector_unit_test;
760 // Indicates if superblock multipass unit test should be enabled or not.
761 unsigned int sb_multipass_unit_test;
762} UnitTestCfg;
763
764typedef struct {
765 // Indicates the file path to the VMAF model.
766 const char *vmaf_model_path;
767 // Indicates the path to the film grain parameters.
768 const char *film_grain_table_filename;
769 // Indicates the visual tuning metric.
770 aom_tune_metric tuning;
771 // Indicates if the current content is screen or default type.
772 aom_tune_content content;
773 // Indicates the film grain parameters.
774 int film_grain_test_vector;
775 // Indicates the in-block distortion metric to use.
776 aom_dist_metric dist_metric;
777} TuneCfg;
778
779typedef struct {
780 // Indicates the framerate of the input video.
781 double init_framerate;
782 // Indicates the bit-depth of the input video.
783 unsigned int input_bit_depth;
784 // Indicates the maximum number of frames to be encoded.
785 unsigned int limit;
786 // Indicates the chrome subsampling x value.
787 unsigned int chroma_subsampling_x;
788 // Indicates the chrome subsampling y value.
789 unsigned int chroma_subsampling_y;
790} InputCfg;
791
792typedef struct {
793 // If true, encoder will use fixed QP offsets, that are either:
794 // - Given by the user, and stored in 'fixed_qp_offsets' array, OR
795 // - Picked automatically from cq_level.
796 int use_fixed_qp_offsets;
797 // Indicates the minimum flatness of the quantization matrix.
798 int qm_minlevel;
799 // Indicates the maximum flatness of the quantization matrix.
800 int qm_maxlevel;
801 // Indicates if adaptive quantize_b should be enabled.
802 int quant_b_adapt;
803 // Indicates the Adaptive Quantization mode to be used.
804 AQ_MODE aq_mode;
805 // Indicates the delta q mode to be used.
806 DELTAQ_MODE deltaq_mode;
807 // Indicates the delta q mode strength.
808 DELTAQ_MODE deltaq_strength;
809 // Indicates if delta quantization should be enabled in chroma planes.
810 bool_Bool enable_chroma_deltaq;
811 // Indicates if delta quantization should be enabled for hdr video
812 bool_Bool enable_hdr_deltaq;
813 // Indicates if encoding with quantization matrices should be enabled.
814 bool_Bool using_qm;
815} QuantizationCfg;
816
817/*!\endcond */
818/*!
819 * \brief Algorithm configuration parameters.
820 */
821typedef struct {
822 /*!
823 * Controls the level at which rate-distortion optimization of transform
824 * coefficients favors sharpness in the block. Has no impact on RD when set
825 * to zero (default).
826 *
827 * For values 1-7, eob and skip block optimization are
828 * avoided and rdmult is adjusted in favor of block sharpness.
829 *
830 * In all-intra mode: it also sets the `loop_filter_sharpness` syntax element
831 * in the bitstream. Larger values increasingly reduce how much the filtering
832 * can change the sample values on block edges to favor perceived sharpness.
833 */
834 int sharpness;
835
836 /*!
837 * Indicates the trellis optimization mode of quantized coefficients.
838 * 0: disabled
839 * 1: enabled
840 * 2: enabled for rd search
841 * 3: true for estimate yrd search
842 */
843 int disable_trellis_quant;
844
845 /*!
846 * The maximum number of frames used to create an arf.
847 */
848 int arnr_max_frames;
849
850 /*!
851 * The temporal filter strength for arf used when creating ARFs.
852 */
853 int arnr_strength;
854
855 /*!
856 * Indicates the CDF update mode
857 * 0: no update
858 * 1: update on every frame(default)
859 * 2: selectively update
860 */
861 uint8_t cdf_update_mode;
862
863 /*!
864 * Indicates if RDO based on frame temporal dependency should be enabled.
865 */
866 bool_Bool enable_tpl_model;
867
868 /*!
869 * Indicates if coding of overlay frames for filtered ALTREF frames is
870 * enabled.
871 */
872 bool_Bool enable_overlay;
873
874 /*!
875 * Controls loop filtering
876 * 0: Loop filter is disabled for all frames
877 * 1: Loop filter is enabled for all frames
878 * 2: Loop filter is disabled for non-reference frames
879 * 3: Loop filter is disables for the frames with low motion
880 */
881 LOOPFILTER_CONTROL loopfilter_control;
882
883 /*!
884 * Indicates if the application of post-processing filters should be skipped
885 * on reconstructed frame.
886 */
887 bool_Bool skip_postproc_filtering;
888
889 /*!
890 * Controls screen content detection mode
891 */
892 aom_screen_detection_mode screen_detection_mode;
893} AlgoCfg;
894/*!\cond */
895
896typedef struct {
897 // Indicates the codec bit-depth.
898 aom_bit_depth_t bit_depth;
899 // Indicates the superblock size that should be used by the encoder.
900 aom_superblock_size_t superblock_size;
901 // Indicates if loopfilter modulation should be enabled.
902 bool_Bool enable_deltalf_mode;
903 // Indicates how CDEF should be applied.
904 CDEF_CONTROL cdef_control;
905 // Indicates if loop restoration filter should be enabled.
906 bool_Bool enable_restoration;
907 // When enabled, video mode should be used even for single frame input.
908 bool_Bool force_video_mode;
909 // Indicates if the error resiliency features should be enabled.
910 bool_Bool error_resilient_mode;
911 // Indicates if frame parallel decoding feature should be enabled.
912 bool_Bool frame_parallel_decoding_mode;
913 // Indicates if the input should be encoded as monochrome.
914 bool_Bool enable_monochrome;
915 // When enabled, the encoder will use a full header even for still pictures.
916 // When disabled, a reduced header is used for still pictures.
917 bool_Bool full_still_picture_hdr;
918 // Indicates if dual interpolation filters should be enabled.
919 bool_Bool enable_dual_filter;
920 // Indicates if frame order hint should be enabled or not.
921 bool_Bool enable_order_hint;
922 // Indicates if ref_frame_mvs should be enabled at the sequence level.
923 bool_Bool ref_frame_mvs_present;
924 // Indicates if ref_frame_mvs should be enabled at the frame level.
925 bool_Bool enable_ref_frame_mvs;
926 // Indicates if interintra compound mode is enabled.
927 bool_Bool enable_interintra_comp;
928 // Indicates if global motion should be enabled.
929 bool_Bool enable_global_motion;
930 // Indicates if palette should be enabled.
931 bool_Bool enable_palette;
932} ToolCfg;
933
934/*!\endcond */
935/*!
936 * \brief Main encoder configuration data structure.
937 */
938typedef struct AV1EncoderConfig {
939 /*!\cond */
940 // Configuration related to the input video.
941 InputCfg input_cfg;
942
943 // Configuration related to frame-dimensions.
944 FrameDimensionCfg frm_dim_cfg;
945
946 /*!\endcond */
947 /*!
948 * Encoder algorithm configuration.
949 */
950 AlgoCfg algo_cfg;
951
952 /*!
953 * Configuration related to key-frames.
954 */
955 KeyFrameCfg kf_cfg;
956
957 /*!
958 * Rate control configuration
959 */
960 RateControlCfg rc_cfg;
961 /*!\cond */
962
963 // Configuration related to Quantization.
964 QuantizationCfg q_cfg;
965
966 // Internal frame size scaling.
967 ResizeCfg resize_cfg;
968
969 // Frame Super-Resolution size scaling.
970 SuperResCfg superres_cfg;
971
972 /*!\endcond */
973 /*!
974 * stats_in buffer contains all of the stats packets produced in the first
975 * pass, concatenated.
976 */
977 aom_fixed_buf_t twopass_stats_in;
978 /*!\cond */
979
980 // Configuration related to encoder toolsets.
981 ToolCfg tool_cfg;
982
983 // Configuration related to Group of frames.
984 GFConfig gf_cfg;
985
986 // Tile related configuration parameters.
987 TileConfig tile_cfg;
988
989 // Configuration related to Tune.
990 TuneCfg tune_cfg;
991
992 // Configuration related to color.
993 ColorCfg color_cfg;
994
995 // Configuration related to decoder model.
996 DecoderModelCfg dec_model_cfg;
997
998 // Configuration related to reference frames.
999 RefFrameCfg ref_frm_cfg;
1000
1001 // Configuration related to unit tests.
1002 UnitTestCfg unit_test_cfg;
1003
1004 // Flags related to motion mode.
1005 MotionModeCfg motion_mode_cfg;
1006
1007 // Flags related to intra mode search.
1008 IntraModeCfg intra_mode_cfg;
1009
1010 // Flags related to transform size/type.
1011 TxfmSizeTypeCfg txfm_cfg;
1012
1013 // Flags related to compound type.
1014 CompoundTypeCfg comp_type_cfg;
1015
1016 // Partition related information.
1017 PartitionCfg part_cfg;
1018
1019 // Configuration related to frequency of cost update.
1020 CostUpdateFreq cost_upd_freq;
1021
1022#if CONFIG_DENOISE1
1023 // Indicates the noise level.
1024 float noise_level;
1025 // Indicates the the denoisers block size.
1026 int noise_block_size;
1027 // Indicates whether to apply denoising to the frame to be encoded
1028 int enable_dnl_denoising;
1029#endif
1030
1031#if CONFIG_AV1_TEMPORAL_DENOISING0
1032 // Noise sensitivity.
1033 int noise_sensitivity;
1034#endif
1035 // Bit mask to specify which tier each of the 32 possible operating points
1036 // conforms to.
1037 unsigned int tier_mask;
1038
1039 // Indicates the number of pixels off the edge of a reference frame we're
1040 // allowed to go when forming an inter prediction.
1041 int border_in_pixels;
1042
1043 // Indicates the maximum number of threads that may be used by the encoder.
1044 int max_threads;
1045
1046 // Indicates the speed preset to be used.
1047 int speed;
1048
1049 // Enable the low complexity decode mode.
1050 unsigned int enable_low_complexity_decode;
1051
1052 // Indicates the target sequence level index for each operating point(OP).
1053 AV1_LEVEL target_seq_level_idx[MAX_NUM_OPERATING_POINTS(8 * 4)];
1054
1055 // Indicates the bitstream profile to be used.
1056 BITSTREAM_PROFILE profile;
1057
1058 /*!\endcond */
1059 /*!
1060 * Indicates the current encoder pass :
1061 * AOM_RC_ONE_PASS = One pass encode,
1062 * AOM_RC_FIRST_PASS = First pass of multiple-pass
1063 * AOM_RC_SECOND_PASS = Second pass of multiple-pass
1064 * AOM_RC_THIRD_PASS = Third pass of multiple-pass
1065 */
1066 enum aom_enc_pass pass;
1067 /*!\cond */
1068
1069 // Total number of encoding passes.
1070 int passes;
1071
1072 // the name of the second pass output file when passes > 2
1073 const char *two_pass_output;
1074
1075 // the name of the second pass log file when passes > 2
1076 const char *second_pass_log;
1077
1078 // Indicates if the encoding is GOOD or REALTIME.
1079 MODE mode;
1080
1081 // Indicates if row-based multi-threading should be enabled or not.
1082 bool_Bool row_mt;
1083
1084 // Indicates if frame parallel multi-threading should be enabled or not.
1085 bool_Bool fp_mt;
1086
1087 // Indicates if 16bit frame buffers are to be used i.e., the content is >
1088 // 8-bit.
1089 bool_Bool use_highbitdepth;
1090
1091 // Indicates the bitstream syntax mode. 0 indicates bitstream is saved as
1092 // Section 5 bitstream, while 1 indicates the bitstream is saved in Annex - B
1093 // format.
1094 bool_Bool save_as_annexb;
1095
1096 // The path for partition stats reading and writing, used in the experiment
1097 // CONFIG_PARTITION_SEARCH_ORDER.
1098 const char *partition_info_path;
1099
1100 // The flag that indicates whether we use an external rate distribution to
1101 // guide adaptive quantization. It requires --deltaq-mode=3. The rate
1102 // distribution map file name is stored in |rate_distribution_info|.
1103 unsigned int enable_rate_guide_deltaq;
1104
1105 // The input file of rate distribution information used in all intra mode
1106 // to determine delta quantization.
1107 const char *rate_distribution_info;
1108
1109 // Exit the encoder when it fails to encode to a given level.
1110 int strict_level_conformance;
1111
1112 // Max depth for the GOP after a key frame
1113 int kf_max_pyr_height;
1114
1115 // A flag to control if we enable the superblock qp sweep for a given lambda
1116 int sb_qp_sweep;
1117 /*!\endcond */
1118} AV1EncoderConfig;
1119
1120/*!\cond */
1121static inline int is_lossless_requested(const RateControlCfg *const rc_cfg) {
1122 return rc_cfg->best_allowed_q == 0 && rc_cfg->worst_allowed_q == 0;
1123}
1124/*!\endcond */
1125
1126/*!
1127 * \brief Encoder-side probabilities for pruning of various AV1 tools
1128 */
1129typedef struct {
1130 /*!
1131 * obmc_probs[i][j] is the probability of OBMC being the best motion mode for
1132 * jth block size and ith frame update type, averaged over past frames. If
1133 * obmc_probs[i][j] < thresh, then OBMC search is pruned.
1134 */
1135 int obmc_probs[FRAME_UPDATE_TYPES][BLOCK_SIZES_ALL];
1136
1137 /*!
1138 * warped_probs[i] is the probability of warped motion being the best motion
1139 * mode for ith frame update type, averaged over past frames. If
1140 * warped_probs[i] < thresh, then warped motion search is pruned.
1141 */
1142 int warped_probs[FRAME_UPDATE_TYPES];
1143
1144 /*!
1145 * tx_type_probs[i][j][k] is the probability of kth tx_type being the best
1146 * for jth transform size and ith frame update type, averaged over past
1147 * frames. If tx_type_probs[i][j][k] < thresh, then transform search for that
1148 * type is pruned.
1149 */
1150 int tx_type_probs[FRAME_UPDATE_TYPES][TX_SIZES_ALL][TX_TYPES];
1151
1152 /*!
1153 * switchable_interp_probs[i][j][k] is the probability of kth interpolation
1154 * filter being the best for jth filter context and ith frame update type,
1155 * averaged over past frames. If switchable_interp_probs[i][j][k] < thresh,
1156 * then interpolation filter search is pruned for that case.
1157 */
1158 int switchable_interp_probs[FRAME_UPDATE_TYPES][SWITCHABLE_FILTER_CONTEXTS((SWITCHABLE_FILTERS + 1) * 4)]
1159 [SWITCHABLE_FILTERS];
1160} FrameProbInfo;
1161
1162/*!\cond */
1163
1164typedef struct FRAME_COUNTS {
1165// Note: This structure should only contain 'unsigned int' fields, or
1166// aggregates built solely from 'unsigned int' fields/elements
1167#if CONFIG_ENTROPY_STATS0
1168 unsigned int kf_y_mode[KF_MODE_CONTEXTS5][KF_MODE_CONTEXTS5][INTRA_MODES];
1169 unsigned int angle_delta[DIRECTIONAL_MODES8][2 * MAX_ANGLE_DELTA3 + 1];
1170 unsigned int y_mode[BLOCK_SIZE_GROUPS4][INTRA_MODES];
1171 unsigned int uv_mode[CFL_ALLOWED_TYPES][INTRA_MODES][UV_INTRA_MODES];
1172 unsigned int cfl_sign[CFL_JOINT_SIGNS(CFL_SIGNS * CFL_SIGNS - 1)];
1173 unsigned int cfl_alpha[CFL_ALPHA_CONTEXTS((CFL_SIGNS * CFL_SIGNS - 1) + 1 - CFL_SIGNS)][CFL_ALPHABET_SIZE(1 << 4)];
1174 unsigned int palette_y_mode[PALATTE_BSIZE_CTXS7][PALETTE_Y_MODE_CONTEXTS3][2];
1175 unsigned int palette_uv_mode[PALETTE_UV_MODE_CONTEXTS2][2];
1176 unsigned int palette_y_size[PALATTE_BSIZE_CTXS7][PALETTE_SIZES];
1177 unsigned int palette_uv_size[PALATTE_BSIZE_CTXS7][PALETTE_SIZES];
1178 unsigned int palette_y_color_index[PALETTE_SIZES]
1179 [PALETTE_COLOR_INDEX_CONTEXTS5]
1180 [PALETTE_COLORS];
1181 unsigned int palette_uv_color_index[PALETTE_SIZES]
1182 [PALETTE_COLOR_INDEX_CONTEXTS5]
1183 [PALETTE_COLORS];
1184 unsigned int partition[PARTITION_CONTEXTS(5 * 4)][EXT_PARTITION_TYPES];
1185 unsigned int txb_skip[TOKEN_CDF_Q_CTXS4][TX_SIZES][TXB_SKIP_CONTEXTS13][2];
1186 unsigned int eob_extra[TOKEN_CDF_Q_CTXS4][TX_SIZES][PLANE_TYPES]
1187 [EOB_COEF_CONTEXTS9][2];
1188 unsigned int dc_sign[PLANE_TYPES][DC_SIGN_CONTEXTS3][2];
1189 unsigned int coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE(4) - 1][LEVEL_CONTEXTS21]
1190 [2];
1191 unsigned int eob_flag[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS9][2];
1192 unsigned int eob_multi16[TOKEN_CDF_Q_CTXS4][PLANE_TYPES][2][5];
1193 unsigned int eob_multi32[TOKEN_CDF_Q_CTXS4][PLANE_TYPES][2][6];
1194 unsigned int eob_multi64[TOKEN_CDF_Q_CTXS4][PLANE_TYPES][2][7];
1195 unsigned int eob_multi128[TOKEN_CDF_Q_CTXS4][PLANE_TYPES][2][8];
1196 unsigned int eob_multi256[TOKEN_CDF_Q_CTXS4][PLANE_TYPES][2][9];
1197 unsigned int eob_multi512[TOKEN_CDF_Q_CTXS4][PLANE_TYPES][2][10];
1198 unsigned int eob_multi1024[TOKEN_CDF_Q_CTXS4][PLANE_TYPES][2][11];
1199 unsigned int coeff_lps_multi[TOKEN_CDF_Q_CTXS4][TX_SIZES][PLANE_TYPES]
1200 [LEVEL_CONTEXTS21][BR_CDF_SIZE(4)];
1201 unsigned int coeff_base_multi[TOKEN_CDF_Q_CTXS4][TX_SIZES][PLANE_TYPES]
1202 [SIG_COEF_CONTEXTS(26 + 16)][NUM_BASE_LEVELS2 + 2];
1203 unsigned int coeff_base_eob_multi[TOKEN_CDF_Q_CTXS4][TX_SIZES][PLANE_TYPES]
1204 [SIG_COEF_CONTEXTS_EOB4][NUM_BASE_LEVELS2 + 1];
1205 unsigned int newmv_mode[NEWMV_MODE_CONTEXTS6][2];
1206 unsigned int zeromv_mode[GLOBALMV_MODE_CONTEXTS2][2];
1207 unsigned int refmv_mode[REFMV_MODE_CONTEXTS6][2];
1208 unsigned int drl_mode[DRL_MODE_CONTEXTS3][2];
1209 unsigned int inter_compound_mode[INTER_MODE_CONTEXTS8][INTER_COMPOUND_MODES(1 + NEW_NEWMV - NEAREST_NEARESTMV)];
1210 unsigned int wedge_idx[BLOCK_SIZES_ALL][16];
1211 unsigned int interintra[BLOCK_SIZE_GROUPS4][2];
1212 unsigned int interintra_mode[BLOCK_SIZE_GROUPS4][INTERINTRA_MODES];
1213 unsigned int wedge_interintra[BLOCK_SIZES_ALL][2];
1214 unsigned int compound_type[BLOCK_SIZES_ALL][MASKED_COMPOUND_TYPES];
1215 unsigned int motion_mode[BLOCK_SIZES_ALL][MOTION_MODES];
1216 unsigned int obmc[BLOCK_SIZES_ALL][2];
1217 unsigned int intra_inter[INTRA_INTER_CONTEXTS4][2];
1218 unsigned int comp_inter[COMP_INTER_CONTEXTS5][2];
1219 unsigned int comp_ref_type[COMP_REF_TYPE_CONTEXTS5][2];
1220 unsigned int uni_comp_ref[UNI_COMP_REF_CONTEXTS3][UNIDIR_COMP_REFS - 1][2];
1221 unsigned int single_ref[REF_CONTEXTS3][SINGLE_REFS - 1][2];
1222 unsigned int comp_ref[REF_CONTEXTS3][FWD_REFS - 1][2];
1223 unsigned int comp_bwdref[REF_CONTEXTS3][BWD_REFS - 1][2];
1224 unsigned int intrabc[2];
1225
1226 unsigned int txfm_partition[TXFM_PARTITION_CONTEXTS((TX_SIZES - TX_8X8) * 6 - 3)][2];
1227 unsigned int intra_tx_size[MAX_TX_CATS(TX_SIZES - ((TX_4X4) + 1))][TX_SIZE_CONTEXTS3][MAX_TX_DEPTH2 + 1];
1228 unsigned int skip_mode[SKIP_MODE_CONTEXTS3][2];
1229 unsigned int skip_txfm[SKIP_CONTEXTS3][2];
1230 unsigned int compound_index[COMP_INDEX_CONTEXTS6][2];
1231 unsigned int comp_group_idx[COMP_GROUP_IDX_CONTEXTS6][2];
1232 unsigned int delta_q[DELTA_Q_PROBS(3)][2];
1233 unsigned int delta_lf_multi[FRAME_LF_COUNT4][DELTA_LF_PROBS(3)][2];
1234 unsigned int delta_lf[DELTA_LF_PROBS(3)][2];
1235
1236 unsigned int inter_ext_tx[EXT_TX_SETS_INTER4][EXT_TX_SIZES4][TX_TYPES];
1237 unsigned int intra_ext_tx[EXT_TX_SETS_INTRA3][EXT_TX_SIZES4][INTRA_MODES]
1238 [TX_TYPES];
1239 unsigned int filter_intra_mode[FILTER_INTRA_MODES];
1240 unsigned int filter_intra[BLOCK_SIZES_ALL][2];
1241 unsigned int switchable_restore[RESTORE_SWITCHABLE_TYPES];
1242 unsigned int wiener_restore[2];
1243 unsigned int sgrproj_restore[2];
1244#endif // CONFIG_ENTROPY_STATS
1245
1246 unsigned int switchable_interp[SWITCHABLE_FILTER_CONTEXTS((SWITCHABLE_FILTERS + 1) * 4)]
1247 [SWITCHABLE_FILTERS];
1248} FRAME_COUNTS;
1249
1250#define INTER_MODE_RD_DATA_OVERALL_SIZE6400 6400
1251
1252typedef struct {
1253 int ready;
1254 double a;
1255 double b;
1256 double dist_mean;
1257 double ld_mean;
1258 double sse_mean;
1259 double sse_sse_mean;
1260 double sse_ld_mean;
1261 int num;
1262 double dist_sum;
1263 double ld_sum;
1264 double sse_sum;
1265 double sse_sse_sum;
1266 double sse_ld_sum;
1267} InterModeRdModel;
1268
1269typedef struct {
1270 int idx;
1271 int64_t rd;
1272} RdIdxPair;
1273// TODO(angiebird): This is an estimated size. We still need to figure what is
1274// the maximum number of modes.
1275#define MAX_INTER_MODES1024 1024
1276// TODO(any): rename this struct to something else. There is already another
1277// struct called inter_mode_info, which makes this terribly confusing.
1278/*!\endcond */
1279/*!
1280 * \brief Struct used to hold inter mode data for fast tx search.
1281 *
1282 * This struct is used to perform a full transform search only on winning
1283 * candidates searched with an estimate for transform coding RD.
1284 */
1285typedef struct inter_modes_info {
1286 /*!
1287 * The number of inter modes for which data was stored in each of the
1288 * following arrays.
1289 */
1290 int num;
1291 /*!
1292 * Mode info struct for each of the candidate modes.
1293 */
1294 MB_MODE_INFO mbmi_arr[MAX_INTER_MODES1024];
1295 /*!
1296 * The rate for each of the candidate modes.
1297 */
1298 int mode_rate_arr[MAX_INTER_MODES1024];
1299 /*!
1300 * The sse of the predictor for each of the candidate modes.
1301 */
1302 int64_t sse_arr[MAX_INTER_MODES1024];
1303 /*!
1304 * The estimated rd of the predictor for each of the candidate modes.
1305 */
1306 int64_t est_rd_arr[MAX_INTER_MODES1024];
1307 /*!
1308 * The rate and mode index for each of the candidate modes.
1309 */
1310 RdIdxPair rd_idx_pair_arr[MAX_INTER_MODES1024];
1311 /*!
1312 * The full rd stats for each of the candidate modes.
1313 */
1314 RD_STATS rd_cost_arr[MAX_INTER_MODES1024];
1315 /*!
1316 * The full rd stats of luma only for each of the candidate modes.
1317 */
1318 RD_STATS rd_cost_y_arr[MAX_INTER_MODES1024];
1319 /*!
1320 * The full rd stats of chroma only for each of the candidate modes.
1321 */
1322 RD_STATS rd_cost_uv_arr[MAX_INTER_MODES1024];
1323} InterModesInfo;
1324
1325/*!\cond */
1326typedef struct {
1327 // TODO(kyslov): consider changing to 64bit
1328
1329 // This struct is used for computing variance in choose_partitioning(), where
1330 // the max number of samples within a superblock is 32x32 (with 4x4 avg).
1331 // With 8bit bitdepth, uint32_t is enough for sum_square_error (2^8 * 2^8 * 32
1332 // * 32 = 2^26). For high bitdepth we need to consider changing this to 64 bit
1333 uint32_t sum_square_error;
1334 int32_t sum_error;
1335 int log2_count;
1336 int variance;
1337} VPartVar;
1338
1339typedef struct {
1340 VPartVar none;
1341 VPartVar horz[2];
1342 VPartVar vert[2];
1343} VPVariance;
1344
1345typedef struct {
1346 VPVariance part_variances;
1347 VPartVar split[4];
1348} VP4x4;
1349
1350typedef struct {
1351 VPVariance part_variances;
1352 VP4x4 split[4];
1353} VP8x8;
1354
1355typedef struct {
1356 VPVariance part_variances;
1357 VP8x8 split[4];
1358} VP16x16;
1359
1360typedef struct {
1361 VPVariance part_variances;
1362 VP16x16 split[4];
1363} VP32x32;
1364
1365typedef struct {
1366 VPVariance part_variances;
1367 VP32x32 split[4];
1368} VP64x64;
1369
1370typedef struct {
1371 VPVariance part_variances;
1372 VP64x64 *split;
1373} VP128x128;
1374
1375/*!\endcond */
1376
1377/*!
1378 * \brief Thresholds for variance based partitioning.
1379 */
1380typedef struct {
1381 /*!
1382 * If block variance > threshold, then that block is forced to split.
1383 * thresholds[0] - threshold for 128x128;
1384 * thresholds[1] - threshold for 64x64;
1385 * thresholds[2] - threshold for 32x32;
1386 * thresholds[3] - threshold for 16x16;
1387 * thresholds[4] - threshold for 8x8;
1388 */
1389 int64_t thresholds[5];
1390
1391 /*!
1392 * MinMax variance threshold for 8x8 sub blocks of a 16x16 block. If actual
1393 * minmax > threshold_minmax, the 16x16 is forced to split.
1394 */
1395 int64_t threshold_minmax;
1396} VarBasedPartitionInfo;
1397
1398/*!
1399 * \brief Encoder parameters for synchronization of row based multi-threading
1400 */
1401typedef struct {
1402#if CONFIG_MULTITHREAD1
1403 /**
1404 * \name Synchronization objects for top-right dependency.
1405 */
1406 /**@{*/
1407 pthread_mutex_t *mutex_; /*!< Mutex lock object */
1408 pthread_cond_t *cond_; /*!< Condition variable */
1409 /**@}*/
1410#endif // CONFIG_MULTITHREAD
1411 /*!
1412 * Buffer to store the superblock whose encoding is complete.
1413 * num_finished_cols[i] stores the number of superblocks which finished
1414 * encoding in the ith superblock row.
1415 */
1416 int *num_finished_cols;
1417 /*!
1418 * Denotes the superblock interval at which conditional signalling should
1419 * happen. Also denotes the minimum number of extra superblocks of the top row
1420 * to be complete to start encoding the current superblock. A value of 1
1421 * indicates top-right dependency.
1422 */
1423 int sync_range;
1424 /*!
1425 * Denotes the additional number of superblocks in the previous row to be
1426 * complete to start encoding the current superblock when intraBC tool is
1427 * enabled. This additional top-right delay is required to satisfy the
1428 * hardware constraints for intraBC tool when row multithreading is enabled.
1429 */
1430 int intrabc_extra_top_right_sb_delay;
1431 /*!
1432 * Number of superblock rows.
1433 */
1434 int rows;
1435 /*!
1436 * The superblock row (in units of MI blocks) to be processed next.
1437 */
1438 int next_mi_row;
1439 /*!
1440 * Number of threads processing the current tile.
1441 */
1442 int num_threads_working;
1443} AV1EncRowMultiThreadSync;
1444
1445/*!\cond */
1446
1447// TODO(jingning) All spatially adaptive variables should go to TileDataEnc.
1448typedef struct TileDataEnc {
1449 TileInfo tile_info;
1450 DECLARE_ALIGNED(16, FRAME_CONTEXT, tctx)FRAME_CONTEXT tctx __attribute__((aligned(16)));
1451 FRAME_CONTEXT *row_ctx;
1452 uint64_t abs_sum_level;
1453 uint8_t allow_update_cdf;
1454 InterModeRdModel inter_mode_rd_models[BLOCK_SIZES_ALL];
1455 AV1EncRowMultiThreadSync row_mt_sync;
1456 MV firstpass_top_mv;
1457} TileDataEnc;
1458
1459typedef struct RD_COUNTS {
1460 int compound_ref_used_flag;
1461 int skip_mode_used_flag;
1462 int tx_type_used[TX_SIZES_ALL][TX_TYPES];
1463 int obmc_used[BLOCK_SIZES_ALL][2];
1464 int warped_used[2];
1465 int newmv_or_intra_blocks;
1466 uint64_t seg_tmp_pred_cost[2];
1467} RD_COUNTS;
1468
1469typedef struct ThreadData {
1470 MACROBLOCK mb;
1471 MvCosts *mv_costs_alloc;
1472 IntraBCMVCosts *dv_costs_alloc;
1473 RD_COUNTS rd_counts;
1474 FRAME_COUNTS *counts;
1475 PC_TREE_SHARED_BUFFERS shared_coeff_buf;
1476 SIMPLE_MOTION_DATA_TREE *sms_tree;
1477 SIMPLE_MOTION_DATA_TREE *sms_root;
1478 uint32_t *hash_value_buffer[2][2];
1479 OBMCBuffer obmc_buffer;
1480 PALETTE_BUFFER *palette_buffer;
1481 CompoundTypeRdBuffers comp_rd_buffer;
1482 CONV_BUF_TYPE *tmp_conv_dst;
1483 uint64_t abs_sum_level;
1484 uint8_t *tmp_pred_bufs[2];
1485 uint8_t *wiener_tmp_pred_buf;
1486 int intrabc_used;
1487 int deltaq_used;
1488 int coefficient_size;
1489 int max_mv_magnitude;
1490 int interp_filter_selected[SWITCHABLE];
1491 FRAME_CONTEXT *tctx;
1492 VP64x64 *vt64x64;
1493 int32_t num_64x64_blocks;
1494 PICK_MODE_CONTEXT *firstpass_ctx;
1495 TemporalFilterData tf_data;
1496 TplBuffers tpl_tmp_buffers;
1497 TplTxfmStats tpl_txfm_stats;
1498 GlobalMotionData gm_data;
1499 // Pointer to the array of structures to store gradient information of each
1500 // pixel in a superblock. The buffer constitutes of MAX_SB_SQUARE pixel level
1501 // structures for each of the plane types (PLANE_TYPE_Y and PLANE_TYPE_UV).
1502 PixelLevelGradientInfo *pixel_gradient_info;
1503 // Pointer to the array of structures to store source variance information of
1504 // each 4x4 sub-block in a superblock. Block4x4VarInfo structure is used to
1505 // store source variance and log of source variance of each 4x4 sub-block
1506 // for subsequent retrieval.
1507 Block4x4VarInfo *src_var_info_of_4x4_sub_blocks;
1508 // Pointer to pc tree root.
1509 PC_TREE *pc_root;
1510} ThreadData;
1511
1512struct EncWorkerData;
1513
1514/*!\endcond */
1515
1516/*!
1517 * \brief Encoder data related to row-based multi-threading
1518 */
1519typedef struct {
1520 /*!
1521 * Number of tile rows for which row synchronization memory is allocated.
1522 */
1523 int allocated_tile_rows;
1524 /*!
1525 * Number of tile cols for which row synchronization memory is allocated.
1526 */
1527 int allocated_tile_cols;
1528 /*!
1529 * Number of rows for which row synchronization memory is allocated
1530 * per tile. During first-pass/look-ahead stage this equals the
1531 * maximum number of macroblock rows in a tile. During encode stage,
1532 * this equals the maximum number of superblock rows in a tile.
1533 */
1534 int allocated_rows;
1535 /*!
1536 * Number of columns for which entropy context memory is allocated
1537 * per tile. During encode stage, this equals the maximum number of
1538 * superblock columns in a tile minus 1. The entropy context memory
1539 * is not allocated during first-pass/look-ahead stage.
1540 */
1541 int allocated_cols;
1542
1543 /*!
1544 * thread_id_to_tile_id[i] indicates the tile id assigned to the ith thread.
1545 */
1546 int thread_id_to_tile_id[MAX_NUM_THREADS64];
1547
1548 /*!
1549 * num_tile_cols_done[i] indicates the number of tile columns whose encoding
1550 * is complete in the ith superblock row.
1551 */
1552 int *num_tile_cols_done;
1553
1554 /*!
1555 * Number of superblock rows in a frame for which 'num_tile_cols_done' is
1556 * allocated.
1557 */
1558 int allocated_sb_rows;
1559
1560 /*!
1561 * Initialized to false, set to true by the worker thread that encounters an
1562 * error in order to abort the processing of other worker threads.
1563 */
1564 bool_Bool row_mt_exit;
1565
1566 /*!
1567 * Initialized to false, set to true during first pass encoding by the worker
1568 * thread that encounters an error in order to abort the processing of other
1569 * worker threads.
1570 */
1571 bool_Bool firstpass_mt_exit;
1572
1573 /*!
1574 * Initialized to false, set to true in cal_mb_wiener_var_hook() by the worker
1575 * thread that encounters an error in order to abort the processing of other
1576 * worker threads.
1577 */
1578 bool_Bool mb_wiener_mt_exit;
1579
1580#if CONFIG_MULTITHREAD1
1581 /*!
1582 * Mutex lock used while dispatching jobs.
1583 */
1584 pthread_mutex_t *mutex_;
1585 /*!
1586 * Condition variable used to dispatch loopfilter jobs.
1587 */
1588 pthread_cond_t *cond_;
1589#endif
1590
1591 /**
1592 * \name Row synchronization related function pointers.
1593 */
1594 /**@{*/
1595 /*!
1596 * Reader.
1597 */
1598 void (*sync_read_ptr)(AV1EncRowMultiThreadSync *const, int, int);
1599 /*!
1600 * Writer.
1601 */
1602 void (*sync_write_ptr)(AV1EncRowMultiThreadSync *const, int, int, int);
1603 /**@}*/
1604} AV1EncRowMultiThreadInfo;
1605
1606/*!
1607 * \brief Encoder data related to multi-threading for allintra deltaq-mode=3
1608 */
1609typedef struct {
1610#if CONFIG_MULTITHREAD1
1611 /*!
1612 * Mutex lock used while dispatching jobs.
1613 */
1614 pthread_mutex_t *mutex_;
1615 /*!
1616 * Condition variable used to dispatch loopfilter jobs.
1617 */
1618 pthread_cond_t *cond_;
1619#endif
1620
1621 /**
1622 * \name Row synchronization related function pointers for all intra mode
1623 */
1624 /**@{*/
1625 /*!
1626 * Reader.
1627 */
1628 void (*intra_sync_read_ptr)(AV1EncRowMultiThreadSync *const, int, int);
1629 /*!
1630 * Writer.
1631 */
1632 void (*intra_sync_write_ptr)(AV1EncRowMultiThreadSync *const, int, int, int);
1633 /**@}*/
1634} AV1EncAllIntraMultiThreadInfo;
1635
1636/*!
1637 * \brief Max number of recodes used to track the frame probabilities.
1638 */
1639#define NUM_RECODES_PER_FRAME10 10
1640
1641/*!
1642 * \brief Max number of frames that can be encoded in a parallel encode set.
1643 */
1644#define MAX_PARALLEL_FRAMES4 4
1645
1646/*!
1647 * \brief Buffers to be backed up during parallel encode set to be restored
1648 * later.
1649 */
1650typedef struct RestoreStateBuffers {
1651 /*!
1652 * Backup of original CDEF srcbuf.
1653 */
1654 uint16_t *cdef_srcbuf;
1655
1656 /*!
1657 * Backup of original CDEF colbuf.
1658 */
1659 uint16_t *cdef_colbuf[MAX_MB_PLANE3];
1660
1661 /*!
1662 * Backup of original LR rst_tmpbuf.
1663 */
1664 int32_t *rst_tmpbuf;
1665
1666 /*!
1667 * Backup of original LR rlbs.
1668 */
1669 RestorationLineBuffers *rlbs;
1670} RestoreStateBuffers;
1671
1672/*!
1673 * \brief Parameters related to restoration types.
1674 */
1675typedef struct {
1676 /*!
1677 * Stores the best coefficients for Wiener restoration.
1678 */
1679 WienerInfo wiener;
1680
1681 /*!
1682 * Stores the best coefficients for Sgrproj restoration.
1683 */
1684 SgrprojInfo sgrproj;
1685
1686 /*!
1687 * The rtype to use for this unit given a frame rtype as index. Indices:
1688 * WIENER, SGRPROJ, SWITCHABLE.
1689 */
1690 RestorationType best_rtype[RESTORE_TYPES - 1];
1691} RestUnitSearchInfo;
1692
1693/*!
1694 * \brief Structure to hold search parameter per restoration unit and
1695 * intermediate buffer of Wiener filter used in pick filter stage of Loop
1696 * restoration.
1697 */
1698typedef struct {
1699 /*!
1700 * Array of pointers to 'RestUnitSearchInfo' which holds data related to
1701 * restoration types.
1702 */
1703 RestUnitSearchInfo *rusi[MAX_MB_PLANE3];
1704
1705 /*!
1706 * Buffer used to hold dgd-avg data during SIMD call of Wiener filter.
1707 */
1708 int16_t *dgd_avg;
1709} AV1LrPickStruct;
1710
1711/*!
1712 * \brief Primary Encoder parameters related to multi-threading.
1713 */
1714typedef struct PrimaryMultiThreadInfo {
1715 /*!
1716 * Number of workers created for multi-threading.
1717 */
1718 int num_workers;
1719
1720 /*!
1721 * Number of workers used for different MT modules.
1722 */
1723 int num_mod_workers[NUM_MT_MODULES];
1724
1725 /*!
1726 * Synchronization object used to launch job in the worker thread.
1727 */
1728 AVxWorker *workers;
1729
1730 /*!
1731 * Data specific to each worker in encoder multi-threading.
1732 * tile_thr_data[i] stores the worker data of the ith thread.
1733 */
1734 struct EncWorkerData *tile_thr_data;
1735
1736 /*!
1737 * CDEF row multi-threading data.
1738 */
1739 AV1CdefWorkerData *cdef_worker;
1740
1741 /*!
1742 * Primary(Level 1) Synchronization object used to launch job in the worker
1743 * thread.
1744 */
1745 AVxWorker *p_workers[MAX_PARALLEL_FRAMES4];
1746
1747 /*!
1748 * Number of primary workers created for multi-threading.
1749 */
1750 int p_num_workers;
1751
1752 /*!
1753 * Tracks the number of workers in encode stage multi-threading.
1754 */
1755 int prev_num_enc_workers;
1756} PrimaryMultiThreadInfo;
1757
1758/*!
1759 * \brief Encoder parameters related to multi-threading.
1760 */
1761typedef struct MultiThreadInfo {
1762 /*!
1763 * Number of workers created for multi-threading.
1764 */
1765 int num_workers;
1766
1767 /*!
1768 * Number of workers used for different MT modules.
1769 */
1770 int num_mod_workers[NUM_MT_MODULES];
1771
1772 /*!
1773 * Synchronization object used to launch job in the worker thread.
1774 */
1775 AVxWorker *workers;
1776
1777 /*!
1778 * Data specific to each worker in encoder multi-threading.
1779 * tile_thr_data[i] stores the worker data of the ith thread.
1780 */
1781 struct EncWorkerData *tile_thr_data;
1782
1783 /*!
1784 * When set, indicates that row based multi-threading of the encoder is
1785 * enabled.
1786 */
1787 bool_Bool row_mt_enabled;
1788
1789 /*!
1790 * When set, indicates that multi-threading for bitstream packing is enabled.
1791 */
1792 bool_Bool pack_bs_mt_enabled;
1793
1794 /*!
1795 * Encoder row multi-threading data.
1796 */
1797 AV1EncRowMultiThreadInfo enc_row_mt;
1798
1799 /*!
1800 * Encoder multi-threading data for allintra mode in the preprocessing stage
1801 * when --deltaq-mode=3.
1802 */
1803 AV1EncAllIntraMultiThreadInfo intra_mt;
1804
1805 /*!
1806 * Tpl row multi-threading data.
1807 */
1808 AV1TplRowMultiThreadInfo tpl_row_mt;
1809
1810 /*!
1811 * Loop Filter multi-threading object.
1812 */
1813 AV1LfSync lf_row_sync;
1814
1815 /*!
1816 * Loop Restoration multi-threading object.
1817 */
1818 AV1LrSync lr_row_sync;
1819
1820 /*!
1821 * Pack bitstream multi-threading object.
1822 */
1823 AV1EncPackBSSync pack_bs_sync;
1824
1825 /*!
1826 * Global Motion multi-threading object.
1827 */
1828 AV1GlobalMotionSync gm_sync;
1829
1830 /*!
1831 * Temporal Filter multi-threading object.
1832 */
1833 AV1TemporalFilterSync tf_sync;
1834
1835 /*!
1836 * CDEF search multi-threading object.
1837 */
1838 AV1CdefSync cdef_sync;
1839
1840 /*!
1841 * Pointer to CDEF row multi-threading data for the frame.
1842 */
1843 AV1CdefWorkerData *cdef_worker;
1844
1845 /*!
1846 * Buffers to be stored/restored before/after parallel encode.
1847 */
1848 RestoreStateBuffers restore_state_buf;
1849
1850 /*!
1851 * In multi-threaded realtime encoding with row-mt enabled, pipeline
1852 * loop-filtering after encoding.
1853 */
1854 int pipeline_lpf_mt_with_enc;
1855} MultiThreadInfo;
1856
1857/*!\cond */
1858
1859typedef struct ActiveMap {
1860 int enabled;
1861 int update;
1862 unsigned char *map;
1863} ActiveMap;
1864
1865/*!\endcond */
1866
1867/*!
1868 * \brief Encoder info used for decision on forcing integer motion vectors.
1869 */
1870typedef struct {
1871 /*!
1872 * cs_rate_array[i] is the fraction of blocks in a frame which either match
1873 * with the collocated block or are smooth, where i is the rate_index.
1874 */
1875 double cs_rate_array[32];
1876 /*!
1877 * rate_index is used to index cs_rate_array.
1878 */
1879 int rate_index;
1880 /*!
1881 * rate_size is the total number of entries populated in cs_rate_array.
1882 */
1883 int rate_size;
1884} ForceIntegerMVInfo;
1885
1886/*!\cond */
1887
1888#if CONFIG_INTERNAL_STATS0
1889// types of stats
1890enum {
1891 STAT_Y,
1892 STAT_U,
1893 STAT_V,
1894 STAT_ALL,
1895 NUM_STAT_TYPES // This should always be the last member of the enum
1896} UENUM1BYTE(StatType); typedef uint8_t StatType;
1897
1898typedef struct IMAGE_STAT {
1899 double stat[NUM_STAT_TYPES];
1900 double worst;
1901} ImageStat;
1902#endif // CONFIG_INTERNAL_STATS
1903
1904typedef struct {
1905 int ref_count;
1906 YV12_BUFFER_CONFIG buf;
1907} EncRefCntBuffer;
1908
1909/*!\endcond */
1910
1911/*!
1912 * \brief Buffer to store mode information at mi_alloc_bsize (4x4 or 8x8) level
1913 *
1914 * This is used for bitstream preparation.
1915 */
1916typedef struct {
1917 /*!
1918 * frame_base[mi_row * stride + mi_col] stores the mode information of
1919 * block (mi_row,mi_col).
1920 */
1921 MB_MODE_INFO_EXT_FRAME *frame_base;
1922 /*!
1923 * Size of frame_base buffer.
1924 */
1925 int alloc_size;
1926 /*!
1927 * Stride of frame_base buffer.
1928 */
1929 int stride;
1930} MBMIExtFrameBufferInfo;
1931
1932/*!\cond */
1933
1934#if CONFIG_COLLECT_PARTITION_STATS0
1935typedef struct FramePartitionTimingStats {
1936 int partition_decisions[6][EXT_PARTITION_TYPES];
1937 int partition_attempts[6][EXT_PARTITION_TYPES];
1938 int64_t partition_times[6][EXT_PARTITION_TYPES];
1939
1940 int partition_redo;
1941} FramePartitionTimingStats;
1942#endif // CONFIG_COLLECT_PARTITION_STATS
1943
1944#if CONFIG_COLLECT_COMPONENT_TIMING0
1945#include "aom_ports/aom_timer.h"
1946// Adjust the following to add new components.
1947enum {
1948 av1_encode_strategy_time,
1949 av1_get_one_pass_rt_params_time,
1950 av1_get_second_pass_params_time,
1951 denoise_and_encode_time,
1952 apply_filtering_time,
1953 av1_tpl_setup_stats_time,
1954 encode_frame_to_data_rate_time,
1955 encode_with_or_without_recode_time,
1956 loop_filter_time,
1957 cdef_time,
1958 loop_restoration_time,
1959 av1_pack_bitstream_final_time,
1960 av1_encode_frame_time,
1961 av1_compute_global_motion_time,
1962 av1_setup_motion_field_time,
1963 encode_sb_row_time,
1964
1965 rd_pick_partition_time,
1966 rd_use_partition_time,
1967 choose_var_based_partitioning_time,
1968 av1_prune_partitions_time,
1969 none_partition_search_time,
1970 split_partition_search_time,
1971 rectangular_partition_search_time,
1972 ab_partitions_search_time,
1973 rd_pick_4partition_time,
1974 encode_sb_time,
1975
1976 rd_pick_sb_modes_time,
1977 av1_rd_pick_intra_mode_sb_time,
1978 av1_rd_pick_inter_mode_sb_time,
1979 set_params_rd_pick_inter_mode_time,
1980 skip_inter_mode_time,
1981 handle_inter_mode_time,
1982 evaluate_motion_mode_for_winner_candidates_time,
1983 do_tx_search_time,
1984 handle_intra_mode_time,
1985 refine_winner_mode_tx_time,
1986 av1_search_palette_mode_time,
1987 handle_newmv_time,
1988 compound_type_rd_time,
1989 interpolation_filter_search_time,
1990 motion_mode_rd_time,
1991
1992 nonrd_use_partition_time,
1993 pick_sb_modes_nonrd_time,
1994 hybrid_intra_mode_search_time,
1995 nonrd_pick_inter_mode_sb_time,
1996 encode_b_nonrd_time,
1997
1998 kTimingComponents,
1999} UENUM1BYTE(TIMING_COMPONENT); typedef uint8_t TIMING_COMPONENT;
2000
2001static inline char const *get_component_name(int index) {
2002 switch (index) {
2003 case av1_encode_strategy_time: return "av1_encode_strategy_time";
2004 case av1_get_one_pass_rt_params_time:
2005 return "av1_get_one_pass_rt_params_time";
2006 case av1_get_second_pass_params_time:
2007 return "av1_get_second_pass_params_time";
2008 case denoise_and_encode_time: return "denoise_and_encode_time";
2009 case apply_filtering_time: return "apply_filtering_time";
2010 case av1_tpl_setup_stats_time: return "av1_tpl_setup_stats_time";
2011 case encode_frame_to_data_rate_time:
2012 return "encode_frame_to_data_rate_time";
2013 case encode_with_or_without_recode_time:
2014 return "encode_with_or_without_recode_time";
2015 case loop_filter_time: return "loop_filter_time";
2016 case cdef_time: return "cdef_time";
2017 case loop_restoration_time: return "loop_restoration_time";
2018 case av1_pack_bitstream_final_time: return "av1_pack_bitstream_final_time";
2019 case av1_encode_frame_time: return "av1_encode_frame_time";
2020 case av1_compute_global_motion_time:
2021 return "av1_compute_global_motion_time";
2022 case av1_setup_motion_field_time: return "av1_setup_motion_field_time";
2023 case encode_sb_row_time: return "encode_sb_row_time";
2024
2025 case rd_pick_partition_time: return "rd_pick_partition_time";
2026 case rd_use_partition_time: return "rd_use_partition_time";
2027 case choose_var_based_partitioning_time:
2028 return "choose_var_based_partitioning_time";
2029 case av1_prune_partitions_time: return "av1_prune_partitions_time";
2030 case none_partition_search_time: return "none_partition_search_time";
2031 case split_partition_search_time: return "split_partition_search_time";
2032 case rectangular_partition_search_time:
2033 return "rectangular_partition_search_time";
2034 case ab_partitions_search_time: return "ab_partitions_search_time";
2035 case rd_pick_4partition_time: return "rd_pick_4partition_time";
2036 case encode_sb_time: return "encode_sb_time";
2037
2038 case rd_pick_sb_modes_time: return "rd_pick_sb_modes_time";
2039 case av1_rd_pick_intra_mode_sb_time:
2040 return "av1_rd_pick_intra_mode_sb_time";
2041 case av1_rd_pick_inter_mode_sb_time:
2042 return "av1_rd_pick_inter_mode_sb_time";
2043 case set_params_rd_pick_inter_mode_time:
2044 return "set_params_rd_pick_inter_mode_time";
2045 case skip_inter_mode_time: return "skip_inter_mode_time";
2046 case handle_inter_mode_time: return "handle_inter_mode_time";
2047 case evaluate_motion_mode_for_winner_candidates_time:
2048 return "evaluate_motion_mode_for_winner_candidates_time";
2049 case do_tx_search_time: return "do_tx_search_time";
2050 case handle_intra_mode_time: return "handle_intra_mode_time";
2051 case refine_winner_mode_tx_time: return "refine_winner_mode_tx_time";
2052 case av1_search_palette_mode_time: return "av1_search_palette_mode_time";
2053 case handle_newmv_time: return "handle_newmv_time";
2054 case compound_type_rd_time: return "compound_type_rd_time";
2055 case interpolation_filter_search_time:
2056 return "interpolation_filter_search_time";
2057 case motion_mode_rd_time: return "motion_mode_rd_time";
2058
2059 case nonrd_use_partition_time: return "nonrd_use_partition_time";
2060 case pick_sb_modes_nonrd_time: return "pick_sb_modes_nonrd_time";
2061 case hybrid_intra_mode_search_time: return "hybrid_intra_mode_search_time";
2062 case nonrd_pick_inter_mode_sb_time: return "nonrd_pick_inter_mode_sb_time";
2063 case encode_b_nonrd_time: return "encode_b_nonrd_time";
2064
2065 default: assert(0)((void) sizeof ((0) ? 1 : 0), __extension__ ({ if (0) ; else __assert_fail
("0", "/root/firefox-clang/third_party/aom/av1/encoder/encoder.h"
, 2065, __extension__ __PRETTY_FUNCTION__); }))
;
2066 }
2067 return "error";
2068}
2069#endif
2070
2071// The maximum number of internal ARFs except ALTREF_FRAME
2072#define MAX_INTERNAL_ARFS(REF_FRAMES - BWDREF_FRAME - 1) (REF_FRAMES - BWDREF_FRAME - 1)
2073
2074/*!\endcond */
2075
2076/*!
2077 * \brief Parameters related to global motion search
2078 */
2079typedef struct {
2080 /*!
2081 * Flag to indicate if global motion search needs to be rerun.
2082 */
2083 bool_Bool search_done;
2084
2085 /*!
2086 * Array of pointers to the frame buffers holding the reference frames.
2087 * ref_buf[i] stores the pointer to the reference frame of the ith
2088 * reference frame type.
2089 */
2090 YV12_BUFFER_CONFIG *ref_buf[REF_FRAMES];
2091
2092 /*!
2093 * Holds the number of valid reference frames in past and future directions
2094 * w.r.t. the current frame. num_ref_frames[i] stores the total number of
2095 * valid reference frames in 'i' direction.
2096 */
2097 int num_ref_frames[MAX_DIRECTIONS2];
2098
2099 /*!
2100 * Array of structure which stores the valid reference frames in past and
2101 * future directions and their corresponding distance from the source frame.
2102 * reference_frames[i][j] holds the jth valid reference frame type in the
2103 * direction 'i' and its temporal distance from the source frame .
2104 */
2105 FrameDistPair reference_frames[MAX_DIRECTIONS2][REF_FRAMES - 1];
2106
2107 /**
2108 * \name Dimensions for which segment map is allocated.
2109 */
2110 /**@{*/
2111 int segment_map_w; /*!< segment map width */
2112 int segment_map_h; /*!< segment map height */
2113 /**@}*/
2114} GlobalMotionInfo;
2115
2116/*!
2117 * \brief Flags related to interpolation filter search
2118 */
2119typedef struct {
2120 /*!
2121 * Stores the default value of skip flag depending on chroma format
2122 * Set as 1 for monochrome and 3 for other color formats
2123 */
2124 int default_interp_skip_flags;
2125 /*!
2126 * Filter mask to allow certain interp_filter type.
2127 */
2128 uint16_t interp_filter_search_mask;
2129} InterpSearchFlags;
2130
2131/*!
2132 * \brief Parameters for motion vector search process
2133 */
2134typedef struct {
2135 /*!
2136 * Largest MV component used in a frame.
2137 * The value from the previous frame is used to set the full pixel search
2138 * range for the current frame.
2139 */
2140 int max_mv_magnitude;
2141 /*!
2142 * Parameter indicating initial search window to be used in full-pixel search.
2143 * Range [0, MAX_MVSEARCH_STEPS-2]. Lower value indicates larger window.
2144 */
2145 int mv_step_param;
2146 /*!
2147 * Pointer to sub-pixel search function.
2148 * In encoder: av1_find_best_sub_pixel_tree
2149 * av1_find_best_sub_pixel_tree_pruned
2150 * av1_find_best_sub_pixel_tree_pruned_more
2151 * In MV unit test: av1_return_max_sub_pixel_mv
2152 * av1_return_min_sub_pixel_mv
2153 */
2154 fractional_mv_step_fp *find_fractional_mv_step;
2155 /*!
2156 * Search site configuration for full-pel MV search.
2157 * search_site_cfg[SS_CFG_SRC]: Used in tpl, rd/non-rd inter mode loop, simple
2158 * motion search. search_site_cfg[SS_CFG_LOOKAHEAD]: Used in intraBC, temporal
2159 * filter search_site_cfg[SS_CFG_FPF]: Used during first pass and lookahead
2160 */
2161 search_site_config search_site_cfg[SS_CFG_TOTAL][NUM_DISTINCT_SEARCH_METHODS];
2162} MotionVectorSearchParams;
2163
2164/*!
2165 * \brief Refresh frame flags for different type of frames.
2166 *
2167 * If the refresh flag is true for a particular reference frame, after the
2168 * current frame is encoded, the reference frame gets refreshed (updated) to
2169 * be the current frame. Note: Usually at most one flag will be set to true at
2170 * a time. But, for key-frames, all flags are set to true at once.
2171 */
2172typedef struct {
2173 bool_Bool golden_frame; /*!< Refresh flag for golden frame */
2174 bool_Bool bwd_ref_frame; /*!< Refresh flag for bwd-ref frame */
2175 bool_Bool alt_ref_frame; /*!< Refresh flag for alt-ref frame */
2176} RefreshFrameInfo;
2177
2178/*!
2179 * \brief Desired dimensions for an externally triggered resize.
2180 *
2181 * When resize is triggered externally, the desired dimensions are stored in
2182 * this struct until used in the next frame to be coded. These values are
2183 * effective only for one frame and are reset after they are used.
2184 */
2185typedef struct {
2186 int width; /*!< Desired resized width */
2187 int height; /*!< Desired resized height */
2188} ResizePendingParams;
2189
2190/*!
2191 * \brief Refrence frame distance related variables.
2192 */
2193typedef struct {
2194 /*!
2195 * True relative distance of reference frames w.r.t. the current frame.
2196 */
2197 int ref_relative_dist[INTER_REFS_PER_FRAME];
2198 /*!
2199 * The nearest reference w.r.t. current frame in the past.
2200 */
2201 int8_t nearest_past_ref;
2202 /*!
2203 * The nearest reference w.r.t. current frame in the future.
2204 */
2205 int8_t nearest_future_ref;
2206} RefFrameDistanceInfo;
2207
2208/*!
2209 * \brief Parameters used for winner mode processing.
2210 *
2211 * This is a basic two pass approach: in the first pass, we reduce the number of
2212 * transform searches based on some thresholds during the rdopt process to find
2213 * the "winner mode". In the second pass, we perform a more through tx search
2214 * on the winner mode.
2215 * There are some arrays in the struct, and their indices are used in the
2216 * following manner:
2217 * Index 0: Default mode evaluation, Winner mode processing is not applicable
2218 * (Eg : IntraBc).
2219 * Index 1: Mode evaluation.
2220 * Index 2: Winner mode evaluation
2221 * Index 1 and 2 are only used when the respective speed feature is on.
2222 */
2223typedef struct {
2224 /*!
2225 * Threshold to determine if trellis optimization is to be enabled
2226 * based on :
2227 * 0 : dist threshold
2228 * 1 : satd threshold
2229 * Corresponds to enable_winner_mode_for_coeff_opt speed feature.
2230 */
2231 unsigned int coeff_opt_thresholds[MODE_EVAL_TYPES][2];
2232
2233 /*!
2234 * Determines the tx size search method during rdopt.
2235 * Corresponds to enable_winner_mode_for_tx_size_srch speed feature.
2236 */
2237 TX_SIZE_SEARCH_METHOD tx_size_search_methods[MODE_EVAL_TYPES];
2238
2239 /*!
2240 * Controls how often we should approximate prediction error with tx
2241 * coefficients. If it's 0, then never. If 1, then it's during the tx_type
2242 * search only. If 2, then always.
2243 * Corresponds to tx_domain_dist_level speed feature.
2244 */
2245 unsigned int use_transform_domain_distortion[MODE_EVAL_TYPES];
2246
2247 /*!
2248 * Threshold to approximate pixel domain distortion with transform domain
2249 * distortion. This is only used if use_transform_domain_distortion is on.
2250 * Corresponds to enable_winner_mode_for_use_tx_domain_dist speed feature.
2251 */
2252 unsigned int tx_domain_dist_threshold[MODE_EVAL_TYPES];
2253
2254 /*!
2255 * Controls how often we should try to skip the transform process based on
2256 * result from dct.
2257 * Corresponds to use_skip_flag_prediction speed feature.
2258 */
2259 unsigned int skip_txfm_level[MODE_EVAL_TYPES];
2260
2261 /*!
2262 * Predict DC only txfm blocks for default, mode and winner mode evaluation.
2263 * Index 0: Default mode evaluation, Winner mode processing is not applicable.
2264 * Index 1: Mode evaluation, Index 2: Winner mode evaluation
2265 */
2266 unsigned int predict_dc_level[MODE_EVAL_TYPES];
2267} WinnerModeParams;
2268
2269/*!
2270 * \brief Frame refresh flags set by the external interface.
2271 *
2272 * Flags set by external interface to determine which reference buffers are
2273 * refreshed by this frame. When set, the encoder will update the particular
2274 * reference frame buffer with the contents of the current frame.
2275 */
2276typedef struct {
2277 bool_Bool last_frame; /*!< Refresh flag for last frame */
2278 bool_Bool golden_frame; /*!< Refresh flag for golden frame */
2279 bool_Bool bwd_ref_frame; /*!< Refresh flag for bwd-ref frame */
2280 bool_Bool alt2_ref_frame; /*!< Refresh flag for alt2-ref frame */
2281 bool_Bool alt_ref_frame; /*!< Refresh flag for alt-ref frame */
2282 /*!
2283 * Flag indicating if the update of refresh frame flags is pending.
2284 */
2285 bool_Bool update_pending;
2286} ExtRefreshFrameFlagsInfo;
2287
2288/*!
2289 * \brief Flags signalled by the external interface at frame level.
2290 */
2291typedef struct {
2292 /*!
2293 * Bit mask to disable certain reference frame types.
2294 */
2295 int ref_frame_flags;
2296
2297 /*!
2298 * Frame refresh flags set by the external interface.
2299 */
2300 ExtRefreshFrameFlagsInfo refresh_frame;
2301
2302 /*!
2303 * Flag to enable the update of frame contexts at the end of a frame decode.
2304 */
2305 bool_Bool refresh_frame_context;
2306
2307 /*!
2308 * Flag to indicate that update of refresh_frame_context from external
2309 * interface is pending.
2310 */
2311 bool_Bool refresh_frame_context_pending;
2312
2313 /*!
2314 * Flag to enable temporal MV prediction.
2315 */
2316 bool_Bool use_ref_frame_mvs;
2317
2318 /*!
2319 * Indicates whether the current frame is to be coded as error resilient.
2320 */
2321 bool_Bool use_error_resilient;
2322
2323 /*!
2324 * Indicates whether the current frame is to be coded as s-frame.
2325 */
2326 bool_Bool use_s_frame;
2327
2328 /*!
2329 * Indicates whether the current frame's primary_ref_frame is set to
2330 * PRIMARY_REF_NONE.
2331 */
2332 bool_Bool use_primary_ref_none;
2333} ExternalFlags;
2334
2335/*!\cond */
2336
2337typedef struct {
2338 // Some misc info
2339 int high_prec;
2340 int q;
2341 int order;
2342
2343 // MV counters
2344 int inter_count;
2345 int intra_count;
2346 int default_mvs;
2347 int mv_joint_count[4];
2348 int last_bit_zero;
2349 int last_bit_nonzero;
2350
2351 // Keep track of the rates
2352 int total_mv_rate;
2353 int hp_total_mv_rate;
2354 int lp_total_mv_rate;
2355
2356 // Texture info
2357 int horz_text;
2358 int vert_text;
2359 int diag_text;
2360
2361 // Whether the current struct contains valid data
2362 int valid;
2363} MV_STATS;
2364
2365typedef struct WeberStats {
2366 int64_t mb_wiener_variance;
2367 int64_t src_variance;
2368 int64_t rec_variance;
2369 int16_t src_pix_max;
2370 int16_t rec_pix_max;
2371 int64_t distortion;
2372 int64_t satd;
2373 double max_scale;
2374} WeberStats;
2375
2376typedef struct {
2377 struct loopfilter lf;
2378 CdefInfo cdef_info;
2379 YV12_BUFFER_CONFIG copy_buffer;
2380 RATE_CONTROL rc;
2381 MV_STATS mv_stats;
2382} CODING_CONTEXT;
2383
2384typedef struct {
2385 int frame_width;
2386 int frame_height;
2387 int mi_rows;
2388 int mi_cols;
2389 int mb_rows;
2390 int mb_cols;
2391 int num_mbs;
2392 aom_bit_depth_t bit_depth;
2393 int subsampling_x;
2394 int subsampling_y;
2395} FRAME_INFO;
2396
2397/*!
2398 * \brief This structure stores different types of frame indices.
2399 */
2400typedef struct {
2401 int show_frame_count;
2402} FRAME_INDEX_SET;
2403
2404/*!\endcond */
2405
2406/*!
2407 * \brief Segmentation related information for the current frame.
2408 */
2409typedef struct {
2410 /*!
2411 * 3-bit number containing the segment affiliation for each 4x4 block in the
2412 * frame. map[y * stride + x] contains the segment id of the 4x4 block at
2413 * (x,y) position.
2414 */
2415 uint8_t *map;
2416 /*!
2417 * Flag to indicate if current frame has lossless segments or not.
2418 * 1: frame has at least one lossless segment.
2419 * 0: frame has no lossless segments.
2420 */
2421 bool_Bool has_lossless_segment;
2422} EncSegmentationInfo;
2423
2424/*!
2425 * \brief Frame time stamps.
2426 */
2427typedef struct {
2428 /*!
2429 * Start time stamp of the previous frame
2430 */
2431 int64_t prev_ts_start;
2432 /*!
2433 * End time stamp of the previous frame
2434 */
2435 int64_t prev_ts_end;
2436 /*!
2437 * Start time stamp of the first frame
2438 */
2439 int64_t first_ts_start;
2440} TimeStamps;
2441
2442/*!
2443 * Pointers to the memory allocated for frame level transform coeff related
2444 * info.
2445 */
2446typedef struct {
2447 /*!
2448 * Pointer to the transformed coefficients buffer.
2449 */
2450 tran_low_t *tcoeff;
2451 /*!
2452 * Pointer to the eobs buffer.
2453 */
2454 uint16_t *eobs;
2455 /*!
2456 * Pointer to the entropy_ctx buffer.
2457 */
2458 uint8_t *entropy_ctx;
2459} CoeffBufferPool;
2460
2461#if !CONFIG_REALTIME_ONLY0
2462/*!\cond */
2463// DUCKY_ENCODE_FRAME_MODE is c version of EncodeFrameMode
2464enum {
2465 DUCKY_ENCODE_FRAME_MODE_NONE, // Let native AV1 determine q index and rdmult
2466 DUCKY_ENCODE_FRAME_MODE_QINDEX, // DuckyEncode determines q index and AV1
2467 // determines rdmult
2468 DUCKY_ENCODE_FRAME_MODE_QINDEX_RDMULT, // DuckyEncode determines q index and
2469 // rdmult
2470} UENUM1BYTE(DUCKY_ENCODE_FRAME_MODE); typedef uint8_t DUCKY_ENCODE_FRAME_MODE;
2471
2472enum {
2473 DUCKY_ENCODE_GOP_MODE_NONE, // native AV1 decides GOP
2474 DUCKY_ENCODE_GOP_MODE_RCL, // rate control lib decides GOP
2475} UENUM1BYTE(DUCKY_ENCODE_GOP_MODE); typedef uint8_t DUCKY_ENCODE_GOP_MODE;
2476
2477typedef struct DuckyEncodeFrameInfo {
2478 DUCKY_ENCODE_FRAME_MODE qp_mode;
2479 DUCKY_ENCODE_GOP_MODE gop_mode;
2480 int q_index;
2481 int rdmult;
2482 // These two arrays are equivalent to std::vector<SuperblockEncodeParameters>
2483 int *superblock_encode_qindex;
2484 int *superblock_encode_rdmult;
2485 int delta_q_enabled;
2486} DuckyEncodeFrameInfo;
2487
2488typedef struct DuckyEncodeFrameResult {
2489 int global_order_idx;
2490 int q_index;
2491 int rdmult;
2492 int rate;
2493 int64_t dist;
2494 double psnr;
2495} DuckyEncodeFrameResult;
2496
2497typedef struct DuckyEncodeInfo {
2498 DuckyEncodeFrameInfo frame_info;
2499 DuckyEncodeFrameResult frame_result;
2500} DuckyEncodeInfo;
2501/*!\endcond */
2502#endif
2503
2504/*!\cond */
2505typedef struct RTC_REF {
2506 /*!
2507 * LAST_FRAME (0), LAST2_FRAME(1), LAST3_FRAME(2), GOLDEN_FRAME(3),
2508 * BWDREF_FRAME(4), ALTREF2_FRAME(5), ALTREF_FRAME(6).
2509 */
2510 int reference[INTER_REFS_PER_FRAME];
2511 int ref_idx[INTER_REFS_PER_FRAME];
2512 int refresh[REF_FRAMES];
2513 int set_ref_frame_config;
2514 int non_reference_frame;
2515 int ref_frame_comp[3];
2516 int gld_idx_1layer;
2517 /*!
2518 * Frame number of the last frame that refreshed the buffer slot.
2519 */
2520 unsigned int buffer_time_index[REF_FRAMES];
2521 /*!
2522 * Spatial layer id of the last frame that refreshed the buffer slot.
2523 */
2524 unsigned char buffer_spatial_layer[REF_FRAMES];
2525 /*!
2526 * Flag to indicate whether closest reference was the previous frame.
2527 */
2528 bool_Bool reference_was_previous_frame;
2529 /*!
2530 * Flag to indicate this frame is based on longer term reference only,
2531 * for recovery from past loss, and it should be biased for improved coding.
2532 */
2533 bool_Bool bias_recovery_frame;
2534} RTC_REF;
2535/*!\endcond */
2536
2537/*!
2538 * \brief Structure to hold data corresponding to an encoded frame.
2539 */
2540typedef struct AV1_COMP_DATA {
2541 /*!
2542 * Buffer to store packed bitstream data of a frame.
2543 */
2544 unsigned char *cx_data;
2545
2546 /*!
2547 * Allocated size of the cx_data buffer.
2548 */
2549 size_t cx_data_sz;
2550
2551 /*!
2552 * Size of data written in the cx_data buffer.
2553 */
2554 size_t frame_size;
2555
2556 /*!
2557 * Flags for the frame.
2558 */
2559 unsigned int lib_flags;
2560
2561 /*!
2562 * Time stamp for start of frame.
2563 */
2564 int64_t ts_frame_start;
2565
2566 /*!
2567 * Time stamp for end of frame.
2568 */
2569 int64_t ts_frame_end;
2570
2571 /*!
2572 * Flag to indicate flush call.
2573 */
2574 int flush;
2575
2576 /*!
2577 * Time base for sequence.
2578 */
2579 const aom_rational64_t *timestamp_ratio;
2580
2581 /*!
2582 * Decide to pop the source for this frame from input buffer queue.
2583 */
2584 int pop_lookahead;
2585} AV1_COMP_DATA;
2586
2587/*!
2588 * \brief Top level primary encoder structure
2589 */
2590typedef struct AV1_PRIMARY {
2591 /*!
2592 * Array of frame level encoder stage top level structures
2593 */
2594 struct AV1_COMP *parallel_cpi[MAX_PARALLEL_FRAMES4];
2595
2596 /*!
2597 * Array of structures to hold data of frames encoded in a given parallel
2598 * encode set.
2599 */
2600 struct AV1_COMP_DATA parallel_frames_data[MAX_PARALLEL_FRAMES4 - 1];
2601#if CONFIG_FPMT_TEST0
2602 /*!
2603 * Flag which enables/disables simulation path for fpmt unit test.
2604 * 0 - FPMT integration
2605 * 1 - FPMT simulation
2606 */
2607 FPMT_TEST_ENC_CFG fpmt_unit_test_cfg;
2608
2609 /*!
2610 * Temporary variable simulating the delayed frame_probability update.
2611 */
2612 FrameProbInfo temp_frame_probs;
2613
2614 /*!
2615 * Temporary variable holding the updated frame probability across
2616 * frames. Copy its value to temp_frame_probs for frame_parallel_level 0
2617 * frames or last frame in parallel encode set.
2618 */
2619 FrameProbInfo temp_frame_probs_simulation;
2620
2621 /*!
2622 * Temporary variable simulating the delayed update of valid global motion
2623 * model across frames.
2624 */
2625 int temp_valid_gm_model_found[FRAME_UPDATE_TYPES];
2626#endif // CONFIG_FPMT_TEST
2627 /*!
2628 * Copy of cm->ref_frame_map maintained to facilitate sequential update of
2629 * ref_frame_map by lower layer depth frames encoded ahead of time in a
2630 * parallel encode set.
2631 */
2632 RefCntBuffer *ref_frame_map_copy[REF_FRAMES];
2633
2634 /*!
2635 * Start time stamp of the last encoded show frame
2636 */
2637 int64_t ts_start_last_show_frame;
2638
2639 /*!
2640 * End time stamp of the last encoded show frame
2641 */
2642 int64_t ts_end_last_show_frame;
2643
2644 /*!
2645 * Number of frame level contexts(cpis)
2646 */
2647 int num_fp_contexts;
2648
2649 /*!
2650 * Loopfilter levels of the previous encoded frame.
2651 */
2652 int filter_level[2];
2653
2654 /*!
2655 * Chrominance component loopfilter level of the previous encoded frame.
2656 */
2657 int filter_level_u;
2658
2659 /*!
2660 * Chrominance component loopfilter level of the previous encoded frame.
2661 */
2662 int filter_level_v;
2663
2664 /*!
2665 * Encode stage top level structure
2666 * During frame parallel encode, this is the same as parallel_cpi[0]
2667 */
2668 struct AV1_COMP *cpi;
2669
2670 /*!
2671 * Lookahead processing stage top level structure
2672 */
2673 struct AV1_COMP *cpi_lap;
2674
2675 /*!
2676 * Look-ahead context.
2677 */
2678 struct lookahead_ctx *lookahead;
2679
2680 /*!
2681 * Sequence parameters have been transmitted already and locked
2682 * or not. Once locked av1_change_config cannot change the seq
2683 * parameters. Note that for SVC encoding the sequence parameters
2684 * (operating_points_cnt_minus_1, operating_point_idc[],
2685 * has_nonzero_operating_point_idc) should be updated whenever the
2686 * number of layers is changed. This is done in the
2687 * ctrl_set_svc_params().
2688 */
2689 int seq_params_locked;
2690
2691 /*!
2692 * Pointer to internal utility functions that manipulate aom_codec_* data
2693 * structures.
2694 */
2695 struct aom_codec_pkt_list *output_pkt_list;
2696
2697 /*!
2698 * When set, indicates that internal ARFs are enabled.
2699 */
2700 int internal_altref_allowed;
2701
2702 /*!
2703 * Tell if OVERLAY frame shows existing alt_ref frame.
2704 */
2705 int show_existing_alt_ref;
2706
2707 /*!
2708 * Information related to a gf group.
2709 */
2710 GF_GROUP gf_group;
2711
2712 /*!
2713 * Track prior gf group state.
2714 */
2715 GF_STATE gf_state;
2716
2717 /*!
2718 * Flag indicating whether look ahead processing (LAP) is enabled.
2719 */
2720 int lap_enabled;
2721
2722 /*!
2723 * Parameters for AV1 bitstream levels.
2724 */
2725 AV1LevelParams level_params;
2726
2727 /*!
2728 * Calculates PSNR on each frame when set to 1.
2729 */
2730 int b_calculate_psnr;
2731
2732 /*!
2733 * Number of frames left to be encoded, is 0 if limit is not set.
2734 */
2735 int frames_left;
2736
2737 /*!
2738 * Information related to two pass encoding.
2739 */
2740 TWO_PASS twopass;
2741
2742 /*!
2743 * Rate control related parameters.
2744 */
2745 PRIMARY_RATE_CONTROL p_rc;
2746
2747 /*!
2748 * Info and resources used by temporal filtering.
2749 */
2750 TEMPORAL_FILTER_INFO tf_info;
2751 /*!
2752 * Elements part of the sequence header, that are applicable for all the
2753 * frames in the video.
2754 */
2755 SequenceHeader seq_params;
2756
2757 /*!
2758 * Indicates whether to use SVC.
2759 */
2760 int use_svc;
2761
2762 /*!
2763 * If true, buffer removal times are present.
2764 */
2765 bool_Bool buffer_removal_time_present;
2766
2767 /*!
2768 * Number of temporal layers: may be > 1 for SVC (scalable vector coding).
2769 */
2770 unsigned int number_temporal_layers;
2771
2772 /*!
2773 * Number of spatial layers: may be > 1 for SVC (scalable vector coding).
2774 */
2775 unsigned int number_spatial_layers;
2776
2777 /*!
2778 * Code and details about current error status.
2779 */
2780 struct aom_internal_error_info error;
2781
2782 /*!
2783 * Function pointers to variants of sse/sad/variance computation functions.
2784 * fn_ptr[i] indicates the list of function pointers corresponding to block
2785 * size i.
2786 */
2787 aom_variance_fn_ptr_t fn_ptr[BLOCK_SIZES_ALL];
2788
2789 /*!
2790 * tpl_sb_rdmult_scaling_factors[i] stores the RD multiplier scaling factor of
2791 * the ith 16 x 16 block in raster scan order.
2792 */
2793 double *tpl_sb_rdmult_scaling_factors;
2794
2795 /*!
2796 * Parameters related to tpl.
2797 */
2798 TplParams tpl_data;
2799
2800 /*!
2801 * Motion vector stats of the previous encoded frame.
2802 */
2803 MV_STATS mv_stats;
2804
2805#if CONFIG_INTERNAL_STATS0
2806 /*!\cond */
2807 uint64_t total_time_receive_data;
2808 uint64_t total_time_compress_data;
2809
2810 unsigned int total_mode_chosen_counts[MAX_MODES];
2811
2812 int count[2];
2813 uint64_t total_sq_error[2];
2814 uint64_t total_samples[2];
2815 ImageStat psnr[2];
2816
2817 double total_blockiness;
2818 double worst_blockiness;
2819
2820 uint64_t total_bytes;
2821 double summed_quality;
2822 double summed_weights;
2823 double summed_quality_hbd;
2824 double summed_weights_hbd;
2825 unsigned int total_recode_hits;
2826 double worst_ssim;
2827 double worst_ssim_hbd;
2828
2829 ImageStat fastssim;
2830 ImageStat psnrhvs;
2831
2832 int b_calculate_blockiness;
2833 int b_calculate_consistency;
2834
2835 double total_inconsistency;
2836 double worst_consistency;
2837 Ssimv *ssim_vars;
2838 Metrics metrics;
2839 /*!\endcond */
2840#endif
2841
2842#if CONFIG_ENTROPY_STATS0
2843 /*!
2844 * Aggregates frame counts for the sequence.
2845 */
2846 FRAME_COUNTS aggregate_fc;
2847#endif // CONFIG_ENTROPY_STATS
2848
2849 /*!
2850 * For each type of reference frame, this contains the index of a reference
2851 * frame buffer for a reference frame of the same type. We use this to
2852 * choose our primary reference frame (which is the most recent reference
2853 * frame of the same type as the current frame).
2854 */
2855 int fb_of_context_type[REF_FRAMES];
2856
2857 /*!
2858 * Primary Multi-threading parameters.
2859 */
2860 PrimaryMultiThreadInfo p_mt_info;
2861
2862 /*!
2863 * Probabilities for pruning of various AV1 tools.
2864 */
2865 FrameProbInfo frame_probs;
2866
2867 /*!
2868 * Indicates if a valid global motion model has been found in the different
2869 * frame update types of a GF group.
2870 * valid_gm_model_found[i] indicates if valid global motion model has been
2871 * found in the frame update type with enum value equal to i
2872 */
2873 int valid_gm_model_found[FRAME_UPDATE_TYPES];
2874
2875 /*!
2876 * Struct for the reference structure for RTC.
2877 */
2878 RTC_REF rtc_ref;
2879
2880 /*!
2881 * Struct for all intra mode row multi threading in the preprocess stage
2882 * when --deltaq-mode=3.
2883 */
2884 AV1EncRowMultiThreadSync intra_row_mt_sync;
2885} AV1_PRIMARY;
2886
2887/*!
2888 * \brief Top level encoder structure.
2889 */
2890typedef struct AV1_COMP {
Excessive padding in 'struct AV1_COMP' (107 padding bytes, where 11 is optimal). Optimal fields order: common, enc_quant_dequant_params, td, ppi, coeff_buffer_base, source, last_source, unscaled_source, unscaled_last_source, unfiltered_source, tpl_rdmult_scaling_factors, cdef_search_ctx, last_show_frame_buf, ambient_err, framerate, cyclic_refresh, tile_data, new_framerate, film_grain_table, denoise_and_model, ssim_rdmult_scaling_factors, consec_zero_mv, available_bs_size, mb_weber_stats, prep_rate_estimates, ext_rate_distribution, ext_rate_scale, norm_wiener_variance, mb_delta_q, second_pass_log_stream, src_sad_blk_64x64, rec_sse, mbmi_ext_info, enc_seg, active_map, firstpass_data, coeff_buffer_pool, time_stamps, pick_lr_ctxt, twopass_frame, vbp_info, scaled_ref_buf, ducky_encode_info, ext_part_controller, roi, lr_ctxt, gm_info, scaled_source, scaled_last_source, orig_source, last_frame_uf, trial_frame_rst, force_intpel_info, rc, svc, tf_ctx, coding_context, oxcf, sf, mt_info, token_info, mv_search_params, rd, skip_tpl_setup_stats, rt_reduce_num_ref_buffers, ref_frame_flags, speed, all_one_sided_refs, droppable, frame_index_set, data_alloc_width, data_alloc_height, initial_mbs, last_coded_width, last_coded_height, allocated_tiles, vaq_refresh, num_frame_recode, do_update_vbr_bits_off_target_fast, existing_fb_idx_to_show, intrabc_used, prune_ref_frame_mask, use_screen_content_tools, is_screen_content_type, frame_header_count, deltaq_used, num_tg, superres_mode, consec_zero_mv_alloc_size, sb_counter, ref_refresh_index, ref_idx_to_skip, use_ducky_encode, frames_since_last_update, palette_pixel_num, scaled_last_source_available, resize_pending_params, interp_search_flags, ext_flags, ref_frame_dist_info, noise_estimate, frame_info, do_update_frame_probs_txtype, do_update_frame_probs_obmc, do_update_frame_probs_warp, do_update_frame_probs_interpfilter, winner_mode_params, mv_stats, zeromv_skip_thresh_exit_part, counts, frame_new_probs, gf_frame_index, frame_size_related_setup_done, compressor_stage, last_frame_type, fp_block_size, refresh_idx_available, do_frame_data_update, weber_bsize, is_dropped_frame, alloc_pyramid, refresh_frame, optimize_seg_arr, consider reordering the fields or adding explicit padding members
2891 /*!
2892 * Pointer to top level primary encoder structure
2893 */
2894 AV1_PRIMARY *ppi;
2895
2896 /*!
2897 * Quantization and dequantization parameters for internal quantizer setup
2898 * in the encoder.
2899 */
2900 EncQuantDequantParams enc_quant_dequant_params;
2901
2902 /*!
2903 * Structure holding thread specific variables.
2904 */
2905 ThreadData td;
2906
2907 /*!
2908 * Statistics collected at frame level.
2909 */
2910 FRAME_COUNTS counts;
2911
2912 /*!
2913 * Holds buffer storing mode information at 4x4/8x8 level.
2914 */
2915 MBMIExtFrameBufferInfo mbmi_ext_info;
2916
2917 /*!
2918 * Buffer holding the transform block related information.
2919 * coeff_buffer_base[i] stores the transform block related information of the
2920 * ith superblock in raster scan order.
2921 */
2922 CB_COEFF_BUFFER *coeff_buffer_base;
2923
2924 /*!
2925 * Structure holding pointers to frame level memory allocated for transform
2926 * block related information.
2927 */
2928 CoeffBufferPool coeff_buffer_pool;
2929
2930 /*!
2931 * Structure holding variables common to encoder and decoder.
2932 */
2933 AV1_COMMON common;
2934
2935 /*!
2936 * Encoder configuration related parameters.
2937 */
2938 AV1EncoderConfig oxcf;
2939
2940 /*!
2941 * Stores the trellis optimization type at segment level.
2942 * optimize_seg_arr[i] stores the trellis opt type for ith segment.
2943 */
2944 TRELLIS_OPT_TYPE optimize_seg_arr[MAX_SEGMENTS8];
2945
2946 /*!
2947 * Pointer to the frame buffer holding the source frame to be used during the
2948 * current stage of encoding. It can be the raw input, temporally filtered
2949 * input or scaled input.
2950 */
2951 YV12_BUFFER_CONFIG *source;
2952
2953 /*!
2954 * Pointer to the frame buffer holding the last raw source frame.
2955 * last_source is NULL for the following cases:
2956 * 1) First frame
2957 * 2) Alt-ref frames
2958 * 3) All frames for all-intra frame encoding.
2959 */
2960 YV12_BUFFER_CONFIG *last_source;
2961
2962 /*!
2963 * Pointer to the frame buffer holding the unscaled source frame.
2964 * It can be either the raw input or temporally filtered input.
2965 */
2966 YV12_BUFFER_CONFIG *unscaled_source;
2967
2968 /*!
2969 * Frame buffer holding the resized source frame (cropping / superres).
2970 */
2971 YV12_BUFFER_CONFIG scaled_source;
2972
2973 /*!
2974 * Pointer to the frame buffer holding the unscaled last source frame.
2975 */
2976 YV12_BUFFER_CONFIG *unscaled_last_source;
2977
2978 /*!
2979 * Frame buffer holding the resized last source frame.
2980 */
2981 YV12_BUFFER_CONFIG scaled_last_source;
2982
2983 /*!
2984 * Pointer to the original source frame. This is used to determine if the
2985 * content is screen.
2986 */
2987 YV12_BUFFER_CONFIG *unfiltered_source;
2988
2989 /*!
2990 * Frame buffer holding the orig source frame for PSNR calculation in rtc tf
2991 * case.
2992 */
2993 YV12_BUFFER_CONFIG orig_source;
2994
2995 /*!
2996 * Skip tpl setup when tpl data from gop length decision can be reused.
2997 */
2998 int skip_tpl_setup_stats;
2999
3000 /*!
3001 * Scaling factors used in the RD multiplier modulation.
3002 * TODO(sdeng): consider merge the following arrays.
3003 * tpl_rdmult_scaling_factors is a temporary buffer used to store the
3004 * intermediate scaling factors which are used in the calculation of
3005 * tpl_sb_rdmult_scaling_factors. tpl_rdmult_scaling_factors[i] stores the
3006 * intermediate scaling factor of the ith 16 x 16 block in raster scan order.
3007 */
3008 double *tpl_rdmult_scaling_factors;
3009
3010 /*!
3011 * Temporal filter context.
3012 */
3013 TemporalFilterCtx tf_ctx;
3014
3015 /*!
3016 * Pointer to CDEF search context.
3017 */
3018 CdefSearchCtx *cdef_search_ctx;
3019
3020 /*!
3021 * Variables related to forcing integer mv decisions for the current frame.
3022 */
3023 ForceIntegerMVInfo force_intpel_info;
3024
3025 /*!
3026 * Pointer to the buffer holding the scaled reference frames.
3027 * scaled_ref_buf[i] holds the scaled reference frame of type i.
3028 */
3029 RefCntBuffer *scaled_ref_buf[INTER_REFS_PER_FRAME];
3030
3031 /*!
3032 * Pointer to the buffer holding the last show frame.
3033 */
3034 RefCntBuffer *last_show_frame_buf;
3035
3036 /*!
3037 * Refresh frame flags for golden, bwd-ref and alt-ref frames.
3038 */
3039 RefreshFrameInfo refresh_frame;
3040
3041 /*!
3042 * Flag to reduce the number of reference frame buffers used in rt.
3043 */
3044 int rt_reduce_num_ref_buffers;
3045
3046 /*!
3047 * Flags signalled by the external interface at frame level.
3048 */
3049 ExternalFlags ext_flags;
3050
3051 /*!
3052 * Temporary frame buffer used to store the non-loop filtered reconstructed
3053 * frame during the search of loop filter level.
3054 */
3055 YV12_BUFFER_CONFIG last_frame_uf;
3056
3057 /*!
3058 * Temporary frame buffer used to store the loop restored frame during loop
3059 * restoration search.
3060 */
3061 YV12_BUFFER_CONFIG trial_frame_rst;
3062
3063 /*!
3064 * Ambient reconstruction err target for force key frames.
3065 */
3066 int64_t ambient_err;
3067
3068 /*!
3069 * Parameters related to rate distortion optimization.
3070 */
3071 RD_OPT rd;
3072
3073 /*!
3074 * Temporary coding context used to save and restore when encoding with and
3075 * without super-resolution.
3076 */
3077 CODING_CONTEXT coding_context;
3078
3079 /*!
3080 * Parameters related to global motion search.
3081 */
3082 GlobalMotionInfo gm_info;
3083
3084 /*!
3085 * Parameters related to winner mode processing.
3086 */
3087 WinnerModeParams winner_mode_params;
3088
3089 /*!
3090 * Frame time stamps.
3091 */
3092 TimeStamps time_stamps;
3093
3094 /*!
3095 * Rate control related parameters.
3096 */
3097 RATE_CONTROL rc;
3098
3099 /*!
3100 * Frame rate of the video.
3101 */
3102 double framerate;
3103
3104 /*!
3105 * Bitmask indicating which reference buffers may be referenced by this frame.
3106 */
3107 int ref_frame_flags;
3108
3109 /*!
3110 * speed is passed as a per-frame parameter into the encoder.
3111 */
3112 int speed;
3113
3114 /*!
3115 * sf contains fine-grained config set internally based on speed.
3116 */
3117 SPEED_FEATURES sf;
3118
3119 /*!
3120 * Parameters for motion vector search process.
3121 */
3122 MotionVectorSearchParams mv_search_params;
3123
3124 /*!
3125 * When set, indicates that all reference frames are forward references,
3126 * i.e., all the reference frames are output before the current frame.
3127 */
3128 int all_one_sided_refs;
3129
3130 /*!
3131 * Segmentation related information for current frame.
3132 */
3133 EncSegmentationInfo enc_seg;
3134
3135 /*!
3136 * Parameters related to cyclic refresh aq-mode.
3137 */
3138 CYCLIC_REFRESH *cyclic_refresh;
3139 /*!
3140 * Parameters related to active map. Active maps indicate
3141 * if there is any activity on a 4x4 block basis.
3142 */
3143 ActiveMap active_map;
3144
3145 /*!
3146 * The frame processing order within a GOP.
3147 */
3148 unsigned char gf_frame_index;
3149
3150#if CONFIG_INTERNAL_STATS0
3151 /*!\cond */
3152 uint64_t time_compress_data;
3153
3154 unsigned int mode_chosen_counts[MAX_MODES];
3155 int bytes;
3156 unsigned int frame_recode_hits;
3157 /*!\endcond */
3158#endif
3159
3160#if CONFIG_SPEED_STATS0
3161 /*!
3162 * For debugging: number of transform searches we have performed.
3163 */
3164 unsigned int tx_search_count;
3165#endif // CONFIG_SPEED_STATS
3166
3167 /*!
3168 * When set, indicates that the frame is droppable, i.e., this frame
3169 * does not update any reference buffers.
3170 */
3171 int droppable;
3172
3173 /*!
3174 * Stores the frame parameters during encoder initialization.
3175 */
3176 FRAME_INFO frame_info;
3177
3178 /*!
3179 * Stores different types of frame indices.
3180 */
3181 FRAME_INDEX_SET frame_index_set;
3182
3183 /*!
3184 * Stores the cm->width in the last call of alloc_compressor_data(). Helps
3185 * determine whether compressor data should be reallocated when cm->width
3186 * changes.
3187 */
3188 int data_alloc_width;
3189
3190 /*!
3191 * Stores the cm->height in the last call of alloc_compressor_data(). Helps
3192 * determine whether compressor data should be reallocated when cm->height
3193 * changes.
3194 */
3195 int data_alloc_height;
3196
3197 /*!
3198 * Number of MBs in the full-size frame; to be used to
3199 * normalize the firstpass stats. This will differ from the
3200 * number of MBs in the current frame when the frame is
3201 * scaled.
3202 */
3203 int initial_mbs;
3204
3205 /*!
3206 * Flag to indicate whether the frame size inforamation has been
3207 * setup and propagated to associated allocations.
3208 */
3209 bool_Bool frame_size_related_setup_done;
3210
3211 /*!
3212 * The width of the frame that is lastly encoded.
3213 * It is updated in the function "encoder_encode()".
3214 */
3215 int last_coded_width;
3216
3217 /*!
3218 * The height of the frame that is lastly encoded.
3219 * It is updated in the function "encoder_encode()".
3220 */
3221 int last_coded_height;
3222
3223 /*!
3224 * Resize related parameters.
3225 */
3226 ResizePendingParams resize_pending_params;
3227
3228 /*!
3229 * Pointer to struct holding adaptive data/contexts/models for the tile during
3230 * encoding.
3231 */
3232 TileDataEnc *tile_data;
3233 /*!
3234 * Number of tiles for which memory has been allocated for tile_data.
3235 */
3236 int allocated_tiles;
3237
3238 /*!
3239 * Structure to store the palette token related information.
3240 */
3241 TokenInfo token_info;
3242
3243 /*!
3244 * VARIANCE_AQ segment map refresh.
3245 */
3246 int vaq_refresh;
3247
3248 /*!
3249 * Thresholds for variance based partitioning.
3250 */
3251 VarBasedPartitionInfo vbp_info;
3252
3253 /*!
3254 * Number of recodes in the frame.
3255 */
3256 int num_frame_recode;
3257
3258 /*!
3259 * Current frame probability of parallel frames, across recodes.
3260 */
3261 FrameProbInfo frame_new_probs[NUM_RECODES_PER_FRAME10];
3262
3263 /*!
3264 * Retain condition for transform type frame_probability calculation
3265 */
3266 int do_update_frame_probs_txtype[NUM_RECODES_PER_FRAME10];
3267
3268 /*!
3269 * Retain condition for obmc frame_probability calculation
3270 */
3271 int do_update_frame_probs_obmc[NUM_RECODES_PER_FRAME10];
3272
3273 /*!
3274 * Retain condition for warped motion frame_probability calculation
3275 */
3276 int do_update_frame_probs_warp[NUM_RECODES_PER_FRAME10];
3277
3278 /*!
3279 * Retain condition for interpolation filter frame_probability calculation
3280 */
3281 int do_update_frame_probs_interpfilter[NUM_RECODES_PER_FRAME10];
3282
3283#if CONFIG_FPMT_TEST0
3284 /*!
3285 * Temporary variable for simulation.
3286 * Previous frame's framerate.
3287 */
3288 double temp_framerate;
3289#endif
3290 /*!
3291 * Updated framerate for the current parallel frame.
3292 * cpi->framerate is updated with new_framerate during
3293 * post encode updates for parallel frames.
3294 */
3295 double new_framerate;
3296
3297 /*!
3298 * Retain condition for fast_extra_bits calculation.
3299 */
3300 int do_update_vbr_bits_off_target_fast;
3301
3302 /*!
3303 * Multi-threading parameters.
3304 */
3305 MultiThreadInfo mt_info;
3306
3307 /*!
3308 * Specifies the frame to be output. It is valid only if show_existing_frame
3309 * is 1. When show_existing_frame is 0, existing_fb_idx_to_show is set to
3310 * INVALID_IDX.
3311 */
3312 int existing_fb_idx_to_show;
3313
3314 /*!
3315 * A flag to indicate if intrabc is ever used in current frame.
3316 */
3317 int intrabc_used;
3318
3319 /*!
3320 * Mark which ref frames can be skipped for encoding current frame during RDO.
3321 */
3322 int prune_ref_frame_mask;
3323
3324 /*!
3325 * Loop Restoration context.
3326 */
3327 AV1LrStruct lr_ctxt;
3328
3329 /*!
3330 * Loop Restoration context used during pick stage.
3331 */
3332 AV1LrPickStruct pick_lr_ctxt;
3333
3334 /*!
3335 * Pointer to list of tables with film grain parameters.
3336 */
3337 aom_film_grain_table_t *film_grain_table;
3338
3339#if CONFIG_DENOISE1
3340 /*!
3341 * Pointer to structure holding the denoised image buffers and the helper
3342 * noise models.
3343 */
3344 struct aom_denoise_and_model_t *denoise_and_model;
3345#endif
3346
3347 /*!
3348 * Flags related to interpolation filter search.
3349 */
3350 InterpSearchFlags interp_search_flags;
3351
3352 /*!
3353 * Turn on screen content tools flag.
3354 * Note that some videos are not screen content videos, but
3355 * screen content tools could also improve coding efficiency.
3356 * For example, videos with large flat regions, gaming videos that look
3357 * like natural videos.
3358 */
3359 int use_screen_content_tools;
3360
3361 /*!
3362 * A flag to indicate "real" screen content videos.
3363 * For example, screen shares, screen editing.
3364 * This type is true indicates |use_screen_content_tools| must be true.
3365 * In addition, rate control strategy is adjusted when this flag is true.
3366 */
3367 int is_screen_content_type;
3368
3369#if CONFIG_COLLECT_PARTITION_STATS0
3370 /*!
3371 * Accumulates the partition timing stat over the whole frame.
3372 */
3373 FramePartitionTimingStats partition_stats;
3374#endif // CONFIG_COLLECT_PARTITION_STATS
3375
3376#if CONFIG_COLLECT_COMPONENT_TIMING0
3377 /*!
3378 * component_time[] are initialized to zero while encoder starts.
3379 */
3380 uint64_t component_time[kTimingComponents];
3381 /*!
3382 * Stores timing for individual components between calls of start_timing()
3383 * and end_timing().
3384 */
3385 struct aom_usec_timer component_timer[kTimingComponents];
3386 /*!
3387 * frame_component_time[] are initialized to zero at beginning of each frame.
3388 */
3389 uint64_t frame_component_time[kTimingComponents];
3390#endif
3391
3392 /*!
3393 * Count the number of OBU_FRAME and OBU_FRAME_HEADER for level calculation.
3394 */
3395 int frame_header_count;
3396
3397 /*!
3398 * Whether any no-zero delta_q was actually used.
3399 */
3400 int deltaq_used;
3401
3402 /*!
3403 * Refrence frame distance related variables.
3404 */
3405 RefFrameDistanceInfo ref_frame_dist_info;
3406
3407 /*!
3408 * ssim_rdmult_scaling_factors[i] stores the RD multiplier scaling factor of
3409 * the ith 16 x 16 block in raster scan order. This scaling factor is used for
3410 * RD multiplier modulation when SSIM tuning is enabled.
3411 */
3412 double *ssim_rdmult_scaling_factors;
3413
3414#if CONFIG_TUNE_VMAF0
3415 /*!
3416 * Parameters for VMAF tuning.
3417 */
3418 TuneVMAFInfo vmaf_info;
3419#endif
3420
3421#if CONFIG_TUNE_BUTTERAUGLI0
3422 /*!
3423 * Parameters for Butteraugli tuning.
3424 */
3425 TuneButteraugliInfo butteraugli_info;
3426#endif
3427
3428 /*!
3429 * Parameters for scalable video coding.
3430 */
3431 SVC svc;
3432
3433 /*!
3434 * Indicates whether current processing stage is encode stage or LAP stage.
3435 */
3436 COMPRESSOR_STAGE compressor_stage;
3437
3438 /*!
3439 * Frame type of the last frame. May be used in some heuristics for speeding
3440 * up the encoding.
3441 */
3442 FRAME_TYPE last_frame_type;
3443
3444 /*!
3445 * Number of tile-groups.
3446 */
3447 int num_tg;
3448
3449 /*!
3450 * Super-resolution mode currently being used by the encoder.
3451 * This may / may not be same as user-supplied mode in oxcf->superres_mode
3452 * (when we are recoding to try multiple options for example).
3453 */
3454 aom_superres_mode superres_mode;
3455
3456 /*!
3457 * First pass related data.
3458 */
3459 FirstPassData firstpass_data;
3460
3461 /*!
3462 * Temporal Noise Estimate
3463 */
3464 NOISE_ESTIMATE noise_estimate;
3465
3466#if CONFIG_AV1_TEMPORAL_DENOISING0
3467 /*!
3468 * Temporal Denoiser
3469 */
3470 AV1_DENOISER denoiser;
3471#endif
3472
3473 /*!
3474 * Count on how many consecutive times a block uses small/zeromv for encoding
3475 * in a scale of 8x8 block.
3476 */
3477 uint8_t *consec_zero_mv;
3478
3479 /*!
3480 * Allocated memory size for |consec_zero_mv|.
3481 */
3482 int consec_zero_mv_alloc_size;
3483
3484 /*!
3485 * Block size of first pass encoding
3486 */
3487 BLOCK_SIZE fp_block_size;
3488
3489 /*!
3490 * The counter of encoded super block, used to differentiate block names.
3491 * This number starts from 0 and increases whenever a super block is encoded.
3492 */
3493 int sb_counter;
3494
3495 /*!
3496 * Available bitstream buffer size in bytes
3497 */
3498 size_t available_bs_size;
3499
3500 /*!
3501 * The controller of the external partition model.
3502 * It is used to do partition type selection based on external models.
3503 */
3504 ExtPartController ext_part_controller;
3505
3506 /*!
3507 * Motion vector stats of the current encoded frame, used to update the
3508 * ppi->mv_stats during postencode.
3509 */
3510 MV_STATS mv_stats;
3511 /*!
3512 * Stores the reference refresh index for the current frame.
3513 */
3514 int ref_refresh_index;
3515
3516 /*!
3517 * A flag to indicate if the reference refresh index is available for the
3518 * current frame.
3519 */
3520 bool_Bool refresh_idx_available;
3521
3522 /*!
3523 * Reference frame index corresponding to the frame to be excluded from being
3524 * used as a reference by frame_parallel_level 2 frame in a parallel
3525 * encode set of lower layer frames.
3526 */
3527 int ref_idx_to_skip;
3528#if CONFIG_FPMT_TEST0
3529 /*!
3530 * Stores the wanted frame buffer index for choosing primary ref frame by a
3531 * frame_parallel_level 2 frame in a parallel encode set of lower layer
3532 * frames.
3533 */
3534
3535 int wanted_fb;
3536#endif // CONFIG_FPMT_TEST
3537
3538 /*!
3539 * A flag to indicate frames that will update their data to the primary
3540 * context at the end of the encode. It is set for non-parallel frames and the
3541 * last frame in encode order in a given parallel encode set.
3542 */
3543 bool_Bool do_frame_data_update;
3544
3545#if CONFIG_RD_COMMAND0
3546 /*!
3547 * A structure for assigning external q_index / rdmult for experiments
3548 */
3549 RD_COMMAND rd_command;
3550#endif // CONFIG_RD_COMMAND
3551
3552 /*!
3553 * Buffer to store MB variance after Wiener filter.
3554 */
3555 WeberStats *mb_weber_stats;
3556
3557 /*!
3558 * Buffer to store rate cost estimates for each macro block (8x8) in the
3559 * preprocessing stage used in allintra mode.
3560 */
3561 int *prep_rate_estimates;
3562
3563 /*!
3564 * Buffer to store rate cost estimates for each 16x16 block read
3565 * from an external file, used in allintra mode.
3566 */
3567 double *ext_rate_distribution;
3568
3569 /*!
3570 * The scale that equals sum_rate_uniform_quantizer / sum_ext_rate.
3571 */
3572 double ext_rate_scale;
3573
3574 /*!
3575 * Buffer to store MB variance after Wiener filter.
3576 */
3577 BLOCK_SIZE weber_bsize;
3578
3579 /*!
3580 * Frame level Wiener filter normalization.
3581 */
3582 int64_t norm_wiener_variance;
3583
3584 /*!
3585 * Buffer to store delta-q values for delta-q mode 4.
3586 */
3587 int *mb_delta_q;
3588
3589 /*!
3590 * Flag to indicate that current frame is dropped.
3591 */
3592 bool_Bool is_dropped_frame;
3593
3594#if CONFIG_BITRATE_ACCURACY0
3595 /*!
3596 * Structure stores information needed for bitrate accuracy experiment.
3597 */
3598 VBR_RATECTRL_INFO vbr_rc_info;
3599#endif
3600
3601#if CONFIG_RATECTRL_LOG0
3602 /*!
3603 * Structure stores information of rate control decisions.
3604 */
3605 RATECTRL_LOG rc_log;
3606#endif // CONFIG_RATECTRL_LOG
3607
3608 /*!
3609 * Frame level twopass status and control data
3610 */
3611 TWO_PASS_FRAME twopass_frame;
3612
3613#if CONFIG_THREE_PASS0
3614 /*!
3615 * Context needed for third pass encoding.
3616 */
3617 THIRD_PASS_DEC_CTX *third_pass_ctx;
3618#endif
3619
3620 /*!
3621 * File pointer to second pass log
3622 */
3623 FILE *second_pass_log_stream;
3624
3625 /*!
3626 * Buffer to store 64x64 SAD
3627 */
3628 uint64_t *src_sad_blk_64x64;
3629
3630 /*!
3631 * SSE between the current frame and the reconstructed last frame
3632 * It is only used for CBR mode.
3633 * It is not used if the reference frame has a different frame size.
3634 */
3635 uint64_t rec_sse;
3636
3637 /*!
3638 * A flag to indicate whether the encoder is controlled by DuckyEncode or not.
3639 * 1:yes 0:no
3640 */
3641 int use_ducky_encode;
3642
3643#if !CONFIG_REALTIME_ONLY0
3644 /*! A structure that facilitates the communication between DuckyEncode and AV1
3645 * encoder.
3646 */
3647 DuckyEncodeInfo ducky_encode_info;
3648#endif // CONFIG_REALTIME_ONLY
3649 //
3650 /*!
3651 * Frames since last frame with cdf update.
3652 */
3653 int frames_since_last_update;
3654
3655 /*!
3656 * Block level thresholds to force zeromv-skip at partition level.
3657 */
3658 unsigned int zeromv_skip_thresh_exit_part[BLOCK_SIZES_ALL];
3659
3660 /*!
3661 * Should we allocate a downsampling pyramid for each frame buffer?
3662 * This is currently only used for global motion
3663 */
3664 bool_Bool alloc_pyramid;
3665
3666#if CONFIG_SALIENCY_MAP0
3667 /*!
3668 * Pixel level saliency map for each frame.
3669 */
3670 uint8_t *saliency_map;
3671
3672 /*!
3673 * Superblock level rdmult scaling factor driven by saliency map.
3674 */
3675 double *sm_scaling_factor;
3676#endif
3677
3678 /*!
3679 * Number of pixels that choose palette mode for luma in the
3680 * fast encoding pass in av1_determine_sc_tools_with_encoding().
3681 */
3682 int palette_pixel_num;
3683
3684 /*!
3685 * Flag to indicate scaled_last_source is available,
3686 * so scaling is not needed for last_source.
3687 */
3688 int scaled_last_source_available;
3689
3690 /*!
3691 * ROI map.
3692 */
3693 aom_roi_map_t roi;
3694} AV1_COMP;
3695
3696/*!
3697 * \brief Input frames and last input frame
3698 */
3699typedef struct EncodeFrameInput {
3700 /*!\cond */
3701 YV12_BUFFER_CONFIG *source;
3702 YV12_BUFFER_CONFIG *last_source;
3703 int64_t ts_duration;
3704 /*!\endcond */
3705} EncodeFrameInput;
3706
3707/*!
3708 * \brief contains per-frame encoding parameters decided upon by
3709 * av1_encode_strategy() and passed down to av1_encode().
3710 */
3711typedef struct EncodeFrameParams {
3712 /*!
3713 * Is error resilient mode enabled
3714 */
3715 int error_resilient_mode;
3716 /*!
3717 * Frame type (eg KF vs inter frame etc)
3718 */
3719 FRAME_TYPE frame_type;
3720
3721 /*!\cond */
3722 int primary_ref_frame;
3723 int order_offset;
3724
3725 /*!\endcond */
3726 /*!
3727 * Should the current frame be displayed after being decoded
3728 */
3729 int show_frame;
3730
3731 /*!\cond */
3732 int refresh_frame_flags;
3733
3734 int show_existing_frame;
3735 int existing_fb_idx_to_show;
3736
3737 /*!\endcond */
3738 /*!
3739 * Bitmask of which reference buffers may be referenced by this frame.
3740 */
3741 int ref_frame_flags;
3742
3743 /*!
3744 * Reference buffer assignment for this frame.
3745 */
3746 int remapped_ref_idx[REF_FRAMES];
3747
3748 /*!
3749 * Flags which determine which reference buffers are refreshed by this
3750 * frame.
3751 */
3752 RefreshFrameInfo refresh_frame;
3753
3754 /*!
3755 * Speed level to use for this frame: Bigger number means faster.
3756 */
3757 int speed;
3758} EncodeFrameParams;
3759
3760/*!\cond */
3761
3762void av1_initialize_enc(unsigned int usage, enum aom_rc_mode end_usage);
3763
3764struct AV1_COMP *av1_create_compressor(AV1_PRIMARY *ppi,
3765 const AV1EncoderConfig *oxcf,
3766 BufferPool *const pool,
3767 COMPRESSOR_STAGE stage,
3768 int lap_lag_in_frames);
3769
3770struct AV1_PRIMARY *av1_create_primary_compressor(
3771 struct aom_codec_pkt_list *pkt_list_head, int num_lap_buffers,
3772 const AV1EncoderConfig *oxcf);
3773
3774void av1_remove_compressor(AV1_COMP *cpi);
3775
3776void av1_remove_primary_compressor(AV1_PRIMARY *ppi);
3777
3778#if CONFIG_ENTROPY_STATS0
3779void print_entropy_stats(AV1_PRIMARY *const ppi);
3780#endif
3781#if CONFIG_INTERNAL_STATS0
3782void print_internal_stats(AV1_PRIMARY *ppi);
3783#endif
3784
3785void av1_change_config_seq(AV1_PRIMARY *ppi, const AV1EncoderConfig *oxcf,
3786 bool_Bool *sb_size_changed);
3787
3788void av1_change_config(AV1_COMP *cpi, const AV1EncoderConfig *oxcf,
3789 bool_Bool sb_size_changed);
3790
3791aom_codec_err_t av1_check_initial_width(AV1_COMP *cpi, int use_highbitdepth,
3792 int subsampling_x, int subsampling_y);
3793
3794void av1_post_encode_updates(AV1_COMP *const cpi,
3795 const AV1_COMP_DATA *const cpi_data);
3796
3797void av1_release_scaled_references_fpmt(AV1_COMP *cpi);
3798
3799void av1_decrement_ref_counts_fpmt(BufferPool *buffer_pool,
3800 int ref_buffers_used_map);
3801
3802void av1_init_sc_decisions(AV1_PRIMARY *const ppi);
3803
3804AV1_COMP *av1_get_parallel_frame_enc_data(AV1_PRIMARY *const ppi,
3805 AV1_COMP_DATA *const first_cpi_data);
3806
3807int av1_init_parallel_frame_context(const AV1_COMP_DATA *const first_cpi_data,
3808 AV1_PRIMARY *const ppi,
3809 int *ref_buffers_used_map);
3810
3811/*!\endcond */
3812
3813/*!\brief Obtain the raw frame data
3814 *
3815 * \ingroup high_level_algo
3816 * This function receives the raw frame data from input.
3817 *
3818 * \param[in] cpi Top-level encoder structure
3819 * \param[in] frame_flags Flags to decide how to encoding the frame
3820 * \param[in,out] sd Contain raw frame data
3821 * \param[in] time_stamp Time stamp of the frame
3822 * \param[in] end_time_stamp End time stamp
3823 *
3824 * \return Returns a value to indicate if the frame data is received
3825 * successfully.
3826 * \note The caller can assume that a copy of this frame is made and not just a
3827 * copy of the pointer.
3828 */
3829int av1_receive_raw_frame(AV1_COMP *cpi, aom_enc_frame_flags_t frame_flags,
3830 const YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
3831 int64_t end_time_stamp);
3832
3833/*!\brief Encode a frame
3834 *
3835 * \ingroup high_level_algo
3836 * \callgraph
3837 * \callergraph
3838 * This function encodes the raw frame data, and outputs the frame bit stream
3839 * to the designated buffer. The caller should use the output parameters
3840 * cpi_data->ts_frame_start and cpi_data->ts_frame_end only when this function
3841 * returns AOM_CODEC_OK.
3842 *
3843 * \param[in] cpi Top-level encoder structure
3844 * \param[in,out] cpi_data Data corresponding to a frame encode
3845 *
3846 * \return Returns a value to indicate if the encoding is done successfully.
3847 * \retval #AOM_CODEC_OK
3848 * \retval -1
3849 * No frame encoded; more input is required.
3850 * \retval "A nonzero (positive) aom_codec_err_t code"
3851 * The encoding failed with the error. Sets the error code and error message
3852 * in \c cpi->common.error.
3853 */
3854int av1_get_compressed_data(AV1_COMP *cpi, AV1_COMP_DATA *const cpi_data);
3855
3856/*!\brief Run 1-pass/2-pass encoding
3857 *
3858 * \ingroup high_level_algo
3859 * \callgraph
3860 * \callergraph
3861 */
3862int av1_encode(AV1_COMP *const cpi, uint8_t *const dest, size_t dest_size,
3863 const EncodeFrameInput *const frame_input,
3864 const EncodeFrameParams *const frame_params,
3865 size_t *const frame_size);
3866
3867/*!\cond */
3868int av1_get_preview_raw_frame(AV1_COMP *cpi, YV12_BUFFER_CONFIG *dest);
3869
3870int av1_get_last_show_frame(AV1_COMP *cpi, YV12_BUFFER_CONFIG *frame);
3871
3872aom_codec_err_t av1_copy_new_frame_enc(AV1_COMMON *cm,
3873 YV12_BUFFER_CONFIG *new_frame,
3874 YV12_BUFFER_CONFIG *sd);
3875
3876int av1_use_as_reference(int *ext_ref_frame_flags, int ref_frame_flags);
3877
3878int av1_copy_reference_enc(AV1_COMP *cpi, int idx, YV12_BUFFER_CONFIG *sd);
3879
3880int av1_set_reference_enc(AV1_COMP *cpi, int idx, YV12_BUFFER_CONFIG *sd);
3881
3882void av1_set_frame_size(AV1_COMP *cpi, int width, int height);
3883
3884void av1_set_mv_search_params(AV1_COMP *cpi);
3885
3886int av1_set_roi_map(AV1_COMP *cpi, unsigned char *map, unsigned int rows,
3887 unsigned int cols, int delta_q[8], int delta_lf[8],
3888 int skip[8], int ref_frame[8]);
3889
3890int av1_set_active_map(AV1_COMP *cpi, unsigned char *map, int rows, int cols);
3891
3892int av1_get_active_map(AV1_COMP *cpi, unsigned char *map, int rows, int cols);
3893
3894int av1_set_internal_size(AV1EncoderConfig *const oxcf,
3895 ResizePendingParams *resize_pending_params,
3896 AOM_SCALING_MODE horiz_mode,
3897 AOM_SCALING_MODE vert_mode);
3898
3899int av1_get_quantizer(struct AV1_COMP *cpi);
3900
3901// This function assumes that the input buffer contains valid OBUs. It should
3902// not be called on untrusted input.
3903int av1_convert_sect5obus_to_annexb(uint8_t *buffer, size_t buffer_size,
3904 size_t *input_size);
3905
3906void av1_alloc_mb_wiener_var_pred_buf(AV1_COMMON *cm, ThreadData *td);
3907
3908void av1_dealloc_mb_wiener_var_pred_buf(ThreadData *td);
3909
3910uint8_t av1_find_dominant_value(const uint8_t *src, int stride, int rows,
3911 int cols);
3912
3913void av1_dilate_block(const uint8_t *src, int src_stride, uint8_t *dilated,
3914 int dilated_stride, int rows, int cols);
3915
3916// Set screen content options.
3917// This function estimates whether to use screen content tools, by counting
3918// the portion of blocks that have few luma colors.
3919// Modifies:
3920// cpi->commom.features.allow_screen_content_tools
3921// cpi->common.features.allow_intrabc
3922// cpi->use_screen_content_tools
3923// cpi->is_screen_content_type
3924// However, the estimation is not accurate and may misclassify videos.
3925// A slower but more accurate approach that determines whether to use screen
3926// content tools is employed later. See av1_determine_sc_tools_with_encoding().
3927void av1_set_screen_content_options(struct AV1_COMP *cpi,
3928 FeatureFlags *features);
3929
3930void av1_update_frame_size(AV1_COMP *cpi);
3931
3932void av1_set_svc_seq_params(AV1_PRIMARY *const ppi);
3933
3934typedef struct {
3935 int pyr_level;
3936 int disp_order;
3937} RefFrameMapPair;
3938
3939static inline void init_ref_map_pair(
3940 AV1_COMP *cpi, RefFrameMapPair ref_frame_map_pairs[REF_FRAMES]) {
3941 if (cpi->ppi->gf_group.update_type[cpi->gf_frame_index] == KF_UPDATE) {
3942 memset(ref_frame_map_pairs, -1, sizeof(*ref_frame_map_pairs) * REF_FRAMES);
3943 return;
3944 }
3945 memset(ref_frame_map_pairs, 0, sizeof(*ref_frame_map_pairs) * REF_FRAMES);
3946 for (int map_idx = 0; map_idx < REF_FRAMES; map_idx++) {
3947 // Get reference frame buffer.
3948 const RefCntBuffer *const buf = cpi->common.ref_frame_map[map_idx];
3949 if (ref_frame_map_pairs[map_idx].disp_order == -1) continue;
3950 if (buf == NULL((void*)0)) {
3951 ref_frame_map_pairs[map_idx].disp_order = -1;
3952 ref_frame_map_pairs[map_idx].pyr_level = -1;
3953 continue;
3954 } else if (buf->ref_count > 1) {
3955 // Once the keyframe is coded, the slots in ref_frame_map will all
3956 // point to the same frame. In that case, all subsequent pointers
3957 // matching the current are considered "free" slots. This will find
3958 // the next occurrence of the current pointer if ref_count indicates
3959 // there are multiple instances of it and mark it as free.
3960 for (int idx2 = map_idx + 1; idx2 < REF_FRAMES; ++idx2) {
3961 const RefCntBuffer *const buf2 = cpi->common.ref_frame_map[idx2];
3962 if (buf2 == buf) {
3963 ref_frame_map_pairs[idx2].disp_order = -1;
3964 ref_frame_map_pairs[idx2].pyr_level = -1;
3965 }
3966 }
3967 }
3968 ref_frame_map_pairs[map_idx].disp_order = (int)buf->display_order_hint;
3969 ref_frame_map_pairs[map_idx].pyr_level = buf->pyramid_level;
3970 }
3971}
3972
3973#if CONFIG_FPMT_TEST0
3974static inline void calc_frame_data_update_flag(
3975 GF_GROUP *const gf_group, int gf_frame_index,
3976 bool_Bool *const do_frame_data_update) {
3977 *do_frame_data_update = true1;
3978 // Set the flag to false for all frames in a given parallel encode set except
3979 // the last frame in the set with frame_parallel_level = 2.
3980 if (gf_group->frame_parallel_level[gf_frame_index] == 1) {
3981 *do_frame_data_update = false0;
3982 } else if (gf_group->frame_parallel_level[gf_frame_index] == 2) {
3983 // Check if this is the last frame in the set with frame_parallel_level = 2.
3984 for (int i = gf_frame_index + 1; i < gf_group->size; i++) {
3985 if ((gf_group->frame_parallel_level[i] == 0 &&
3986 (gf_group->update_type[i] == ARF_UPDATE ||
3987 gf_group->update_type[i] == INTNL_ARF_UPDATE)) ||
3988 gf_group->frame_parallel_level[i] == 1) {
3989 break;
3990 } else if (gf_group->frame_parallel_level[i] == 2) {
3991 *do_frame_data_update = false0;
3992 break;
3993 }
3994 }
3995 }
3996}
3997#endif
3998
3999// av1 uses 10,000,000 ticks/second as time stamp
4000#define TICKS_PER_SEC10000000LL 10000000LL
4001
4002static inline int64_t timebase_units_to_ticks(
4003 const aom_rational64_t *timestamp_ratio, int64_t n) {
4004 return n * timestamp_ratio->num / timestamp_ratio->den;
4005}
4006
4007static inline int64_t ticks_to_timebase_units(
4008 const aom_rational64_t *timestamp_ratio, int64_t n) {
4009 int64_t round = timestamp_ratio->num / 2;
4010 if (round > 0) --round;
4011 return (n * timestamp_ratio->den + round) / timestamp_ratio->num;
4012}
4013
4014static inline int frame_is_kf_gf_arf(const AV1_COMP *cpi) {
4015 const GF_GROUP *const gf_group = &cpi->ppi->gf_group;
4016 const FRAME_UPDATE_TYPE update_type =
4017 gf_group->update_type[cpi->gf_frame_index];
4018
4019 return frame_is_intra_only(&cpi->common) || update_type == ARF_UPDATE ||
4020 update_type == GF_UPDATE;
4021}
4022
4023// TODO(huisu@google.com, youzhou@microsoft.com): enable hash-me for HBD.
4024static inline int av1_use_hash_me(const AV1_COMP *const cpi) {
4025 return (cpi->common.features.allow_screen_content_tools &&
4026 cpi->common.features.allow_intrabc &&
4027 frame_is_intra_only(&cpi->common));
4028}
4029
4030static inline const YV12_BUFFER_CONFIG *get_ref_frame_yv12_buf(
4031 const AV1_COMMON *const cm, MV_REFERENCE_FRAME ref_frame) {
4032 const RefCntBuffer *const buf = get_ref_frame_buf(cm, ref_frame);
4033 return buf != NULL((void*)0) ? &buf->buf : NULL((void*)0);
4034}
4035
4036static inline void alloc_frame_mvs(AV1_COMMON *const cm, RefCntBuffer *buf) {
4037 assert(buf != NULL)((void) sizeof ((buf != ((void*)0)) ? 1 : 0), __extension__ (
{ if (buf != ((void*)0)) ; else __assert_fail ("buf != NULL",
"/root/firefox-clang/third_party/aom/av1/encoder/encoder.h",
4037, __extension__ __PRETTY_FUNCTION__); }))
;
4038 ensure_mv_buffer(buf, cm);
4039 buf->width = cm->width;
4040 buf->height = cm->height;
4041}
4042
4043// Get the allocated token size for a tile. It does the same calculation as in
4044// the frame token allocation.
4045static inline unsigned int allocated_tokens(const TileInfo *tile,
4046 int sb_size_log2, int num_planes) {
4047 int tile_mb_rows =
4048 ROUND_POWER_OF_TWO(tile->mi_row_end - tile->mi_row_start, 2)(((tile->mi_row_end - tile->mi_row_start) + (((1 <<
(2)) >> 1))) >> (2))
;
4049 int tile_mb_cols =
4050 ROUND_POWER_OF_TWO(tile->mi_col_end - tile->mi_col_start, 2)(((tile->mi_col_end - tile->mi_col_start) + (((1 <<
(2)) >> 1))) >> (2))
;
4051
4052 return get_token_alloc(tile_mb_rows, tile_mb_cols, sb_size_log2, num_planes);
4053}
4054
4055static inline void get_start_tok(AV1_COMP *cpi, int tile_row, int tile_col,
4056 int mi_row, TokenExtra **tok, int sb_size_log2,
4057 int num_planes) {
4058 AV1_COMMON *const cm = &cpi->common;
4059 const int tile_cols = cm->tiles.cols;
4060 TileDataEnc *this_tile = &cpi->tile_data[tile_row * tile_cols + tile_col];
4061 const TileInfo *const tile_info = &this_tile->tile_info;
4062
4063 const int tile_mb_cols =
4064 (tile_info->mi_col_end - tile_info->mi_col_start + 2) >> 2;
4065 const int tile_mb_row = (mi_row - tile_info->mi_row_start + 2) >> 2;
4066
4067 *tok = cpi->token_info.tile_tok[tile_row][tile_col] +
4068 get_token_alloc(tile_mb_row, tile_mb_cols, sb_size_log2, num_planes);
4069}
4070
4071void av1_apply_encoding_flags(AV1_COMP *cpi, aom_enc_frame_flags_t flags);
4072
4073#define ALT_MIN_LAG3 3
4074static inline int is_altref_enabled(int lag_in_frames, bool_Bool enable_auto_arf) {
4075 return lag_in_frames >= ALT_MIN_LAG3 && enable_auto_arf;
4076}
4077
4078static inline int can_disable_altref(const GFConfig *gf_cfg) {
4079 return is_altref_enabled(gf_cfg->lag_in_frames, gf_cfg->enable_auto_arf) &&
4080 (gf_cfg->gf_min_pyr_height == 0);
4081}
4082
4083// Helper function to compute number of blocks on either side of the frame.
4084static inline int get_num_blocks(const int frame_length, const int mb_length) {
4085 return (frame_length + mb_length - 1) / mb_length;
4086}
4087
4088// Check if statistics generation stage
4089static inline int is_stat_generation_stage(const AV1_COMP *const cpi) {
4090 assert(IMPLIES(cpi->compressor_stage == LAP_STAGE,((void) sizeof (((!(cpi->compressor_stage == LAP_STAGE) ||
(cpi->oxcf.pass == AOM_RC_ONE_PASS && cpi->ppi
->lap_enabled))) ? 1 : 0), __extension__ ({ if ((!(cpi->
compressor_stage == LAP_STAGE) || (cpi->oxcf.pass == AOM_RC_ONE_PASS
&& cpi->ppi->lap_enabled))) ; else __assert_fail
("IMPLIES(cpi->compressor_stage == LAP_STAGE, cpi->oxcf.pass == AOM_RC_ONE_PASS && cpi->ppi->lap_enabled)"
, "/root/firefox-clang/third_party/aom/av1/encoder/encoder.h"
, 4091, __extension__ __PRETTY_FUNCTION__); }))
4091 cpi->oxcf.pass == AOM_RC_ONE_PASS && cpi->ppi->lap_enabled))((void) sizeof (((!(cpi->compressor_stage == LAP_STAGE) ||
(cpi->oxcf.pass == AOM_RC_ONE_PASS && cpi->ppi
->lap_enabled))) ? 1 : 0), __extension__ ({ if ((!(cpi->
compressor_stage == LAP_STAGE) || (cpi->oxcf.pass == AOM_RC_ONE_PASS
&& cpi->ppi->lap_enabled))) ; else __assert_fail
("IMPLIES(cpi->compressor_stage == LAP_STAGE, cpi->oxcf.pass == AOM_RC_ONE_PASS && cpi->ppi->lap_enabled)"
, "/root/firefox-clang/third_party/aom/av1/encoder/encoder.h"
, 4091, __extension__ __PRETTY_FUNCTION__); }))
;
4092 return (cpi->oxcf.pass == AOM_RC_FIRST_PASS ||
4093 (cpi->compressor_stage == LAP_STAGE));
4094}
4095// Check if statistics consumption stage
4096static inline int is_stat_consumption_stage_twopass(const AV1_COMP *const cpi) {
4097 return (cpi->oxcf.pass >= AOM_RC_SECOND_PASS);
4098}
4099
4100// Check if statistics consumption stage
4101static inline int is_stat_consumption_stage(const AV1_COMP *const cpi) {
4102 return (is_stat_consumption_stage_twopass(cpi) ||
4103 (cpi->oxcf.pass == AOM_RC_ONE_PASS &&
4104 (cpi->compressor_stage == ENCODE_STAGE) && cpi->ppi->lap_enabled));
4105}
4106
4107// Decide whether 'dv_costs' need to be allocated/stored during the encoding.
4108static inline bool_Bool av1_need_dv_costs(const AV1_COMP *const cpi) {
4109 return !cpi->sf.rt_sf.use_nonrd_pick_mode &&
4110 av1_allow_intrabc(&cpi->common) && !is_stat_generation_stage(cpi);
4111}
4112
4113/*!\endcond */
4114/*!\brief Check if the current stage has statistics
4115 *
4116 *\ingroup two_pass_algo
4117 *
4118 * \param[in] cpi Top - level encoder instance structure
4119 *
4120 * \return 0 if no stats for current stage else 1
4121 */
4122static inline int has_no_stats_stage(const AV1_COMP *const cpi) {
4123 assert(((void) sizeof (((!(!cpi->ppi->lap_enabled) || (cpi->
compressor_stage == ENCODE_STAGE))) ? 1 : 0), __extension__ (
{ if ((!(!cpi->ppi->lap_enabled) || (cpi->compressor_stage
== ENCODE_STAGE))) ; else __assert_fail ("IMPLIES(!cpi->ppi->lap_enabled, cpi->compressor_stage == ENCODE_STAGE)"
, "/root/firefox-clang/third_party/aom/av1/encoder/encoder.h"
, 4124, __extension__ __PRETTY_FUNCTION__); }))
4124 IMPLIES(!cpi->ppi->lap_enabled, cpi->compressor_stage == ENCODE_STAGE))((void) sizeof (((!(!cpi->ppi->lap_enabled) || (cpi->
compressor_stage == ENCODE_STAGE))) ? 1 : 0), __extension__ (
{ if ((!(!cpi->ppi->lap_enabled) || (cpi->compressor_stage
== ENCODE_STAGE))) ; else __assert_fail ("IMPLIES(!cpi->ppi->lap_enabled, cpi->compressor_stage == ENCODE_STAGE)"
, "/root/firefox-clang/third_party/aom/av1/encoder/encoder.h"
, 4124, __extension__ __PRETTY_FUNCTION__); }))
;
4125 return (cpi->oxcf.pass == AOM_RC_ONE_PASS && !cpi->ppi->lap_enabled);
4126}
4127
4128/*!\cond */
4129
4130static inline int is_one_pass_rt_params(const AV1_COMP *cpi) {
4131 return has_no_stats_stage(cpi) && cpi->oxcf.gf_cfg.lag_in_frames == 0 &&
4132 (cpi->oxcf.mode == REALTIME || cpi->svc.number_spatial_layers > 1);
4133}
4134
4135// Use default/internal reference structure for single-layer RTC.
4136static inline int use_rtc_reference_structure_one_layer(const AV1_COMP *cpi) {
4137 return is_one_pass_rt_params(cpi) && cpi->ppi->number_spatial_layers == 1 &&
4138 cpi->ppi->number_temporal_layers == 1 &&
4139 !cpi->ppi->rtc_ref.set_ref_frame_config;
4140}
4141
4142// Check if postencode drop is allowed.
4143static inline int allow_postencode_drop_rtc(const AV1_COMP *cpi) {
4144 const AV1_COMMON *const cm = &cpi->common;
4145 return is_one_pass_rt_params(cpi) && cpi->oxcf.rc_cfg.mode == AOM_CBR &&
4146 cpi->oxcf.rc_cfg.drop_frames_water_mark > 0 &&
4147 !cpi->rc.rtc_external_ratectrl && !frame_is_intra_only(cm) &&
4148 cpi->svc.spatial_layer_id == 0;
4149}
4150
4151// Function return size of frame stats buffer
4152static inline int get_stats_buf_size(int num_lap_buffer, int num_lag_buffer) {
4153 /* if lookahead is enabled return num_lap_buffers else num_lag_buffers */
4154 return (num_lap_buffer > 0 ? num_lap_buffer + 1 : num_lag_buffer);
4155}
4156
4157// TODO(zoeliu): To set up cpi->oxcf.gf_cfg.enable_auto_brf
4158
4159static inline void set_ref_ptrs(const AV1_COMMON *cm, MACROBLOCKD *xd,
4160 MV_REFERENCE_FRAME ref0,
4161 MV_REFERENCE_FRAME ref1) {
4162 xd->block_ref_scale_factors[0] =
4163 get_ref_scale_factors_const(cm, ref0 >= LAST_FRAME ? ref0 : 1);
4164 xd->block_ref_scale_factors[1] =
4165 get_ref_scale_factors_const(cm, ref1 >= LAST_FRAME ? ref1 : 1);
4166}
4167
4168static inline int get_chessboard_index(int frame_index) {
4169 return frame_index & 0x1;
4170}
4171
4172static inline const int *cond_cost_list_const(const struct AV1_COMP *cpi,
4173 const int *cost_list) {
4174 const int use_cost_list = cpi->sf.mv_sf.subpel_search_method != SUBPEL_TREE &&
4175 cpi->sf.mv_sf.use_fullpel_costlist;
4176 return use_cost_list ? cost_list : NULL((void*)0);
4177}
4178
4179static inline int *cond_cost_list(const struct AV1_COMP *cpi, int *cost_list) {
4180 const int use_cost_list = cpi->sf.mv_sf.subpel_search_method != SUBPEL_TREE &&
4181 cpi->sf.mv_sf.use_fullpel_costlist;
4182 return use_cost_list ? cost_list : NULL((void*)0);
4183}
4184
4185// Compression ratio of current frame.
4186double av1_get_compression_ratio(const AV1_COMMON *const cm,
4187 size_t encoded_frame_size);
4188
4189void av1_new_framerate(AV1_COMP *cpi, double framerate);
4190
4191void av1_setup_frame_size(AV1_COMP *cpi);
4192
4193#define LAYER_IDS_TO_IDX(sl, tl, num_tl)((sl) * (num_tl) + (tl)) ((sl) * (num_tl) + (tl))
4194
4195// Returns 1 if a frame is scaled and 0 otherwise.
4196static inline int av1_resize_scaled(const AV1_COMMON *cm) {
4197 return cm->superres_upscaled_width != cm->render_width ||
4198 cm->superres_upscaled_height != cm->render_height;
4199}
4200
4201static inline int av1_frame_scaled(const AV1_COMMON *cm) {
4202 return av1_superres_scaled(cm) || av1_resize_scaled(cm);
4203}
4204
4205// Don't allow a show_existing_frame to coincide with an error resilient
4206// frame. An exception can be made for a forward keyframe since it has no
4207// previous dependencies.
4208static inline int encode_show_existing_frame(const AV1_COMMON *cm) {
4209 return cm->show_existing_frame && (!cm->features.error_resilient_mode ||
4210 cm->current_frame.frame_type == KEY_FRAME);
4211}
4212
4213// Get index into the 'cpi->mbmi_ext_info.frame_base' array for the given
4214// 'mi_row' and 'mi_col'.
4215static inline int get_mi_ext_idx(const int mi_row, const int mi_col,
4216 const BLOCK_SIZE mi_alloc_bsize,
4217 const int mbmi_ext_stride) {
4218 const int mi_ext_size_1d = mi_size_wide[mi_alloc_bsize];
4219 const int mi_ext_row = mi_row / mi_ext_size_1d;
4220 const int mi_ext_col = mi_col / mi_ext_size_1d;
4221 return mi_ext_row * mbmi_ext_stride + mi_ext_col;
4222}
4223
4224// Lighter version of set_offsets that only sets the mode info
4225// pointers.
4226static inline void set_mode_info_offsets(
4227 const CommonModeInfoParams *const mi_params,
4228 const MBMIExtFrameBufferInfo *const mbmi_ext_info, MACROBLOCK *const x,
4229 MACROBLOCKD *const xd, int mi_row, int mi_col) {
4230 set_mi_offsets(mi_params, xd, mi_row, mi_col);
4231 const int ext_idx = get_mi_ext_idx(mi_row, mi_col, mi_params->mi_alloc_bsize,
4232 mbmi_ext_info->stride);
4233 x->mbmi_ext_frame = mbmi_ext_info->frame_base + ext_idx;
4234}
4235
4236// Check to see if the given partition size is allowed for a specified number
4237// of mi block rows and columns remaining in the image.
4238// If not then return the largest allowed partition size
4239static inline BLOCK_SIZE find_partition_size(BLOCK_SIZE bsize, int rows_left,
4240 int cols_left, int *bh, int *bw) {
4241 int int_size = (int)bsize;
4242 if (rows_left <= 0 || cols_left <= 0) {
4243 return AOMMIN(bsize, BLOCK_8X8)(((bsize) < (BLOCK_8X8)) ? (bsize) : (BLOCK_8X8));
4244 } else {
4245 for (; int_size > 0; int_size -= 3) {
4246 *bh = mi_size_high[int_size];
4247 *bw = mi_size_wide[int_size];
4248 if ((*bh <= rows_left) && (*bw <= cols_left)) {
4249 break;
4250 }
4251 }
4252 }
4253 return (BLOCK_SIZE)int_size;
4254}
4255
4256static const uint8_t av1_ref_frame_flag_list[REF_FRAMES] = { 0,
4257 AOM_LAST_FLAG,
4258 AOM_LAST2_FLAG,
4259 AOM_LAST3_FLAG,
4260 AOM_GOLD_FLAG,
4261 AOM_BWD_FLAG,
4262 AOM_ALT2_FLAG,
4263 AOM_ALT_FLAG };
4264
4265// When more than 'max_allowed_refs' are available, we reduce the number of
4266// reference frames one at a time based on this order.
4267static const MV_REFERENCE_FRAME disable_order[] = {
4268 LAST3_FRAME,
4269 LAST2_FRAME,
4270 ALTREF2_FRAME,
4271 BWDREF_FRAME,
4272};
4273
4274static const MV_REFERENCE_FRAME
4275 ref_frame_priority_order[INTER_REFS_PER_FRAME] = {
4276 LAST_FRAME, ALTREF_FRAME, BWDREF_FRAME, GOLDEN_FRAME,
4277 ALTREF2_FRAME, LAST2_FRAME, LAST3_FRAME,
4278 };
4279
4280static inline int get_ref_frame_flags(const SPEED_FEATURES *const sf,
4281 const int use_one_pass_rt_params,
4282 const YV12_BUFFER_CONFIG **ref_frames,
4283 const int ext_ref_frame_flags) {
4284 // cpi->ext_flags.ref_frame_flags allows certain reference types to be
4285 // disabled by the external interface. These are set by
4286 // av1_apply_encoding_flags(). Start with what the external interface allows,
4287 // then suppress any reference types which we have found to be duplicates.
4288 int flags = ext_ref_frame_flags;
4289
4290 for (int i = 1; i < INTER_REFS_PER_FRAME; ++i) {
4291 const YV12_BUFFER_CONFIG *const this_ref = ref_frames[i];
4292 // If this_ref has appeared before, mark the corresponding ref frame as
4293 // invalid. For one_pass_rt mode, only disable GOLDEN_FRAME if it's the
4294 // same as LAST_FRAME or ALTREF_FRAME (if ALTREF is being used in nonrd).
4295 int index =
4296 (use_one_pass_rt_params && ref_frame_priority_order[i] == GOLDEN_FRAME)
4297 ? (1 + sf->rt_sf.use_nonrd_altref_frame)
4298 : i;
4299 for (int j = 0; j < index; ++j) {
4300 // If this_ref has appeared before (same as the reference corresponding
4301 // to lower index j), remove it as a reference only if that reference
4302 // (for index j) is actually used as a reference.
4303 if (this_ref == ref_frames[j] &&
4304 (flags & (1 << (ref_frame_priority_order[j] - 1)))) {
4305 flags &= ~(1 << (ref_frame_priority_order[i] - 1));
4306 break;
4307 }
4308 }
4309 }
4310 return flags;
4311}
4312
4313// Returns a Sequence Header OBU stored in an aom_fixed_buf_t, or NULL upon
4314// failure. When a non-NULL aom_fixed_buf_t pointer is returned by this
4315// function, the memory must be freed by the caller. Both the buf member of the
4316// aom_fixed_buf_t, and the aom_fixed_buf_t pointer itself must be freed. Memory
4317// returned must be freed via call to free().
4318//
4319// Note: The OBU returned is in Low Overhead Bitstream Format. Specifically,
4320// the obu_has_size_field bit is set, and the buffer contains the obu_size
4321// field.
4322aom_fixed_buf_t *av1_get_global_headers(AV1_PRIMARY *ppi);
4323
4324#define MAX_GFUBOOST_FACTOR10.0 10.0
4325#define MIN_GFUBOOST_FACTOR4.0 4.0
4326
4327static inline int is_frame_tpl_eligible(const GF_GROUP *const gf_group,
4328 uint8_t index) {
4329 const FRAME_UPDATE_TYPE update_type = gf_group->update_type[index];
4330 return update_type == ARF_UPDATE || update_type == GF_UPDATE ||
4331 update_type == KF_UPDATE;
4332}
4333
4334static inline int is_frame_eligible_for_ref_pruning(const GF_GROUP *gf_group,
4335 int selective_ref_frame,
4336 int prune_ref_frames,
4337 int gf_index) {
4338 return (selective_ref_frame > 0) && (prune_ref_frames > 0) &&
4339 !is_frame_tpl_eligible(gf_group, gf_index);
4340}
4341
4342// Get update type of the current frame.
4343static inline FRAME_UPDATE_TYPE get_frame_update_type(const GF_GROUP *gf_group,
4344 int gf_frame_index) {
4345 return gf_group->update_type[gf_frame_index];
4346}
4347
4348static inline int av1_pixels_to_mi(int pixels) {
4349 return ALIGN_POWER_OF_TWO(pixels, 3)(((pixels) + ((1 << (3)) - 1)) & ~((1 << (3))
- 1))
>> MI_SIZE_LOG22;
4350}
4351
4352static inline int is_psnr_calc_enabled(const AV1_COMP *cpi) {
4353 const AV1_COMMON *const cm = &cpi->common;
4354
4355 return cpi->ppi->b_calculate_psnr && !is_stat_generation_stage(cpi) &&
4356 cm->show_frame && !cpi->is_dropped_frame;
4357}
4358
4359static inline int is_frame_resize_pending(const AV1_COMP *const cpi) {
4360 const ResizePendingParams *const resize_pending_params =
4361 &cpi->resize_pending_params;
4362 return (resize_pending_params->width && resize_pending_params->height &&
4363 (cpi->common.width != resize_pending_params->width ||
4364 cpi->common.height != resize_pending_params->height));
4365}
4366
4367// Check if loop filter is used.
4368static inline int is_loopfilter_used(const AV1_COMMON *const cm) {
4369 return !cm->features.coded_lossless && !cm->tiles.large_scale;
4370}
4371
4372// Check if CDEF is used.
4373static inline int is_cdef_used(const AV1_COMMON *const cm) {
4374 return cm->seq_params->enable_cdef && !cm->features.coded_lossless &&
4375 !cm->tiles.large_scale;
4376}
4377
4378// Check if loop restoration filter is used.
4379static inline int is_restoration_used(const AV1_COMMON *const cm) {
4380 return cm->seq_params->enable_restoration && !cm->features.all_lossless &&
4381 !cm->tiles.large_scale;
4382}
4383
4384// Checks if post-processing filters need to be applied.
4385// NOTE: This function decides if the application of different post-processing
4386// filters on the reconstructed frame can be skipped at the encoder side.
4387// However the computation of different filter parameters that are signaled in
4388// the bitstream is still required.
4389static inline unsigned int derive_skip_apply_postproc_filters(
4390 const AV1_COMP *cpi, int use_loopfilter, int use_cdef, int use_superres,
4391 int use_restoration) {
4392 // Though CDEF parameter selection should be dependent on
4393 // deblocked/loop-filtered pixels for cdef_pick_method <=
4394 // CDEF_FAST_SEARCH_LVL5, CDEF strength values are calculated based on the
4395 // pixel values that are not loop-filtered in svc real-time encoding mode.
4396 // Hence this case is handled separately using the condition below.
4397 if (cpi->ppi->rtc_ref.non_reference_frame)
4398 return (SKIP_APPLY_LOOPFILTER | SKIP_APPLY_CDEF);
4399
4400 if (!cpi->oxcf.algo_cfg.skip_postproc_filtering || cpi->ppi->b_calculate_psnr)
4401 return 0;
4402 assert(cpi->oxcf.mode == ALLINTRA)((void) sizeof ((cpi->oxcf.mode == ALLINTRA) ? 1 : 0), __extension__
({ if (cpi->oxcf.mode == ALLINTRA) ; else __assert_fail (
"cpi->oxcf.mode == ALLINTRA", "/root/firefox-clang/third_party/aom/av1/encoder/encoder.h"
, 4402, __extension__ __PRETTY_FUNCTION__); }))
;
4403
4404 // The post-processing filters are applied one after the other in the
4405 // following order: deblocking->cdef->superres->restoration. In case of
4406 // ALLINTRA encoding, the reconstructed frame is not used as a reference
4407 // frame. Hence, the application of these filters can be skipped when
4408 // 1. filter parameters of the subsequent stages are not dependent on the
4409 // filtered output of the current stage or
4410 // 2. subsequent filtering stages are disabled
4411 if (use_restoration) return SKIP_APPLY_RESTORATION;
4412 if (use_superres) return SKIP_APPLY_SUPERRES;
4413 if (use_cdef) {
4414 // CDEF parameter selection is not dependent on the deblocked frame if
4415 // cdef_pick_method is CDEF_PICK_FROM_Q. Hence the application of deblocking
4416 // filters and cdef filters can be skipped in this case.
4417 return (cpi->sf.lpf_sf.cdef_pick_method == CDEF_PICK_FROM_Q &&
4418 use_loopfilter)
4419 ? (SKIP_APPLY_LOOPFILTER | SKIP_APPLY_CDEF)
4420 : SKIP_APPLY_CDEF;
4421 }
4422 if (use_loopfilter) return SKIP_APPLY_LOOPFILTER;
4423
4424 // If we reach here, all post-processing stages are disabled, so none need to
4425 // be skipped.
4426 return 0;
4427}
4428
4429static inline void set_postproc_filter_default_params(AV1_COMMON *cm) {
4430 struct loopfilter *const lf = &cm->lf;
4431 CdefInfo *const cdef_info = &cm->cdef_info;
4432 RestorationInfo *const rst_info = cm->rst_info;
4433
4434 lf->filter_level[0] = 0;
4435 lf->filter_level[1] = 0;
4436 lf->backup_filter_level[0] = 0;
4437 lf->backup_filter_level[1] = 0;
4438 cdef_info->cdef_bits = 0;
4439 cdef_info->cdef_strengths[0] = 0;
4440 cdef_info->nb_cdef_strengths = 1;
4441 cdef_info->cdef_uv_strengths[0] = 0;
4442 rst_info[0].frame_restoration_type = RESTORE_NONE;
4443 rst_info[1].frame_restoration_type = RESTORE_NONE;
4444 rst_info[2].frame_restoration_type = RESTORE_NONE;
4445}
4446
4447static inline int is_inter_tx_size_search_level_one(
4448 const TX_SPEED_FEATURES *tx_sf) {
4449 return (tx_sf->inter_tx_size_search_init_depth_rect >= 1 &&
4450 tx_sf->inter_tx_size_search_init_depth_sqr >= 1);
4451}
4452
4453static inline int get_lpf_opt_level(const SPEED_FEATURES *sf) {
4454 int lpf_opt_level = 0;
4455 if (is_inter_tx_size_search_level_one(&sf->tx_sf))
4456 lpf_opt_level = (sf->lpf_sf.lpf_pick == LPF_PICK_FROM_Q) ? 2 : 1;
4457 return lpf_opt_level;
4458}
4459
4460// Enable switchable motion mode only if warp and OBMC tools are allowed
4461static inline bool_Bool is_switchable_motion_mode_allowed(bool_Bool allow_warped_motion,
4462 bool_Bool enable_obmc) {
4463 return (allow_warped_motion || enable_obmc);
4464}
4465
4466#if CONFIG_AV1_TEMPORAL_DENOISING0
4467static inline int denoise_svc(const struct AV1_COMP *const cpi) {
4468 return (!cpi->ppi->use_svc ||
4469 (cpi->ppi->use_svc &&
4470 cpi->svc.spatial_layer_id >= cpi->svc.first_layer_denoise));
4471}
4472#endif
4473
4474#if CONFIG_COLLECT_PARTITION_STATS0 == 2
4475static inline void av1_print_fr_partition_timing_stats(
4476 const FramePartitionTimingStats *part_stats, const char *filename) {
4477 FILE *f = fopen(filename, "w");
4478 if (!f) {
4479 return;
4480 }
4481
4482 fprintf(f, "bsize,redo,");
4483 for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
4484 fprintf(f, "decision_%d,", part);
4485 }
4486 for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
4487 fprintf(f, "attempt_%d,", part);
4488 }
4489 for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
4490 fprintf(f, "time_%d,", part);
4491 }
4492 fprintf(f, "\n");
4493
4494 static const int bsizes[6] = { 128, 64, 32, 16, 8, 4 };
4495
4496 for (int bsize_idx = 0; bsize_idx < 6; bsize_idx++) {
4497 fprintf(f, "%d,%d,", bsizes[bsize_idx], part_stats->partition_redo);
4498 for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
4499 fprintf(f, "%d,", part_stats->partition_decisions[bsize_idx][part]);
4500 }
4501 for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
4502 fprintf(f, "%d,", part_stats->partition_attempts[bsize_idx][part]);
4503 }
4504 for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
4505 fprintf(f, "%ld,", part_stats->partition_times[bsize_idx][part]);
4506 }
4507 fprintf(f, "\n");
4508 }
4509 fclose(f);
4510}
4511#endif // CONFIG_COLLECT_PARTITION_STATS == 2
4512
4513#if CONFIG_COLLECT_PARTITION_STATS0
4514static inline int av1_get_bsize_idx_for_part_stats(BLOCK_SIZE bsize) {
4515 assert(bsize == BLOCK_128X128 || bsize == BLOCK_64X64 ||((void) sizeof ((bsize == BLOCK_128X128 || bsize == BLOCK_64X64
|| bsize == BLOCK_32X32 || bsize == BLOCK_16X16 || bsize == BLOCK_8X8
|| bsize == BLOCK_4X4) ? 1 : 0), __extension__ ({ if (bsize ==
BLOCK_128X128 || bsize == BLOCK_64X64 || bsize == BLOCK_32X32
|| bsize == BLOCK_16X16 || bsize == BLOCK_8X8 || bsize == BLOCK_4X4
) ; else __assert_fail ("bsize == BLOCK_128X128 || bsize == BLOCK_64X64 || bsize == BLOCK_32X32 || bsize == BLOCK_16X16 || bsize == BLOCK_8X8 || bsize == BLOCK_4X4"
, "/root/firefox-clang/third_party/aom/av1/encoder/encoder.h"
, 4517, __extension__ __PRETTY_FUNCTION__); }))
4516 bsize == BLOCK_32X32 || bsize == BLOCK_16X16 || bsize == BLOCK_8X8 ||((void) sizeof ((bsize == BLOCK_128X128 || bsize == BLOCK_64X64
|| bsize == BLOCK_32X32 || bsize == BLOCK_16X16 || bsize == BLOCK_8X8
|| bsize == BLOCK_4X4) ? 1 : 0), __extension__ ({ if (bsize ==
BLOCK_128X128 || bsize == BLOCK_64X64 || bsize == BLOCK_32X32
|| bsize == BLOCK_16X16 || bsize == BLOCK_8X8 || bsize == BLOCK_4X4
) ; else __assert_fail ("bsize == BLOCK_128X128 || bsize == BLOCK_64X64 || bsize == BLOCK_32X32 || bsize == BLOCK_16X16 || bsize == BLOCK_8X8 || bsize == BLOCK_4X4"
, "/root/firefox-clang/third_party/aom/av1/encoder/encoder.h"
, 4517, __extension__ __PRETTY_FUNCTION__); }))
4517 bsize == BLOCK_4X4)((void) sizeof ((bsize == BLOCK_128X128 || bsize == BLOCK_64X64
|| bsize == BLOCK_32X32 || bsize == BLOCK_16X16 || bsize == BLOCK_8X8
|| bsize == BLOCK_4X4) ? 1 : 0), __extension__ ({ if (bsize ==
BLOCK_128X128 || bsize == BLOCK_64X64 || bsize == BLOCK_32X32
|| bsize == BLOCK_16X16 || bsize == BLOCK_8X8 || bsize == BLOCK_4X4
) ; else __assert_fail ("bsize == BLOCK_128X128 || bsize == BLOCK_64X64 || bsize == BLOCK_32X32 || bsize == BLOCK_16X16 || bsize == BLOCK_8X8 || bsize == BLOCK_4X4"
, "/root/firefox-clang/third_party/aom/av1/encoder/encoder.h"
, 4517, __extension__ __PRETTY_FUNCTION__); }))
;
4518 switch (bsize) {
4519 case BLOCK_128X128: return 0;
4520 case BLOCK_64X64: return 1;
4521 case BLOCK_32X32: return 2;
4522 case BLOCK_16X16: return 3;
4523 case BLOCK_8X8: return 4;
4524 case BLOCK_4X4: return 5;
4525 default: assert(0 && "Invalid bsize for partition_stats.")((void) sizeof ((0 && "Invalid bsize for partition_stats."
) ? 1 : 0), __extension__ ({ if (0 && "Invalid bsize for partition_stats."
) ; else __assert_fail ("0 && \"Invalid bsize for partition_stats.\""
, "/root/firefox-clang/third_party/aom/av1/encoder/encoder.h"
, 4525, __extension__ __PRETTY_FUNCTION__); }))
; return -1;
4526 }
4527}
4528#endif // CONFIG_COLLECT_PARTITION_STATS
4529
4530#if CONFIG_COLLECT_COMPONENT_TIMING0
4531static inline void start_timing(AV1_COMP *cpi, int component) {
4532 aom_usec_timer_start(&cpi->component_timer[component]);
4533}
4534static inline void end_timing(AV1_COMP *cpi, int component) {
4535 aom_usec_timer_mark(&cpi->component_timer[component]);
4536 cpi->frame_component_time[component] +=
4537 aom_usec_timer_elapsed(&cpi->component_timer[component]);
4538}
4539static inline char const *get_frame_type_enum(int type) {
4540 switch (type) {
4541 case 0: return "KEY_FRAME";
4542 case 1: return "INTER_FRAME";
4543 case 2: return "INTRA_ONLY_FRAME";
4544 case 3: return "S_FRAME";
4545 default: assert(0)((void) sizeof ((0) ? 1 : 0), __extension__ ({ if (0) ; else __assert_fail
("0", "/root/firefox-clang/third_party/aom/av1/encoder/encoder.h"
, 4545, __extension__ __PRETTY_FUNCTION__); }))
;
4546 }
4547 return "error";
4548}
4549#endif
4550
4551/*!\endcond */
4552
4553#ifdef __cplusplus
4554} // extern "C"
4555#endif
4556
4557#endif // AOM_AV1_ENCODER_ENCODER_H_