AOMedia AV1 Codec
encoder.h
Go to the documentation of this file.
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
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#include "av1/encoder/aq_cyclicrefresh.h"
34#include "av1/encoder/av1_quantize.h"
35#include "av1/encoder/block.h"
36#include "av1/encoder/context_tree.h"
37#include "av1/encoder/encodemb.h"
38#include "av1/encoder/firstpass.h"
39#include "av1/encoder/global_motion.h"
40#include "av1/encoder/level.h"
42#include "av1/encoder/mcomp.h"
43#include "av1/encoder/pickcdef.h"
44#include "av1/encoder/ratectrl.h"
45#include "av1/encoder/rd.h"
47#include "av1/encoder/svc_layercontext.h"
48#include "av1/encoder/temporal_filter.h"
49#include "av1/encoder/tokenize.h"
50#include "av1/encoder/tpl_model.h"
51#include "av1/encoder/av1_noise_estimate.h"
52
53#if CONFIG_INTERNAL_STATS
54#include "aom_dsp/ssim.h"
55#endif
56#include "aom_dsp/variance.h"
57#if CONFIG_DENOISE
58#include "aom_dsp/noise_model.h"
59#endif
60#if CONFIG_TUNE_VMAF
61#include "av1/encoder/tune_vmaf.h"
62#endif
63#if CONFIG_AV1_TEMPORAL_DENOISING
64#include "av1/encoder/av1_temporal_denoiser.h"
65#endif
66#if CONFIG_TUNE_BUTTERAUGLI
67#include "av1/encoder/tune_butteraugli.h"
68#endif
69
70#include "aom/internal/aom_codec_internal.h"
71#include "aom_util/aom_thread.h"
72
73#ifdef __cplusplus
74extern "C" {
75#endif
76
77// TODO(yunqing, any): Added suppression tag to quiet Doxygen warnings. Need to
78// adjust it while we work on documentation.
80// Number of frames required to test for scene cut detection
81#define SCENE_CUT_KEY_TEST_INTERVAL 16
82
83// Rational number with an int64 numerator
84// This structure holds a fractional value
85typedef struct aom_rational64 {
86 int64_t num; // fraction numerator
87 int den; // fraction denominator
88} aom_rational64_t; // alias for struct aom_rational
89
90enum {
91 NORMAL = 0,
92 FOURFIVE = 1,
93 THREEFIVE = 2,
94 THREEFOUR = 3,
95 ONEFOUR = 4,
96 ONEEIGHT = 5,
97 ONETWO = 6
98} UENUM1BYTE(AOM_SCALING);
99
100enum {
101 // Good Quality Fast Encoding. The encoder balances quality with the amount of
102 // time it takes to encode the output. Speed setting controls how fast.
103 GOOD,
104 // Realtime Fast Encoding. Will force some restrictions on bitrate
105 // constraints.
106 REALTIME,
107 // All intra mode. All the frames are coded as intra frames.
108 ALLINTRA
109} UENUM1BYTE(MODE);
110
111enum {
112 FRAMEFLAGS_KEY = 1 << 0,
113 FRAMEFLAGS_GOLDEN = 1 << 1,
114 FRAMEFLAGS_BWDREF = 1 << 2,
115 // TODO(zoeliu): To determine whether a frame flag is needed for ALTREF2_FRAME
116 FRAMEFLAGS_ALTREF = 1 << 3,
117 FRAMEFLAGS_INTRAONLY = 1 << 4,
118 FRAMEFLAGS_SWITCH = 1 << 5,
119 FRAMEFLAGS_ERROR_RESILIENT = 1 << 6,
120} UENUM1BYTE(FRAMETYPE_FLAGS);
121
122enum {
123 NO_AQ = 0,
124 VARIANCE_AQ = 1,
125 COMPLEXITY_AQ = 2,
126 CYCLIC_REFRESH_AQ = 3,
127 AQ_MODE_COUNT // This should always be the last member of the enum
128} UENUM1BYTE(AQ_MODE);
129enum {
130 NO_DELTA_Q = 0,
131 DELTA_Q_OBJECTIVE = 1, // Modulation to improve objective quality
132 DELTA_Q_PERCEPTUAL = 2, // Modulation to improve perceptual quality
133 DELTA_Q_MODE_COUNT // This should always be the last member of the enum
134} UENUM1BYTE(DELTAQ_MODE);
135
136enum {
137 RESIZE_NONE = 0, // No frame resizing allowed.
138 RESIZE_FIXED = 1, // All frames are coded at the specified scale.
139 RESIZE_RANDOM = 2, // All frames are coded at a random scale.
140 RESIZE_DYNAMIC = 3, // Frames coded at lower scale based on rate control.
141 RESIZE_MODES
142} UENUM1BYTE(RESIZE_MODE);
143
144enum {
145 SS_CFG_SRC = 0,
146 SS_CFG_LOOKAHEAD = 1,
147 SS_CFG_FPF = 2,
148 SS_CFG_TOTAL = 3
149} UENUM1BYTE(SS_CFG_OFFSET);
150
151enum {
152 DISABLE_SCENECUT, // For LAP, lag_in_frames < 19
153 ENABLE_SCENECUT_MODE_1, // For LAP, lag_in_frames >=19 and < 33
154 ENABLE_SCENECUT_MODE_2 // For twopass and LAP - lag_in_frames >=33
155} UENUM1BYTE(SCENECUT_MODE);
156
157#define MAX_VBR_CORPUS_COMPLEXITY 10000
158
160
161typedef enum {
162 MOD_FP, // First pass
163 MOD_TF, // Temporal filtering
164 MOD_TPL, // TPL
165 MOD_GME, // Global motion estimation
166 MOD_ENC, // Encode stage
167 MOD_LPF, // Deblocking loop filter
168 MOD_CDEF_SEARCH, // CDEF search
169 MOD_LR, // Loop restoration filtering
170 NUM_MT_MODULES
171} MULTI_THREADED_MODULES;
172
174
178typedef enum {
179 COST_UPD_SB,
180 COST_UPD_SBROW,
181 COST_UPD_TILE,
182 COST_UPD_OFF,
183} COST_UPDATE_TYPE;
184
188typedef struct {
192 RESIZE_MODE resize_mode;
197 uint8_t resize_scale_denominator;
202 uint8_t resize_kf_scale_denominator;
203} ResizeCfg;
204
208typedef struct {
212 bool enable_rect_partitions;
216 bool enable_ab_partitions;
220 bool enable_1to4_partitions;
225 BLOCK_SIZE min_partition_size;
230 BLOCK_SIZE max_partition_size;
231} PartitionCfg;
232
236typedef struct {
240 bool enable_intra_edge_filter;
245 bool enable_filter_intra;
249 bool enable_smooth_intra;
253 bool enable_paeth_intra;
257 bool enable_cfl_intra;
261 bool enable_diagonal_intra;
266 bool enable_angle_delta;
267} IntraModeCfg;
268
272typedef struct {
276 bool enable_tx64;
280 bool enable_flip_idtx;
284 bool enable_rect_tx;
289 bool reduced_tx_type_set;
294 bool use_intra_dct_only;
299 bool use_inter_dct_only;
304 bool use_intra_default_tx_only;
305} TxfmSizeTypeCfg;
306
310typedef struct {
314 bool enable_dist_wtd_comp;
319 bool enable_masked_comp;
323 bool enable_smooth_interintra;
327 bool enable_diff_wtd_comp;
331 bool enable_interinter_wedge;
335 bool enable_interintra_wedge;
336} CompoundTypeCfg;
337
341typedef struct {
346 int superres_qthresh;
351 int superres_kf_qthresh;
357 uint8_t superres_scale_denominator;
363 uint8_t superres_kf_scale_denominator;
367 aom_superres_mode superres_mode;
371 bool enable_superres;
372} SuperResCfg;
373
377typedef struct {
381 int key_freq_min;
382
386 int key_freq_max;
387
391 int enable_keyframe_filtering;
392
397 int sframe_dist;
398
404 int sframe_mode;
405
409 bool auto_key;
410
414 bool fwd_kf_enabled;
415
419 bool enable_sframe;
420
424 bool enable_intrabc;
425} KeyFrameCfg;
426
430typedef struct {
432 // BUFFERING PARAMETERS
439 int64_t starting_buffer_level_ms;
444 int64_t optimal_buffer_level_ms;
449 int64_t maximum_buffer_size_ms;
450
454 int64_t target_bandwidth;
455
460 unsigned int vbr_corpus_complexity_lap;
465 unsigned int max_intra_bitrate_pct;
470 unsigned int max_inter_bitrate_pct;
474 unsigned int gf_cbr_boost_pct;
479 unsigned int min_cr;
483 int drop_frames_water_mark;
489 int under_shoot_pct;
495 int over_shoot_pct;
500 int worst_allowed_q;
505 int best_allowed_q;
509 int cq_level;
514 enum aom_rc_mode mode;
521 int vbrbias;
526 int vbrmin_section;
531 int vbrmax_section;
532} RateControlCfg;
533
535typedef struct {
536 // Indicates the number of frames lag before encoding is started.
537 int lag_in_frames;
538 // Indicates the minimum gf/arf interval to be used.
539 int min_gf_interval;
540 // Indicates the maximum gf/arf interval to be used.
541 int max_gf_interval;
542 // Indicates the minimum height for GF group pyramid structure to be used.
543 int gf_min_pyr_height;
544 // Indicates the maximum height for GF group pyramid structure to be used.
545 int gf_max_pyr_height;
546 // Indicates if automatic set and use of altref frames should be enabled.
547 bool enable_auto_arf;
548 // Indicates if automatic set and use of (b)ackward (r)ef (f)rames should be
549 // enabled.
550 bool enable_auto_brf;
551} GFConfig;
552
553typedef struct {
554 // Indicates the number of tile groups.
555 unsigned int num_tile_groups;
556 // Indicates the MTU size for a tile group. If mtu is non-zero,
557 // num_tile_groups is set to DEFAULT_MAX_NUM_TG.
558 unsigned int mtu;
559 // Indicates the number of tile columns in log2.
560 int tile_columns;
561 // Indicates the number of tile rows in log2.
562 int tile_rows;
563 // Indicates the number of widths in the tile_widths[] array.
564 int tile_width_count;
565 // Indicates the number of heights in the tile_heights[] array.
566 int tile_height_count;
567 // Indicates the tile widths, and may be empty.
568 int tile_widths[MAX_TILE_COLS];
569 // Indicates the tile heights, and may be empty.
570 int tile_heights[MAX_TILE_ROWS];
571 // Indicates if large scale tile coding should be used.
572 bool enable_large_scale_tile;
573 // Indicates if single tile decoding mode should be enabled.
574 bool enable_single_tile_decoding;
575 // Indicates if EXT_TILE_DEBUG should be enabled.
576 bool enable_ext_tile_debug;
577} TileConfig;
578
579typedef struct {
580 // Indicates the width of the input frame.
581 int width;
582 // Indicates the height of the input frame.
583 int height;
584 // If forced_max_frame_width is non-zero then it is used to force the maximum
585 // frame width written in write_sequence_header().
586 int forced_max_frame_width;
587 // If forced_max_frame_width is non-zero then it is used to force the maximum
588 // frame height written in write_sequence_header().
589 int forced_max_frame_height;
590 // Indicates the frame width after applying both super-resolution and resize
591 // to the coded frame.
592 int render_width;
593 // Indicates the frame height after applying both super-resolution and resize
594 // to the coded frame.
595 int render_height;
596} FrameDimensionCfg;
597
598typedef struct {
599 // Indicates if warped motion should be enabled.
600 bool enable_warped_motion;
601 // Indicates if warped motion should be evaluated or not.
602 bool allow_warped_motion;
603 // Indicates if OBMC motion should be enabled.
604 bool enable_obmc;
605} MotionModeCfg;
606
607typedef struct {
608 // Timing info for each frame.
609 aom_timing_info_t timing_info;
610 // Indicates the number of time units of a decoding clock.
611 uint32_t num_units_in_decoding_tick;
612 // Indicates if decoder model information is present in the coded sequence
613 // header.
614 bool decoder_model_info_present_flag;
615 // Indicates if display model information is present in the coded sequence
616 // header.
617 bool display_model_info_present_flag;
618 // Indicates if timing info for each frame is present.
619 bool timing_info_present;
620} DecoderModelCfg;
621
622typedef struct {
623 // Indicates the update frequency for coeff costs.
624 COST_UPDATE_TYPE coeff;
625 // Indicates the update frequency for mode costs.
626 COST_UPDATE_TYPE mode;
627 // Indicates the update frequency for mv costs.
628 COST_UPDATE_TYPE mv;
629 // Indicates the update frequency for dv costs.
630 COST_UPDATE_TYPE dv;
631} CostUpdateFreq;
632
633typedef struct {
634 // Indicates the maximum number of reference frames allowed per frame.
635 unsigned int max_reference_frames;
636 // Indicates if the reduced set of references should be enabled.
637 bool enable_reduced_reference_set;
638 // Indicates if one-sided compound should be enabled.
639 bool enable_onesided_comp;
640} RefFrameCfg;
641
642typedef struct {
643 // Indicates the color space that should be used.
644 aom_color_primaries_t color_primaries;
645 // Indicates the characteristics of transfer function to be used.
646 aom_transfer_characteristics_t transfer_characteristics;
647 // Indicates the matrix coefficients to be used for the transfer function.
648 aom_matrix_coefficients_t matrix_coefficients;
649 // Indicates the chroma 4:2:0 sample position info.
650 aom_chroma_sample_position_t chroma_sample_position;
651 // Indicates if a limited color range or full color range should be used.
652 aom_color_range_t color_range;
653} ColorCfg;
654
655typedef struct {
656 // Indicates if extreme motion vector unit test should be enabled or not.
657 unsigned int motion_vector_unit_test;
658 // Indicates if superblock multipass unit test should be enabled or not.
659 unsigned int sb_multipass_unit_test;
660} UnitTestCfg;
661
662typedef struct {
663 // Indicates the file path to the VMAF model.
664 const char *vmaf_model_path;
665 // Indicates the path to the film grain parameters.
666 const char *film_grain_table_filename;
667 // Indicates the visual tuning metric.
668 aom_tune_metric tuning;
669 // Indicates if the current content is screen or default type.
670 aom_tune_content content;
671 // Indicates the film grain parameters.
672 int film_grain_test_vector;
673} TuneCfg;
674
675typedef struct {
676 // Indicates the framerate of the input video.
677 double init_framerate;
678 // Indicates the bit-depth of the input video.
679 unsigned int input_bit_depth;
680 // Indicates the maximum number of frames to be encoded.
681 unsigned int limit;
682 // Indicates the chrome subsampling x value.
683 unsigned int chroma_subsampling_x;
684 // Indicates the chrome subsampling y value.
685 unsigned int chroma_subsampling_y;
686} InputCfg;
687
688typedef struct {
689 // List of QP offsets for: keyframe, ALTREF, and 3 levels of internal ARFs.
690 // If any of these values are negative, fixed offsets are disabled.
691 // Uses internal q range.
692 double fixed_qp_offsets[FIXED_QP_OFFSET_COUNT];
693 // If true, encoder will use fixed QP offsets, that are either:
694 // - Given by the user, and stored in 'fixed_qp_offsets' array, OR
695 // - Picked automatically from cq_level.
696 int use_fixed_qp_offsets;
697 // Indicates the minimum flatness of the quantization matrix.
698 int qm_minlevel;
699 // Indicates the maximum flatness of the quantization matrix.
700 int qm_maxlevel;
701 // Indicates if adaptive quantize_b should be enabled.
702 int quant_b_adapt;
703 // Indicates the Adaptive Quantization mode to be used.
704 AQ_MODE aq_mode;
705 // Indicates the delta q mode to be used.
706 DELTAQ_MODE deltaq_mode;
707 // Indicates if delta quantization should be enabled in chroma planes.
708 bool enable_chroma_deltaq;
709 // Indicates if encoding with quantization matrices should be enabled.
710 bool using_qm;
711} QuantizationCfg;
712
717typedef struct {
721 int sharpness;
722
730 int disable_trellis_quant;
731
735 int arnr_max_frames;
736
740 int arnr_strength;
741
748 uint8_t cdf_update_mode;
749
753 bool enable_tpl_model;
754
759 bool enable_overlay;
760} AlgoCfg;
762
763typedef struct {
764 // Indicates the codec bit-depth.
765 aom_bit_depth_t bit_depth;
766 // Indicates the superblock size that should be used by the encoder.
767 aom_superblock_size_t superblock_size;
768 // Indicates if loopfilter modulation should be enabled.
769 bool enable_deltalf_mode;
770 // Indicates if CDEF should be enabled.
771 bool enable_cdef;
772 // Indicates if loop restoration filter should be enabled.
773 bool enable_restoration;
774 // When enabled, video mode should be used even for single frame input.
775 bool force_video_mode;
776 // Indicates if the error resiliency features should be enabled.
777 bool error_resilient_mode;
778 // Indicates if frame parallel decoding feature should be enabled.
779 bool frame_parallel_decoding_mode;
780 // Indicates if the input should be encoded as monochrome.
781 bool enable_monochrome;
782 // When enabled, the encoder will use a full header even for still pictures.
783 // When disabled, a reduced header is used for still pictures.
784 bool full_still_picture_hdr;
785 // Indicates if dual interpolation filters should be enabled.
786 bool enable_dual_filter;
787 // Indicates if frame order hint should be enabled or not.
788 bool enable_order_hint;
789 // Indicates if ref_frame_mvs should be enabled at the sequence level.
790 bool ref_frame_mvs_present;
791 // Indicates if ref_frame_mvs should be enabled at the frame level.
792 bool enable_ref_frame_mvs;
793 // Indicates if interintra compound mode is enabled.
794 bool enable_interintra_comp;
795 // Indicates if global motion should be enabled.
796 bool enable_global_motion;
797 // Indicates if palette should be enabled.
798 bool enable_palette;
799} ToolCfg;
800
805typedef struct AV1EncoderConfig {
807 // Configuration related to the input video.
808 InputCfg input_cfg;
809
810 // Configuration related to frame-dimensions.
811 FrameDimensionCfg frm_dim_cfg;
812
817 AlgoCfg algo_cfg;
818
822 KeyFrameCfg kf_cfg;
823
827 RateControlCfg rc_cfg;
829
830 // Configuration related to Quantization.
831 QuantizationCfg q_cfg;
832
833 // Internal frame size scaling.
834 ResizeCfg resize_cfg;
835
836 // Frame Super-Resolution size scaling.
837 SuperResCfg superres_cfg;
838
844 aom_fixed_buf_t twopass_stats_in;
846
847 // Configuration related to encoder toolsets.
848 ToolCfg tool_cfg;
849
850 // Configuration related to Group of frames.
851 GFConfig gf_cfg;
852
853 // Tile related configuration parameters.
854 TileConfig tile_cfg;
855
856 // Configuration related to Tune.
857 TuneCfg tune_cfg;
858
859 // Configuration related to color.
860 ColorCfg color_cfg;
861
862 // Configuration related to decoder model.
863 DecoderModelCfg dec_model_cfg;
864
865 // Configuration related to reference frames.
866 RefFrameCfg ref_frm_cfg;
867
868 // Configuration related to unit tests.
869 UnitTestCfg unit_test_cfg;
870
871 // Flags related to motion mode.
872 MotionModeCfg motion_mode_cfg;
873
874 // Flags related to intra mode search.
875 IntraModeCfg intra_mode_cfg;
876
877 // Flags related to transform size/type.
878 TxfmSizeTypeCfg txfm_cfg;
879
880 // Flags related to compound type.
881 CompoundTypeCfg comp_type_cfg;
882
883 // Partition related information.
884 PartitionCfg part_cfg;
885
886 // Configuration related to frequency of cost update.
887 CostUpdateFreq cost_upd_freq;
888
889#if CONFIG_DENOISE
890 // Indicates the noise level.
891 float noise_level;
892 // Indicates the the denoisers block size.
893 int noise_block_size;
894 // Indicates whether to apply denoising to the frame to be encoded
895 int enable_dnl_denoising;
896#endif
897
898#if CONFIG_AV1_TEMPORAL_DENOISING
899 // Noise sensitivity.
900 int noise_sensitivity;
901#endif
902 // Bit mask to specify which tier each of the 32 possible operating points
903 // conforms to.
904 unsigned int tier_mask;
905
906 // Indicates the number of pixels off the edge of a reference frame we're
907 // allowed to go when forming an inter prediction.
908 int border_in_pixels;
909
910 // Indicates the maximum number of threads that may be used by the encoder.
911 int max_threads;
912
913 // Indicates the speed preset to be used.
914 int speed;
915
916 // Indicates the target sequence level index for each operating point(OP).
917 AV1_LEVEL target_seq_level_idx[MAX_NUM_OPERATING_POINTS];
918
919 // Indicates the bitstream profile to be used.
920 BITSTREAM_PROFILE profile;
921
930 enum aom_enc_pass pass;
932
933 // Indicates if the encoding is GOOD or REALTIME.
934 MODE mode;
935
936 // Indicates if row-based multi-threading should be enabled or not.
937 bool row_mt;
938
939 // Indicates if 16bit frame buffers are to be used i.e., the content is >
940 // 8-bit.
941 bool use_highbitdepth;
942
943 // Indicates the bitstream syntax mode. 0 indicates bitstream is saved as
944 // Section 5 bitstream, while 1 indicates the bitstream is saved in Annex - B
945 // format.
946 bool save_as_annexb;
947
949} AV1EncoderConfig;
950
952static INLINE int is_lossless_requested(const RateControlCfg *const rc_cfg) {
953 return rc_cfg->best_allowed_q == 0 && rc_cfg->worst_allowed_q == 0;
954}
956
960typedef struct {
966 int obmc_probs[FRAME_UPDATE_TYPES][BLOCK_SIZES_ALL];
967
973 int warped_probs[FRAME_UPDATE_TYPES];
974
981 int tx_type_probs[FRAME_UPDATE_TYPES][TX_SIZES_ALL][TX_TYPES];
982
989 int switchable_interp_probs[FRAME_UPDATE_TYPES][SWITCHABLE_FILTER_CONTEXTS]
990 [SWITCHABLE_FILTERS];
991} FrameProbInfo;
992
994
995typedef struct FRAME_COUNTS {
996// Note: This structure should only contain 'unsigned int' fields, or
997// aggregates built solely from 'unsigned int' fields/elements
998#if CONFIG_ENTROPY_STATS
999 unsigned int kf_y_mode[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS][INTRA_MODES];
1000 unsigned int angle_delta[DIRECTIONAL_MODES][2 * MAX_ANGLE_DELTA + 1];
1001 unsigned int y_mode[BLOCK_SIZE_GROUPS][INTRA_MODES];
1002 unsigned int uv_mode[CFL_ALLOWED_TYPES][INTRA_MODES][UV_INTRA_MODES];
1003 unsigned int cfl_sign[CFL_JOINT_SIGNS];
1004 unsigned int cfl_alpha[CFL_ALPHA_CONTEXTS][CFL_ALPHABET_SIZE];
1005 unsigned int palette_y_mode[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS][2];
1006 unsigned int palette_uv_mode[PALETTE_UV_MODE_CONTEXTS][2];
1007 unsigned int palette_y_size[PALATTE_BSIZE_CTXS][PALETTE_SIZES];
1008 unsigned int palette_uv_size[PALATTE_BSIZE_CTXS][PALETTE_SIZES];
1009 unsigned int palette_y_color_index[PALETTE_SIZES]
1010 [PALETTE_COLOR_INDEX_CONTEXTS]
1011 [PALETTE_COLORS];
1012 unsigned int palette_uv_color_index[PALETTE_SIZES]
1013 [PALETTE_COLOR_INDEX_CONTEXTS]
1014 [PALETTE_COLORS];
1015 unsigned int partition[PARTITION_CONTEXTS][EXT_PARTITION_TYPES];
1016 unsigned int txb_skip[TOKEN_CDF_Q_CTXS][TX_SIZES][TXB_SKIP_CONTEXTS][2];
1017 unsigned int eob_extra[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
1018 [EOB_COEF_CONTEXTS][2];
1019 unsigned int dc_sign[PLANE_TYPES][DC_SIGN_CONTEXTS][2];
1020 unsigned int coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE - 1][LEVEL_CONTEXTS]
1021 [2];
1022 unsigned int eob_flag[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS][2];
1023 unsigned int eob_multi16[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][5];
1024 unsigned int eob_multi32[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][6];
1025 unsigned int eob_multi64[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][7];
1026 unsigned int eob_multi128[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][8];
1027 unsigned int eob_multi256[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][9];
1028 unsigned int eob_multi512[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][10];
1029 unsigned int eob_multi1024[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][11];
1030 unsigned int coeff_lps_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
1031 [LEVEL_CONTEXTS][BR_CDF_SIZE];
1032 unsigned int coeff_base_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
1033 [SIG_COEF_CONTEXTS][NUM_BASE_LEVELS + 2];
1034 unsigned int coeff_base_eob_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
1035 [SIG_COEF_CONTEXTS_EOB][NUM_BASE_LEVELS + 1];
1036 unsigned int newmv_mode[NEWMV_MODE_CONTEXTS][2];
1037 unsigned int zeromv_mode[GLOBALMV_MODE_CONTEXTS][2];
1038 unsigned int refmv_mode[REFMV_MODE_CONTEXTS][2];
1039 unsigned int drl_mode[DRL_MODE_CONTEXTS][2];
1040 unsigned int inter_compound_mode[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES];
1041 unsigned int wedge_idx[BLOCK_SIZES_ALL][16];
1042 unsigned int interintra[BLOCK_SIZE_GROUPS][2];
1043 unsigned int interintra_mode[BLOCK_SIZE_GROUPS][INTERINTRA_MODES];
1044 unsigned int wedge_interintra[BLOCK_SIZES_ALL][2];
1045 unsigned int compound_type[BLOCK_SIZES_ALL][MASKED_COMPOUND_TYPES];
1046 unsigned int motion_mode[BLOCK_SIZES_ALL][MOTION_MODES];
1047 unsigned int obmc[BLOCK_SIZES_ALL][2];
1048 unsigned int intra_inter[INTRA_INTER_CONTEXTS][2];
1049 unsigned int comp_inter[COMP_INTER_CONTEXTS][2];
1050 unsigned int comp_ref_type[COMP_REF_TYPE_CONTEXTS][2];
1051 unsigned int uni_comp_ref[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1][2];
1052 unsigned int single_ref[REF_CONTEXTS][SINGLE_REFS - 1][2];
1053 unsigned int comp_ref[REF_CONTEXTS][FWD_REFS - 1][2];
1054 unsigned int comp_bwdref[REF_CONTEXTS][BWD_REFS - 1][2];
1055 unsigned int intrabc[2];
1056
1057 unsigned int txfm_partition[TXFM_PARTITION_CONTEXTS][2];
1058 unsigned int intra_tx_size[MAX_TX_CATS][TX_SIZE_CONTEXTS][MAX_TX_DEPTH + 1];
1059 unsigned int skip_mode[SKIP_MODE_CONTEXTS][2];
1060 unsigned int skip_txfm[SKIP_CONTEXTS][2];
1061 unsigned int compound_index[COMP_INDEX_CONTEXTS][2];
1062 unsigned int comp_group_idx[COMP_GROUP_IDX_CONTEXTS][2];
1063 unsigned int delta_q[DELTA_Q_PROBS][2];
1064 unsigned int delta_lf_multi[FRAME_LF_COUNT][DELTA_LF_PROBS][2];
1065 unsigned int delta_lf[DELTA_LF_PROBS][2];
1066
1067 unsigned int inter_ext_tx[EXT_TX_SETS_INTER][EXT_TX_SIZES][TX_TYPES];
1068 unsigned int intra_ext_tx[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
1069 [TX_TYPES];
1070 unsigned int filter_intra_mode[FILTER_INTRA_MODES];
1071 unsigned int filter_intra[BLOCK_SIZES_ALL][2];
1072 unsigned int switchable_restore[RESTORE_SWITCHABLE_TYPES];
1073 unsigned int wiener_restore[2];
1074 unsigned int sgrproj_restore[2];
1075#endif // CONFIG_ENTROPY_STATS
1076
1077 unsigned int switchable_interp[SWITCHABLE_FILTER_CONTEXTS]
1078 [SWITCHABLE_FILTERS];
1079} FRAME_COUNTS;
1080
1081#define INTER_MODE_RD_DATA_OVERALL_SIZE 6400
1082
1083typedef struct {
1084 int ready;
1085 double a;
1086 double b;
1087 double dist_mean;
1088 double ld_mean;
1089 double sse_mean;
1090 double sse_sse_mean;
1091 double sse_ld_mean;
1092 int num;
1093 double dist_sum;
1094 double ld_sum;
1095 double sse_sum;
1096 double sse_sse_sum;
1097 double sse_ld_sum;
1098} InterModeRdModel;
1099
1100typedef struct {
1101 int idx;
1102 int64_t rd;
1103} RdIdxPair;
1104// TODO(angiebird): This is an estimated size. We still need to figure what is
1105// the maximum number of modes.
1106#define MAX_INTER_MODES 1024
1107// TODO(any): rename this struct to something else. There is already another
1108// struct called inter_mode_info, which makes this terribly confusing.
1116typedef struct inter_modes_info {
1121 int num;
1125 MB_MODE_INFO mbmi_arr[MAX_INTER_MODES];
1129 int mode_rate_arr[MAX_INTER_MODES];
1133 int64_t sse_arr[MAX_INTER_MODES];
1137 int64_t est_rd_arr[MAX_INTER_MODES];
1141 RdIdxPair rd_idx_pair_arr[MAX_INTER_MODES];
1145 RD_STATS rd_cost_arr[MAX_INTER_MODES];
1149 RD_STATS rd_cost_y_arr[MAX_INTER_MODES];
1153 RD_STATS rd_cost_uv_arr[MAX_INTER_MODES];
1154} InterModesInfo;
1155
1157typedef struct {
1158 // TODO(kyslov): consider changing to 64bit
1159
1160 // This struct is used for computing variance in choose_partitioning(), where
1161 // the max number of samples within a superblock is 32x32 (with 4x4 avg).
1162 // With 8bit bitdepth, uint32_t is enough for sum_square_error (2^8 * 2^8 * 32
1163 // * 32 = 2^26). For high bitdepth we need to consider changing this to 64 bit
1164 uint32_t sum_square_error;
1165 int32_t sum_error;
1166 int log2_count;
1167 int variance;
1168} VPartVar;
1169
1170typedef struct {
1171 VPartVar none;
1172 VPartVar horz[2];
1173 VPartVar vert[2];
1174} VPVariance;
1175
1176typedef struct {
1177 VPVariance part_variances;
1178 VPartVar split[4];
1179} VP4x4;
1180
1181typedef struct {
1182 VPVariance part_variances;
1183 VP4x4 split[4];
1184} VP8x8;
1185
1186typedef struct {
1187 VPVariance part_variances;
1188 VP8x8 split[4];
1189} VP16x16;
1190
1191typedef struct {
1192 VPVariance part_variances;
1193 VP16x16 split[4];
1194} VP32x32;
1195
1196typedef struct {
1197 VPVariance part_variances;
1198 VP32x32 split[4];
1199} VP64x64;
1200
1201typedef struct {
1202 VPVariance part_variances;
1203 VP64x64 *split;
1204} VP128x128;
1205
1207
1211typedef struct {
1220 int64_t thresholds[5];
1221
1226 int64_t threshold_minmax;
1227} VarBasedPartitionInfo;
1228
1232typedef struct {
1233#if CONFIG_MULTITHREAD
1238 pthread_mutex_t *mutex_;
1239 pthread_cond_t *cond_;
1241#endif // CONFIG_MULTITHREAD
1247 int *num_finished_cols;
1253 int sync_range;
1257 int rows;
1261 int next_mi_row;
1265 int num_threads_working;
1266} AV1EncRowMultiThreadSync;
1267
1269
1270// TODO(jingning) All spatially adaptive variables should go to TileDataEnc.
1271typedef struct TileDataEnc {
1272 TileInfo tile_info;
1273 DECLARE_ALIGNED(16, FRAME_CONTEXT, tctx);
1274 FRAME_CONTEXT *row_ctx;
1275 uint8_t allow_update_cdf;
1276 InterModeRdModel inter_mode_rd_models[BLOCK_SIZES_ALL];
1277 AV1EncRowMultiThreadSync row_mt_sync;
1278 MV firstpass_top_mv;
1279} TileDataEnc;
1280
1281typedef struct RD_COUNTS {
1282 int64_t comp_pred_diff[REFERENCE_MODES];
1283 int compound_ref_used_flag;
1284 int skip_mode_used_flag;
1285 int tx_type_used[TX_SIZES_ALL][TX_TYPES];
1286 int obmc_used[BLOCK_SIZES_ALL][2];
1287 int warped_used[2];
1288} RD_COUNTS;
1289
1290typedef struct ThreadData {
1291 MACROBLOCK mb;
1292 RD_COUNTS rd_counts;
1293 FRAME_COUNTS *counts;
1294 PC_TREE_SHARED_BUFFERS shared_coeff_buf;
1295 SIMPLE_MOTION_DATA_TREE *sms_tree;
1296 SIMPLE_MOTION_DATA_TREE *sms_root;
1297 InterModesInfo *inter_modes_info;
1298 uint32_t *hash_value_buffer[2][2];
1299 OBMCBuffer obmc_buffer;
1300 PALETTE_BUFFER *palette_buffer;
1301 CompoundTypeRdBuffers comp_rd_buffer;
1302 CONV_BUF_TYPE *tmp_conv_dst;
1303 uint8_t *tmp_pred_bufs[2];
1304 int intrabc_used;
1305 int deltaq_used;
1306 FRAME_CONTEXT *tctx;
1307 VP64x64 *vt64x64;
1308 int32_t num_64x64_blocks;
1309 PICK_MODE_CONTEXT *firstpass_ctx;
1310 TemporalFilterData tf_data;
1311 TplTxfmStats tpl_txfm_stats;
1312} ThreadData;
1313
1314struct EncWorkerData;
1315
1317
1321typedef struct {
1325 int allocated_tile_rows;
1329 int allocated_tile_cols;
1336 int allocated_rows;
1343 int allocated_cols;
1344
1348 int thread_id_to_tile_id[MAX_NUM_THREADS];
1349
1350#if CONFIG_MULTITHREAD
1354 pthread_mutex_t *mutex_;
1355#endif
1356
1364 void (*sync_read_ptr)(AV1EncRowMultiThreadSync *const, int, int);
1368 void (*sync_write_ptr)(AV1EncRowMultiThreadSync *const, int, int, int);
1370} AV1EncRowMultiThreadInfo;
1371
1375typedef struct MultiThreadInfo {
1379 int num_workers;
1380
1384 int num_mod_workers[NUM_MT_MODULES];
1385
1390 int fp_mt_buf_init_done;
1391
1396 int enc_mt_buf_init_done;
1397
1401 AVxWorker *workers;
1402
1407 struct EncWorkerData *tile_thr_data;
1408
1413 bool row_mt_enabled;
1414
1418 AV1EncRowMultiThreadInfo enc_row_mt;
1419
1423 AV1TplRowMultiThreadInfo tpl_row_mt;
1424
1428 AV1LfSync lf_row_sync;
1429
1433 AV1LrSync lr_row_sync;
1434
1438 AV1GlobalMotionSync gm_sync;
1439
1443 AV1TemporalFilterSync tf_sync;
1444
1448 AV1CdefSync cdef_sync;
1449} MultiThreadInfo;
1450
1452
1453typedef struct ActiveMap {
1454 int enabled;
1455 int update;
1456 unsigned char *map;
1457} ActiveMap;
1458
1460
1464typedef struct {
1469 double cs_rate_array[32];
1473 int rate_index;
1477 int rate_size;
1478} ForceIntegerMVInfo;
1479
1481
1482#if CONFIG_INTERNAL_STATS
1483// types of stats
1484enum {
1485 STAT_Y,
1486 STAT_U,
1487 STAT_V,
1488 STAT_ALL,
1489 NUM_STAT_TYPES // This should always be the last member of the enum
1490} UENUM1BYTE(StatType);
1491
1492typedef struct IMAGE_STAT {
1493 double stat[NUM_STAT_TYPES];
1494 double worst;
1495} ImageStat;
1496#endif // CONFIG_INTERNAL_STATS
1497
1498typedef struct {
1499 int ref_count;
1500 YV12_BUFFER_CONFIG buf;
1501} EncRefCntBuffer;
1502
1504
1510typedef struct {
1515 MB_MODE_INFO_EXT_FRAME *frame_base;
1519 int alloc_size;
1523 int stride;
1524} MBMIExtFrameBufferInfo;
1525
1527
1528#if CONFIG_COLLECT_PARTITION_STATS
1529typedef struct FramePartitionTimingStats {
1530 int partition_decisions[6][EXT_PARTITION_TYPES];
1531 int partition_attempts[6][EXT_PARTITION_TYPES];
1532 int64_t partition_times[6][EXT_PARTITION_TYPES];
1533
1534 int partition_redo;
1535} FramePartitionTimingStats;
1536#endif // CONFIG_COLLECT_PARTITION_STATS
1537
1538#if CONFIG_COLLECT_COMPONENT_TIMING
1539#include "aom_ports/aom_timer.h"
1540// Adjust the following to add new components.
1541enum {
1542 av1_encode_strategy_time,
1543 av1_get_second_pass_params_time,
1544 denoise_and_encode_time,
1545 apply_filtering_time,
1546 av1_tpl_setup_stats_time,
1547 encode_frame_to_data_rate_time,
1548 encode_with_recode_loop_time,
1549 loop_filter_time,
1550 cdef_time,
1551 loop_restoration_time,
1552 av1_pack_bitstream_final_time,
1553 av1_encode_frame_time,
1554 av1_compute_global_motion_time,
1555 av1_setup_motion_field_time,
1556 encode_sb_row_time,
1557
1558 rd_pick_partition_time,
1559 av1_prune_partitions_time,
1560 none_partition_search_time,
1561 split_partition_search_time,
1562 rectangular_partition_search_time,
1563 ab_partitions_search_time,
1564 rd_pick_4partition_time,
1565 encode_sb_time,
1566
1567 rd_pick_sb_modes_time,
1568 av1_rd_pick_intra_mode_sb_time,
1569 av1_rd_pick_inter_mode_sb_time,
1570 handle_inter_mode_time,
1571 evaluate_motion_mode_for_winner_candidates_time,
1572 handle_intra_mode_time,
1573 do_tx_search_time,
1574 av1_search_palette_mode_time,
1575 handle_newmv_time,
1576 compound_type_rd_time,
1577 interpolation_filter_search_time,
1578 motion_mode_rd_time,
1579 kTimingComponents,
1580} UENUM1BYTE(TIMING_COMPONENT);
1581
1582static INLINE char const *get_component_name(int index) {
1583 switch (index) {
1584 case av1_encode_strategy_time: return "av1_encode_strategy_time";
1585 case av1_get_second_pass_params_time:
1586 return "av1_get_second_pass_params_time";
1587 case denoise_and_encode_time: return "denoise_and_encode_time";
1588 case apply_filtering_time: return "apply_filtering_time";
1589 case av1_tpl_setup_stats_time: return "av1_tpl_setup_stats_time";
1590 case encode_frame_to_data_rate_time:
1591 return "encode_frame_to_data_rate_time";
1592 case encode_with_recode_loop_time: return "encode_with_recode_loop_time";
1593 case loop_filter_time: return "loop_filter_time";
1594 case cdef_time: return "cdef_time";
1595 case loop_restoration_time: return "loop_restoration_time";
1596 case av1_pack_bitstream_final_time: return "av1_pack_bitstream_final_time";
1597 case av1_encode_frame_time: return "av1_encode_frame_time";
1598 case av1_compute_global_motion_time:
1599 return "av1_compute_global_motion_time";
1600 case av1_setup_motion_field_time: return "av1_setup_motion_field_time";
1601 case encode_sb_row_time: return "encode_sb_row_time";
1602
1603 case rd_pick_partition_time: return "rd_pick_partition_time";
1604 case av1_prune_partitions_time: return "av1_prune_partitions_time";
1605 case none_partition_search_time: return "none_partition_search_time";
1606 case split_partition_search_time: return "split_partition_search_time";
1607 case rectangular_partition_search_time:
1608 return "rectangular_partition_search_time";
1609 case ab_partitions_search_time: return "ab_partitions_search_time";
1610 case rd_pick_4partition_time: return "rd_pick_4partition_time";
1611 case encode_sb_time: return "encode_sb_time";
1612
1613 case rd_pick_sb_modes_time: return "rd_pick_sb_modes_time";
1614 case av1_rd_pick_intra_mode_sb_time:
1615 return "av1_rd_pick_intra_mode_sb_time";
1616 case av1_rd_pick_inter_mode_sb_time:
1617 return "av1_rd_pick_inter_mode_sb_time";
1618 case handle_inter_mode_time: return "handle_inter_mode_time";
1619 case evaluate_motion_mode_for_winner_candidates_time:
1620 return "evaluate_motion_mode_for_winner_candidates_time";
1621 case handle_intra_mode_time: return "handle_intra_mode_time";
1622 case do_tx_search_time: return "do_tx_search_time";
1623 case av1_search_palette_mode_time: return "av1_search_palette_mode_time";
1624 case handle_newmv_time: return "handle_newmv_time";
1625 case compound_type_rd_time: return "compound_type_rd_time";
1626 case interpolation_filter_search_time:
1627 return "interpolation_filter_search_time";
1628 case motion_mode_rd_time: return "motion_mode_rd_time";
1629 default: assert(0);
1630 }
1631 return "error";
1632}
1633#endif
1634
1635// The maximum number of internal ARFs except ALTREF_FRAME
1636#define MAX_INTERNAL_ARFS (REF_FRAMES - BWDREF_FRAME - 1)
1637
1639
1643typedef struct {
1647 bool search_done;
1648
1654 YV12_BUFFER_CONFIG *ref_buf[REF_FRAMES];
1655
1659 unsigned char *src_buffer;
1660
1666 int num_ref_frames[MAX_DIRECTIONS];
1667
1674 FrameDistPair reference_frames[MAX_DIRECTIONS][REF_FRAMES - 1];
1675
1680 int segment_map_w;
1681 int segment_map_h;
1683
1687 int num_src_corners;
1688
1694 int src_corners[2 * MAX_CORNERS];
1695} GlobalMotionInfo;
1696
1706typedef struct {
1707 int width;
1708 int height;
1709} InitialDimensions;
1710
1714typedef struct {
1719 int default_interp_skip_flags;
1723 uint16_t interp_filter_search_mask;
1724} InterpSearchFlags;
1725
1729typedef struct {
1735 int max_mv_magnitude;
1740 int mv_step_param;
1749 fractional_mv_step_fp *find_fractional_mv_step;
1756 search_site_config search_site_cfg[SS_CFG_TOTAL][NUM_DISTINCT_SEARCH_METHODS];
1757} MotionVectorSearchParams;
1758
1767typedef struct {
1768 bool golden_frame;
1769 bool bwd_ref_frame;
1770 bool alt_ref_frame;
1771} RefreshFrameFlagsInfo;
1772
1780typedef struct {
1781 int width;
1782 int height;
1783} ResizePendingParams;
1784
1788typedef struct {
1792 int ref_relative_dist[INTER_REFS_PER_FRAME];
1796 int8_t nearest_past_ref;
1800 int8_t nearest_future_ref;
1801} RefFrameDistanceInfo;
1802
1818typedef struct {
1826 unsigned int coeff_opt_thresholds[MODE_EVAL_TYPES][2];
1827
1832 TX_SIZE_SEARCH_METHOD tx_size_search_methods[MODE_EVAL_TYPES];
1833
1840 unsigned int use_transform_domain_distortion[MODE_EVAL_TYPES];
1841
1847 unsigned int tx_domain_dist_threshold[MODE_EVAL_TYPES];
1848
1854 unsigned int skip_txfm_level[MODE_EVAL_TYPES];
1855
1861 unsigned int predict_dc_level[MODE_EVAL_TYPES];
1862} WinnerModeParams;
1863
1871typedef struct {
1872 bool last_frame;
1873 bool golden_frame;
1874 bool bwd_ref_frame;
1875 bool alt2_ref_frame;
1876 bool alt_ref_frame;
1880 bool update_pending;
1881} ExtRefreshFrameFlagsInfo;
1882
1886typedef struct {
1890 int ref_frame_flags;
1891
1895 ExtRefreshFrameFlagsInfo refresh_frame;
1896
1900 bool refresh_frame_context;
1901
1906 bool refresh_frame_context_pending;
1907
1911 bool use_ref_frame_mvs;
1912
1916 bool use_error_resilient;
1917
1921 bool use_s_frame;
1922
1927 bool use_primary_ref_none;
1928} ExternalFlags;
1929
1931
1932typedef struct {
1933 int arf_stack[FRAME_BUFFERS];
1934 int arf_stack_size;
1935 int lst_stack[FRAME_BUFFERS];
1936 int lst_stack_size;
1937 int gld_stack[FRAME_BUFFERS];
1938 int gld_stack_size;
1939} RefBufferStack;
1940
1941typedef struct {
1942 // Some misc info
1943 int high_prec;
1944 int q;
1945 int order;
1946
1947 // MV counters
1948 int inter_count;
1949 int intra_count;
1950 int default_mvs;
1951 int mv_joint_count[4];
1952 int last_bit_zero;
1953 int last_bit_nonzero;
1954
1955 // Keep track of the rates
1956 int total_mv_rate;
1957 int hp_total_mv_rate;
1958 int lp_total_mv_rate;
1959
1960 // Texture info
1961 int horz_text;
1962 int vert_text;
1963 int diag_text;
1964
1965 // Whether the current struct contains valid data
1966 int valid;
1967} MV_STATS;
1968
1969typedef struct {
1970 struct loopfilter lf;
1971 CdefInfo cdef_info;
1972 YV12_BUFFER_CONFIG copy_buffer;
1973 RATE_CONTROL rc;
1974 MV_STATS mv_stats;
1975} CODING_CONTEXT;
1976
1977typedef struct {
1978 int frame_width;
1979 int frame_height;
1980 int mi_rows;
1981 int mi_cols;
1982 int mb_rows;
1983 int mb_cols;
1984 int num_mbs;
1985 aom_bit_depth_t bit_depth;
1986 int subsampling_x;
1987 int subsampling_y;
1988} FRAME_INFO;
1989
1993typedef struct {
1994 int show_frame_count;
1995} FRAME_INDEX_SET;
1996
1998
2002typedef struct {
2008 uint8_t *map;
2014 bool has_lossless_segment;
2015} EncSegmentationInfo;
2016
2020typedef struct {
2024 int64_t prev_ts_start;
2028 int64_t prev_ts_end;
2032 int64_t first_ts_start;
2033} TimeStamps;
2034
2039typedef struct {
2043 tran_low_t *tcoeff;
2047 uint16_t *eobs;
2051 uint8_t *entropy_ctx;
2052} CoeffBufferPool;
2053
2057typedef struct AV1_PRIMARY {
2061 struct AV1_COMP *cpi;
2062
2066 struct AV1_COMP *cpi_lap;
2067
2071 struct lookahead_ctx *lookahead;
2072
2078 int seq_params_locked;
2079
2084 struct aom_codec_pkt_list *output_pkt_list;
2085
2089 int internal_altref_allowed;
2090} AV1_PRIMARY;
2091
2095typedef struct AV1_COMP {
2099 AV1_PRIMARY *ppi;
2100
2105 EncQuantDequantParams enc_quant_dequant_params;
2106
2110 ThreadData td;
2111
2115 FRAME_COUNTS counts;
2116
2120 MBMIExtFrameBufferInfo mbmi_ext_info;
2121
2127 CB_COEFF_BUFFER *coeff_buffer_base;
2128
2133 CoeffBufferPool coeff_buffer_pool;
2134
2138 AV1_COMMON common;
2139
2143 AV1EncoderConfig oxcf;
2144
2148 int no_show_fwd_kf;
2149
2154 TRELLIS_OPT_TYPE optimize_seg_arr[MAX_SEGMENTS];
2155
2161 YV12_BUFFER_CONFIG *source;
2162
2170 YV12_BUFFER_CONFIG *last_source;
2171
2176 YV12_BUFFER_CONFIG *unscaled_source;
2177
2181 YV12_BUFFER_CONFIG scaled_source;
2182
2186 YV12_BUFFER_CONFIG *unscaled_last_source;
2187
2191 YV12_BUFFER_CONFIG scaled_last_source;
2192
2197 YV12_BUFFER_CONFIG *unfiltered_source;
2198
2202 TplParams tpl_data;
2203
2207 TemporalFilterCtx tf_ctx;
2208
2212 int partition_search_skippable_frame;
2213
2217 ForceIntegerMVInfo force_intpel_info;
2218
2223 RefCntBuffer *scaled_ref_buf[INTER_REFS_PER_FRAME];
2224
2228 RefCntBuffer *last_show_frame_buf;
2229
2233 RefreshFrameFlagsInfo refresh_frame;
2234
2241 int fb_of_context_type[REF_FRAMES];
2242
2246 ExternalFlags ext_flags;
2247
2252 YV12_BUFFER_CONFIG last_frame_uf;
2253
2258 YV12_BUFFER_CONFIG trial_frame_rst;
2259
2263 int64_t ambient_err;
2264
2268 RD_OPT rd;
2269
2274 CODING_CONTEXT coding_context;
2275
2279 GlobalMotionInfo gm_info;
2280
2284 WinnerModeParams winner_mode_params;
2285
2289 TimeStamps time_stamps;
2290
2294 RATE_CONTROL rc;
2295
2299 double framerate;
2300
2304 int ref_frame_flags;
2305
2309 int speed;
2310
2314 SPEED_FEATURES sf;
2315
2319 MotionVectorSearchParams mv_search_params;
2320
2325 int all_one_sided_refs;
2326
2330 EncSegmentationInfo enc_seg;
2331
2335 CYCLIC_REFRESH *cyclic_refresh;
2340 ActiveMap active_map;
2341
2347 aom_variance_fn_ptr_t fn_ptr[BLOCK_SIZES_ALL];
2348
2352 TWO_PASS twopass;
2353
2357 GF_GROUP gf_group;
2358
2362 unsigned char gf_frame_index;
2363
2367 GF_STATE gf_state;
2368
2372 RefBufferStack ref_buffer_stack;
2373
2378 YV12_BUFFER_CONFIG alt_ref_buffer;
2379
2383 int show_existing_alt_ref;
2384
2385#if CONFIG_INTERNAL_STATS
2387 uint64_t time_receive_data;
2388 uint64_t time_compress_data;
2389
2390 unsigned int mode_chosen_counts[MAX_MODES];
2391
2392 int count[2];
2393 uint64_t total_sq_error[2];
2394 uint64_t total_samples[2];
2395 ImageStat psnr[2];
2396
2397 double total_blockiness;
2398 double worst_blockiness;
2399
2400 int bytes;
2401 double summed_quality;
2402 double summed_weights;
2403 double summed_quality_hbd;
2404 double summed_weights_hbd;
2405 unsigned int tot_recode_hits;
2406 double worst_ssim;
2407 double worst_ssim_hbd;
2408
2409 ImageStat fastssim;
2410 ImageStat psnrhvs;
2411
2412 int b_calculate_blockiness;
2413 int b_calculate_consistency;
2414
2415 double total_inconsistency;
2416 double worst_consistency;
2417 Ssimv *ssim_vars;
2418 Metrics metrics;
2420#endif
2421
2425 int b_calculate_psnr;
2426
2427#if CONFIG_SPEED_STATS
2431 unsigned int tx_search_count;
2432#endif // CONFIG_SPEED_STATS
2433
2438 int droppable;
2439
2443 FRAME_INFO frame_info;
2444
2448 FRAME_INDEX_SET frame_index_set;
2449
2453 InitialDimensions initial_dimensions;
2454
2461 int initial_mbs;
2462
2466 ResizePendingParams resize_pending_params;
2467
2472 TileDataEnc *tile_data;
2476 int allocated_tiles;
2477
2481 TokenInfo token_info;
2482
2486 int vaq_refresh;
2487
2491 VarBasedPartitionInfo vbp_info;
2492
2496 FrameProbInfo frame_probs;
2497
2501 MultiThreadInfo mt_info;
2502
2508 int existing_fb_idx_to_show;
2509
2513 int intrabc_used;
2514
2518 int prune_ref_frame_mask;
2519
2523 AV1LrStruct lr_ctxt;
2524
2528 aom_film_grain_table_t *film_grain_table;
2529
2530#if CONFIG_DENOISE
2535 struct aom_denoise_and_model_t *denoise_and_model;
2536#endif
2537
2541 InterpSearchFlags interp_search_flags;
2542
2550 int use_screen_content_tools;
2551
2558 int is_screen_content_type;
2559
2560#if CONFIG_COLLECT_PARTITION_STATS
2564 FramePartitionTimingStats partition_stats;
2565#endif // CONFIG_COLLECT_PARTITION_STATS
2566
2567#if CONFIG_COLLECT_COMPONENT_TIMING
2571 uint64_t component_time[kTimingComponents];
2572 struct aom_usec_timer component_timer[kTimingComponents];
2576 uint64_t frame_component_time[kTimingComponents];
2577#endif
2578
2582 AV1LevelParams level_params;
2583
2587 int deltaq_used;
2588
2592 RefFrameDistanceInfo ref_frame_dist_info;
2593
2602 double *tpl_rdmult_scaling_factors;
2607 double *tpl_sb_rdmult_scaling_factors;
2613 double *ssim_rdmult_scaling_factors;
2614
2615#if CONFIG_TUNE_VMAF
2619 TuneVMAFInfo vmaf_info;
2620#endif
2621
2622#if CONFIG_TUNE_BUTTERAUGLI
2626 TuneButteraugliInfo butteraugli_info;
2627#endif
2628
2632 int use_svc;
2636 SVC svc;
2637
2641 int lap_enabled;
2645 COMPRESSOR_STAGE compressor_stage;
2646
2651 MV_STATS mv_stats;
2652
2657 FRAME_TYPE last_frame_type;
2658
2662 int num_tg;
2663
2669 aom_superres_mode superres_mode;
2670
2674 FirstPassData firstpass_data;
2675
2679 NOISE_ESTIMATE noise_estimate;
2680
2681#if CONFIG_AV1_TEMPORAL_DENOISING
2685 AV1_DENOISER denoiser;
2686#endif
2687
2692 uint8_t *consec_zero_mv;
2693
2697 int frames_left;
2698
2702 BLOCK_SIZE fp_block_size;
2703
2708 int sb_counter;
2709} AV1_COMP;
2710
2714typedef struct EncodeFrameInput {
2716 YV12_BUFFER_CONFIG *source;
2717 YV12_BUFFER_CONFIG *last_source;
2718 int64_t ts_duration;
2720} EncodeFrameInput;
2721
2726typedef struct EncodeFrameParams {
2730 int error_resilient_mode;
2734 FRAME_TYPE frame_type;
2735
2737 int primary_ref_frame;
2738 int order_offset;
2739
2744 int show_frame;
2745
2747 int refresh_frame_flags;
2748
2749 int show_existing_frame;
2750 int existing_fb_idx_to_show;
2751
2756 int ref_frame_flags;
2757
2761 int remapped_ref_idx[REF_FRAMES];
2762
2767 RefreshFrameFlagsInfo refresh_frame;
2768
2772 int speed;
2773} EncodeFrameParams;
2774
2776
2777// EncodeFrameResults contains information about the result of encoding a
2778// single frame
2779typedef struct {
2780 size_t size; // Size of resulting bitstream
2781} EncodeFrameResults;
2782
2783// Must not be called more than once.
2784void av1_initialize_enc(void);
2785
2786struct AV1_COMP *av1_create_compressor(AV1_PRIMARY *ppi, AV1EncoderConfig *oxcf,
2787 BufferPool *const pool,
2788 FIRSTPASS_STATS *frame_stats_buf,
2789 COMPRESSOR_STAGE stage,
2790 int num_lap_buffers,
2791 int lap_lag_in_frames,
2792 STATS_BUFFER_CTX *stats_buf_context);
2793
2794struct AV1_PRIMARY *av1_create_primary_compressor(
2795 struct aom_codec_pkt_list *pkt_list_head);
2796
2797void av1_remove_compressor(AV1_COMP *cpi);
2798
2799void av1_remove_primary_compressor(AV1_PRIMARY *ppi);
2800
2801void av1_change_config(AV1_COMP *cpi, const AV1EncoderConfig *oxcf);
2802
2803void av1_check_initial_width(AV1_COMP *cpi, int use_highbitdepth,
2804 int subsampling_x, int subsampling_y);
2805
2806void av1_init_seq_coding_tools(SequenceHeader *seq, AV1_COMMON *cm,
2807 const AV1EncoderConfig *oxcf, int use_svc);
2808
2810
2827int av1_receive_raw_frame(AV1_COMP *cpi, aom_enc_frame_flags_t frame_flags,
2828 YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
2829 int64_t end_time_stamp);
2830
2855int av1_get_compressed_data(AV1_COMP *cpi, unsigned int *frame_flags,
2856 size_t *size, uint8_t *dest, int64_t *time_stamp,
2857 int64_t *time_end, int flush,
2858 const aom_rational64_t *timebase);
2859
2866int av1_encode(AV1_COMP *const cpi, uint8_t *const dest,
2867 const EncodeFrameInput *const frame_input,
2868 const EncodeFrameParams *const frame_params,
2869 EncodeFrameResults *const frame_results);
2870
2872int av1_get_preview_raw_frame(AV1_COMP *cpi, YV12_BUFFER_CONFIG *dest);
2873
2874int av1_get_last_show_frame(AV1_COMP *cpi, YV12_BUFFER_CONFIG *frame);
2875
2876aom_codec_err_t av1_copy_new_frame_enc(AV1_COMMON *cm,
2877 YV12_BUFFER_CONFIG *new_frame,
2878 YV12_BUFFER_CONFIG *sd);
2879
2880int av1_use_as_reference(int *ext_ref_frame_flags, int ref_frame_flags);
2881
2882int av1_copy_reference_enc(AV1_COMP *cpi, int idx, YV12_BUFFER_CONFIG *sd);
2883
2884int av1_set_reference_enc(AV1_COMP *cpi, int idx, YV12_BUFFER_CONFIG *sd);
2885
2886int av1_set_size_literal(AV1_COMP *cpi, int width, int height);
2887
2888void av1_set_frame_size(AV1_COMP *cpi, int width, int height);
2889
2890int av1_set_active_map(AV1_COMP *cpi, unsigned char *map, int rows, int cols);
2891
2892int av1_get_active_map(AV1_COMP *cpi, unsigned char *map, int rows, int cols);
2893
2894int av1_set_internal_size(AV1EncoderConfig *const oxcf,
2895 ResizePendingParams *resize_pending_params,
2896 AOM_SCALING horiz_mode, AOM_SCALING vert_mode);
2897
2898int av1_get_quantizer(struct AV1_COMP *cpi);
2899
2900int av1_convert_sect5obus_to_annexb(uint8_t *buffer, size_t *input_size);
2901
2902// Set screen content options.
2903// This function estimates whether to use screen content tools, by counting
2904// the portion of blocks that have few luma colors.
2905// Modifies:
2906// cpi->commom.features.allow_screen_content_tools
2907// cpi->common.features.allow_intrabc
2908// cpi->use_screen_content_tools
2909// cpi->is_screen_content_type
2910// However, the estimation is not accurate and may misclassify videos.
2911// A slower but more accurate approach that determines whether to use screen
2912// content tools is employed later. See av1_determine_sc_tools_with_encoding().
2913void av1_set_screen_content_options(struct AV1_COMP *cpi,
2914 FeatureFlags *features);
2915
2916void av1_update_frame_size(AV1_COMP *cpi);
2917
2918// TODO(jingning): Move these functions as primitive members for the new cpi
2919// class.
2920static INLINE void stack_push(int *stack, int *stack_size, int item) {
2921 for (int i = *stack_size - 1; i >= 0; --i) stack[i + 1] = stack[i];
2922 stack[0] = item;
2923 ++*stack_size;
2924}
2925
2926static INLINE int stack_pop(int *stack, int *stack_size) {
2927 if (*stack_size <= 0) return -1;
2928
2929 int item = stack[0];
2930 for (int i = 0; i < *stack_size; ++i) stack[i] = stack[i + 1];
2931 --*stack_size;
2932
2933 return item;
2934}
2935
2936static INLINE int stack_pop_end(int *stack, int *stack_size) {
2937 int item = stack[*stack_size - 1];
2938 stack[*stack_size - 1] = -1;
2939 --*stack_size;
2940
2941 return item;
2942}
2943
2944static INLINE void stack_reset(int *stack, int *stack_size) {
2945 for (int i = 0; i < *stack_size; ++i) stack[i] = INVALID_IDX;
2946 *stack_size = 0;
2947}
2948
2949// av1 uses 10,000,000 ticks/second as time stamp
2950#define TICKS_PER_SEC 10000000LL
2951
2952static INLINE int64_t
2953timebase_units_to_ticks(const aom_rational64_t *timestamp_ratio, int64_t n) {
2954 return n * timestamp_ratio->num / timestamp_ratio->den;
2955}
2956
2957static INLINE int64_t
2958ticks_to_timebase_units(const aom_rational64_t *timestamp_ratio, int64_t n) {
2959 int64_t round = timestamp_ratio->num / 2;
2960 if (round > 0) --round;
2961 return (n * timestamp_ratio->den + round) / timestamp_ratio->num;
2962}
2963
2964static INLINE int frame_is_kf_gf_arf(const AV1_COMP *cpi) {
2965 const GF_GROUP *const gf_group = &cpi->gf_group;
2966 const FRAME_UPDATE_TYPE update_type =
2967 gf_group->update_type[cpi->gf_frame_index];
2968
2969 return frame_is_intra_only(&cpi->common) || update_type == ARF_UPDATE ||
2970 update_type == GF_UPDATE;
2971}
2972
2973// TODO(huisu@google.com, youzhou@microsoft.com): enable hash-me for HBD.
2974static INLINE int av1_use_hash_me(const AV1_COMP *const cpi) {
2975 return (cpi->common.features.allow_screen_content_tools &&
2976 cpi->common.features.allow_intrabc &&
2977 frame_is_intra_only(&cpi->common));
2978}
2979
2980static INLINE const YV12_BUFFER_CONFIG *get_ref_frame_yv12_buf(
2981 const AV1_COMMON *const cm, MV_REFERENCE_FRAME ref_frame) {
2982 const RefCntBuffer *const buf = get_ref_frame_buf(cm, ref_frame);
2983 return buf != NULL ? &buf->buf : NULL;
2984}
2985
2986static INLINE void alloc_frame_mvs(AV1_COMMON *const cm, RefCntBuffer *buf) {
2987 assert(buf != NULL);
2988 ensure_mv_buffer(buf, cm);
2989 buf->width = cm->width;
2990 buf->height = cm->height;
2991}
2992
2993// Get the allocated token size for a tile. It does the same calculation as in
2994// the frame token allocation.
2995static INLINE unsigned int allocated_tokens(TileInfo tile, int sb_size_log2,
2996 int num_planes) {
2997 int tile_mb_rows = (tile.mi_row_end - tile.mi_row_start + 2) >> 2;
2998 int tile_mb_cols = (tile.mi_col_end - tile.mi_col_start + 2) >> 2;
2999
3000 return get_token_alloc(tile_mb_rows, tile_mb_cols, sb_size_log2, num_planes);
3001}
3002
3003static INLINE void get_start_tok(AV1_COMP *cpi, int tile_row, int tile_col,
3004 int mi_row, TokenExtra **tok, int sb_size_log2,
3005 int num_planes) {
3006 AV1_COMMON *const cm = &cpi->common;
3007 const int tile_cols = cm->tiles.cols;
3008 TileDataEnc *this_tile = &cpi->tile_data[tile_row * tile_cols + tile_col];
3009 const TileInfo *const tile_info = &this_tile->tile_info;
3010
3011 const int tile_mb_cols =
3012 (tile_info->mi_col_end - tile_info->mi_col_start + 2) >> 2;
3013 const int tile_mb_row = (mi_row - tile_info->mi_row_start + 2) >> 2;
3014
3015 *tok = cpi->token_info.tile_tok[tile_row][tile_col] +
3016 get_token_alloc(tile_mb_row, tile_mb_cols, sb_size_log2, num_planes);
3017}
3018
3019void av1_apply_encoding_flags(AV1_COMP *cpi, aom_enc_frame_flags_t flags);
3020
3021#define ALT_MIN_LAG 3
3022static INLINE int is_altref_enabled(int lag_in_frames, bool enable_auto_arf) {
3023 return lag_in_frames >= ALT_MIN_LAG && enable_auto_arf;
3024}
3025
3026// Check if statistics generation stage
3027static INLINE int is_stat_generation_stage(const AV1_COMP *const cpi) {
3028 assert(IMPLIES(cpi->compressor_stage == LAP_STAGE,
3029 cpi->oxcf.pass == 0 && cpi->lap_enabled));
3030 return (cpi->oxcf.pass == 1 || (cpi->compressor_stage == LAP_STAGE));
3031}
3032// Check if statistics consumption stage
3033static INLINE int is_stat_consumption_stage_twopass(const AV1_COMP *const cpi) {
3034 return (cpi->oxcf.pass == 2);
3035}
3036
3037// Check if statistics consumption stage
3038static INLINE int is_stat_consumption_stage(const AV1_COMP *const cpi) {
3039 return (is_stat_consumption_stage_twopass(cpi) ||
3040 (cpi->oxcf.pass == 0 && (cpi->compressor_stage == ENCODE_STAGE) &&
3041 cpi->lap_enabled));
3042}
3043
3053static INLINE int has_no_stats_stage(const AV1_COMP *const cpi) {
3054 assert(IMPLIES(!cpi->lap_enabled, cpi->compressor_stage == ENCODE_STAGE));
3055 return (cpi->oxcf.pass == 0 && !cpi->lap_enabled);
3056}
3058
3059// Function return size of frame stats buffer
3060static INLINE int get_stats_buf_size(int num_lap_buffer, int num_lag_buffer) {
3061 /* if lookahead is enabled return num_lap_buffers else num_lag_buffers */
3062 return (num_lap_buffer > 0 ? num_lap_buffer + 1 : num_lag_buffer);
3063}
3064
3065// TODO(zoeliu): To set up cpi->oxcf.gf_cfg.enable_auto_brf
3066
3067static INLINE void set_ref_ptrs(const AV1_COMMON *cm, MACROBLOCKD *xd,
3068 MV_REFERENCE_FRAME ref0,
3069 MV_REFERENCE_FRAME ref1) {
3071 get_ref_scale_factors_const(cm, ref0 >= LAST_FRAME ? ref0 : 1);
3073 get_ref_scale_factors_const(cm, ref1 >= LAST_FRAME ? ref1 : 1);
3074}
3075
3076static INLINE int get_chessboard_index(int frame_index) {
3077 return frame_index & 0x1;
3078}
3079
3080static INLINE const int *cond_cost_list_const(const struct AV1_COMP *cpi,
3081 const int *cost_list) {
3082 const int use_cost_list = cpi->sf.mv_sf.subpel_search_method != SUBPEL_TREE &&
3083 cpi->sf.mv_sf.use_fullpel_costlist;
3084 return use_cost_list ? cost_list : NULL;
3085}
3086
3087static INLINE int *cond_cost_list(const struct AV1_COMP *cpi, int *cost_list) {
3088 const int use_cost_list = cpi->sf.mv_sf.subpel_search_method != SUBPEL_TREE &&
3089 cpi->sf.mv_sf.use_fullpel_costlist;
3090 return use_cost_list ? cost_list : NULL;
3091}
3092
3093// Compression ratio of current frame.
3094double av1_get_compression_ratio(const AV1_COMMON *const cm,
3095 size_t encoded_frame_size);
3096
3097void av1_new_framerate(AV1_COMP *cpi, double framerate);
3098
3099void av1_setup_frame_size(AV1_COMP *cpi);
3100
3101#define LAYER_IDS_TO_IDX(sl, tl, num_tl) ((sl) * (num_tl) + (tl))
3102
3103// Returns 1 if a frame is scaled and 0 otherwise.
3104static INLINE int av1_resize_scaled(const AV1_COMMON *cm) {
3105 return !(cm->superres_upscaled_width == cm->render_width &&
3107}
3108
3109static INLINE int av1_frame_scaled(const AV1_COMMON *cm) {
3110 return !av1_superres_scaled(cm) && av1_resize_scaled(cm);
3111}
3112
3113// Don't allow a show_existing_frame to coincide with an error resilient
3114// frame. An exception can be made for a forward keyframe since it has no
3115// previous dependencies.
3116static INLINE int encode_show_existing_frame(const AV1_COMMON *cm) {
3118 cm->current_frame.frame_type == KEY_FRAME);
3119}
3120
3121// Get index into the 'cpi->mbmi_ext_info.frame_base' array for the given
3122// 'mi_row' and 'mi_col'.
3123static INLINE int get_mi_ext_idx(const int mi_row, const int mi_col,
3124 const BLOCK_SIZE mi_alloc_bsize,
3125 const int mbmi_ext_stride) {
3126 const int mi_ext_size_1d = mi_size_wide[mi_alloc_bsize];
3127 const int mi_ext_row = mi_row / mi_ext_size_1d;
3128 const int mi_ext_col = mi_col / mi_ext_size_1d;
3129 return mi_ext_row * mbmi_ext_stride + mi_ext_col;
3130}
3131
3132// Lighter version of set_offsets that only sets the mode info
3133// pointers.
3134static INLINE void set_mode_info_offsets(
3135 const CommonModeInfoParams *const mi_params,
3136 const MBMIExtFrameBufferInfo *const mbmi_ext_info, MACROBLOCK *const x,
3137 MACROBLOCKD *const xd, int mi_row, int mi_col) {
3138 set_mi_offsets(mi_params, xd, mi_row, mi_col);
3139 const int ext_idx = get_mi_ext_idx(mi_row, mi_col, mi_params->mi_alloc_bsize,
3140 mbmi_ext_info->stride);
3141 x->mbmi_ext_frame = mbmi_ext_info->frame_base + ext_idx;
3142}
3143
3144// Check to see if the given partition size is allowed for a specified number
3145// of mi block rows and columns remaining in the image.
3146// If not then return the largest allowed partition size
3147static INLINE BLOCK_SIZE find_partition_size(BLOCK_SIZE bsize, int rows_left,
3148 int cols_left, int *bh, int *bw) {
3149 int int_size = (int)bsize;
3150 if (rows_left <= 0 || cols_left <= 0) {
3151 return AOMMIN(bsize, BLOCK_8X8);
3152 } else {
3153 for (; int_size > 0; int_size -= 3) {
3154 *bh = mi_size_high[int_size];
3155 *bw = mi_size_wide[int_size];
3156 if ((*bh <= rows_left) && (*bw <= cols_left)) {
3157 break;
3158 }
3159 }
3160 }
3161 return (BLOCK_SIZE)int_size;
3162}
3163
3164static const uint8_t av1_ref_frame_flag_list[REF_FRAMES] = { 0,
3165 AOM_LAST_FLAG,
3166 AOM_LAST2_FLAG,
3167 AOM_LAST3_FLAG,
3168 AOM_GOLD_FLAG,
3169 AOM_BWD_FLAG,
3170 AOM_ALT2_FLAG,
3171 AOM_ALT_FLAG };
3172
3173// When more than 'max_allowed_refs' are available, we reduce the number of
3174// reference frames one at a time based on this order.
3175static const MV_REFERENCE_FRAME disable_order[] = {
3176 LAST3_FRAME,
3177 LAST2_FRAME,
3178 ALTREF2_FRAME,
3179 GOLDEN_FRAME,
3180};
3181
3182static const MV_REFERENCE_FRAME
3183 ref_frame_priority_order[INTER_REFS_PER_FRAME] = {
3184 LAST_FRAME, ALTREF_FRAME, BWDREF_FRAME, GOLDEN_FRAME,
3185 ALTREF2_FRAME, LAST2_FRAME, LAST3_FRAME,
3186 };
3187
3188static INLINE int get_ref_frame_flags(const SPEED_FEATURES *const sf,
3189 const YV12_BUFFER_CONFIG **ref_frames,
3190 const int ext_ref_frame_flags) {
3191 // cpi->ext_flags.ref_frame_flags allows certain reference types to be
3192 // disabled by the external interface. These are set by
3193 // av1_apply_encoding_flags(). Start with what the external interface allows,
3194 // then suppress any reference types which we have found to be duplicates.
3195 int flags = ext_ref_frame_flags;
3196
3197 for (int i = 1; i < INTER_REFS_PER_FRAME; ++i) {
3198 const YV12_BUFFER_CONFIG *const this_ref = ref_frames[i];
3199 // If this_ref has appeared before, mark the corresponding ref frame as
3200 // invalid. For nonrd mode, only disable GOLDEN_FRAME if it's the same
3201 // as LAST_FRAME or ALTREF_FRAME (if ALTREF is being used in nonrd).
3202 int index = (sf->rt_sf.use_nonrd_pick_mode &&
3203 ref_frame_priority_order[i] == GOLDEN_FRAME)
3204 ? (1 + sf->rt_sf.use_nonrd_altref_frame)
3205 : i;
3206 for (int j = 0; j < index; ++j) {
3207 if (this_ref == ref_frames[j]) {
3208 flags &= ~(1 << (ref_frame_priority_order[i] - 1));
3209 break;
3210 }
3211 }
3212 }
3213 return flags;
3214}
3215
3216// Returns a Sequence Header OBU stored in an aom_fixed_buf_t, or NULL upon
3217// failure. When a non-NULL aom_fixed_buf_t pointer is returned by this
3218// function, the memory must be freed by the caller. Both the buf member of the
3219// aom_fixed_buf_t, and the aom_fixed_buf_t pointer itself must be freed. Memory
3220// returned must be freed via call to free().
3221//
3222// Note: The OBU returned is in Low Overhead Bitstream Format. Specifically,
3223// the obu_has_size_field bit is set, and the buffer contains the obu_size
3224// field.
3225aom_fixed_buf_t *av1_get_global_headers(AV1_COMP *cpi);
3226
3227#define MAX_GFUBOOST_FACTOR 10.0
3228#define MIN_GFUBOOST_FACTOR 4.0
3229
3230static INLINE int is_frame_tpl_eligible(const GF_GROUP *const gf_group,
3231 uint8_t index) {
3232 const FRAME_UPDATE_TYPE update_type = gf_group->update_type[index];
3233 return update_type == ARF_UPDATE || update_type == GF_UPDATE ||
3234 update_type == KF_UPDATE;
3235}
3236
3237static INLINE int is_frame_eligible_for_ref_pruning(const GF_GROUP *gf_group,
3238 int selective_ref_frame,
3239 int prune_ref_frames,
3240 int gf_index) {
3241 return (selective_ref_frame > 0) && (prune_ref_frames > 0) &&
3242 !is_frame_tpl_eligible(gf_group, gf_index);
3243}
3244
3245// Get update type of the current frame.
3246static INLINE FRAME_UPDATE_TYPE get_frame_update_type(const GF_GROUP *gf_group,
3247 int gf_frame_index) {
3248 return gf_group->update_type[gf_frame_index];
3249}
3250
3251static INLINE int av1_pixels_to_mi(int pixels) {
3252 return ALIGN_POWER_OF_TWO(pixels, 3) >> MI_SIZE_LOG2;
3253}
3254
3255static AOM_INLINE int is_psnr_calc_enabled(const AV1_COMP *cpi) {
3256 const AV1_COMMON *const cm = &cpi->common;
3257
3258 return cpi->b_calculate_psnr && !is_stat_generation_stage(cpi) &&
3259 cm->show_frame;
3260}
3261
3262#if CONFIG_AV1_TEMPORAL_DENOISING
3263static INLINE int denoise_svc(const struct AV1_COMP *const cpi) {
3264 return (!cpi->use_svc || (cpi->use_svc && cpi->svc.spatial_layer_id >=
3265 cpi->svc.first_layer_denoise));
3266}
3267#endif
3268
3269#if CONFIG_COLLECT_PARTITION_STATS == 2
3270static INLINE void av1_print_fr_partition_timing_stats(
3271 const FramePartitionTimingStats *part_stats, const char *filename) {
3272 FILE *f = fopen(filename, "w");
3273 if (!f) {
3274 return;
3275 }
3276
3277 fprintf(f, "bsize,redo,");
3278 for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
3279 fprintf(f, "decision_%d,", part);
3280 }
3281 for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
3282 fprintf(f, "attempt_%d,", part);
3283 }
3284 for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
3285 fprintf(f, "time_%d,", part);
3286 }
3287 fprintf(f, "\n");
3288
3289 static const int bsizes[6] = { 128, 64, 32, 16, 8, 4 };
3290
3291 for (int bsize_idx = 0; bsize_idx < 6; bsize_idx++) {
3292 fprintf(f, "%d,%d,", bsizes[bsize_idx], part_stats->partition_redo);
3293 for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
3294 fprintf(f, "%d,", part_stats->partition_decisions[bsize_idx][part]);
3295 }
3296 for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
3297 fprintf(f, "%d,", part_stats->partition_attempts[bsize_idx][part]);
3298 }
3299 for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
3300 fprintf(f, "%ld,", part_stats->partition_times[bsize_idx][part]);
3301 }
3302 fprintf(f, "\n");
3303 }
3304 fclose(f);
3305}
3306#endif // CONFIG_COLLECT_PARTITION_STATS == 2
3307
3308#if CONFIG_COLLECT_PARTITION_STATS
3309static INLINE int av1_get_bsize_idx_for_part_stats(BLOCK_SIZE bsize) {
3310 assert(bsize == BLOCK_128X128 || bsize == BLOCK_64X64 ||
3311 bsize == BLOCK_32X32 || bsize == BLOCK_16X16 || bsize == BLOCK_8X8 ||
3312 bsize == BLOCK_4X4);
3313 switch (bsize) {
3314 case BLOCK_128X128: return 0;
3315 case BLOCK_64X64: return 1;
3316 case BLOCK_32X32: return 2;
3317 case BLOCK_16X16: return 3;
3318 case BLOCK_8X8: return 4;
3319 case BLOCK_4X4: return 5;
3320 default: assert(0 && "Invalid bsize for partition_stats."); return -1;
3321 }
3322}
3323#endif // CONFIG_COLLECT_PARTITION_STATS
3324
3325#if CONFIG_COLLECT_COMPONENT_TIMING
3326static INLINE void start_timing(AV1_COMP *cpi, int component) {
3327 aom_usec_timer_start(&cpi->component_timer[component]);
3328}
3329static INLINE void end_timing(AV1_COMP *cpi, int component) {
3330 aom_usec_timer_mark(&cpi->component_timer[component]);
3331 cpi->frame_component_time[component] +=
3332 aom_usec_timer_elapsed(&cpi->component_timer[component]);
3333}
3334static INLINE char const *get_frame_type_enum(int type) {
3335 switch (type) {
3336 case 0: return "KEY_FRAME";
3337 case 1: return "INTER_FRAME";
3338 case 2: return "INTRA_ONLY_FRAME";
3339 case 3: return "S_FRAME";
3340 default: assert(0);
3341 }
3342 return "error";
3343}
3344#endif
3345
3347
3348#ifdef __cplusplus
3349} // extern "C"
3350#endif
3351
3352#endif // AOM_AV1_ENCODER_ENCODER_H_
#define FIXED_QP_OFFSET_COUNT
Number of fixed QP offsets.
Definition aom_encoder.h:876
enum aom_chroma_sample_position aom_chroma_sample_position_t
List of chroma sample positions.
enum aom_transfer_characteristics aom_transfer_characteristics_t
List of supported transfer functions.
enum aom_color_range aom_color_range_t
List of supported color range.
enum aom_color_primaries aom_color_primaries_t
List of supported color primaries.
enum aom_matrix_coefficients aom_matrix_coefficients_t
List of supported matrix coefficients.
Provides definitions for using AOM or AV1 encoder algorithm within the aom Codec Interface.
struct macroblock MACROBLOCK
Encoder's parameters related to the current coding block.
@ RESTORE_SWITCHABLE_TYPES
Definition enums.h:655
struct SVC SVC
The stucture of SVC.
aom_tune_content
Definition aomcx.h:1400
aom_tune_metric
Model tuning parameters.
Definition aomcx.h:1419
enum aom_bit_depth aom_bit_depth_t
Bit depth for codecThis enumeration determines the bit depth of the codec.
enum aom_superblock_size aom_superblock_size_t
Superblock size selection.
aom_codec_err_t
Algorithm return codes.
Definition aom_codec.h:155
aom_superres_mode
Frame super-resolution mode.
Definition aom_encoder.h:187
aom_rc_mode
Rate control mode.
Definition aom_encoder.h:165
aom_enc_pass
Multi-pass Encoding Pass.
Definition aom_encoder.h:158
struct aom_fixed_buf aom_fixed_buf_t
Generic fixed size buffer structure.
long aom_enc_frame_flags_t
Encoded Frame Flags.
Definition aom_encoder.h:357
Describes look ahead buffer operations.
struct SPEED_FEATURES SPEED_FEATURES
Top level speed vs quality trade off data struture.
int superres_upscaled_width
Definition av1_common_int.h:772
int superres_upscaled_height
Definition av1_common_int.h:773
int width
Definition av1_common_int.h:748
CurrentFrame current_frame
Definition av1_common_int.h:727
int show_existing_frame
Definition av1_common_int.h:877
FeatureFlags features
Definition av1_common_int.h:882
int show_frame
Definition av1_common_int.h:862
CommonTileParams tiles
Definition av1_common_int.h:969
int height
Definition av1_common_int.h:749
int render_width
Definition av1_common_int.h:759
int render_height
Definition av1_common_int.h:760
Parameters related to CDEF.
Definition av1_common_int.h:194
Params related to MB_MODE_INFO arrays and related info.
Definition av1_common_int.h:477
BLOCK_SIZE mi_alloc_bsize
Definition av1_common_int.h:526
int cols
Definition av1_common_int.h:404
The stucture of acummulated frame stats in the first pass.
Definition firstpass.h:36
Frame level features.
Definition av1_common_int.h:334
bool error_resilient_mode
Definition av1_common_int.h:376
Data related to the current GF/ARF group and the individual frames within the group.
Definition firstpass.h:171
Stores best extended mode information at frame level.
Definition block.h:216
Rate Control parameters and status.
Definition ratectrl.h:118
Top level speed vs quality trade off data struture.
Definition speed_features.h:1120
REAL_TIME_SPEED_FEATURES rt_sf
Definition speed_features.h:1184
MB_MODE_INFO_EXT_FRAME * mbmi_ext_frame
Finalized mbmi_ext for the whole frame.
Definition block.h:878
const struct scale_factors * block_ref_scale_factors[2]
Definition blockd.h:685