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