1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
3*77c1e3ccSAndroid Build Coastguard Worker *
4*77c1e3ccSAndroid Build Coastguard Worker * This source code is subject to the terms of the BSD 2 Clause License and
5*77c1e3ccSAndroid Build Coastguard Worker * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6*77c1e3ccSAndroid Build Coastguard Worker * was not distributed with this source code in the LICENSE file, you can
7*77c1e3ccSAndroid Build Coastguard Worker * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8*77c1e3ccSAndroid Build Coastguard Worker * Media Patent License 1.0 was not distributed with this source code in the
9*77c1e3ccSAndroid Build Coastguard Worker * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10*77c1e3ccSAndroid Build Coastguard Worker */
11*77c1e3ccSAndroid Build Coastguard Worker #include <limits.h>
12*77c1e3ccSAndroid Build Coastguard Worker #include <math.h>
13*77c1e3ccSAndroid Build Coastguard Worker #include <stdbool.h>
14*77c1e3ccSAndroid Build Coastguard Worker #include <stdint.h>
15*77c1e3ccSAndroid Build Coastguard Worker #include <stdlib.h>
16*77c1e3ccSAndroid Build Coastguard Worker #include <string.h>
17*77c1e3ccSAndroid Build Coastguard Worker
18*77c1e3ccSAndroid Build Coastguard Worker #include "config/aom_config.h"
19*77c1e3ccSAndroid Build Coastguard Worker #include "config/aom_version.h"
20*77c1e3ccSAndroid Build Coastguard Worker
21*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aomcx.h"
22*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aom_encoder.h"
23*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aom_external_partition.h"
24*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aom_image.h"
25*77c1e3ccSAndroid Build Coastguard Worker #include "aom/internal/aom_codec_internal.h"
26*77c1e3ccSAndroid Build Coastguard Worker #include "aom_dsp/flow_estimation/flow_estimation.h"
27*77c1e3ccSAndroid Build Coastguard Worker #include "aom_mem/aom_mem.h"
28*77c1e3ccSAndroid Build Coastguard Worker #include "aom_scale/yv12config.h"
29*77c1e3ccSAndroid Build Coastguard Worker #include "aom_util/aom_pthread.h"
30*77c1e3ccSAndroid Build Coastguard Worker
31*77c1e3ccSAndroid Build Coastguard Worker #include "av1/av1_cx_iface.h"
32*77c1e3ccSAndroid Build Coastguard Worker #include "av1/av1_iface_common.h"
33*77c1e3ccSAndroid Build Coastguard Worker #include "av1/common/av1_common_int.h"
34*77c1e3ccSAndroid Build Coastguard Worker #include "av1/common/enums.h"
35*77c1e3ccSAndroid Build Coastguard Worker #include "av1/common/scale.h"
36*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/bitstream.h"
37*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/enc_enums.h"
38*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/encoder.h"
39*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/encoder_alloc.h"
40*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/encoder_utils.h"
41*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/ethread.h"
42*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/external_partition.h"
43*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/firstpass.h"
44*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/lookahead.h"
45*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/rc_utils.h"
46*77c1e3ccSAndroid Build Coastguard Worker #include "av1/arg_defs.h"
47*77c1e3ccSAndroid Build Coastguard Worker
48*77c1e3ccSAndroid Build Coastguard Worker #include "common/args_helper.h"
49*77c1e3ccSAndroid Build Coastguard Worker
50*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg {
51*77c1e3ccSAndroid Build Coastguard Worker unsigned int usage; // Same as g_usage in aom_codec_enc_cfg_t
52*77c1e3ccSAndroid Build Coastguard Worker int cpu_used;
53*77c1e3ccSAndroid Build Coastguard Worker unsigned int enable_auto_alt_ref;
54*77c1e3ccSAndroid Build Coastguard Worker unsigned int enable_auto_bwd_ref;
55*77c1e3ccSAndroid Build Coastguard Worker unsigned int noise_sensitivity;
56*77c1e3ccSAndroid Build Coastguard Worker unsigned int sharpness;
57*77c1e3ccSAndroid Build Coastguard Worker unsigned int static_thresh;
58*77c1e3ccSAndroid Build Coastguard Worker unsigned int row_mt;
59*77c1e3ccSAndroid Build Coastguard Worker unsigned int fp_mt;
60*77c1e3ccSAndroid Build Coastguard Worker unsigned int tile_columns; // log2 number of tile columns
61*77c1e3ccSAndroid Build Coastguard Worker unsigned int tile_rows; // log2 number of tile rows
62*77c1e3ccSAndroid Build Coastguard Worker unsigned int auto_tiles;
63*77c1e3ccSAndroid Build Coastguard Worker unsigned int enable_tpl_model;
64*77c1e3ccSAndroid Build Coastguard Worker unsigned int enable_keyframe_filtering;
65*77c1e3ccSAndroid Build Coastguard Worker unsigned int arnr_max_frames;
66*77c1e3ccSAndroid Build Coastguard Worker unsigned int arnr_strength;
67*77c1e3ccSAndroid Build Coastguard Worker unsigned int min_gf_interval;
68*77c1e3ccSAndroid Build Coastguard Worker unsigned int max_gf_interval;
69*77c1e3ccSAndroid Build Coastguard Worker unsigned int gf_min_pyr_height;
70*77c1e3ccSAndroid Build Coastguard Worker unsigned int gf_max_pyr_height;
71*77c1e3ccSAndroid Build Coastguard Worker aom_tune_metric tuning;
72*77c1e3ccSAndroid Build Coastguard Worker const char *vmaf_model_path;
73*77c1e3ccSAndroid Build Coastguard Worker const char *partition_info_path;
74*77c1e3ccSAndroid Build Coastguard Worker unsigned int enable_rate_guide_deltaq;
75*77c1e3ccSAndroid Build Coastguard Worker const char *rate_distribution_info;
76*77c1e3ccSAndroid Build Coastguard Worker aom_dist_metric dist_metric;
77*77c1e3ccSAndroid Build Coastguard Worker unsigned int cq_level; // constrained quality level
78*77c1e3ccSAndroid Build Coastguard Worker unsigned int rc_max_intra_bitrate_pct;
79*77c1e3ccSAndroid Build Coastguard Worker unsigned int rc_max_inter_bitrate_pct;
80*77c1e3ccSAndroid Build Coastguard Worker unsigned int gf_cbr_boost_pct;
81*77c1e3ccSAndroid Build Coastguard Worker unsigned int lossless;
82*77c1e3ccSAndroid Build Coastguard Worker unsigned int enable_cdef;
83*77c1e3ccSAndroid Build Coastguard Worker unsigned int enable_restoration;
84*77c1e3ccSAndroid Build Coastguard Worker unsigned int force_video_mode;
85*77c1e3ccSAndroid Build Coastguard Worker unsigned int enable_obmc;
86*77c1e3ccSAndroid Build Coastguard Worker unsigned int disable_trellis_quant;
87*77c1e3ccSAndroid Build Coastguard Worker unsigned int enable_qm;
88*77c1e3ccSAndroid Build Coastguard Worker unsigned int qm_y;
89*77c1e3ccSAndroid Build Coastguard Worker unsigned int qm_u;
90*77c1e3ccSAndroid Build Coastguard Worker unsigned int qm_v;
91*77c1e3ccSAndroid Build Coastguard Worker unsigned int qm_min;
92*77c1e3ccSAndroid Build Coastguard Worker unsigned int qm_max;
93*77c1e3ccSAndroid Build Coastguard Worker unsigned int num_tg;
94*77c1e3ccSAndroid Build Coastguard Worker unsigned int mtu_size;
95*77c1e3ccSAndroid Build Coastguard Worker
96*77c1e3ccSAndroid Build Coastguard Worker aom_timing_info_type_t timing_info_type;
97*77c1e3ccSAndroid Build Coastguard Worker unsigned int frame_parallel_decoding_mode;
98*77c1e3ccSAndroid Build Coastguard Worker int enable_dual_filter;
99*77c1e3ccSAndroid Build Coastguard Worker unsigned int enable_chroma_deltaq;
100*77c1e3ccSAndroid Build Coastguard Worker AQ_MODE aq_mode;
101*77c1e3ccSAndroid Build Coastguard Worker DELTAQ_MODE deltaq_mode;
102*77c1e3ccSAndroid Build Coastguard Worker int deltaq_strength;
103*77c1e3ccSAndroid Build Coastguard Worker int deltalf_mode;
104*77c1e3ccSAndroid Build Coastguard Worker unsigned int frame_periodic_boost;
105*77c1e3ccSAndroid Build Coastguard Worker aom_tune_content content;
106*77c1e3ccSAndroid Build Coastguard Worker aom_color_primaries_t color_primaries;
107*77c1e3ccSAndroid Build Coastguard Worker aom_transfer_characteristics_t transfer_characteristics;
108*77c1e3ccSAndroid Build Coastguard Worker aom_matrix_coefficients_t matrix_coefficients;
109*77c1e3ccSAndroid Build Coastguard Worker aom_chroma_sample_position_t chroma_sample_position;
110*77c1e3ccSAndroid Build Coastguard Worker int color_range;
111*77c1e3ccSAndroid Build Coastguard Worker int render_width;
112*77c1e3ccSAndroid Build Coastguard Worker int render_height;
113*77c1e3ccSAndroid Build Coastguard Worker aom_superblock_size_t superblock_size;
114*77c1e3ccSAndroid Build Coastguard Worker unsigned int single_tile_decoding;
115*77c1e3ccSAndroid Build Coastguard Worker int error_resilient_mode;
116*77c1e3ccSAndroid Build Coastguard Worker int s_frame_mode;
117*77c1e3ccSAndroid Build Coastguard Worker
118*77c1e3ccSAndroid Build Coastguard Worker int film_grain_test_vector;
119*77c1e3ccSAndroid Build Coastguard Worker const char *film_grain_table_filename;
120*77c1e3ccSAndroid Build Coastguard Worker unsigned int motion_vector_unit_test;
121*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_FPMT_TEST
122*77c1e3ccSAndroid Build Coastguard Worker unsigned int fpmt_unit_test;
123*77c1e3ccSAndroid Build Coastguard Worker #endif
124*77c1e3ccSAndroid Build Coastguard Worker unsigned int cdf_update_mode;
125*77c1e3ccSAndroid Build Coastguard Worker int enable_rect_partitions; // enable rectangular partitions for sequence
126*77c1e3ccSAndroid Build Coastguard Worker int enable_ab_partitions; // enable AB partitions for sequence
127*77c1e3ccSAndroid Build Coastguard Worker int enable_1to4_partitions; // enable 1:4 and 4:1 partitions for sequence
128*77c1e3ccSAndroid Build Coastguard Worker int min_partition_size; // min partition size [4,8,16,32,64,128]
129*77c1e3ccSAndroid Build Coastguard Worker int max_partition_size; // max partition size [4,8,16,32,64,128]
130*77c1e3ccSAndroid Build Coastguard Worker int enable_intra_edge_filter; // enable intra-edge filter for sequence
131*77c1e3ccSAndroid Build Coastguard Worker int enable_order_hint; // enable order hint for sequence
132*77c1e3ccSAndroid Build Coastguard Worker int enable_tx64; // enable 64-pt transform usage for sequence
133*77c1e3ccSAndroid Build Coastguard Worker int enable_flip_idtx; // enable flip and identity transform types
134*77c1e3ccSAndroid Build Coastguard Worker int enable_rect_tx; // enable rectangular transform usage for sequence
135*77c1e3ccSAndroid Build Coastguard Worker int enable_dist_wtd_comp; // enable dist wtd compound for sequence
136*77c1e3ccSAndroid Build Coastguard Worker int max_reference_frames; // maximum number of references per frame
137*77c1e3ccSAndroid Build Coastguard Worker int enable_reduced_reference_set; // enable reduced set of references
138*77c1e3ccSAndroid Build Coastguard Worker int enable_ref_frame_mvs; // sequence level
139*77c1e3ccSAndroid Build Coastguard Worker int allow_ref_frame_mvs; // frame level
140*77c1e3ccSAndroid Build Coastguard Worker int enable_masked_comp; // enable masked compound for sequence
141*77c1e3ccSAndroid Build Coastguard Worker int enable_onesided_comp; // enable one sided compound for sequence
142*77c1e3ccSAndroid Build Coastguard Worker int enable_interintra_comp; // enable interintra compound for sequence
143*77c1e3ccSAndroid Build Coastguard Worker int enable_smooth_interintra; // enable smooth interintra mode usage
144*77c1e3ccSAndroid Build Coastguard Worker int enable_diff_wtd_comp; // enable diff-wtd compound usage
145*77c1e3ccSAndroid Build Coastguard Worker int enable_interinter_wedge; // enable interinter-wedge compound usage
146*77c1e3ccSAndroid Build Coastguard Worker int enable_interintra_wedge; // enable interintra-wedge compound usage
147*77c1e3ccSAndroid Build Coastguard Worker int enable_global_motion; // enable global motion usage for sequence
148*77c1e3ccSAndroid Build Coastguard Worker int enable_warped_motion; // sequence level
149*77c1e3ccSAndroid Build Coastguard Worker int allow_warped_motion; // frame level
150*77c1e3ccSAndroid Build Coastguard Worker int enable_filter_intra; // enable filter intra for sequence
151*77c1e3ccSAndroid Build Coastguard Worker int enable_smooth_intra; // enable smooth intra modes for sequence
152*77c1e3ccSAndroid Build Coastguard Worker int enable_paeth_intra; // enable Paeth intra mode for sequence
153*77c1e3ccSAndroid Build Coastguard Worker int enable_cfl_intra; // enable CFL uv intra mode for sequence
154*77c1e3ccSAndroid Build Coastguard Worker int enable_directional_intra; // enable directional modes for sequence
155*77c1e3ccSAndroid Build Coastguard Worker int enable_diagonal_intra; // enable D45 to D203 intra modes for sequence
156*77c1e3ccSAndroid Build Coastguard Worker int enable_superres;
157*77c1e3ccSAndroid Build Coastguard Worker int enable_overlay; // enable overlay for filtered arf frames
158*77c1e3ccSAndroid Build Coastguard Worker int enable_palette;
159*77c1e3ccSAndroid Build Coastguard Worker int enable_intrabc;
160*77c1e3ccSAndroid Build Coastguard Worker int enable_angle_delta;
161*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_DENOISE
162*77c1e3ccSAndroid Build Coastguard Worker float noise_level;
163*77c1e3ccSAndroid Build Coastguard Worker int noise_block_size;
164*77c1e3ccSAndroid Build Coastguard Worker int enable_dnl_denoising;
165*77c1e3ccSAndroid Build Coastguard Worker #endif
166*77c1e3ccSAndroid Build Coastguard Worker
167*77c1e3ccSAndroid Build Coastguard Worker unsigned int chroma_subsampling_x;
168*77c1e3ccSAndroid Build Coastguard Worker unsigned int chroma_subsampling_y;
169*77c1e3ccSAndroid Build Coastguard Worker int reduced_tx_type_set;
170*77c1e3ccSAndroid Build Coastguard Worker int use_intra_dct_only;
171*77c1e3ccSAndroid Build Coastguard Worker int use_inter_dct_only;
172*77c1e3ccSAndroid Build Coastguard Worker int use_intra_default_tx_only;
173*77c1e3ccSAndroid Build Coastguard Worker int enable_tx_size_search;
174*77c1e3ccSAndroid Build Coastguard Worker int quant_b_adapt;
175*77c1e3ccSAndroid Build Coastguard Worker unsigned int vbr_corpus_complexity_lap;
176*77c1e3ccSAndroid Build Coastguard Worker AV1_LEVEL target_seq_level_idx[MAX_NUM_OPERATING_POINTS];
177*77c1e3ccSAndroid Build Coastguard Worker // Bit mask to specify which tier each of the 32 possible operating points
178*77c1e3ccSAndroid Build Coastguard Worker // conforms to.
179*77c1e3ccSAndroid Build Coastguard Worker unsigned int tier_mask;
180*77c1e3ccSAndroid Build Coastguard Worker // min_cr / 100 is the target minimum compression ratio for each frame.
181*77c1e3ccSAndroid Build Coastguard Worker unsigned int min_cr;
182*77c1e3ccSAndroid Build Coastguard Worker COST_UPDATE_TYPE coeff_cost_upd_freq;
183*77c1e3ccSAndroid Build Coastguard Worker COST_UPDATE_TYPE mode_cost_upd_freq;
184*77c1e3ccSAndroid Build Coastguard Worker COST_UPDATE_TYPE mv_cost_upd_freq;
185*77c1e3ccSAndroid Build Coastguard Worker COST_UPDATE_TYPE dv_cost_upd_freq;
186*77c1e3ccSAndroid Build Coastguard Worker unsigned int ext_tile_debug;
187*77c1e3ccSAndroid Build Coastguard Worker unsigned int sb_multipass_unit_test;
188*77c1e3ccSAndroid Build Coastguard Worker // Total number of passes. If this number is -1, then we assume passes = 1 or
189*77c1e3ccSAndroid Build Coastguard Worker // 2 (passes = 1 if pass == AOM_RC_ONE_PASS and passes = 2 otherwise).
190*77c1e3ccSAndroid Build Coastguard Worker int passes;
191*77c1e3ccSAndroid Build Coastguard Worker int fwd_kf_dist;
192*77c1e3ccSAndroid Build Coastguard Worker
193*77c1e3ccSAndroid Build Coastguard Worker LOOPFILTER_CONTROL loopfilter_control;
194*77c1e3ccSAndroid Build Coastguard Worker // Indicates if the application of post-processing filters should be skipped
195*77c1e3ccSAndroid Build Coastguard Worker // on reconstructed frame.
196*77c1e3ccSAndroid Build Coastguard Worker unsigned int skip_postproc_filtering;
197*77c1e3ccSAndroid Build Coastguard Worker // the name of the second pass output file when passes > 2
198*77c1e3ccSAndroid Build Coastguard Worker const char *two_pass_output;
199*77c1e3ccSAndroid Build Coastguard Worker const char *second_pass_log;
200*77c1e3ccSAndroid Build Coastguard Worker // Automatically determine whether to disable several intra tools
201*77c1e3ccSAndroid Build Coastguard Worker // when "--deltaq-mode=3" is true.
202*77c1e3ccSAndroid Build Coastguard Worker // Default as 0.
203*77c1e3ccSAndroid Build Coastguard Worker // When set to 1, the encoder will analyze the reconstruction quality
204*77c1e3ccSAndroid Build Coastguard Worker // as compared to the source image in the preprocessing pass.
205*77c1e3ccSAndroid Build Coastguard Worker // If the recontruction quality is considered high enough, we disable
206*77c1e3ccSAndroid Build Coastguard Worker // the following intra coding tools, for better encoding speed:
207*77c1e3ccSAndroid Build Coastguard Worker // "--enable_smooth_intra",
208*77c1e3ccSAndroid Build Coastguard Worker // "--enable_paeth_intra",
209*77c1e3ccSAndroid Build Coastguard Worker // "--enable_cfl_intra",
210*77c1e3ccSAndroid Build Coastguard Worker // "--enable_diagonal_intra".
211*77c1e3ccSAndroid Build Coastguard Worker int auto_intra_tools_off;
212*77c1e3ccSAndroid Build Coastguard Worker int strict_level_conformance;
213*77c1e3ccSAndroid Build Coastguard Worker int kf_max_pyr_height;
214*77c1e3ccSAndroid Build Coastguard Worker int sb_qp_sweep;
215*77c1e3ccSAndroid Build Coastguard Worker };
216*77c1e3ccSAndroid Build Coastguard Worker
217*77c1e3ccSAndroid Build Coastguard Worker static const struct av1_extracfg default_extra_cfg[] = {
218*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
219*77c1e3ccSAndroid Build Coastguard Worker {
220*77c1e3ccSAndroid Build Coastguard Worker AOM_USAGE_GOOD_QUALITY, // usage
221*77c1e3ccSAndroid Build Coastguard Worker 0, // cpu_used
222*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_auto_alt_ref
223*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_auto_bwd_ref
224*77c1e3ccSAndroid Build Coastguard Worker 0, // noise_sensitivity
225*77c1e3ccSAndroid Build Coastguard Worker 0, // sharpness
226*77c1e3ccSAndroid Build Coastguard Worker 0, // static_thresh
227*77c1e3ccSAndroid Build Coastguard Worker 1, // row_mt
228*77c1e3ccSAndroid Build Coastguard Worker 0, // fp_mt
229*77c1e3ccSAndroid Build Coastguard Worker 0, // tile_columns
230*77c1e3ccSAndroid Build Coastguard Worker 0, // tile_rows
231*77c1e3ccSAndroid Build Coastguard Worker 0, // auto_tiles
232*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_tpl_model
233*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_keyframe_filtering
234*77c1e3ccSAndroid Build Coastguard Worker 7, // arnr_max_frames
235*77c1e3ccSAndroid Build Coastguard Worker 5, // arnr_strength
236*77c1e3ccSAndroid Build Coastguard Worker 0, // min_gf_interval; 0 -> default decision
237*77c1e3ccSAndroid Build Coastguard Worker 0, // max_gf_interval; 0 -> default decision
238*77c1e3ccSAndroid Build Coastguard Worker 0, // gf_min_pyr_height
239*77c1e3ccSAndroid Build Coastguard Worker 5, // gf_max_pyr_height
240*77c1e3ccSAndroid Build Coastguard Worker AOM_TUNE_PSNR, // tuning
241*77c1e3ccSAndroid Build Coastguard Worker "/usr/local/share/model/vmaf_v0.6.1.json", // VMAF model path
242*77c1e3ccSAndroid Build Coastguard Worker ".", // partition info path
243*77c1e3ccSAndroid Build Coastguard Worker 0, // enable rate guide deltaq
244*77c1e3ccSAndroid Build Coastguard Worker "./rate_map.txt", // rate distribution input
245*77c1e3ccSAndroid Build Coastguard Worker AOM_DIST_METRIC_PSNR, // dist_metric
246*77c1e3ccSAndroid Build Coastguard Worker 10, // cq_level
247*77c1e3ccSAndroid Build Coastguard Worker 0, // rc_max_intra_bitrate_pct
248*77c1e3ccSAndroid Build Coastguard Worker 0, // rc_max_inter_bitrate_pct
249*77c1e3ccSAndroid Build Coastguard Worker 0, // gf_cbr_boost_pct
250*77c1e3ccSAndroid Build Coastguard Worker 0, // lossless
251*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_cdef
252*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_restoration
253*77c1e3ccSAndroid Build Coastguard Worker 0, // force_video_mode
254*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_obmc
255*77c1e3ccSAndroid Build Coastguard Worker 3, // disable_trellis_quant
256*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_qm
257*77c1e3ccSAndroid Build Coastguard Worker DEFAULT_QM_Y, // qm_y
258*77c1e3ccSAndroid Build Coastguard Worker DEFAULT_QM_U, // qm_u
259*77c1e3ccSAndroid Build Coastguard Worker DEFAULT_QM_V, // qm_v
260*77c1e3ccSAndroid Build Coastguard Worker DEFAULT_QM_FIRST, // qm_min
261*77c1e3ccSAndroid Build Coastguard Worker DEFAULT_QM_LAST, // qm_max
262*77c1e3ccSAndroid Build Coastguard Worker 1, // max number of tile groups
263*77c1e3ccSAndroid Build Coastguard Worker 0, // mtu_size
264*77c1e3ccSAndroid Build Coastguard Worker AOM_TIMING_UNSPECIFIED, // No picture timing signaling in bitstream
265*77c1e3ccSAndroid Build Coastguard Worker 0, // frame_parallel_decoding_mode
266*77c1e3ccSAndroid Build Coastguard Worker 1, // enable dual filter
267*77c1e3ccSAndroid Build Coastguard Worker 0, // enable delta quant in chroma planes
268*77c1e3ccSAndroid Build Coastguard Worker NO_AQ, // aq_mode
269*77c1e3ccSAndroid Build Coastguard Worker DELTA_Q_OBJECTIVE, // deltaq_mode
270*77c1e3ccSAndroid Build Coastguard Worker 100, // deltaq_strength
271*77c1e3ccSAndroid Build Coastguard Worker 0, // delta lf mode
272*77c1e3ccSAndroid Build Coastguard Worker 0, // frame_periodic_boost
273*77c1e3ccSAndroid Build Coastguard Worker AOM_CONTENT_DEFAULT, // content
274*77c1e3ccSAndroid Build Coastguard Worker AOM_CICP_CP_UNSPECIFIED, // CICP color primaries
275*77c1e3ccSAndroid Build Coastguard Worker AOM_CICP_TC_UNSPECIFIED, // CICP transfer characteristics
276*77c1e3ccSAndroid Build Coastguard Worker AOM_CICP_MC_UNSPECIFIED, // CICP matrix coefficients
277*77c1e3ccSAndroid Build Coastguard Worker AOM_CSP_UNKNOWN, // chroma sample position
278*77c1e3ccSAndroid Build Coastguard Worker 0, // color range
279*77c1e3ccSAndroid Build Coastguard Worker 0, // render width
280*77c1e3ccSAndroid Build Coastguard Worker 0, // render height
281*77c1e3ccSAndroid Build Coastguard Worker AOM_SUPERBLOCK_SIZE_DYNAMIC, // superblock_size
282*77c1e3ccSAndroid Build Coastguard Worker 1, // this depends on large_scale_tile.
283*77c1e3ccSAndroid Build Coastguard Worker 0, // error_resilient_mode off by default.
284*77c1e3ccSAndroid Build Coastguard Worker 0, // s_frame_mode off by default.
285*77c1e3ccSAndroid Build Coastguard Worker 0, // film_grain_test_vector
286*77c1e3ccSAndroid Build Coastguard Worker NULL, // film_grain_table_filename
287*77c1e3ccSAndroid Build Coastguard Worker 0, // motion_vector_unit_test
288*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_FPMT_TEST
289*77c1e3ccSAndroid Build Coastguard Worker 0, // fpmt_unit_test
290*77c1e3ccSAndroid Build Coastguard Worker #endif
291*77c1e3ccSAndroid Build Coastguard Worker 1, // CDF update mode
292*77c1e3ccSAndroid Build Coastguard Worker 1, // enable rectangular partitions
293*77c1e3ccSAndroid Build Coastguard Worker 1, // enable ab shape partitions
294*77c1e3ccSAndroid Build Coastguard Worker 1, // enable 1:4 and 4:1 partitions
295*77c1e3ccSAndroid Build Coastguard Worker 4, // min_partition_size
296*77c1e3ccSAndroid Build Coastguard Worker 128, // max_partition_size
297*77c1e3ccSAndroid Build Coastguard Worker 1, // enable intra edge filter
298*77c1e3ccSAndroid Build Coastguard Worker 1, // frame order hint
299*77c1e3ccSAndroid Build Coastguard Worker 1, // enable 64-pt transform usage
300*77c1e3ccSAndroid Build Coastguard Worker 1, // enable flip and identity transform
301*77c1e3ccSAndroid Build Coastguard Worker 1, // enable rectangular transform usage
302*77c1e3ccSAndroid Build Coastguard Worker 1, // dist-wtd compound
303*77c1e3ccSAndroid Build Coastguard Worker 7, // max_reference_frames
304*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_reduced_reference_set
305*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_ref_frame_mvs sequence level
306*77c1e3ccSAndroid Build Coastguard Worker 1, // allow ref_frame_mvs frame level
307*77c1e3ccSAndroid Build Coastguard Worker 1, // enable masked compound at sequence level
308*77c1e3ccSAndroid Build Coastguard Worker 1, // enable one sided compound at sequence level
309*77c1e3ccSAndroid Build Coastguard Worker 1, // enable interintra compound at sequence level
310*77c1e3ccSAndroid Build Coastguard Worker 1, // enable smooth interintra mode
311*77c1e3ccSAndroid Build Coastguard Worker 1, // enable difference-weighted compound
312*77c1e3ccSAndroid Build Coastguard Worker 1, // enable interinter wedge compound
313*77c1e3ccSAndroid Build Coastguard Worker 1, // enable interintra wedge compound
314*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_global_motion usage
315*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_warped_motion at sequence level
316*77c1e3ccSAndroid Build Coastguard Worker 1, // allow_warped_motion at frame level
317*77c1e3ccSAndroid Build Coastguard Worker 1, // enable filter intra at sequence level
318*77c1e3ccSAndroid Build Coastguard Worker 1, // enable smooth intra modes usage for sequence
319*77c1e3ccSAndroid Build Coastguard Worker 1, // enable Paeth intra mode usage for sequence
320*77c1e3ccSAndroid Build Coastguard Worker 1, // enable CFL uv intra mode usage for sequence
321*77c1e3ccSAndroid Build Coastguard Worker 1, // enable directional intra mode usage for sequence
322*77c1e3ccSAndroid Build Coastguard Worker 1, // enable D45 to D203 intra mode usage for sequence
323*77c1e3ccSAndroid Build Coastguard Worker 1, // superres
324*77c1e3ccSAndroid Build Coastguard Worker 1, // enable overlay
325*77c1e3ccSAndroid Build Coastguard Worker 1, // enable palette
326*77c1e3ccSAndroid Build Coastguard Worker 1, // enable intrabc
327*77c1e3ccSAndroid Build Coastguard Worker 1, // enable angle delta
328*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_DENOISE
329*77c1e3ccSAndroid Build Coastguard Worker 0, // noise_level
330*77c1e3ccSAndroid Build Coastguard Worker 32, // noise_block_size
331*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_dnl_denoising
332*77c1e3ccSAndroid Build Coastguard Worker #endif
333*77c1e3ccSAndroid Build Coastguard Worker 0, // chroma_subsampling_x
334*77c1e3ccSAndroid Build Coastguard Worker 0, // chroma_subsampling_y
335*77c1e3ccSAndroid Build Coastguard Worker 0, // reduced_tx_type_set
336*77c1e3ccSAndroid Build Coastguard Worker 0, // use_intra_dct_only
337*77c1e3ccSAndroid Build Coastguard Worker 0, // use_inter_dct_only
338*77c1e3ccSAndroid Build Coastguard Worker 0, // use_intra_default_tx_only
339*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_tx_size_search
340*77c1e3ccSAndroid Build Coastguard Worker 0, // quant_b_adapt
341*77c1e3ccSAndroid Build Coastguard Worker 0, // vbr_corpus_complexity_lap
342*77c1e3ccSAndroid Build Coastguard Worker {
343*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
344*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
345*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
346*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
347*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
348*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
349*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
350*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
351*77c1e3ccSAndroid Build Coastguard Worker }, // target_seq_level_idx
352*77c1e3ccSAndroid Build Coastguard Worker 0, // tier_mask
353*77c1e3ccSAndroid Build Coastguard Worker 0, // min_cr
354*77c1e3ccSAndroid Build Coastguard Worker COST_UPD_SB, // coeff_cost_upd_freq
355*77c1e3ccSAndroid Build Coastguard Worker COST_UPD_SB, // mode_cost_upd_freq
356*77c1e3ccSAndroid Build Coastguard Worker COST_UPD_SB, // mv_cost_upd_freq
357*77c1e3ccSAndroid Build Coastguard Worker COST_UPD_SB, // dv_cost_upd_freq
358*77c1e3ccSAndroid Build Coastguard Worker 0, // ext_tile_debug
359*77c1e3ccSAndroid Build Coastguard Worker 0, // sb_multipass_unit_test
360*77c1e3ccSAndroid Build Coastguard Worker -1, // passes
361*77c1e3ccSAndroid Build Coastguard Worker -1, // fwd_kf_dist
362*77c1e3ccSAndroid Build Coastguard Worker LOOPFILTER_ALL, // loopfilter_control
363*77c1e3ccSAndroid Build Coastguard Worker 0, // skip_postproc_filtering
364*77c1e3ccSAndroid Build Coastguard Worker NULL, // two_pass_output
365*77c1e3ccSAndroid Build Coastguard Worker NULL, // second_pass_log
366*77c1e3ccSAndroid Build Coastguard Worker 0, // auto_intra_tools_off
367*77c1e3ccSAndroid Build Coastguard Worker 0, // strict_level_conformance
368*77c1e3ccSAndroid Build Coastguard Worker -1, // kf_max_pyr_height
369*77c1e3ccSAndroid Build Coastguard Worker 0, // sb_qp_sweep
370*77c1e3ccSAndroid Build Coastguard Worker },
371*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY
372*77c1e3ccSAndroid Build Coastguard Worker {
373*77c1e3ccSAndroid Build Coastguard Worker AOM_USAGE_REALTIME, // usage
374*77c1e3ccSAndroid Build Coastguard Worker 10, // cpu_used
375*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_auto_alt_ref
376*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_auto_bwd_ref
377*77c1e3ccSAndroid Build Coastguard Worker 0, // noise_sensitivity
378*77c1e3ccSAndroid Build Coastguard Worker 0, // sharpness
379*77c1e3ccSAndroid Build Coastguard Worker 0, // static_thresh
380*77c1e3ccSAndroid Build Coastguard Worker 1, // row_mt
381*77c1e3ccSAndroid Build Coastguard Worker 0, // fp_mt
382*77c1e3ccSAndroid Build Coastguard Worker 0, // tile_columns
383*77c1e3ccSAndroid Build Coastguard Worker 0, // tile_rows
384*77c1e3ccSAndroid Build Coastguard Worker 0, // auto_tiles
385*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_tpl_model
386*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_keyframe_filtering
387*77c1e3ccSAndroid Build Coastguard Worker 7, // arnr_max_frames
388*77c1e3ccSAndroid Build Coastguard Worker 5, // arnr_strength
389*77c1e3ccSAndroid Build Coastguard Worker 0, // min_gf_interval; 0 -> default decision
390*77c1e3ccSAndroid Build Coastguard Worker 0, // max_gf_interval; 0 -> default decision
391*77c1e3ccSAndroid Build Coastguard Worker 0, // gf_min_pyr_height
392*77c1e3ccSAndroid Build Coastguard Worker 5, // gf_max_pyr_height
393*77c1e3ccSAndroid Build Coastguard Worker AOM_TUNE_PSNR, // tuning
394*77c1e3ccSAndroid Build Coastguard Worker "/usr/local/share/model/vmaf_v0.6.1.json", // VMAF model path
395*77c1e3ccSAndroid Build Coastguard Worker ".", // partition info path
396*77c1e3ccSAndroid Build Coastguard Worker 0, // enable rate guide deltaq
397*77c1e3ccSAndroid Build Coastguard Worker "./rate_map.txt", // rate distribution input
398*77c1e3ccSAndroid Build Coastguard Worker AOM_DIST_METRIC_PSNR, // dist_metric
399*77c1e3ccSAndroid Build Coastguard Worker 10, // cq_level
400*77c1e3ccSAndroid Build Coastguard Worker 300, // rc_max_intra_bitrate_pct
401*77c1e3ccSAndroid Build Coastguard Worker 0, // rc_max_inter_bitrate_pct
402*77c1e3ccSAndroid Build Coastguard Worker 0, // gf_cbr_boost_pct
403*77c1e3ccSAndroid Build Coastguard Worker 0, // lossless
404*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_cdef
405*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_restoration
406*77c1e3ccSAndroid Build Coastguard Worker 0, // force_video_mode
407*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_obmc
408*77c1e3ccSAndroid Build Coastguard Worker 3, // disable_trellis_quant
409*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_qm
410*77c1e3ccSAndroid Build Coastguard Worker DEFAULT_QM_Y, // qm_y
411*77c1e3ccSAndroid Build Coastguard Worker DEFAULT_QM_U, // qm_u
412*77c1e3ccSAndroid Build Coastguard Worker DEFAULT_QM_V, // qm_v
413*77c1e3ccSAndroid Build Coastguard Worker DEFAULT_QM_FIRST, // qm_min
414*77c1e3ccSAndroid Build Coastguard Worker DEFAULT_QM_LAST, // qm_max
415*77c1e3ccSAndroid Build Coastguard Worker 1, // max number of tile groups
416*77c1e3ccSAndroid Build Coastguard Worker 0, // mtu_size
417*77c1e3ccSAndroid Build Coastguard Worker AOM_TIMING_UNSPECIFIED, // No picture timing signaling in bitstream
418*77c1e3ccSAndroid Build Coastguard Worker 0, // frame_parallel_decoding_mode
419*77c1e3ccSAndroid Build Coastguard Worker 0, // enable dual filter
420*77c1e3ccSAndroid Build Coastguard Worker 0, // enable delta quant in chroma planes
421*77c1e3ccSAndroid Build Coastguard Worker CYCLIC_REFRESH_AQ, // aq_mode
422*77c1e3ccSAndroid Build Coastguard Worker NO_DELTA_Q, // deltaq_mode
423*77c1e3ccSAndroid Build Coastguard Worker 100, // deltaq_strength
424*77c1e3ccSAndroid Build Coastguard Worker 0, // delta lf mode
425*77c1e3ccSAndroid Build Coastguard Worker 0, // frame_periodic_boost
426*77c1e3ccSAndroid Build Coastguard Worker AOM_CONTENT_DEFAULT, // content
427*77c1e3ccSAndroid Build Coastguard Worker AOM_CICP_CP_UNSPECIFIED, // CICP color primaries
428*77c1e3ccSAndroid Build Coastguard Worker AOM_CICP_TC_UNSPECIFIED, // CICP transfer characteristics
429*77c1e3ccSAndroid Build Coastguard Worker AOM_CICP_MC_UNSPECIFIED, // CICP matrix coefficients
430*77c1e3ccSAndroid Build Coastguard Worker AOM_CSP_UNKNOWN, // chroma sample position
431*77c1e3ccSAndroid Build Coastguard Worker 0, // color range
432*77c1e3ccSAndroid Build Coastguard Worker 0, // render width
433*77c1e3ccSAndroid Build Coastguard Worker 0, // render height
434*77c1e3ccSAndroid Build Coastguard Worker AOM_SUPERBLOCK_SIZE_DYNAMIC, // superblock_size
435*77c1e3ccSAndroid Build Coastguard Worker 1, // this depends on large_scale_tile.
436*77c1e3ccSAndroid Build Coastguard Worker 0, // error_resilient_mode off by default.
437*77c1e3ccSAndroid Build Coastguard Worker 0, // s_frame_mode off by default.
438*77c1e3ccSAndroid Build Coastguard Worker 0, // film_grain_test_vector
439*77c1e3ccSAndroid Build Coastguard Worker NULL, // film_grain_table_filename
440*77c1e3ccSAndroid Build Coastguard Worker 0, // motion_vector_unit_test
441*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_FPMT_TEST
442*77c1e3ccSAndroid Build Coastguard Worker 0, // fpmt_unit_test
443*77c1e3ccSAndroid Build Coastguard Worker #endif
444*77c1e3ccSAndroid Build Coastguard Worker 1, // CDF update mode
445*77c1e3ccSAndroid Build Coastguard Worker 0, // enable rectangular partitions
446*77c1e3ccSAndroid Build Coastguard Worker 0, // enable ab shape partitions
447*77c1e3ccSAndroid Build Coastguard Worker 0, // enable 1:4 and 4:1 partitions
448*77c1e3ccSAndroid Build Coastguard Worker 4, // min_partition_size
449*77c1e3ccSAndroid Build Coastguard Worker 128, // max_partition_size
450*77c1e3ccSAndroid Build Coastguard Worker 0, // enable intra edge filter
451*77c1e3ccSAndroid Build Coastguard Worker 0, // frame order hint
452*77c1e3ccSAndroid Build Coastguard Worker 0, // enable 64-pt transform usage
453*77c1e3ccSAndroid Build Coastguard Worker 1, // enable flip and identity transform
454*77c1e3ccSAndroid Build Coastguard Worker 1, // enable rectangular transform usage
455*77c1e3ccSAndroid Build Coastguard Worker 0, // dist-wtd compound
456*77c1e3ccSAndroid Build Coastguard Worker 3, // max_reference_frames
457*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_reduced_reference_set
458*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_ref_frame_mvs sequence level
459*77c1e3ccSAndroid Build Coastguard Worker 0, // allow ref_frame_mvs frame level
460*77c1e3ccSAndroid Build Coastguard Worker 0, // enable masked compound at sequence level
461*77c1e3ccSAndroid Build Coastguard Worker 0, // enable one sided compound at sequence level
462*77c1e3ccSAndroid Build Coastguard Worker 0, // enable interintra compound at sequence level
463*77c1e3ccSAndroid Build Coastguard Worker 0, // enable smooth interintra mode
464*77c1e3ccSAndroid Build Coastguard Worker 0, // enable difference-weighted compound
465*77c1e3ccSAndroid Build Coastguard Worker 0, // enable interinter wedge compound
466*77c1e3ccSAndroid Build Coastguard Worker 0, // enable interintra wedge compound
467*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_global_motion usage
468*77c1e3ccSAndroid Build Coastguard Worker 0, // enable_warped_motion at sequence level
469*77c1e3ccSAndroid Build Coastguard Worker 0, // allow_warped_motion at frame level
470*77c1e3ccSAndroid Build Coastguard Worker 0, // enable filter intra at sequence level
471*77c1e3ccSAndroid Build Coastguard Worker 0, // enable smooth intra modes usage for sequence
472*77c1e3ccSAndroid Build Coastguard Worker 0, // enable Paeth intra mode usage for sequence
473*77c1e3ccSAndroid Build Coastguard Worker 0, // enable CFL uv intra mode usage for sequence
474*77c1e3ccSAndroid Build Coastguard Worker 1, // enable directional intra mode usage for sequence
475*77c1e3ccSAndroid Build Coastguard Worker 1, // enable D45 to D203 intra mode usage for sequence
476*77c1e3ccSAndroid Build Coastguard Worker 0, // superres
477*77c1e3ccSAndroid Build Coastguard Worker 0, // enable overlay
478*77c1e3ccSAndroid Build Coastguard Worker 1, // enable palette
479*77c1e3ccSAndroid Build Coastguard Worker 0, // enable intrabc
480*77c1e3ccSAndroid Build Coastguard Worker 0, // enable angle delta
481*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_DENOISE
482*77c1e3ccSAndroid Build Coastguard Worker 0, // noise_level
483*77c1e3ccSAndroid Build Coastguard Worker 32, // noise_block_size
484*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_dnl_denoising
485*77c1e3ccSAndroid Build Coastguard Worker #endif
486*77c1e3ccSAndroid Build Coastguard Worker 0, // chroma_subsampling_x
487*77c1e3ccSAndroid Build Coastguard Worker 0, // chroma_subsampling_y
488*77c1e3ccSAndroid Build Coastguard Worker 0, // reduced_tx_type_set
489*77c1e3ccSAndroid Build Coastguard Worker 0, // use_intra_dct_only
490*77c1e3ccSAndroid Build Coastguard Worker 0, // use_inter_dct_only
491*77c1e3ccSAndroid Build Coastguard Worker 1, // use_intra_default_tx_only
492*77c1e3ccSAndroid Build Coastguard Worker 1, // enable_tx_size_search
493*77c1e3ccSAndroid Build Coastguard Worker 0, // quant_b_adapt
494*77c1e3ccSAndroid Build Coastguard Worker 0, // vbr_corpus_complexity_lap
495*77c1e3ccSAndroid Build Coastguard Worker {
496*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
497*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
498*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
499*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
500*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
501*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
502*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
503*77c1e3ccSAndroid Build Coastguard Worker SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX, SEQ_LEVEL_MAX,
504*77c1e3ccSAndroid Build Coastguard Worker }, // target_seq_level_idx
505*77c1e3ccSAndroid Build Coastguard Worker 0, // tier_mask
506*77c1e3ccSAndroid Build Coastguard Worker 0, // min_cr
507*77c1e3ccSAndroid Build Coastguard Worker COST_UPD_OFF, // coeff_cost_upd_freq
508*77c1e3ccSAndroid Build Coastguard Worker COST_UPD_OFF, // mode_cost_upd_freq
509*77c1e3ccSAndroid Build Coastguard Worker COST_UPD_OFF, // mv_cost_upd_freq
510*77c1e3ccSAndroid Build Coastguard Worker COST_UPD_OFF, // dv_cost_upd_freq
511*77c1e3ccSAndroid Build Coastguard Worker 0, // ext_tile_debug
512*77c1e3ccSAndroid Build Coastguard Worker 0, // sb_multipass_unit_test
513*77c1e3ccSAndroid Build Coastguard Worker -1, // passes
514*77c1e3ccSAndroid Build Coastguard Worker -1, // fwd_kf_dist
515*77c1e3ccSAndroid Build Coastguard Worker LOOPFILTER_ALL, // loopfilter_control
516*77c1e3ccSAndroid Build Coastguard Worker 0, // skip_postproc_filtering
517*77c1e3ccSAndroid Build Coastguard Worker NULL, // two_pass_output
518*77c1e3ccSAndroid Build Coastguard Worker NULL, // second_pass_log
519*77c1e3ccSAndroid Build Coastguard Worker 0, // auto_intra_tools_off
520*77c1e3ccSAndroid Build Coastguard Worker 0, // strict_level_conformance
521*77c1e3ccSAndroid Build Coastguard Worker -1, // kf_max_pyr_height
522*77c1e3ccSAndroid Build Coastguard Worker 0, // sb_qp_sweep
523*77c1e3ccSAndroid Build Coastguard Worker },
524*77c1e3ccSAndroid Build Coastguard Worker };
525*77c1e3ccSAndroid Build Coastguard Worker
526*77c1e3ccSAndroid Build Coastguard Worker struct aom_codec_alg_priv {
527*77c1e3ccSAndroid Build Coastguard Worker aom_codec_priv_t base;
528*77c1e3ccSAndroid Build Coastguard Worker aom_codec_enc_cfg_t cfg;
529*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg;
530*77c1e3ccSAndroid Build Coastguard Worker aom_rational64_t timestamp_ratio;
531*77c1e3ccSAndroid Build Coastguard Worker aom_codec_pts_t pts_offset;
532*77c1e3ccSAndroid Build Coastguard Worker unsigned char pts_offset_initialized;
533*77c1e3ccSAndroid Build Coastguard Worker AV1EncoderConfig oxcf;
534*77c1e3ccSAndroid Build Coastguard Worker AV1_PRIMARY *ppi;
535*77c1e3ccSAndroid Build Coastguard Worker unsigned char *cx_data;
536*77c1e3ccSAndroid Build Coastguard Worker size_t cx_data_sz;
537*77c1e3ccSAndroid Build Coastguard Worker size_t pending_cx_data_sz;
538*77c1e3ccSAndroid Build Coastguard Worker aom_image_t preview_img;
539*77c1e3ccSAndroid Build Coastguard Worker aom_enc_frame_flags_t next_frame_flags;
540*77c1e3ccSAndroid Build Coastguard Worker aom_codec_pkt_list_decl(256) pkt_list;
541*77c1e3ccSAndroid Build Coastguard Worker unsigned int fixed_kf_cntr;
542*77c1e3ccSAndroid Build Coastguard Worker // BufferPool that holds all reference frames.
543*77c1e3ccSAndroid Build Coastguard Worker BufferPool *buffer_pool;
544*77c1e3ccSAndroid Build Coastguard Worker
545*77c1e3ccSAndroid Build Coastguard Worker // lookahead instance variables
546*77c1e3ccSAndroid Build Coastguard Worker BufferPool *buffer_pool_lap;
547*77c1e3ccSAndroid Build Coastguard Worker FIRSTPASS_STATS *frame_stats_buffer;
548*77c1e3ccSAndroid Build Coastguard Worker // Number of stats buffers required for look ahead
549*77c1e3ccSAndroid Build Coastguard Worker int num_lap_buffers;
550*77c1e3ccSAndroid Build Coastguard Worker STATS_BUFFER_CTX stats_buf_context;
551*77c1e3ccSAndroid Build Coastguard Worker bool monochrome_on_init;
552*77c1e3ccSAndroid Build Coastguard Worker };
553*77c1e3ccSAndroid Build Coastguard Worker
gcd(int64_t a,int b)554*77c1e3ccSAndroid Build Coastguard Worker static inline int gcd(int64_t a, int b) {
555*77c1e3ccSAndroid Build Coastguard Worker int remainder;
556*77c1e3ccSAndroid Build Coastguard Worker while (b > 0) {
557*77c1e3ccSAndroid Build Coastguard Worker remainder = (int)(a % b);
558*77c1e3ccSAndroid Build Coastguard Worker a = b;
559*77c1e3ccSAndroid Build Coastguard Worker b = remainder;
560*77c1e3ccSAndroid Build Coastguard Worker }
561*77c1e3ccSAndroid Build Coastguard Worker
562*77c1e3ccSAndroid Build Coastguard Worker return (int)a;
563*77c1e3ccSAndroid Build Coastguard Worker }
564*77c1e3ccSAndroid Build Coastguard Worker
reduce_ratio(aom_rational64_t * ratio)565*77c1e3ccSAndroid Build Coastguard Worker static void reduce_ratio(aom_rational64_t *ratio) {
566*77c1e3ccSAndroid Build Coastguard Worker const int denom = gcd(ratio->num, ratio->den);
567*77c1e3ccSAndroid Build Coastguard Worker ratio->num /= denom;
568*77c1e3ccSAndroid Build Coastguard Worker ratio->den /= denom;
569*77c1e3ccSAndroid Build Coastguard Worker }
570*77c1e3ccSAndroid Build Coastguard Worker
571*77c1e3ccSAndroid Build Coastguard Worker // Called by encoder_encode() only. Must not be called by encoder_init()
572*77c1e3ccSAndroid Build Coastguard Worker // because the `error` paramerer will be destroyed by aom_codec_enc_init_ver()
573*77c1e3ccSAndroid Build Coastguard Worker // after encoder_init() returns an error. See the "IMPORTANT" comment in
574*77c1e3ccSAndroid Build Coastguard Worker // aom_codec_enc_init_ver().
update_error_state(aom_codec_alg_priv_t * ctx,const struct aom_internal_error_info * error)575*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t update_error_state(
576*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, const struct aom_internal_error_info *error) {
577*77c1e3ccSAndroid Build Coastguard Worker const aom_codec_err_t res = error->error_code;
578*77c1e3ccSAndroid Build Coastguard Worker
579*77c1e3ccSAndroid Build Coastguard Worker if (res != AOM_CODEC_OK)
580*77c1e3ccSAndroid Build Coastguard Worker ctx->base.err_detail = error->has_detail ? error->detail : NULL;
581*77c1e3ccSAndroid Build Coastguard Worker
582*77c1e3ccSAndroid Build Coastguard Worker return res;
583*77c1e3ccSAndroid Build Coastguard Worker }
584*77c1e3ccSAndroid Build Coastguard Worker
585*77c1e3ccSAndroid Build Coastguard Worker // This function deep copies a string src to *dst. For default string we will
586*77c1e3ccSAndroid Build Coastguard Worker // use a string literal, and otherwise we will allocate memory for the string.
allocate_and_set_string(const char * src,const char * default_src,const char ** dst,char * err_detail)587*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t allocate_and_set_string(const char *src,
588*77c1e3ccSAndroid Build Coastguard Worker const char *default_src,
589*77c1e3ccSAndroid Build Coastguard Worker const char **dst,
590*77c1e3ccSAndroid Build Coastguard Worker char *err_detail) {
591*77c1e3ccSAndroid Build Coastguard Worker if (!src) {
592*77c1e3ccSAndroid Build Coastguard Worker snprintf(err_detail, ARG_ERR_MSG_MAX_LEN,
593*77c1e3ccSAndroid Build Coastguard Worker "Null pointer given to a string parameter.");
594*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
595*77c1e3ccSAndroid Build Coastguard Worker }
596*77c1e3ccSAndroid Build Coastguard Worker if (*dst && strcmp(src, *dst) == 0) return AOM_CODEC_OK;
597*77c1e3ccSAndroid Build Coastguard Worker // If the input is exactly the same as default, we will use the string
598*77c1e3ccSAndroid Build Coastguard Worker // literal, so do not free here.
599*77c1e3ccSAndroid Build Coastguard Worker if (*dst != default_src) {
600*77c1e3ccSAndroid Build Coastguard Worker aom_free((void *)*dst);
601*77c1e3ccSAndroid Build Coastguard Worker }
602*77c1e3ccSAndroid Build Coastguard Worker
603*77c1e3ccSAndroid Build Coastguard Worker if (default_src && strcmp(src, default_src) == 0) {
604*77c1e3ccSAndroid Build Coastguard Worker // default_src should be a string literal
605*77c1e3ccSAndroid Build Coastguard Worker *dst = default_src;
606*77c1e3ccSAndroid Build Coastguard Worker } else {
607*77c1e3ccSAndroid Build Coastguard Worker size_t len = strlen(src) + 1;
608*77c1e3ccSAndroid Build Coastguard Worker char *tmp = aom_malloc(len * sizeof(*tmp));
609*77c1e3ccSAndroid Build Coastguard Worker if (!tmp) {
610*77c1e3ccSAndroid Build Coastguard Worker snprintf(err_detail, ARG_ERR_MSG_MAX_LEN,
611*77c1e3ccSAndroid Build Coastguard Worker "Failed to allocate memory for copying parameters.");
612*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_MEM_ERROR;
613*77c1e3ccSAndroid Build Coastguard Worker }
614*77c1e3ccSAndroid Build Coastguard Worker memcpy(tmp, src, len);
615*77c1e3ccSAndroid Build Coastguard Worker *dst = tmp;
616*77c1e3ccSAndroid Build Coastguard Worker }
617*77c1e3ccSAndroid Build Coastguard Worker return 0;
618*77c1e3ccSAndroid Build Coastguard Worker }
619*77c1e3ccSAndroid Build Coastguard Worker
620*77c1e3ccSAndroid Build Coastguard Worker #undef ERROR
621*77c1e3ccSAndroid Build Coastguard Worker #define ERROR(str) \
622*77c1e3ccSAndroid Build Coastguard Worker do { \
623*77c1e3ccSAndroid Build Coastguard Worker ctx->base.err_detail = str; \
624*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM; \
625*77c1e3ccSAndroid Build Coastguard Worker } while (0)
626*77c1e3ccSAndroid Build Coastguard Worker
627*77c1e3ccSAndroid Build Coastguard Worker #define RANGE_CHECK(p, memb, lo, hi) \
628*77c1e3ccSAndroid Build Coastguard Worker do { \
629*77c1e3ccSAndroid Build Coastguard Worker if (!((p)->memb >= (lo) && (p)->memb <= (hi))) \
630*77c1e3ccSAndroid Build Coastguard Worker ERROR(#memb " out of range [" #lo ".." #hi "]"); \
631*77c1e3ccSAndroid Build Coastguard Worker } while (0)
632*77c1e3ccSAndroid Build Coastguard Worker
633*77c1e3ccSAndroid Build Coastguard Worker #define RANGE_CHECK_HI(p, memb, hi) \
634*77c1e3ccSAndroid Build Coastguard Worker do { \
635*77c1e3ccSAndroid Build Coastguard Worker if (!((p)->memb <= (hi))) ERROR(#memb " out of range [.." #hi "]"); \
636*77c1e3ccSAndroid Build Coastguard Worker } while (0)
637*77c1e3ccSAndroid Build Coastguard Worker
638*77c1e3ccSAndroid Build Coastguard Worker #define RANGE_CHECK_BOOL(p, memb) \
639*77c1e3ccSAndroid Build Coastguard Worker do { \
640*77c1e3ccSAndroid Build Coastguard Worker if (!!((p)->memb) != (p)->memb) ERROR(#memb " expected boolean"); \
641*77c1e3ccSAndroid Build Coastguard Worker } while (0)
642*77c1e3ccSAndroid Build Coastguard Worker
validate_config(aom_codec_alg_priv_t * ctx,const aom_codec_enc_cfg_t * cfg,const struct av1_extracfg * extra_cfg)643*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t validate_config(aom_codec_alg_priv_t *ctx,
644*77c1e3ccSAndroid Build Coastguard Worker const aom_codec_enc_cfg_t *cfg,
645*77c1e3ccSAndroid Build Coastguard Worker const struct av1_extracfg *extra_cfg) {
646*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, g_w, 1, 65536); // 16 bits available
647*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, g_h, 1, 65536); // 16 bits available
648*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, g_forced_max_frame_width, 65536); // 16 bits available
649*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, g_forced_max_frame_height, 65536); // 16 bits available
650*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_forced_max_frame_width) {
651*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, g_w, cfg->g_forced_max_frame_width);
652*77c1e3ccSAndroid Build Coastguard Worker }
653*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_forced_max_frame_height) {
654*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, g_h, cfg->g_forced_max_frame_height);
655*77c1e3ccSAndroid Build Coastguard Worker }
656*77c1e3ccSAndroid Build Coastguard Worker // To avoid integer overflows when multiplying width by height (or values
657*77c1e3ccSAndroid Build Coastguard Worker // derived from width and height) using the int type, impose a maximum frame
658*77c1e3ccSAndroid Build Coastguard Worker // area (width * height) of 2^30.
659*77c1e3ccSAndroid Build Coastguard Worker const unsigned int max_frame_width =
660*77c1e3ccSAndroid Build Coastguard Worker cfg->g_forced_max_frame_width ? cfg->g_forced_max_frame_width : cfg->g_w;
661*77c1e3ccSAndroid Build Coastguard Worker const unsigned int max_frame_height = cfg->g_forced_max_frame_height
662*77c1e3ccSAndroid Build Coastguard Worker ? cfg->g_forced_max_frame_height
663*77c1e3ccSAndroid Build Coastguard Worker : cfg->g_h;
664*77c1e3ccSAndroid Build Coastguard Worker const int64_t max_frame_area = (int64_t)max_frame_width * max_frame_height;
665*77c1e3ccSAndroid Build Coastguard Worker if (max_frame_area > (1 << 30)) {
666*77c1e3ccSAndroid Build Coastguard Worker ERROR("max_frame_area out of range [..2^30]");
667*77c1e3ccSAndroid Build Coastguard Worker }
668*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, g_timebase.den, 1, 1000000000);
669*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, g_timebase.num, 1, 1000000000);
670*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, g_profile, MAX_PROFILES - 1);
671*77c1e3ccSAndroid Build Coastguard Worker
672*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, rc_target_bitrate, 2000000);
673*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, rc_max_quantizer, 63);
674*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, rc_min_quantizer, cfg->rc_max_quantizer);
675*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_BOOL(extra_cfg, lossless);
676*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, aq_mode, AQ_MODE_COUNT - 1);
677*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, deltaq_mode, DELTA_Q_MODE_COUNT - 1);
678*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, deltalf_mode, 1);
679*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, frame_periodic_boost, 1);
680*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_REALTIME_ONLY
681*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, g_usage, AOM_USAGE_REALTIME, AOM_USAGE_REALTIME);
682*77c1e3ccSAndroid Build Coastguard Worker #else
683*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, g_usage, AOM_USAGE_ALL_INTRA);
684*77c1e3ccSAndroid Build Coastguard Worker #endif
685*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, g_threads, MAX_NUM_THREADS);
686*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, rc_end_usage, AOM_VBR, AOM_Q);
687*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, rc_undershoot_pct, 100);
688*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, rc_overshoot_pct, 100);
689*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, rc_2pass_vbr_bias_pct, 100);
690*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, kf_mode, AOM_KF_DISABLED, AOM_KF_AUTO);
691*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, rc_dropframe_thresh, 100);
692*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, g_pass, AOM_RC_ONE_PASS, AOM_RC_THIRD_PASS);
693*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, g_lag_in_frames, MAX_LAG_BUFFERS);
694*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_usage == AOM_USAGE_ALL_INTRA) {
695*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, g_lag_in_frames, 0);
696*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, kf_max_dist, 0);
697*77c1e3ccSAndroid Build Coastguard Worker }
698*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, min_gf_interval, MAX_LAG_BUFFERS - 1);
699*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, max_gf_interval, MAX_LAG_BUFFERS - 1);
700*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->max_gf_interval > 0) {
701*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, max_gf_interval,
702*77c1e3ccSAndroid Build Coastguard Worker AOMMAX(2, extra_cfg->min_gf_interval), (MAX_LAG_BUFFERS - 1));
703*77c1e3ccSAndroid Build Coastguard Worker }
704*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, gf_min_pyr_height, 5);
705*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, gf_max_pyr_height, 5);
706*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->gf_min_pyr_height > extra_cfg->gf_max_pyr_height) {
707*77c1e3ccSAndroid Build Coastguard Worker ERROR(
708*77c1e3ccSAndroid Build Coastguard Worker "gf_min_pyr_height must be less than or equal to "
709*77c1e3ccSAndroid Build Coastguard Worker "gf_max_pyramid_height");
710*77c1e3ccSAndroid Build Coastguard Worker }
711*77c1e3ccSAndroid Build Coastguard Worker
712*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, rc_resize_mode, RESIZE_MODES - 1);
713*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, rc_resize_denominator, SCALE_NUMERATOR,
714*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR << 1);
715*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, rc_resize_kf_denominator, SCALE_NUMERATOR,
716*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR << 1);
717*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, rc_superres_mode, AOM_SUPERRES_AUTO);
718*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, rc_superres_denominator, SCALE_NUMERATOR,
719*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR << 1);
720*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, rc_superres_kf_denominator, SCALE_NUMERATOR,
721*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR << 1);
722*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, rc_superres_qthresh, 1, 63);
723*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, rc_superres_kf_qthresh, 1, 63);
724*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, cdf_update_mode, 2);
725*77c1e3ccSAndroid Build Coastguard Worker
726*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, motion_vector_unit_test, 2);
727*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_FPMT_TEST
728*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, fpmt_unit_test, 1);
729*77c1e3ccSAndroid Build Coastguard Worker #endif
730*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, sb_multipass_unit_test, 1);
731*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, ext_tile_debug, 1);
732*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, enable_auto_alt_ref, 1);
733*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, enable_auto_bwd_ref, 2);
734*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, cpu_used, 0,
735*77c1e3ccSAndroid Build Coastguard Worker (cfg->g_usage == AOM_USAGE_REALTIME) ? 11 : 9);
736*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, noise_sensitivity, 6);
737*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, superblock_size, AOM_SUPERBLOCK_SIZE_64X64,
738*77c1e3ccSAndroid Build Coastguard Worker AOM_SUPERBLOCK_SIZE_DYNAMIC);
739*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, large_scale_tile, 1);
740*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, single_tile_decoding, 1);
741*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, enable_rate_guide_deltaq, 1);
742*77c1e3ccSAndroid Build Coastguard Worker
743*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, row_mt, 1);
744*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, fp_mt, 1);
745*77c1e3ccSAndroid Build Coastguard Worker
746*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, tile_columns, 6);
747*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, tile_rows, 6);
748*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, auto_tiles, 1);
749*77c1e3ccSAndroid Build Coastguard Worker
750*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, monochrome, 1);
751*77c1e3ccSAndroid Build Coastguard Worker
752*77c1e3ccSAndroid Build Coastguard Worker if (cfg->large_scale_tile && extra_cfg->aq_mode)
753*77c1e3ccSAndroid Build Coastguard Worker ERROR(
754*77c1e3ccSAndroid Build Coastguard Worker "Adaptive quantization are not supported in large scale tile "
755*77c1e3ccSAndroid Build Coastguard Worker "coding.");
756*77c1e3ccSAndroid Build Coastguard Worker
757*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, sharpness, 7);
758*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, arnr_max_frames, 15);
759*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, arnr_strength, 6);
760*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, cq_level, 63);
761*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, g_bit_depth, AOM_BITS_8, AOM_BITS_12);
762*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(cfg, g_input_bit_depth, 8, 12);
763*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, content, AOM_CONTENT_DEFAULT, AOM_CONTENT_INVALID - 1);
764*77c1e3ccSAndroid Build Coastguard Worker
765*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_pass >= AOM_RC_SECOND_PASS) {
766*77c1e3ccSAndroid Build Coastguard Worker const size_t packet_sz = sizeof(FIRSTPASS_STATS);
767*77c1e3ccSAndroid Build Coastguard Worker const int n_packets = (int)(cfg->rc_twopass_stats_in.sz / packet_sz);
768*77c1e3ccSAndroid Build Coastguard Worker const FIRSTPASS_STATS *stats;
769*77c1e3ccSAndroid Build Coastguard Worker
770*77c1e3ccSAndroid Build Coastguard Worker if (cfg->rc_twopass_stats_in.buf == NULL)
771*77c1e3ccSAndroid Build Coastguard Worker ERROR("rc_twopass_stats_in.buf not set.");
772*77c1e3ccSAndroid Build Coastguard Worker
773*77c1e3ccSAndroid Build Coastguard Worker if (cfg->rc_twopass_stats_in.sz % packet_sz)
774*77c1e3ccSAndroid Build Coastguard Worker ERROR("rc_twopass_stats_in.sz indicates truncated packet.");
775*77c1e3ccSAndroid Build Coastguard Worker
776*77c1e3ccSAndroid Build Coastguard Worker if (cfg->rc_twopass_stats_in.sz < 2 * packet_sz)
777*77c1e3ccSAndroid Build Coastguard Worker ERROR("rc_twopass_stats_in requires at least two packets.");
778*77c1e3ccSAndroid Build Coastguard Worker
779*77c1e3ccSAndroid Build Coastguard Worker stats =
780*77c1e3ccSAndroid Build Coastguard Worker (const FIRSTPASS_STATS *)cfg->rc_twopass_stats_in.buf + n_packets - 1;
781*77c1e3ccSAndroid Build Coastguard Worker
782*77c1e3ccSAndroid Build Coastguard Worker if ((int)(stats->count + 0.5) != n_packets - 1)
783*77c1e3ccSAndroid Build Coastguard Worker ERROR("rc_twopass_stats_in missing EOS stats packet");
784*77c1e3ccSAndroid Build Coastguard Worker }
785*77c1e3ccSAndroid Build Coastguard Worker
786*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->passes != -1 && cfg->g_pass == AOM_RC_ONE_PASS &&
787*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->passes != 1) {
788*77c1e3ccSAndroid Build Coastguard Worker ERROR("One pass encoding but passes != 1.");
789*77c1e3ccSAndroid Build Coastguard Worker }
790*77c1e3ccSAndroid Build Coastguard Worker
791*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->passes != -1 && (int)cfg->g_pass > extra_cfg->passes) {
792*77c1e3ccSAndroid Build Coastguard Worker ERROR("Current pass is larger than total number of passes.");
793*77c1e3ccSAndroid Build Coastguard Worker }
794*77c1e3ccSAndroid Build Coastguard Worker
795*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_profile == (unsigned int)PROFILE_1 && cfg->monochrome) {
796*77c1e3ccSAndroid Build Coastguard Worker ERROR("Monochrome is not supported in profile 1");
797*77c1e3ccSAndroid Build Coastguard Worker }
798*77c1e3ccSAndroid Build Coastguard Worker
799*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_profile <= (unsigned int)PROFILE_1 &&
800*77c1e3ccSAndroid Build Coastguard Worker cfg->g_bit_depth > AOM_BITS_10) {
801*77c1e3ccSAndroid Build Coastguard Worker ERROR("Codec bit-depth 12 not supported in profile < 2");
802*77c1e3ccSAndroid Build Coastguard Worker }
803*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_profile <= (unsigned int)PROFILE_1 &&
804*77c1e3ccSAndroid Build Coastguard Worker cfg->g_input_bit_depth > 10) {
805*77c1e3ccSAndroid Build Coastguard Worker ERROR("Source bit-depth 12 not supported in profile < 2");
806*77c1e3ccSAndroid Build Coastguard Worker }
807*77c1e3ccSAndroid Build Coastguard Worker
808*77c1e3ccSAndroid Build Coastguard Worker if (cfg->rc_end_usage == AOM_Q) {
809*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(cfg, use_fixed_qp_offsets, 1);
810*77c1e3ccSAndroid Build Coastguard Worker } else {
811*77c1e3ccSAndroid Build Coastguard Worker if (cfg->use_fixed_qp_offsets > 0) {
812*77c1e3ccSAndroid Build Coastguard Worker ERROR("--use_fixed_qp_offsets can only be used with --end-usage=q");
813*77c1e3ccSAndroid Build Coastguard Worker }
814*77c1e3ccSAndroid Build Coastguard Worker }
815*77c1e3ccSAndroid Build Coastguard Worker
816*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, color_primaries, AOM_CICP_CP_BT_709,
817*77c1e3ccSAndroid Build Coastguard Worker AOM_CICP_CP_EBU_3213); // Need to check range more precisely to
818*77c1e3ccSAndroid Build Coastguard Worker // check for reserved values?
819*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, transfer_characteristics, AOM_CICP_TC_BT_709,
820*77c1e3ccSAndroid Build Coastguard Worker AOM_CICP_TC_HLG);
821*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, matrix_coefficients, AOM_CICP_MC_IDENTITY,
822*77c1e3ccSAndroid Build Coastguard Worker AOM_CICP_MC_ICTCP);
823*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, color_range, 0, 1);
824*77c1e3ccSAndroid Build Coastguard Worker
825*77c1e3ccSAndroid Build Coastguard Worker /* Average corpus complexity is supported only in the case of single pass
826*77c1e3ccSAndroid Build Coastguard Worker * VBR*/
827*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_pass == AOM_RC_ONE_PASS && cfg->rc_end_usage == AOM_VBR)
828*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, vbr_corpus_complexity_lap,
829*77c1e3ccSAndroid Build Coastguard Worker MAX_VBR_CORPUS_COMPLEXITY);
830*77c1e3ccSAndroid Build Coastguard Worker else if (extra_cfg->vbr_corpus_complexity_lap != 0)
831*77c1e3ccSAndroid Build Coastguard Worker ERROR(
832*77c1e3ccSAndroid Build Coastguard Worker "VBR corpus complexity is supported only in the case of single pass "
833*77c1e3ccSAndroid Build Coastguard Worker "VBR mode.");
834*77c1e3ccSAndroid Build Coastguard Worker
835*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_TUNE_BUTTERAUGLI
836*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->tuning == AOM_TUNE_BUTTERAUGLI) {
837*77c1e3ccSAndroid Build Coastguard Worker ERROR(
838*77c1e3ccSAndroid Build Coastguard Worker "This error may be related to the wrong configuration options: try to "
839*77c1e3ccSAndroid Build Coastguard Worker "set -DCONFIG_TUNE_BUTTERAUGLI=1 at the time CMake is run.");
840*77c1e3ccSAndroid Build Coastguard Worker }
841*77c1e3ccSAndroid Build Coastguard Worker #endif
842*77c1e3ccSAndroid Build Coastguard Worker
843*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_TUNE_VMAF
844*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->tuning >= AOM_TUNE_VMAF_WITH_PREPROCESSING &&
845*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->tuning <= AOM_TUNE_VMAF_NEG_MAX_GAIN) {
846*77c1e3ccSAndroid Build Coastguard Worker ERROR(
847*77c1e3ccSAndroid Build Coastguard Worker "This error may be related to the wrong configuration options: try to "
848*77c1e3ccSAndroid Build Coastguard Worker "set -DCONFIG_TUNE_VMAF=1 at the time CMake is run.");
849*77c1e3ccSAndroid Build Coastguard Worker }
850*77c1e3ccSAndroid Build Coastguard Worker #endif
851*77c1e3ccSAndroid Build Coastguard Worker
852*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, tuning, AOM_TUNE_PSNR, AOM_TUNE_VMAF_SALIENCY_MAP);
853*77c1e3ccSAndroid Build Coastguard Worker
854*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, dist_metric, AOM_DIST_METRIC_PSNR,
855*77c1e3ccSAndroid Build Coastguard Worker AOM_DIST_METRIC_QM_PSNR);
856*77c1e3ccSAndroid Build Coastguard Worker
857*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, timing_info_type, AOM_TIMING_UNSPECIFIED,
858*77c1e3ccSAndroid Build Coastguard Worker AOM_TIMING_DEC_MODEL);
859*77c1e3ccSAndroid Build Coastguard Worker
860*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, film_grain_test_vector, 0, 16);
861*77c1e3ccSAndroid Build Coastguard Worker
862*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->lossless) {
863*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->aq_mode != 0)
864*77c1e3ccSAndroid Build Coastguard Worker ERROR("Only --aq_mode=0 can be used with --lossless=1.");
865*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->enable_chroma_deltaq)
866*77c1e3ccSAndroid Build Coastguard Worker ERROR("Only --enable_chroma_deltaq=0 can be used with --lossless=1.");
867*77c1e3ccSAndroid Build Coastguard Worker }
868*77c1e3ccSAndroid Build Coastguard Worker
869*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, max_reference_frames, 3, 7);
870*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, enable_reduced_reference_set, 0, 1);
871*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, chroma_subsampling_x, 1);
872*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, chroma_subsampling_y, 1);
873*77c1e3ccSAndroid Build Coastguard Worker
874*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, disable_trellis_quant, 3);
875*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, coeff_cost_upd_freq, 0, 3);
876*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, mode_cost_upd_freq, 0, 3);
877*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, mv_cost_upd_freq, 0, 3);
878*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, dv_cost_upd_freq, 0, 3);
879*77c1e3ccSAndroid Build Coastguard Worker
880*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, min_partition_size, 4, 128);
881*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, max_partition_size, 4, 128);
882*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, min_partition_size, extra_cfg->max_partition_size);
883*77c1e3ccSAndroid Build Coastguard Worker
884*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i) {
885*77c1e3ccSAndroid Build Coastguard Worker const int level_idx = extra_cfg->target_seq_level_idx[i];
886*77c1e3ccSAndroid Build Coastguard Worker if (!is_valid_seq_level_idx(level_idx) &&
887*77c1e3ccSAndroid Build Coastguard Worker level_idx != SEQ_LEVEL_KEEP_STATS) {
888*77c1e3ccSAndroid Build Coastguard Worker ERROR("Target sequence level index is invalid");
889*77c1e3ccSAndroid Build Coastguard Worker }
890*77c1e3ccSAndroid Build Coastguard Worker }
891*77c1e3ccSAndroid Build Coastguard Worker
892*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, deltaq_strength, 0, 1000);
893*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, loopfilter_control, 3);
894*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_BOOL(extra_cfg, skip_postproc_filtering);
895*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_HI(extra_cfg, enable_cdef, 2);
896*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_BOOL(extra_cfg, auto_intra_tools_off);
897*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_BOOL(extra_cfg, strict_level_conformance);
898*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK_BOOL(extra_cfg, sb_qp_sweep);
899*77c1e3ccSAndroid Build Coastguard Worker
900*77c1e3ccSAndroid Build Coastguard Worker RANGE_CHECK(extra_cfg, kf_max_pyr_height, -1, 5);
901*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->kf_max_pyr_height != -1 &&
902*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->kf_max_pyr_height < (int)extra_cfg->gf_min_pyr_height) {
903*77c1e3ccSAndroid Build Coastguard Worker ERROR(
904*77c1e3ccSAndroid Build Coastguard Worker "The value of kf-max-pyr-height should not be smaller than "
905*77c1e3ccSAndroid Build Coastguard Worker "gf-min-pyr-height");
906*77c1e3ccSAndroid Build Coastguard Worker }
907*77c1e3ccSAndroid Build Coastguard Worker
908*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
909*77c1e3ccSAndroid Build Coastguard Worker }
910*77c1e3ccSAndroid Build Coastguard Worker
validate_img(aom_codec_alg_priv_t * ctx,const aom_image_t * img)911*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t validate_img(aom_codec_alg_priv_t *ctx,
912*77c1e3ccSAndroid Build Coastguard Worker const aom_image_t *img) {
913*77c1e3ccSAndroid Build Coastguard Worker switch (img->fmt) {
914*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_YV12:
915*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_NV12:
916*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_I420:
917*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_YV1216:
918*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_I42016: break;
919*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_I444:
920*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_I44416:
921*77c1e3ccSAndroid Build Coastguard Worker if (ctx->cfg.g_profile == (unsigned int)PROFILE_0 &&
922*77c1e3ccSAndroid Build Coastguard Worker !ctx->cfg.monochrome) {
923*77c1e3ccSAndroid Build Coastguard Worker ERROR("Invalid image format. I444 images not supported in profile.");
924*77c1e3ccSAndroid Build Coastguard Worker }
925*77c1e3ccSAndroid Build Coastguard Worker break;
926*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_I422:
927*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_I42216:
928*77c1e3ccSAndroid Build Coastguard Worker if (ctx->cfg.g_profile != (unsigned int)PROFILE_2) {
929*77c1e3ccSAndroid Build Coastguard Worker ERROR("Invalid image format. I422 images not supported in profile.");
930*77c1e3ccSAndroid Build Coastguard Worker }
931*77c1e3ccSAndroid Build Coastguard Worker break;
932*77c1e3ccSAndroid Build Coastguard Worker default:
933*77c1e3ccSAndroid Build Coastguard Worker ERROR(
934*77c1e3ccSAndroid Build Coastguard Worker "Invalid image format. Only YV12, NV12, I420, I422, I444 images are "
935*77c1e3ccSAndroid Build Coastguard Worker "supported.");
936*77c1e3ccSAndroid Build Coastguard Worker break;
937*77c1e3ccSAndroid Build Coastguard Worker }
938*77c1e3ccSAndroid Build Coastguard Worker
939*77c1e3ccSAndroid Build Coastguard Worker if (img->d_w != ctx->cfg.g_w || img->d_h != ctx->cfg.g_h)
940*77c1e3ccSAndroid Build Coastguard Worker ERROR("Image size must match encoder init configuration size");
941*77c1e3ccSAndroid Build Coastguard Worker
942*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_TUNE_BUTTERAUGLI
943*77c1e3ccSAndroid Build Coastguard Worker if (ctx->extra_cfg.tuning == AOM_TUNE_BUTTERAUGLI) {
944*77c1e3ccSAndroid Build Coastguard Worker if (img->bit_depth > 8) {
945*77c1e3ccSAndroid Build Coastguard Worker ERROR("Only 8 bit depth images supported in tune=butteraugli mode.");
946*77c1e3ccSAndroid Build Coastguard Worker }
947*77c1e3ccSAndroid Build Coastguard Worker if (img->mc != 0 && img->mc != AOM_CICP_MC_BT_709 &&
948*77c1e3ccSAndroid Build Coastguard Worker img->mc != AOM_CICP_MC_BT_601 && img->mc != AOM_CICP_MC_BT_470_B_G) {
949*77c1e3ccSAndroid Build Coastguard Worker ERROR(
950*77c1e3ccSAndroid Build Coastguard Worker "Only BT.709 and BT.601 matrix coefficients supported in "
951*77c1e3ccSAndroid Build Coastguard Worker "tune=butteraugli mode. Identity matrix is treated as BT.601.");
952*77c1e3ccSAndroid Build Coastguard Worker }
953*77c1e3ccSAndroid Build Coastguard Worker }
954*77c1e3ccSAndroid Build Coastguard Worker #endif
955*77c1e3ccSAndroid Build Coastguard Worker
956*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
957*77c1e3ccSAndroid Build Coastguard Worker }
958*77c1e3ccSAndroid Build Coastguard Worker
get_image_bps(const aom_image_t * img)959*77c1e3ccSAndroid Build Coastguard Worker static int get_image_bps(const aom_image_t *img) {
960*77c1e3ccSAndroid Build Coastguard Worker switch (img->fmt) {
961*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_YV12:
962*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_NV12:
963*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_I420: return 12;
964*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_I422: return 16;
965*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_I444: return 24;
966*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_YV1216:
967*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_I42016: return 24;
968*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_I42216: return 32;
969*77c1e3ccSAndroid Build Coastguard Worker case AOM_IMG_FMT_I44416: return 48;
970*77c1e3ccSAndroid Build Coastguard Worker default: assert(0 && "Invalid image format"); break;
971*77c1e3ccSAndroid Build Coastguard Worker }
972*77c1e3ccSAndroid Build Coastguard Worker return 0;
973*77c1e3ccSAndroid Build Coastguard Worker }
974*77c1e3ccSAndroid Build Coastguard Worker
975*77c1e3ccSAndroid Build Coastguard Worker // Set appropriate options to disable frame super-resolution.
disable_superres(SuperResCfg * const superres_cfg)976*77c1e3ccSAndroid Build Coastguard Worker static void disable_superres(SuperResCfg *const superres_cfg) {
977*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_mode = AOM_SUPERRES_NONE;
978*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_scale_denominator = SCALE_NUMERATOR;
979*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_kf_scale_denominator = SCALE_NUMERATOR;
980*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_qthresh = 255;
981*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_kf_qthresh = 255;
982*77c1e3ccSAndroid Build Coastguard Worker }
983*77c1e3ccSAndroid Build Coastguard Worker
set_auto_tiles(TileConfig * const tile_cfg,unsigned int width,unsigned int height,unsigned int threads)984*77c1e3ccSAndroid Build Coastguard Worker static void set_auto_tiles(TileConfig *const tile_cfg, unsigned int width,
985*77c1e3ccSAndroid Build Coastguard Worker unsigned int height, unsigned int threads) {
986*77c1e3ccSAndroid Build Coastguard Worker int tile_cols_log2 = 0;
987*77c1e3ccSAndroid Build Coastguard Worker int tile_rows_log2 = 0;
988*77c1e3ccSAndroid Build Coastguard Worker if (threads < 2) return;
989*77c1e3ccSAndroid Build Coastguard Worker // Avoid small tiles because they are particularly bad for coding.
990*77c1e3ccSAndroid Build Coastguard Worker // Use no more tiles than the number of threads. Aim for one tile per
991*77c1e3ccSAndroid Build Coastguard Worker // thread. Using more than one thread inside one tile could be less
992*77c1e3ccSAndroid Build Coastguard Worker // efficient. Using more tiles than the number of threads would result
993*77c1e3ccSAndroid Build Coastguard Worker // in a compression penalty without much benefit.
994*77c1e3ccSAndroid Build Coastguard Worker const uint32_t kMinTileArea = 128 * 128;
995*77c1e3ccSAndroid Build Coastguard Worker const uint32_t kMaxTiles = 32;
996*77c1e3ccSAndroid Build Coastguard Worker uint32_t frame_area = width * height;
997*77c1e3ccSAndroid Build Coastguard Worker uint32_t tiles = (frame_area + kMinTileArea - 1) / kMinTileArea;
998*77c1e3ccSAndroid Build Coastguard Worker if (tiles > kMaxTiles) {
999*77c1e3ccSAndroid Build Coastguard Worker tiles = kMaxTiles;
1000*77c1e3ccSAndroid Build Coastguard Worker }
1001*77c1e3ccSAndroid Build Coastguard Worker if (tiles > threads) {
1002*77c1e3ccSAndroid Build Coastguard Worker tiles = threads;
1003*77c1e3ccSAndroid Build Coastguard Worker }
1004*77c1e3ccSAndroid Build Coastguard Worker int tiles_log2 = (int)log2(tiles);
1005*77c1e3ccSAndroid Build Coastguard Worker // If the frame width is equal or greater than the height, use more tile
1006*77c1e3ccSAndroid Build Coastguard Worker // columns than tile rows.
1007*77c1e3ccSAndroid Build Coastguard Worker if (width >= height) {
1008*77c1e3ccSAndroid Build Coastguard Worker tile_cols_log2 = (tiles_log2 + 1) / 2;
1009*77c1e3ccSAndroid Build Coastguard Worker tile_rows_log2 = tiles_log2 - tile_cols_log2;
1010*77c1e3ccSAndroid Build Coastguard Worker } else {
1011*77c1e3ccSAndroid Build Coastguard Worker tile_rows_log2 = (tiles_log2 + 1) / 2;
1012*77c1e3ccSAndroid Build Coastguard Worker tile_cols_log2 = tiles_log2 - tile_rows_log2;
1013*77c1e3ccSAndroid Build Coastguard Worker }
1014*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->tile_columns = tile_cols_log2;
1015*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->tile_rows = tile_rows_log2;
1016*77c1e3ccSAndroid Build Coastguard Worker }
1017*77c1e3ccSAndroid Build Coastguard Worker
update_default_encoder_config(const cfg_options_t * cfg,struct av1_extracfg * extra_cfg)1018*77c1e3ccSAndroid Build Coastguard Worker static void update_default_encoder_config(const cfg_options_t *cfg,
1019*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg *extra_cfg) {
1020*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_cdef = (cfg->disable_cdef == 0) ? 1 : 0;
1021*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_restoration = (cfg->disable_lr == 0);
1022*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->superblock_size =
1023*77c1e3ccSAndroid Build Coastguard Worker (cfg->super_block_size == 64) ? AOM_SUPERBLOCK_SIZE_64X64
1024*77c1e3ccSAndroid Build Coastguard Worker : (cfg->super_block_size == 128) ? AOM_SUPERBLOCK_SIZE_128X128
1025*77c1e3ccSAndroid Build Coastguard Worker : AOM_SUPERBLOCK_SIZE_DYNAMIC;
1026*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_warped_motion = (cfg->disable_warp_motion == 0);
1027*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_dist_wtd_comp = (cfg->disable_dist_wtd_comp == 0);
1028*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_diff_wtd_comp = (cfg->disable_diff_wtd_comp == 0);
1029*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_dual_filter = (cfg->disable_dual_filter == 0);
1030*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_angle_delta = (cfg->disable_intra_angle_delta == 0);
1031*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_rect_partitions = (cfg->disable_rect_partition_type == 0);
1032*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_ab_partitions = (cfg->disable_ab_partition_type == 0);
1033*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_1to4_partitions = (cfg->disable_1to4_partition_type == 0);
1034*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->max_partition_size = cfg->max_partition_size;
1035*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->min_partition_size = cfg->min_partition_size;
1036*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_intra_edge_filter = (cfg->disable_intra_edge_filter == 0);
1037*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_tx64 = (cfg->disable_tx_64x64 == 0);
1038*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_flip_idtx = (cfg->disable_flip_idtx == 0);
1039*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_masked_comp = (cfg->disable_masked_comp == 0);
1040*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_interintra_comp = (cfg->disable_inter_intra_comp == 0);
1041*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_smooth_interintra = (cfg->disable_smooth_inter_intra == 0);
1042*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_interinter_wedge = (cfg->disable_inter_inter_wedge == 0);
1043*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_interintra_wedge = (cfg->disable_inter_intra_wedge == 0);
1044*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_global_motion = (cfg->disable_global_motion == 0);
1045*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_filter_intra = (cfg->disable_filter_intra == 0);
1046*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_smooth_intra = (cfg->disable_smooth_intra == 0);
1047*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_paeth_intra = (cfg->disable_paeth_intra == 0);
1048*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_cfl_intra = (cfg->disable_cfl == 0);
1049*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_obmc = (cfg->disable_obmc == 0);
1050*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_palette = (cfg->disable_palette == 0);
1051*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_intrabc = (cfg->disable_intrabc == 0);
1052*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->disable_trellis_quant = cfg->disable_trellis_quant;
1053*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->allow_ref_frame_mvs = (cfg->disable_ref_frame_mv == 0);
1054*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_ref_frame_mvs = (cfg->disable_ref_frame_mv == 0);
1055*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_onesided_comp = (cfg->disable_one_sided_comp == 0);
1056*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_reduced_reference_set = cfg->reduced_reference_set;
1057*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->reduced_tx_type_set = cfg->reduced_tx_type_set;
1058*77c1e3ccSAndroid Build Coastguard Worker }
1059*77c1e3ccSAndroid Build Coastguard Worker
set_encoder_config(AV1EncoderConfig * oxcf,const aom_codec_enc_cfg_t * cfg,struct av1_extracfg * extra_cfg)1060*77c1e3ccSAndroid Build Coastguard Worker static void set_encoder_config(AV1EncoderConfig *oxcf,
1061*77c1e3ccSAndroid Build Coastguard Worker const aom_codec_enc_cfg_t *cfg,
1062*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg *extra_cfg) {
1063*77c1e3ccSAndroid Build Coastguard Worker if (cfg->encoder_cfg.init_by_cfg_file) {
1064*77c1e3ccSAndroid Build Coastguard Worker update_default_encoder_config(&cfg->encoder_cfg, extra_cfg);
1065*77c1e3ccSAndroid Build Coastguard Worker }
1066*77c1e3ccSAndroid Build Coastguard Worker
1067*77c1e3ccSAndroid Build Coastguard Worker TuneCfg *const tune_cfg = &oxcf->tune_cfg;
1068*77c1e3ccSAndroid Build Coastguard Worker FrameDimensionCfg *const frm_dim_cfg = &oxcf->frm_dim_cfg;
1069*77c1e3ccSAndroid Build Coastguard Worker TileConfig *const tile_cfg = &oxcf->tile_cfg;
1070*77c1e3ccSAndroid Build Coastguard Worker ResizeCfg *const resize_cfg = &oxcf->resize_cfg;
1071*77c1e3ccSAndroid Build Coastguard Worker GFConfig *const gf_cfg = &oxcf->gf_cfg;
1072*77c1e3ccSAndroid Build Coastguard Worker PartitionCfg *const part_cfg = &oxcf->part_cfg;
1073*77c1e3ccSAndroid Build Coastguard Worker IntraModeCfg *const intra_mode_cfg = &oxcf->intra_mode_cfg;
1074*77c1e3ccSAndroid Build Coastguard Worker TxfmSizeTypeCfg *const txfm_cfg = &oxcf->txfm_cfg;
1075*77c1e3ccSAndroid Build Coastguard Worker CompoundTypeCfg *const comp_type_cfg = &oxcf->comp_type_cfg;
1076*77c1e3ccSAndroid Build Coastguard Worker SuperResCfg *const superres_cfg = &oxcf->superres_cfg;
1077*77c1e3ccSAndroid Build Coastguard Worker KeyFrameCfg *const kf_cfg = &oxcf->kf_cfg;
1078*77c1e3ccSAndroid Build Coastguard Worker DecoderModelCfg *const dec_model_cfg = &oxcf->dec_model_cfg;
1079*77c1e3ccSAndroid Build Coastguard Worker RateControlCfg *const rc_cfg = &oxcf->rc_cfg;
1080*77c1e3ccSAndroid Build Coastguard Worker QuantizationCfg *const q_cfg = &oxcf->q_cfg;
1081*77c1e3ccSAndroid Build Coastguard Worker ColorCfg *const color_cfg = &oxcf->color_cfg;
1082*77c1e3ccSAndroid Build Coastguard Worker InputCfg *const input_cfg = &oxcf->input_cfg;
1083*77c1e3ccSAndroid Build Coastguard Worker AlgoCfg *const algo_cfg = &oxcf->algo_cfg;
1084*77c1e3ccSAndroid Build Coastguard Worker ToolCfg *const tool_cfg = &oxcf->tool_cfg;
1085*77c1e3ccSAndroid Build Coastguard Worker
1086*77c1e3ccSAndroid Build Coastguard Worker const int is_vbr = cfg->rc_end_usage == AOM_VBR;
1087*77c1e3ccSAndroid Build Coastguard Worker oxcf->profile = cfg->g_profile;
1088*77c1e3ccSAndroid Build Coastguard Worker oxcf->max_threads = (int)cfg->g_threads;
1089*77c1e3ccSAndroid Build Coastguard Worker
1090*77c1e3ccSAndroid Build Coastguard Worker switch (cfg->g_usage) {
1091*77c1e3ccSAndroid Build Coastguard Worker case AOM_USAGE_REALTIME: oxcf->mode = REALTIME; break;
1092*77c1e3ccSAndroid Build Coastguard Worker case AOM_USAGE_ALL_INTRA: oxcf->mode = ALLINTRA; break;
1093*77c1e3ccSAndroid Build Coastguard Worker default: oxcf->mode = GOOD; break;
1094*77c1e3ccSAndroid Build Coastguard Worker }
1095*77c1e3ccSAndroid Build Coastguard Worker
1096*77c1e3ccSAndroid Build Coastguard Worker // Set frame-dimension related configuration.
1097*77c1e3ccSAndroid Build Coastguard Worker frm_dim_cfg->width = cfg->g_w;
1098*77c1e3ccSAndroid Build Coastguard Worker frm_dim_cfg->height = cfg->g_h;
1099*77c1e3ccSAndroid Build Coastguard Worker frm_dim_cfg->forced_max_frame_width = cfg->g_forced_max_frame_width;
1100*77c1e3ccSAndroid Build Coastguard Worker frm_dim_cfg->forced_max_frame_height = cfg->g_forced_max_frame_height;
1101*77c1e3ccSAndroid Build Coastguard Worker frm_dim_cfg->render_width = extra_cfg->render_width;
1102*77c1e3ccSAndroid Build Coastguard Worker frm_dim_cfg->render_height = extra_cfg->render_height;
1103*77c1e3ccSAndroid Build Coastguard Worker
1104*77c1e3ccSAndroid Build Coastguard Worker // Set input video related configuration.
1105*77c1e3ccSAndroid Build Coastguard Worker input_cfg->input_bit_depth = cfg->g_input_bit_depth;
1106*77c1e3ccSAndroid Build Coastguard Worker // guess a frame rate if out of whack, use 30
1107*77c1e3ccSAndroid Build Coastguard Worker input_cfg->init_framerate = (double)cfg->g_timebase.den / cfg->g_timebase.num;
1108*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_pass >= AOM_RC_SECOND_PASS) {
1109*77c1e3ccSAndroid Build Coastguard Worker const size_t packet_sz = sizeof(FIRSTPASS_STATS);
1110*77c1e3ccSAndroid Build Coastguard Worker const int n_packets = (int)(cfg->rc_twopass_stats_in.sz / packet_sz);
1111*77c1e3ccSAndroid Build Coastguard Worker input_cfg->limit = n_packets - 1;
1112*77c1e3ccSAndroid Build Coastguard Worker } else {
1113*77c1e3ccSAndroid Build Coastguard Worker input_cfg->limit = cfg->g_limit;
1114*77c1e3ccSAndroid Build Coastguard Worker }
1115*77c1e3ccSAndroid Build Coastguard Worker input_cfg->chroma_subsampling_x = extra_cfg->chroma_subsampling_x;
1116*77c1e3ccSAndroid Build Coastguard Worker input_cfg->chroma_subsampling_y = extra_cfg->chroma_subsampling_y;
1117*77c1e3ccSAndroid Build Coastguard Worker if (input_cfg->init_framerate > 180) {
1118*77c1e3ccSAndroid Build Coastguard Worker input_cfg->init_framerate = 30;
1119*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->timing_info_present = 0;
1120*77c1e3ccSAndroid Build Coastguard Worker }
1121*77c1e3ccSAndroid Build Coastguard Worker
1122*77c1e3ccSAndroid Build Coastguard Worker // Set Decoder model configuration.
1123*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->timing_info_type == AOM_TIMING_EQUAL ||
1124*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->timing_info_type == AOM_TIMING_DEC_MODEL) {
1125*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->timing_info_present = 1;
1126*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->timing_info.num_units_in_display_tick = cfg->g_timebase.num;
1127*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->timing_info.time_scale = cfg->g_timebase.den;
1128*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->timing_info.num_ticks_per_picture = 1;
1129*77c1e3ccSAndroid Build Coastguard Worker } else {
1130*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->timing_info_present = 0;
1131*77c1e3ccSAndroid Build Coastguard Worker }
1132*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->timing_info_type == AOM_TIMING_EQUAL) {
1133*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->timing_info.equal_picture_interval = 1;
1134*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->decoder_model_info_present_flag = 0;
1135*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->display_model_info_present_flag = 1;
1136*77c1e3ccSAndroid Build Coastguard Worker } else if (extra_cfg->timing_info_type == AOM_TIMING_DEC_MODEL) {
1137*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->num_units_in_decoding_tick = cfg->g_timebase.num;
1138*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->timing_info.equal_picture_interval = 0;
1139*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->decoder_model_info_present_flag = 1;
1140*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->display_model_info_present_flag = 1;
1141*77c1e3ccSAndroid Build Coastguard Worker }
1142*77c1e3ccSAndroid Build Coastguard Worker
1143*77c1e3ccSAndroid Build Coastguard Worker oxcf->pass = cfg->g_pass;
1144*77c1e3ccSAndroid Build Coastguard Worker // For backward compatibility, assume that if extra_cfg->passes==-1, then
1145*77c1e3ccSAndroid Build Coastguard Worker // passes = 1 or 2.
1146*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->passes == -1) {
1147*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_pass == AOM_RC_ONE_PASS) {
1148*77c1e3ccSAndroid Build Coastguard Worker oxcf->passes = 1;
1149*77c1e3ccSAndroid Build Coastguard Worker } else {
1150*77c1e3ccSAndroid Build Coastguard Worker oxcf->passes = 2;
1151*77c1e3ccSAndroid Build Coastguard Worker }
1152*77c1e3ccSAndroid Build Coastguard Worker } else {
1153*77c1e3ccSAndroid Build Coastguard Worker oxcf->passes = extra_cfg->passes;
1154*77c1e3ccSAndroid Build Coastguard Worker }
1155*77c1e3ccSAndroid Build Coastguard Worker
1156*77c1e3ccSAndroid Build Coastguard Worker // Set Rate Control configuration.
1157*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->max_intra_bitrate_pct = extra_cfg->rc_max_intra_bitrate_pct;
1158*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->max_inter_bitrate_pct = extra_cfg->rc_max_inter_bitrate_pct;
1159*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->gf_cbr_boost_pct = extra_cfg->gf_cbr_boost_pct;
1160*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->mode = cfg->rc_end_usage;
1161*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->min_cr = extra_cfg->min_cr;
1162*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->best_allowed_q =
1163*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->lossless ? 0 : av1_quantizer_to_qindex(cfg->rc_min_quantizer);
1164*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->worst_allowed_q =
1165*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->lossless ? 0 : av1_quantizer_to_qindex(cfg->rc_max_quantizer);
1166*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->cq_level = av1_quantizer_to_qindex(extra_cfg->cq_level);
1167*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->under_shoot_pct = cfg->rc_undershoot_pct;
1168*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->over_shoot_pct = cfg->rc_overshoot_pct;
1169*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->maximum_buffer_size_ms = is_vbr ? 240000 : cfg->rc_buf_sz;
1170*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->starting_buffer_level_ms = is_vbr ? 60000 : cfg->rc_buf_initial_sz;
1171*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->optimal_buffer_level_ms = is_vbr ? 60000 : cfg->rc_buf_optimal_sz;
1172*77c1e3ccSAndroid Build Coastguard Worker // Convert target bandwidth from Kbit/s to Bit/s
1173*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->target_bandwidth = 1000 * cfg->rc_target_bitrate;
1174*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->drop_frames_water_mark = cfg->rc_dropframe_thresh;
1175*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->vbr_corpus_complexity_lap = extra_cfg->vbr_corpus_complexity_lap;
1176*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->vbrbias = cfg->rc_2pass_vbr_bias_pct;
1177*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->vbrmin_section = cfg->rc_2pass_vbr_minsection_pct;
1178*77c1e3ccSAndroid Build Coastguard Worker rc_cfg->vbrmax_section = cfg->rc_2pass_vbr_maxsection_pct;
1179*77c1e3ccSAndroid Build Coastguard Worker
1180*77c1e3ccSAndroid Build Coastguard Worker // Set Toolset related configuration.
1181*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->bit_depth = cfg->g_bit_depth;
1182*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->cdef_control = (CDEF_CONTROL)extra_cfg->enable_cdef;
1183*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->enable_restoration =
1184*77c1e3ccSAndroid Build Coastguard Worker (cfg->g_usage == AOM_USAGE_REALTIME) ? 0 : extra_cfg->enable_restoration;
1185*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->force_video_mode = extra_cfg->force_video_mode;
1186*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->enable_palette = extra_cfg->enable_palette;
1187*77c1e3ccSAndroid Build Coastguard Worker // FIXME(debargha): Should this be:
1188*77c1e3ccSAndroid Build Coastguard Worker // tool_cfg->enable_ref_frame_mvs = extra_cfg->allow_ref_frame_mvs &
1189*77c1e3ccSAndroid Build Coastguard Worker // extra_cfg->enable_order_hint ?
1190*77c1e3ccSAndroid Build Coastguard Worker // Disallow using temporal MVs while large_scale_tile = 1.
1191*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->enable_ref_frame_mvs =
1192*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->allow_ref_frame_mvs && !cfg->large_scale_tile;
1193*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->superblock_size = extra_cfg->superblock_size;
1194*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->enable_monochrome = cfg->monochrome;
1195*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->full_still_picture_hdr = cfg->full_still_picture_hdr != 0;
1196*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->enable_dual_filter = extra_cfg->enable_dual_filter;
1197*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->enable_order_hint = extra_cfg->enable_order_hint;
1198*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->enable_interintra_comp = extra_cfg->enable_interintra_comp;
1199*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->ref_frame_mvs_present =
1200*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_ref_frame_mvs & extra_cfg->enable_order_hint;
1201*77c1e3ccSAndroid Build Coastguard Worker
1202*77c1e3ccSAndroid Build Coastguard Worker // Explicitly disable global motion in a few cases:
1203*77c1e3ccSAndroid Build Coastguard Worker // * For realtime mode, we never search global motion, and disabling
1204*77c1e3ccSAndroid Build Coastguard Worker // it here prevents later code from allocating buffers we don't need
1205*77c1e3ccSAndroid Build Coastguard Worker // * For large scale tile mode, some of the intended use cases expect
1206*77c1e3ccSAndroid Build Coastguard Worker // all frame headers to be identical. This breaks if global motion is
1207*77c1e3ccSAndroid Build Coastguard Worker // used, since global motion data is stored in the frame header.
1208*77c1e3ccSAndroid Build Coastguard Worker // eg, see test/lightfield_test.sh, which checks that all frame headers
1209*77c1e3ccSAndroid Build Coastguard Worker // are the same.
1210*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->enable_global_motion = extra_cfg->enable_global_motion &&
1211*77c1e3ccSAndroid Build Coastguard Worker cfg->g_usage != AOM_USAGE_REALTIME &&
1212*77c1e3ccSAndroid Build Coastguard Worker !cfg->large_scale_tile;
1213*77c1e3ccSAndroid Build Coastguard Worker
1214*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->error_resilient_mode =
1215*77c1e3ccSAndroid Build Coastguard Worker cfg->g_error_resilient | extra_cfg->error_resilient_mode;
1216*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->frame_parallel_decoding_mode =
1217*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->frame_parallel_decoding_mode;
1218*77c1e3ccSAndroid Build Coastguard Worker
1219*77c1e3ccSAndroid Build Coastguard Worker // Set Quantization related configuration.
1220*77c1e3ccSAndroid Build Coastguard Worker q_cfg->using_qm = extra_cfg->enable_qm;
1221*77c1e3ccSAndroid Build Coastguard Worker q_cfg->qm_minlevel = extra_cfg->qm_min;
1222*77c1e3ccSAndroid Build Coastguard Worker q_cfg->qm_maxlevel = extra_cfg->qm_max;
1223*77c1e3ccSAndroid Build Coastguard Worker q_cfg->quant_b_adapt = extra_cfg->quant_b_adapt;
1224*77c1e3ccSAndroid Build Coastguard Worker q_cfg->enable_chroma_deltaq = extra_cfg->enable_chroma_deltaq;
1225*77c1e3ccSAndroid Build Coastguard Worker q_cfg->aq_mode = extra_cfg->aq_mode;
1226*77c1e3ccSAndroid Build Coastguard Worker q_cfg->deltaq_mode = extra_cfg->deltaq_mode;
1227*77c1e3ccSAndroid Build Coastguard Worker q_cfg->deltaq_strength = extra_cfg->deltaq_strength;
1228*77c1e3ccSAndroid Build Coastguard Worker q_cfg->use_fixed_qp_offsets =
1229*77c1e3ccSAndroid Build Coastguard Worker cfg->use_fixed_qp_offsets && (rc_cfg->mode == AOM_Q);
1230*77c1e3ccSAndroid Build Coastguard Worker q_cfg->enable_hdr_deltaq =
1231*77c1e3ccSAndroid Build Coastguard Worker (q_cfg->deltaq_mode == DELTA_Q_HDR) &&
1232*77c1e3ccSAndroid Build Coastguard Worker (cfg->g_bit_depth == AOM_BITS_10) &&
1233*77c1e3ccSAndroid Build Coastguard Worker (extra_cfg->color_primaries == AOM_CICP_CP_BT_2020);
1234*77c1e3ccSAndroid Build Coastguard Worker
1235*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->enable_deltalf_mode =
1236*77c1e3ccSAndroid Build Coastguard Worker (q_cfg->deltaq_mode != NO_DELTA_Q) && extra_cfg->deltalf_mode;
1237*77c1e3ccSAndroid Build Coastguard Worker
1238*77c1e3ccSAndroid Build Coastguard Worker // Set cost update frequency configuration.
1239*77c1e3ccSAndroid Build Coastguard Worker oxcf->cost_upd_freq.coeff = (COST_UPDATE_TYPE)extra_cfg->coeff_cost_upd_freq;
1240*77c1e3ccSAndroid Build Coastguard Worker oxcf->cost_upd_freq.mode = (COST_UPDATE_TYPE)extra_cfg->mode_cost_upd_freq;
1241*77c1e3ccSAndroid Build Coastguard Worker // Avoid MV cost update for allintra encoding mode.
1242*77c1e3ccSAndroid Build Coastguard Worker oxcf->cost_upd_freq.mv = (cfg->kf_max_dist != 0)
1243*77c1e3ccSAndroid Build Coastguard Worker ? (COST_UPDATE_TYPE)extra_cfg->mv_cost_upd_freq
1244*77c1e3ccSAndroid Build Coastguard Worker : COST_UPD_OFF;
1245*77c1e3ccSAndroid Build Coastguard Worker oxcf->cost_upd_freq.dv = (COST_UPDATE_TYPE)extra_cfg->dv_cost_upd_freq;
1246*77c1e3ccSAndroid Build Coastguard Worker
1247*77c1e3ccSAndroid Build Coastguard Worker // Set frame resize mode configuration.
1248*77c1e3ccSAndroid Build Coastguard Worker resize_cfg->resize_mode = (RESIZE_MODE)cfg->rc_resize_mode;
1249*77c1e3ccSAndroid Build Coastguard Worker resize_cfg->resize_scale_denominator = (uint8_t)cfg->rc_resize_denominator;
1250*77c1e3ccSAndroid Build Coastguard Worker resize_cfg->resize_kf_scale_denominator =
1251*77c1e3ccSAndroid Build Coastguard Worker (uint8_t)cfg->rc_resize_kf_denominator;
1252*77c1e3ccSAndroid Build Coastguard Worker if (resize_cfg->resize_mode == RESIZE_FIXED &&
1253*77c1e3ccSAndroid Build Coastguard Worker resize_cfg->resize_scale_denominator == SCALE_NUMERATOR &&
1254*77c1e3ccSAndroid Build Coastguard Worker resize_cfg->resize_kf_scale_denominator == SCALE_NUMERATOR)
1255*77c1e3ccSAndroid Build Coastguard Worker resize_cfg->resize_mode = RESIZE_NONE;
1256*77c1e3ccSAndroid Build Coastguard Worker
1257*77c1e3ccSAndroid Build Coastguard Worker // Set encoder algorithm related configuration.
1258*77c1e3ccSAndroid Build Coastguard Worker algo_cfg->enable_overlay = extra_cfg->enable_overlay;
1259*77c1e3ccSAndroid Build Coastguard Worker algo_cfg->disable_trellis_quant = extra_cfg->disable_trellis_quant;
1260*77c1e3ccSAndroid Build Coastguard Worker algo_cfg->sharpness = extra_cfg->sharpness;
1261*77c1e3ccSAndroid Build Coastguard Worker algo_cfg->arnr_max_frames = extra_cfg->arnr_max_frames;
1262*77c1e3ccSAndroid Build Coastguard Worker algo_cfg->arnr_strength = extra_cfg->arnr_strength;
1263*77c1e3ccSAndroid Build Coastguard Worker algo_cfg->cdf_update_mode = (uint8_t)extra_cfg->cdf_update_mode;
1264*77c1e3ccSAndroid Build Coastguard Worker // TODO(any): Fix and Enable TPL for resize-mode > 0
1265*77c1e3ccSAndroid Build Coastguard Worker algo_cfg->enable_tpl_model =
1266*77c1e3ccSAndroid Build Coastguard Worker resize_cfg->resize_mode ? 0 : extra_cfg->enable_tpl_model;
1267*77c1e3ccSAndroid Build Coastguard Worker algo_cfg->loopfilter_control = extra_cfg->loopfilter_control;
1268*77c1e3ccSAndroid Build Coastguard Worker algo_cfg->skip_postproc_filtering = extra_cfg->skip_postproc_filtering;
1269*77c1e3ccSAndroid Build Coastguard Worker
1270*77c1e3ccSAndroid Build Coastguard Worker // Set two-pass stats configuration.
1271*77c1e3ccSAndroid Build Coastguard Worker oxcf->twopass_stats_in = cfg->rc_twopass_stats_in;
1272*77c1e3ccSAndroid Build Coastguard Worker
1273*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->two_pass_output)
1274*77c1e3ccSAndroid Build Coastguard Worker oxcf->two_pass_output = extra_cfg->two_pass_output;
1275*77c1e3ccSAndroid Build Coastguard Worker
1276*77c1e3ccSAndroid Build Coastguard Worker oxcf->second_pass_log = extra_cfg->second_pass_log;
1277*77c1e3ccSAndroid Build Coastguard Worker
1278*77c1e3ccSAndroid Build Coastguard Worker // Set Key frame configuration.
1279*77c1e3ccSAndroid Build Coastguard Worker kf_cfg->fwd_kf_enabled = cfg->fwd_kf_enabled;
1280*77c1e3ccSAndroid Build Coastguard Worker kf_cfg->auto_key =
1281*77c1e3ccSAndroid Build Coastguard Worker cfg->kf_mode == AOM_KF_AUTO && cfg->kf_min_dist != cfg->kf_max_dist;
1282*77c1e3ccSAndroid Build Coastguard Worker kf_cfg->key_freq_min = cfg->kf_min_dist;
1283*77c1e3ccSAndroid Build Coastguard Worker kf_cfg->key_freq_max = cfg->kf_max_dist;
1284*77c1e3ccSAndroid Build Coastguard Worker kf_cfg->sframe_dist = cfg->sframe_dist;
1285*77c1e3ccSAndroid Build Coastguard Worker kf_cfg->sframe_mode = cfg->sframe_mode;
1286*77c1e3ccSAndroid Build Coastguard Worker kf_cfg->enable_sframe = extra_cfg->s_frame_mode;
1287*77c1e3ccSAndroid Build Coastguard Worker kf_cfg->enable_keyframe_filtering = extra_cfg->enable_keyframe_filtering;
1288*77c1e3ccSAndroid Build Coastguard Worker kf_cfg->fwd_kf_dist = extra_cfg->fwd_kf_dist;
1289*77c1e3ccSAndroid Build Coastguard Worker // Disable key frame filtering in all intra mode.
1290*77c1e3ccSAndroid Build Coastguard Worker if (cfg->kf_max_dist == 0) {
1291*77c1e3ccSAndroid Build Coastguard Worker kf_cfg->enable_keyframe_filtering = 0;
1292*77c1e3ccSAndroid Build Coastguard Worker }
1293*77c1e3ccSAndroid Build Coastguard Worker kf_cfg->enable_intrabc = extra_cfg->enable_intrabc;
1294*77c1e3ccSAndroid Build Coastguard Worker
1295*77c1e3ccSAndroid Build Coastguard Worker oxcf->speed = extra_cfg->cpu_used;
1296*77c1e3ccSAndroid Build Coastguard Worker // TODO(yunqingwang, any) In REALTIME mode, 1080p performance at speed 5 & 6
1297*77c1e3ccSAndroid Build Coastguard Worker // is quite bad. Force to use speed 7 for now. Will investigate it when we
1298*77c1e3ccSAndroid Build Coastguard Worker // work on rd path optimization later.
1299*77c1e3ccSAndroid Build Coastguard Worker if (oxcf->mode == REALTIME && AOMMIN(cfg->g_w, cfg->g_h) >= 1080 &&
1300*77c1e3ccSAndroid Build Coastguard Worker oxcf->speed < 7)
1301*77c1e3ccSAndroid Build Coastguard Worker oxcf->speed = 7;
1302*77c1e3ccSAndroid Build Coastguard Worker
1303*77c1e3ccSAndroid Build Coastguard Worker // Set Color related configuration.
1304*77c1e3ccSAndroid Build Coastguard Worker color_cfg->color_primaries = extra_cfg->color_primaries;
1305*77c1e3ccSAndroid Build Coastguard Worker color_cfg->transfer_characteristics = extra_cfg->transfer_characteristics;
1306*77c1e3ccSAndroid Build Coastguard Worker color_cfg->matrix_coefficients = extra_cfg->matrix_coefficients;
1307*77c1e3ccSAndroid Build Coastguard Worker color_cfg->color_range = extra_cfg->color_range;
1308*77c1e3ccSAndroid Build Coastguard Worker color_cfg->chroma_sample_position = extra_cfg->chroma_sample_position;
1309*77c1e3ccSAndroid Build Coastguard Worker
1310*77c1e3ccSAndroid Build Coastguard Worker // Set Group of frames configuration.
1311*77c1e3ccSAndroid Build Coastguard Worker // Force lag_in_frames to 0 for REALTIME mode
1312*77c1e3ccSAndroid Build Coastguard Worker gf_cfg->lag_in_frames = (oxcf->mode == REALTIME)
1313*77c1e3ccSAndroid Build Coastguard Worker ? 0
1314*77c1e3ccSAndroid Build Coastguard Worker : clamp(cfg->g_lag_in_frames, 0, MAX_LAG_BUFFERS);
1315*77c1e3ccSAndroid Build Coastguard Worker gf_cfg->enable_auto_arf = extra_cfg->enable_auto_alt_ref;
1316*77c1e3ccSAndroid Build Coastguard Worker gf_cfg->enable_auto_brf = extra_cfg->enable_auto_bwd_ref;
1317*77c1e3ccSAndroid Build Coastguard Worker gf_cfg->min_gf_interval = extra_cfg->min_gf_interval;
1318*77c1e3ccSAndroid Build Coastguard Worker gf_cfg->max_gf_interval = extra_cfg->max_gf_interval;
1319*77c1e3ccSAndroid Build Coastguard Worker gf_cfg->gf_min_pyr_height = extra_cfg->gf_min_pyr_height;
1320*77c1e3ccSAndroid Build Coastguard Worker gf_cfg->gf_max_pyr_height = extra_cfg->gf_max_pyr_height;
1321*77c1e3ccSAndroid Build Coastguard Worker
1322*77c1e3ccSAndroid Build Coastguard Worker // Set tune related configuration.
1323*77c1e3ccSAndroid Build Coastguard Worker tune_cfg->tuning = extra_cfg->tuning;
1324*77c1e3ccSAndroid Build Coastguard Worker tune_cfg->vmaf_model_path = extra_cfg->vmaf_model_path;
1325*77c1e3ccSAndroid Build Coastguard Worker tune_cfg->content = extra_cfg->content;
1326*77c1e3ccSAndroid Build Coastguard Worker if (cfg->large_scale_tile) {
1327*77c1e3ccSAndroid Build Coastguard Worker tune_cfg->film_grain_test_vector = 0;
1328*77c1e3ccSAndroid Build Coastguard Worker tune_cfg->film_grain_table_filename = NULL;
1329*77c1e3ccSAndroid Build Coastguard Worker } else {
1330*77c1e3ccSAndroid Build Coastguard Worker tune_cfg->film_grain_test_vector = extra_cfg->film_grain_test_vector;
1331*77c1e3ccSAndroid Build Coastguard Worker tune_cfg->film_grain_table_filename = extra_cfg->film_grain_table_filename;
1332*77c1e3ccSAndroid Build Coastguard Worker }
1333*77c1e3ccSAndroid Build Coastguard Worker tune_cfg->dist_metric = extra_cfg->dist_metric;
1334*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_DENOISE
1335*77c1e3ccSAndroid Build Coastguard Worker oxcf->noise_level = extra_cfg->noise_level;
1336*77c1e3ccSAndroid Build Coastguard Worker oxcf->noise_block_size = extra_cfg->noise_block_size;
1337*77c1e3ccSAndroid Build Coastguard Worker oxcf->enable_dnl_denoising = extra_cfg->enable_dnl_denoising;
1338*77c1e3ccSAndroid Build Coastguard Worker #endif
1339*77c1e3ccSAndroid Build Coastguard Worker
1340*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_AV1_TEMPORAL_DENOISING
1341*77c1e3ccSAndroid Build Coastguard Worker // Temporal denoiser is for nonrd pickmode so disable it for speed < 7.
1342*77c1e3ccSAndroid Build Coastguard Worker // Also disable it for speed 7 for now since it needs to be modified for
1343*77c1e3ccSAndroid Build Coastguard Worker // the check_partition_merge_mode feature.
1344*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_bit_depth == AOM_BITS_8 && oxcf->speed > 7) {
1345*77c1e3ccSAndroid Build Coastguard Worker oxcf->noise_sensitivity = extra_cfg->noise_sensitivity;
1346*77c1e3ccSAndroid Build Coastguard Worker } else {
1347*77c1e3ccSAndroid Build Coastguard Worker oxcf->noise_sensitivity = 0;
1348*77c1e3ccSAndroid Build Coastguard Worker }
1349*77c1e3ccSAndroid Build Coastguard Worker #endif
1350*77c1e3ccSAndroid Build Coastguard Worker // Set Tile related configuration.
1351*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->num_tile_groups = extra_cfg->num_tg;
1352*77c1e3ccSAndroid Build Coastguard Worker // In large-scale tile encoding mode, num_tile_groups is always 1.
1353*77c1e3ccSAndroid Build Coastguard Worker if (cfg->large_scale_tile) tile_cfg->num_tile_groups = 1;
1354*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->mtu = extra_cfg->mtu_size;
1355*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->enable_large_scale_tile = cfg->large_scale_tile;
1356*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->enable_single_tile_decoding =
1357*77c1e3ccSAndroid Build Coastguard Worker (tile_cfg->enable_large_scale_tile) ? extra_cfg->single_tile_decoding : 0;
1358*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->auto_tiles) {
1359*77c1e3ccSAndroid Build Coastguard Worker set_auto_tiles(tile_cfg, cfg->g_w, cfg->g_h, cfg->g_threads);
1360*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->tile_columns = tile_cfg->tile_columns;
1361*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->tile_rows = tile_cfg->tile_rows;
1362*77c1e3ccSAndroid Build Coastguard Worker } else {
1363*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->tile_columns = extra_cfg->tile_columns;
1364*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->tile_rows = extra_cfg->tile_rows;
1365*77c1e3ccSAndroid Build Coastguard Worker }
1366*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->tile_width_count = AOMMIN(cfg->tile_width_count, MAX_TILE_COLS);
1367*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->tile_height_count = AOMMIN(cfg->tile_height_count, MAX_TILE_ROWS);
1368*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < tile_cfg->tile_width_count; i++) {
1369*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->tile_widths[i] = cfg->tile_widths[i];
1370*77c1e3ccSAndroid Build Coastguard Worker }
1371*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < tile_cfg->tile_height_count; i++) {
1372*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->tile_heights[i] = cfg->tile_heights[i];
1373*77c1e3ccSAndroid Build Coastguard Worker }
1374*77c1e3ccSAndroid Build Coastguard Worker tile_cfg->enable_ext_tile_debug = extra_cfg->ext_tile_debug;
1375*77c1e3ccSAndroid Build Coastguard Worker
1376*77c1e3ccSAndroid Build Coastguard Worker if (tile_cfg->enable_large_scale_tile) {
1377*77c1e3ccSAndroid Build Coastguard Worker // The superblock_size can only be AOM_SUPERBLOCK_SIZE_64X64 or
1378*77c1e3ccSAndroid Build Coastguard Worker // AOM_SUPERBLOCK_SIZE_128X128 while tile_cfg->enable_large_scale_tile = 1.
1379*77c1e3ccSAndroid Build Coastguard Worker // If superblock_size = AOM_SUPERBLOCK_SIZE_DYNAMIC, hard set it to
1380*77c1e3ccSAndroid Build Coastguard Worker // AOM_SUPERBLOCK_SIZE_64X64(default value in large_scale_tile).
1381*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->superblock_size != AOM_SUPERBLOCK_SIZE_64X64 &&
1382*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->superblock_size != AOM_SUPERBLOCK_SIZE_128X128)
1383*77c1e3ccSAndroid Build Coastguard Worker tool_cfg->superblock_size = AOM_SUPERBLOCK_SIZE_64X64;
1384*77c1e3ccSAndroid Build Coastguard Worker }
1385*77c1e3ccSAndroid Build Coastguard Worker
1386*77c1e3ccSAndroid Build Coastguard Worker // Set reference frame related configuration.
1387*77c1e3ccSAndroid Build Coastguard Worker oxcf->ref_frm_cfg.max_reference_frames = extra_cfg->max_reference_frames;
1388*77c1e3ccSAndroid Build Coastguard Worker oxcf->ref_frm_cfg.enable_reduced_reference_set =
1389*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_reduced_reference_set;
1390*77c1e3ccSAndroid Build Coastguard Worker oxcf->ref_frm_cfg.enable_onesided_comp = extra_cfg->enable_onesided_comp;
1391*77c1e3ccSAndroid Build Coastguard Worker
1392*77c1e3ccSAndroid Build Coastguard Worker oxcf->row_mt = extra_cfg->row_mt;
1393*77c1e3ccSAndroid Build Coastguard Worker oxcf->fp_mt = extra_cfg->fp_mt;
1394*77c1e3ccSAndroid Build Coastguard Worker
1395*77c1e3ccSAndroid Build Coastguard Worker // Set motion mode related configuration.
1396*77c1e3ccSAndroid Build Coastguard Worker oxcf->motion_mode_cfg.enable_obmc = extra_cfg->enable_obmc;
1397*77c1e3ccSAndroid Build Coastguard Worker oxcf->motion_mode_cfg.enable_warped_motion = extra_cfg->enable_warped_motion;
1398*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
1399*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_usage == AOM_USAGE_REALTIME && oxcf->speed >= 7 &&
1400*77c1e3ccSAndroid Build Coastguard Worker oxcf->tune_cfg.content == AOM_CONTENT_SCREEN) {
1401*77c1e3ccSAndroid Build Coastguard Worker // TODO(marpan): warped motion is causing a crash for RT mode with screen
1402*77c1e3ccSAndroid Build Coastguard Worker // in nonrd (speed >= 7), for non-realtime build.
1403*77c1e3ccSAndroid Build Coastguard Worker // Re-enable/allow when the issue is fixed.
1404*77c1e3ccSAndroid Build Coastguard Worker oxcf->motion_mode_cfg.enable_warped_motion = 0;
1405*77c1e3ccSAndroid Build Coastguard Worker oxcf->motion_mode_cfg.allow_warped_motion = 0;
1406*77c1e3ccSAndroid Build Coastguard Worker } else {
1407*77c1e3ccSAndroid Build Coastguard Worker oxcf->motion_mode_cfg.allow_warped_motion =
1408*77c1e3ccSAndroid Build Coastguard Worker (extra_cfg->allow_warped_motion & extra_cfg->enable_warped_motion);
1409*77c1e3ccSAndroid Build Coastguard Worker }
1410*77c1e3ccSAndroid Build Coastguard Worker #else
1411*77c1e3ccSAndroid Build Coastguard Worker oxcf->motion_mode_cfg.allow_warped_motion =
1412*77c1e3ccSAndroid Build Coastguard Worker (cfg->g_usage == AOM_USAGE_REALTIME && oxcf->speed >= 7)
1413*77c1e3ccSAndroid Build Coastguard Worker ? false
1414*77c1e3ccSAndroid Build Coastguard Worker : (extra_cfg->allow_warped_motion & extra_cfg->enable_warped_motion);
1415*77c1e3ccSAndroid Build Coastguard Worker #endif
1416*77c1e3ccSAndroid Build Coastguard Worker
1417*77c1e3ccSAndroid Build Coastguard Worker // Set partition related configuration.
1418*77c1e3ccSAndroid Build Coastguard Worker part_cfg->enable_rect_partitions = extra_cfg->enable_rect_partitions;
1419*77c1e3ccSAndroid Build Coastguard Worker part_cfg->enable_ab_partitions = extra_cfg->enable_ab_partitions;
1420*77c1e3ccSAndroid Build Coastguard Worker part_cfg->enable_1to4_partitions = extra_cfg->enable_1to4_partitions;
1421*77c1e3ccSAndroid Build Coastguard Worker part_cfg->min_partition_size = extra_cfg->min_partition_size;
1422*77c1e3ccSAndroid Build Coastguard Worker part_cfg->max_partition_size = extra_cfg->max_partition_size;
1423*77c1e3ccSAndroid Build Coastguard Worker
1424*77c1e3ccSAndroid Build Coastguard Worker // Set intra mode configuration.
1425*77c1e3ccSAndroid Build Coastguard Worker intra_mode_cfg->enable_angle_delta = extra_cfg->enable_angle_delta;
1426*77c1e3ccSAndroid Build Coastguard Worker intra_mode_cfg->enable_intra_edge_filter =
1427*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_intra_edge_filter;
1428*77c1e3ccSAndroid Build Coastguard Worker intra_mode_cfg->enable_filter_intra = extra_cfg->enable_filter_intra;
1429*77c1e3ccSAndroid Build Coastguard Worker intra_mode_cfg->enable_smooth_intra = extra_cfg->enable_smooth_intra;
1430*77c1e3ccSAndroid Build Coastguard Worker intra_mode_cfg->enable_paeth_intra = extra_cfg->enable_paeth_intra;
1431*77c1e3ccSAndroid Build Coastguard Worker intra_mode_cfg->enable_cfl_intra = extra_cfg->enable_cfl_intra;
1432*77c1e3ccSAndroid Build Coastguard Worker intra_mode_cfg->enable_directional_intra =
1433*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_directional_intra;
1434*77c1e3ccSAndroid Build Coastguard Worker intra_mode_cfg->enable_diagonal_intra = extra_cfg->enable_diagonal_intra;
1435*77c1e3ccSAndroid Build Coastguard Worker intra_mode_cfg->auto_intra_tools_off = extra_cfg->auto_intra_tools_off;
1436*77c1e3ccSAndroid Build Coastguard Worker
1437*77c1e3ccSAndroid Build Coastguard Worker // Set transform size/type configuration.
1438*77c1e3ccSAndroid Build Coastguard Worker txfm_cfg->enable_tx64 = extra_cfg->enable_tx64;
1439*77c1e3ccSAndroid Build Coastguard Worker txfm_cfg->enable_flip_idtx = extra_cfg->enable_flip_idtx;
1440*77c1e3ccSAndroid Build Coastguard Worker txfm_cfg->enable_rect_tx = extra_cfg->enable_rect_tx;
1441*77c1e3ccSAndroid Build Coastguard Worker txfm_cfg->reduced_tx_type_set = extra_cfg->reduced_tx_type_set;
1442*77c1e3ccSAndroid Build Coastguard Worker txfm_cfg->use_intra_dct_only = extra_cfg->use_intra_dct_only;
1443*77c1e3ccSAndroid Build Coastguard Worker txfm_cfg->use_inter_dct_only = extra_cfg->use_inter_dct_only;
1444*77c1e3ccSAndroid Build Coastguard Worker txfm_cfg->use_intra_default_tx_only = extra_cfg->use_intra_default_tx_only;
1445*77c1e3ccSAndroid Build Coastguard Worker txfm_cfg->enable_tx_size_search = extra_cfg->enable_tx_size_search;
1446*77c1e3ccSAndroid Build Coastguard Worker
1447*77c1e3ccSAndroid Build Coastguard Worker // Set compound type configuration.
1448*77c1e3ccSAndroid Build Coastguard Worker comp_type_cfg->enable_dist_wtd_comp =
1449*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_dist_wtd_comp & extra_cfg->enable_order_hint;
1450*77c1e3ccSAndroid Build Coastguard Worker comp_type_cfg->enable_masked_comp = extra_cfg->enable_masked_comp;
1451*77c1e3ccSAndroid Build Coastguard Worker comp_type_cfg->enable_diff_wtd_comp =
1452*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_masked_comp & extra_cfg->enable_diff_wtd_comp;
1453*77c1e3ccSAndroid Build Coastguard Worker comp_type_cfg->enable_interinter_wedge =
1454*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_masked_comp & extra_cfg->enable_interinter_wedge;
1455*77c1e3ccSAndroid Build Coastguard Worker comp_type_cfg->enable_smooth_interintra =
1456*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_interintra_comp && extra_cfg->enable_smooth_interintra;
1457*77c1e3ccSAndroid Build Coastguard Worker comp_type_cfg->enable_interintra_wedge =
1458*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_interintra_comp & extra_cfg->enable_interintra_wedge;
1459*77c1e3ccSAndroid Build Coastguard Worker
1460*77c1e3ccSAndroid Build Coastguard Worker // Set Super-resolution mode configuration.
1461*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg->lossless || cfg->large_scale_tile) {
1462*77c1e3ccSAndroid Build Coastguard Worker disable_superres(superres_cfg);
1463*77c1e3ccSAndroid Build Coastguard Worker } else {
1464*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_mode = cfg->rc_superres_mode;
1465*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_scale_denominator =
1466*77c1e3ccSAndroid Build Coastguard Worker (uint8_t)cfg->rc_superres_denominator;
1467*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_kf_scale_denominator =
1468*77c1e3ccSAndroid Build Coastguard Worker (uint8_t)cfg->rc_superres_kf_denominator;
1469*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_qthresh =
1470*77c1e3ccSAndroid Build Coastguard Worker av1_quantizer_to_qindex(cfg->rc_superres_qthresh);
1471*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_kf_qthresh =
1472*77c1e3ccSAndroid Build Coastguard Worker av1_quantizer_to_qindex(cfg->rc_superres_kf_qthresh);
1473*77c1e3ccSAndroid Build Coastguard Worker if (superres_cfg->superres_mode == AOM_SUPERRES_FIXED &&
1474*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_scale_denominator == SCALE_NUMERATOR &&
1475*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_kf_scale_denominator == SCALE_NUMERATOR) {
1476*77c1e3ccSAndroid Build Coastguard Worker disable_superres(superres_cfg);
1477*77c1e3ccSAndroid Build Coastguard Worker }
1478*77c1e3ccSAndroid Build Coastguard Worker if (superres_cfg->superres_mode == AOM_SUPERRES_QTHRESH &&
1479*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_qthresh == 255 &&
1480*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->superres_kf_qthresh == 255) {
1481*77c1e3ccSAndroid Build Coastguard Worker disable_superres(superres_cfg);
1482*77c1e3ccSAndroid Build Coastguard Worker }
1483*77c1e3ccSAndroid Build Coastguard Worker }
1484*77c1e3ccSAndroid Build Coastguard Worker
1485*77c1e3ccSAndroid Build Coastguard Worker superres_cfg->enable_superres =
1486*77c1e3ccSAndroid Build Coastguard Worker (superres_cfg->superres_mode != AOM_SUPERRES_NONE) &&
1487*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->enable_superres;
1488*77c1e3ccSAndroid Build Coastguard Worker if (!superres_cfg->enable_superres) {
1489*77c1e3ccSAndroid Build Coastguard Worker disable_superres(superres_cfg);
1490*77c1e3ccSAndroid Build Coastguard Worker }
1491*77c1e3ccSAndroid Build Coastguard Worker
1492*77c1e3ccSAndroid Build Coastguard Worker if (input_cfg->limit == 1) {
1493*77c1e3ccSAndroid Build Coastguard Worker // still picture mode, display model and timing is meaningless
1494*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->display_model_info_present_flag = 0;
1495*77c1e3ccSAndroid Build Coastguard Worker dec_model_cfg->timing_info_present = 0;
1496*77c1e3ccSAndroid Build Coastguard Worker }
1497*77c1e3ccSAndroid Build Coastguard Worker
1498*77c1e3ccSAndroid Build Coastguard Worker oxcf->save_as_annexb = cfg->save_as_annexb;
1499*77c1e3ccSAndroid Build Coastguard Worker
1500*77c1e3ccSAndroid Build Coastguard Worker // Set unit test related configuration.
1501*77c1e3ccSAndroid Build Coastguard Worker oxcf->unit_test_cfg.motion_vector_unit_test =
1502*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->motion_vector_unit_test;
1503*77c1e3ccSAndroid Build Coastguard Worker oxcf->unit_test_cfg.sb_multipass_unit_test =
1504*77c1e3ccSAndroid Build Coastguard Worker extra_cfg->sb_multipass_unit_test;
1505*77c1e3ccSAndroid Build Coastguard Worker
1506*77c1e3ccSAndroid Build Coastguard Worker oxcf->border_in_pixels =
1507*77c1e3ccSAndroid Build Coastguard Worker av1_get_enc_border_size(av1_is_resize_needed(oxcf),
1508*77c1e3ccSAndroid Build Coastguard Worker (oxcf->kf_cfg.key_freq_max == 0), BLOCK_128X128);
1509*77c1e3ccSAndroid Build Coastguard Worker memcpy(oxcf->target_seq_level_idx, extra_cfg->target_seq_level_idx,
1510*77c1e3ccSAndroid Build Coastguard Worker sizeof(oxcf->target_seq_level_idx));
1511*77c1e3ccSAndroid Build Coastguard Worker oxcf->tier_mask = extra_cfg->tier_mask;
1512*77c1e3ccSAndroid Build Coastguard Worker
1513*77c1e3ccSAndroid Build Coastguard Worker oxcf->partition_info_path = extra_cfg->partition_info_path;
1514*77c1e3ccSAndroid Build Coastguard Worker
1515*77c1e3ccSAndroid Build Coastguard Worker oxcf->enable_rate_guide_deltaq = extra_cfg->enable_rate_guide_deltaq;
1516*77c1e3ccSAndroid Build Coastguard Worker oxcf->rate_distribution_info = extra_cfg->rate_distribution_info;
1517*77c1e3ccSAndroid Build Coastguard Worker
1518*77c1e3ccSAndroid Build Coastguard Worker oxcf->strict_level_conformance = extra_cfg->strict_level_conformance;
1519*77c1e3ccSAndroid Build Coastguard Worker
1520*77c1e3ccSAndroid Build Coastguard Worker oxcf->kf_max_pyr_height = extra_cfg->kf_max_pyr_height;
1521*77c1e3ccSAndroid Build Coastguard Worker
1522*77c1e3ccSAndroid Build Coastguard Worker oxcf->sb_qp_sweep = extra_cfg->sb_qp_sweep;
1523*77c1e3ccSAndroid Build Coastguard Worker }
1524*77c1e3ccSAndroid Build Coastguard Worker
av1_get_encoder_config(const aom_codec_enc_cfg_t * cfg)1525*77c1e3ccSAndroid Build Coastguard Worker AV1EncoderConfig av1_get_encoder_config(const aom_codec_enc_cfg_t *cfg) {
1526*77c1e3ccSAndroid Build Coastguard Worker AV1EncoderConfig oxcf;
1527*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = default_extra_cfg[0];
1528*77c1e3ccSAndroid Build Coastguard Worker set_encoder_config(&oxcf, cfg, &extra_cfg);
1529*77c1e3ccSAndroid Build Coastguard Worker return oxcf;
1530*77c1e3ccSAndroid Build Coastguard Worker }
1531*77c1e3ccSAndroid Build Coastguard Worker
encoder_set_config(aom_codec_alg_priv_t * ctx,const aom_codec_enc_cfg_t * cfg)1532*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t encoder_set_config(aom_codec_alg_priv_t *ctx,
1533*77c1e3ccSAndroid Build Coastguard Worker const aom_codec_enc_cfg_t *cfg) {
1534*77c1e3ccSAndroid Build Coastguard Worker aom_codec_err_t res;
1535*77c1e3ccSAndroid Build Coastguard Worker int force_key = 0;
1536*77c1e3ccSAndroid Build Coastguard Worker
1537*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_w != ctx->cfg.g_w || cfg->g_h != ctx->cfg.g_h) {
1538*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_lag_in_frames > 1 || cfg->g_pass != AOM_RC_ONE_PASS)
1539*77c1e3ccSAndroid Build Coastguard Worker ERROR("Cannot change width or height after initialization");
1540*77c1e3ccSAndroid Build Coastguard Worker // Note: function encoder_set_config() is allowed to be called multiple
1541*77c1e3ccSAndroid Build Coastguard Worker // times. However, when the original frame width or height is less than two
1542*77c1e3ccSAndroid Build Coastguard Worker // times of the new frame width or height, a forced key frame should be
1543*77c1e3ccSAndroid Build Coastguard Worker // used. To make sure the correct detection of a forced key frame, we need
1544*77c1e3ccSAndroid Build Coastguard Worker // to update the frame width and height only when the actual encoding is
1545*77c1e3ccSAndroid Build Coastguard Worker // performed. cpi->last_coded_width and cpi->last_coded_height are used to
1546*77c1e3ccSAndroid Build Coastguard Worker // track the actual coded frame size.
1547*77c1e3ccSAndroid Build Coastguard Worker if (ctx->ppi->cpi->last_coded_width && ctx->ppi->cpi->last_coded_height &&
1548*77c1e3ccSAndroid Build Coastguard Worker (!valid_ref_frame_size(ctx->ppi->cpi->last_coded_width,
1549*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->cpi->last_coded_height, cfg->g_w,
1550*77c1e3ccSAndroid Build Coastguard Worker cfg->g_h) ||
1551*77c1e3ccSAndroid Build Coastguard Worker ((int)cfg->g_w > ctx->ppi->cpi->last_coded_width) ||
1552*77c1e3ccSAndroid Build Coastguard Worker ((int)cfg->g_h > ctx->ppi->cpi->last_coded_height))) {
1553*77c1e3ccSAndroid Build Coastguard Worker force_key = 1;
1554*77c1e3ccSAndroid Build Coastguard Worker }
1555*77c1e3ccSAndroid Build Coastguard Worker }
1556*77c1e3ccSAndroid Build Coastguard Worker
1557*77c1e3ccSAndroid Build Coastguard Worker if (ctx->monochrome_on_init && cfg->monochrome == 0) {
1558*77c1e3ccSAndroid Build Coastguard Worker // TODO(aomedia:3465): Allow this case to work without requiring re-init
1559*77c1e3ccSAndroid Build Coastguard Worker // of encoder.
1560*77c1e3ccSAndroid Build Coastguard Worker ERROR("Cannot change to monochrome = 0 after init with monochrome");
1561*77c1e3ccSAndroid Build Coastguard Worker }
1562*77c1e3ccSAndroid Build Coastguard Worker
1563*77c1e3ccSAndroid Build Coastguard Worker // Prevent increasing lag_in_frames. This check is stricter than it needs
1564*77c1e3ccSAndroid Build Coastguard Worker // to be -- the limit is not increasing past the first lag_in_frames
1565*77c1e3ccSAndroid Build Coastguard Worker // value, but we don't track the initial config, only the last successful
1566*77c1e3ccSAndroid Build Coastguard Worker // config.
1567*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_lag_in_frames > ctx->cfg.g_lag_in_frames)
1568*77c1e3ccSAndroid Build Coastguard Worker ERROR("Cannot increase lag_in_frames");
1569*77c1e3ccSAndroid Build Coastguard Worker // Prevent changing lag_in_frames if Lookahead Processing is enabled
1570*77c1e3ccSAndroid Build Coastguard Worker if (cfg->g_lag_in_frames != ctx->cfg.g_lag_in_frames &&
1571*77c1e3ccSAndroid Build Coastguard Worker ctx->num_lap_buffers > 0)
1572*77c1e3ccSAndroid Build Coastguard Worker ERROR("Cannot change lag_in_frames if LAP is enabled");
1573*77c1e3ccSAndroid Build Coastguard Worker
1574*77c1e3ccSAndroid Build Coastguard Worker res = validate_config(ctx, cfg, &ctx->extra_cfg);
1575*77c1e3ccSAndroid Build Coastguard Worker
1576*77c1e3ccSAndroid Build Coastguard Worker if (res == AOM_CODEC_OK) {
1577*77c1e3ccSAndroid Build Coastguard Worker ctx->cfg = *cfg;
1578*77c1e3ccSAndroid Build Coastguard Worker set_encoder_config(&ctx->oxcf, &ctx->cfg, &ctx->extra_cfg);
1579*77c1e3ccSAndroid Build Coastguard Worker // On profile change, request a key frame
1580*77c1e3ccSAndroid Build Coastguard Worker force_key |= ctx->ppi->seq_params.profile != ctx->oxcf.profile;
1581*77c1e3ccSAndroid Build Coastguard Worker bool is_sb_size_changed = false;
1582*77c1e3ccSAndroid Build Coastguard Worker av1_change_config_seq(ctx->ppi, &ctx->oxcf, &is_sb_size_changed);
1583*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < ctx->ppi->num_fp_contexts; i++) {
1584*77c1e3ccSAndroid Build Coastguard Worker av1_change_config(ctx->ppi->parallel_cpi[i], &ctx->oxcf,
1585*77c1e3ccSAndroid Build Coastguard Worker is_sb_size_changed);
1586*77c1e3ccSAndroid Build Coastguard Worker }
1587*77c1e3ccSAndroid Build Coastguard Worker if (ctx->ppi->cpi_lap != NULL) {
1588*77c1e3ccSAndroid Build Coastguard Worker av1_change_config(ctx->ppi->cpi_lap, &ctx->oxcf, is_sb_size_changed);
1589*77c1e3ccSAndroid Build Coastguard Worker }
1590*77c1e3ccSAndroid Build Coastguard Worker }
1591*77c1e3ccSAndroid Build Coastguard Worker
1592*77c1e3ccSAndroid Build Coastguard Worker if (force_key) ctx->next_frame_flags |= AOM_EFLAG_FORCE_KF;
1593*77c1e3ccSAndroid Build Coastguard Worker
1594*77c1e3ccSAndroid Build Coastguard Worker return res;
1595*77c1e3ccSAndroid Build Coastguard Worker }
1596*77c1e3ccSAndroid Build Coastguard Worker
encoder_get_global_headers(aom_codec_alg_priv_t * ctx)1597*77c1e3ccSAndroid Build Coastguard Worker static aom_fixed_buf_t *encoder_get_global_headers(aom_codec_alg_priv_t *ctx) {
1598*77c1e3ccSAndroid Build Coastguard Worker return av1_get_global_headers(ctx->ppi);
1599*77c1e3ccSAndroid Build Coastguard Worker }
1600*77c1e3ccSAndroid Build Coastguard Worker
ctrl_get_quantizer(aom_codec_alg_priv_t * ctx,va_list args)1601*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_get_quantizer(aom_codec_alg_priv_t *ctx,
1602*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1603*77c1e3ccSAndroid Build Coastguard Worker int *const arg = va_arg(args, int *);
1604*77c1e3ccSAndroid Build Coastguard Worker if (arg == NULL) return AOM_CODEC_INVALID_PARAM;
1605*77c1e3ccSAndroid Build Coastguard Worker *arg = av1_get_quantizer(ctx->ppi->cpi);
1606*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
1607*77c1e3ccSAndroid Build Coastguard Worker }
1608*77c1e3ccSAndroid Build Coastguard Worker
ctrl_get_quantizer64(aom_codec_alg_priv_t * ctx,va_list args)1609*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_get_quantizer64(aom_codec_alg_priv_t *ctx,
1610*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1611*77c1e3ccSAndroid Build Coastguard Worker int *const arg = va_arg(args, int *);
1612*77c1e3ccSAndroid Build Coastguard Worker if (arg == NULL) return AOM_CODEC_INVALID_PARAM;
1613*77c1e3ccSAndroid Build Coastguard Worker *arg = av1_qindex_to_quantizer(av1_get_quantizer(ctx->ppi->cpi));
1614*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
1615*77c1e3ccSAndroid Build Coastguard Worker }
1616*77c1e3ccSAndroid Build Coastguard Worker
ctrl_get_loopfilter_level(aom_codec_alg_priv_t * ctx,va_list args)1617*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_get_loopfilter_level(aom_codec_alg_priv_t *ctx,
1618*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1619*77c1e3ccSAndroid Build Coastguard Worker int *const arg = va_arg(args, int *);
1620*77c1e3ccSAndroid Build Coastguard Worker if (arg == NULL) return AOM_CODEC_INVALID_PARAM;
1621*77c1e3ccSAndroid Build Coastguard Worker *arg = ctx->ppi->cpi->common.lf.filter_level[0];
1622*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
1623*77c1e3ccSAndroid Build Coastguard Worker }
1624*77c1e3ccSAndroid Build Coastguard Worker
ctrl_get_baseline_gf_interval(aom_codec_alg_priv_t * ctx,va_list args)1625*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_get_baseline_gf_interval(aom_codec_alg_priv_t *ctx,
1626*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1627*77c1e3ccSAndroid Build Coastguard Worker int *const arg = va_arg(args, int *);
1628*77c1e3ccSAndroid Build Coastguard Worker if (arg == NULL) return AOM_CODEC_INVALID_PARAM;
1629*77c1e3ccSAndroid Build Coastguard Worker *arg = ctx->ppi->p_rc.baseline_gf_interval;
1630*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
1631*77c1e3ccSAndroid Build Coastguard Worker }
1632*77c1e3ccSAndroid Build Coastguard Worker
update_encoder_cfg(aom_codec_alg_priv_t * ctx)1633*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t update_encoder_cfg(aom_codec_alg_priv_t *ctx) {
1634*77c1e3ccSAndroid Build Coastguard Worker set_encoder_config(&ctx->oxcf, &ctx->cfg, &ctx->extra_cfg);
1635*77c1e3ccSAndroid Build Coastguard Worker av1_check_fpmt_config(ctx->ppi, &ctx->oxcf);
1636*77c1e3ccSAndroid Build Coastguard Worker bool is_sb_size_changed = false;
1637*77c1e3ccSAndroid Build Coastguard Worker av1_change_config_seq(ctx->ppi, &ctx->oxcf, &is_sb_size_changed);
1638*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < ctx->ppi->num_fp_contexts; i++) {
1639*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *const cpi = ctx->ppi->parallel_cpi[i];
1640*77c1e3ccSAndroid Build Coastguard Worker struct aom_internal_error_info *const error = cpi->common.error;
1641*77c1e3ccSAndroid Build Coastguard Worker if (setjmp(error->jmp)) {
1642*77c1e3ccSAndroid Build Coastguard Worker error->setjmp = 0;
1643*77c1e3ccSAndroid Build Coastguard Worker return error->error_code;
1644*77c1e3ccSAndroid Build Coastguard Worker }
1645*77c1e3ccSAndroid Build Coastguard Worker error->setjmp = 1;
1646*77c1e3ccSAndroid Build Coastguard Worker av1_change_config(cpi, &ctx->oxcf, is_sb_size_changed);
1647*77c1e3ccSAndroid Build Coastguard Worker error->setjmp = 0;
1648*77c1e3ccSAndroid Build Coastguard Worker }
1649*77c1e3ccSAndroid Build Coastguard Worker if (ctx->ppi->cpi_lap != NULL) {
1650*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *const cpi_lap = ctx->ppi->cpi_lap;
1651*77c1e3ccSAndroid Build Coastguard Worker struct aom_internal_error_info *const error = cpi_lap->common.error;
1652*77c1e3ccSAndroid Build Coastguard Worker if (setjmp(error->jmp)) {
1653*77c1e3ccSAndroid Build Coastguard Worker error->setjmp = 0;
1654*77c1e3ccSAndroid Build Coastguard Worker return error->error_code;
1655*77c1e3ccSAndroid Build Coastguard Worker }
1656*77c1e3ccSAndroid Build Coastguard Worker error->setjmp = 1;
1657*77c1e3ccSAndroid Build Coastguard Worker av1_change_config(cpi_lap, &ctx->oxcf, is_sb_size_changed);
1658*77c1e3ccSAndroid Build Coastguard Worker error->setjmp = 0;
1659*77c1e3ccSAndroid Build Coastguard Worker }
1660*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
1661*77c1e3ccSAndroid Build Coastguard Worker }
1662*77c1e3ccSAndroid Build Coastguard Worker
update_extra_cfg(aom_codec_alg_priv_t * ctx,const struct av1_extracfg * extra_cfg)1663*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t update_extra_cfg(aom_codec_alg_priv_t *ctx,
1664*77c1e3ccSAndroid Build Coastguard Worker const struct av1_extracfg *extra_cfg) {
1665*77c1e3ccSAndroid Build Coastguard Worker const aom_codec_err_t res = validate_config(ctx, &ctx->cfg, extra_cfg);
1666*77c1e3ccSAndroid Build Coastguard Worker if (res == AOM_CODEC_OK) {
1667*77c1e3ccSAndroid Build Coastguard Worker ctx->extra_cfg = *extra_cfg;
1668*77c1e3ccSAndroid Build Coastguard Worker return update_encoder_cfg(ctx);
1669*77c1e3ccSAndroid Build Coastguard Worker }
1670*77c1e3ccSAndroid Build Coastguard Worker return res;
1671*77c1e3ccSAndroid Build Coastguard Worker }
1672*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_cpuused(aom_codec_alg_priv_t * ctx,va_list args)1673*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_cpuused(aom_codec_alg_priv_t *ctx,
1674*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1675*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1676*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.cpu_used = CAST(AOME_SET_CPUUSED, args);
1677*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1678*77c1e3ccSAndroid Build Coastguard Worker }
1679*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_auto_alt_ref(aom_codec_alg_priv_t * ctx,va_list args)1680*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_auto_alt_ref(aom_codec_alg_priv_t *ctx,
1681*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1682*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1683*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_auto_alt_ref = CAST(AOME_SET_ENABLEAUTOALTREF, args);
1684*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1685*77c1e3ccSAndroid Build Coastguard Worker }
1686*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_auto_bwd_ref(aom_codec_alg_priv_t * ctx,va_list args)1687*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_auto_bwd_ref(aom_codec_alg_priv_t *ctx,
1688*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1689*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1690*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_auto_bwd_ref = CAST(AOME_SET_ENABLEAUTOBWDREF, args);
1691*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1692*77c1e3ccSAndroid Build Coastguard Worker }
1693*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_noise_sensitivity(aom_codec_alg_priv_t * ctx,va_list args)1694*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_noise_sensitivity(aom_codec_alg_priv_t *ctx,
1695*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1696*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1697*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.noise_sensitivity = CAST(AV1E_SET_NOISE_SENSITIVITY, args);
1698*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1699*77c1e3ccSAndroid Build Coastguard Worker }
1700*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_sharpness(aom_codec_alg_priv_t * ctx,va_list args)1701*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_sharpness(aom_codec_alg_priv_t *ctx,
1702*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1703*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1704*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.sharpness = CAST(AOME_SET_SHARPNESS, args);
1705*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1706*77c1e3ccSAndroid Build Coastguard Worker }
1707*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_static_thresh(aom_codec_alg_priv_t * ctx,va_list args)1708*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_static_thresh(aom_codec_alg_priv_t *ctx,
1709*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1710*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1711*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.static_thresh = CAST(AOME_SET_STATIC_THRESHOLD, args);
1712*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1713*77c1e3ccSAndroid Build Coastguard Worker }
1714*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_row_mt(aom_codec_alg_priv_t * ctx,va_list args)1715*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_row_mt(aom_codec_alg_priv_t *ctx,
1716*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1717*77c1e3ccSAndroid Build Coastguard Worker unsigned int row_mt = CAST(AV1E_SET_ROW_MT, args);
1718*77c1e3ccSAndroid Build Coastguard Worker if (row_mt == ctx->extra_cfg.row_mt) return AOM_CODEC_OK;
1719*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1720*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.row_mt = row_mt;
1721*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1722*77c1e3ccSAndroid Build Coastguard Worker }
1723*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_tile_columns(aom_codec_alg_priv_t * ctx,va_list args)1724*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_tile_columns(aom_codec_alg_priv_t *ctx,
1725*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1726*77c1e3ccSAndroid Build Coastguard Worker // If the control AUTO_TILES is used (set to 1) then don't override
1727*77c1e3ccSAndroid Build Coastguard Worker // the tile_columns set via the AUTO_TILES control.
1728*77c1e3ccSAndroid Build Coastguard Worker if (ctx->extra_cfg.auto_tiles) {
1729*77c1e3ccSAndroid Build Coastguard Worker ERROR("AUTO_TILES is set so AV1E_SET_TILE_COLUMNS should not be called.");
1730*77c1e3ccSAndroid Build Coastguard Worker }
1731*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1732*77c1e3ccSAndroid Build Coastguard Worker unsigned int tile_columns = CAST(AV1E_SET_TILE_COLUMNS, args);
1733*77c1e3ccSAndroid Build Coastguard Worker if (tile_columns == extra_cfg.tile_columns) return AOM_CODEC_OK;
1734*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.tile_columns = tile_columns;
1735*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1736*77c1e3ccSAndroid Build Coastguard Worker }
1737*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_tile_rows(aom_codec_alg_priv_t * ctx,va_list args)1738*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_tile_rows(aom_codec_alg_priv_t *ctx,
1739*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1740*77c1e3ccSAndroid Build Coastguard Worker // If the control AUTO_TILES is used (set to 1) then don't override
1741*77c1e3ccSAndroid Build Coastguard Worker // the tile_rows set via the AUTO_TILES control.
1742*77c1e3ccSAndroid Build Coastguard Worker if (ctx->extra_cfg.auto_tiles) {
1743*77c1e3ccSAndroid Build Coastguard Worker ERROR("AUTO_TILES is set so AV1E_SET_TILE_ROWS should not be called.");
1744*77c1e3ccSAndroid Build Coastguard Worker }
1745*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1746*77c1e3ccSAndroid Build Coastguard Worker unsigned int tile_rows = CAST(AV1E_SET_TILE_ROWS, args);
1747*77c1e3ccSAndroid Build Coastguard Worker if (tile_rows == extra_cfg.tile_rows) return AOM_CODEC_OK;
1748*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.tile_rows = tile_rows;
1749*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1750*77c1e3ccSAndroid Build Coastguard Worker }
1751*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_tpl_model(aom_codec_alg_priv_t * ctx,va_list args)1752*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_tpl_model(aom_codec_alg_priv_t *ctx,
1753*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1754*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1755*77c1e3ccSAndroid Build Coastguard Worker const unsigned int tpl_model_arg = CAST(AV1E_SET_ENABLE_TPL_MODEL, args);
1756*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_REALTIME_ONLY
1757*77c1e3ccSAndroid Build Coastguard Worker if (tpl_model_arg) {
1758*77c1e3ccSAndroid Build Coastguard Worker ERROR("TPL model can't be turned on in realtime only build.");
1759*77c1e3ccSAndroid Build Coastguard Worker }
1760*77c1e3ccSAndroid Build Coastguard Worker #endif
1761*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_tpl_model = tpl_model_arg;
1762*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1763*77c1e3ccSAndroid Build Coastguard Worker }
1764*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_keyframe_filtering(aom_codec_alg_priv_t * ctx,va_list args)1765*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_keyframe_filtering(
1766*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
1767*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1768*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_keyframe_filtering =
1769*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_ENABLE_KEYFRAME_FILTERING, args);
1770*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1771*77c1e3ccSAndroid Build Coastguard Worker }
1772*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_arnr_max_frames(aom_codec_alg_priv_t * ctx,va_list args)1773*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_arnr_max_frames(aom_codec_alg_priv_t *ctx,
1774*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1775*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1776*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.arnr_max_frames = CAST(AOME_SET_ARNR_MAXFRAMES, args);
1777*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1778*77c1e3ccSAndroid Build Coastguard Worker }
1779*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_arnr_strength(aom_codec_alg_priv_t * ctx,va_list args)1780*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_arnr_strength(aom_codec_alg_priv_t *ctx,
1781*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1782*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1783*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.arnr_strength = CAST(AOME_SET_ARNR_STRENGTH, args);
1784*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1785*77c1e3ccSAndroid Build Coastguard Worker }
1786*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_tuning(aom_codec_alg_priv_t * ctx,va_list args)1787*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_tuning(aom_codec_alg_priv_t *ctx,
1788*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1789*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1790*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.tuning = CAST(AOME_SET_TUNING, args);
1791*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1792*77c1e3ccSAndroid Build Coastguard Worker }
1793*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_cq_level(aom_codec_alg_priv_t * ctx,va_list args)1794*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_cq_level(aom_codec_alg_priv_t *ctx,
1795*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1796*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1797*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.cq_level = CAST(AOME_SET_CQ_LEVEL, args);
1798*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1799*77c1e3ccSAndroid Build Coastguard Worker }
1800*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_rc_max_intra_bitrate_pct(aom_codec_alg_priv_t * ctx,va_list args)1801*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_rc_max_intra_bitrate_pct(
1802*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
1803*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1804*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.rc_max_intra_bitrate_pct =
1805*77c1e3ccSAndroid Build Coastguard Worker CAST(AOME_SET_MAX_INTRA_BITRATE_PCT, args);
1806*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1807*77c1e3ccSAndroid Build Coastguard Worker }
1808*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_rc_max_inter_bitrate_pct(aom_codec_alg_priv_t * ctx,va_list args)1809*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_rc_max_inter_bitrate_pct(
1810*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
1811*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1812*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.rc_max_inter_bitrate_pct =
1813*77c1e3ccSAndroid Build Coastguard Worker CAST(AOME_SET_MAX_INTER_BITRATE_PCT, args);
1814*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1815*77c1e3ccSAndroid Build Coastguard Worker }
1816*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_rc_gf_cbr_boost_pct(aom_codec_alg_priv_t * ctx,va_list args)1817*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_rc_gf_cbr_boost_pct(aom_codec_alg_priv_t *ctx,
1818*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1819*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1820*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.gf_cbr_boost_pct = CAST(AV1E_SET_GF_CBR_BOOST_PCT, args);
1821*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1822*77c1e3ccSAndroid Build Coastguard Worker }
1823*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_lossless(aom_codec_alg_priv_t * ctx,va_list args)1824*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_lossless(aom_codec_alg_priv_t *ctx,
1825*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1826*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1827*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.lossless = CAST(AV1E_SET_LOSSLESS, args);
1828*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1829*77c1e3ccSAndroid Build Coastguard Worker }
1830*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_cdef(aom_codec_alg_priv_t * ctx,va_list args)1831*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_cdef(aom_codec_alg_priv_t *ctx,
1832*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1833*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1834*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_cdef = CAST(AV1E_SET_ENABLE_CDEF, args);
1835*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1836*77c1e3ccSAndroid Build Coastguard Worker }
1837*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_restoration(aom_codec_alg_priv_t * ctx,va_list args)1838*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_restoration(aom_codec_alg_priv_t *ctx,
1839*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1840*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1841*77c1e3ccSAndroid Build Coastguard Worker const unsigned int restoration_arg = CAST(AV1E_SET_ENABLE_RESTORATION, args);
1842*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_REALTIME_ONLY
1843*77c1e3ccSAndroid Build Coastguard Worker if (restoration_arg) {
1844*77c1e3ccSAndroid Build Coastguard Worker ERROR("Restoration can't be turned on in realtime only build.");
1845*77c1e3ccSAndroid Build Coastguard Worker }
1846*77c1e3ccSAndroid Build Coastguard Worker #endif
1847*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_restoration = restoration_arg;
1848*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1849*77c1e3ccSAndroid Build Coastguard Worker }
1850*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_force_video_mode(aom_codec_alg_priv_t * ctx,va_list args)1851*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_force_video_mode(aom_codec_alg_priv_t *ctx,
1852*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1853*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1854*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.force_video_mode = CAST(AV1E_SET_FORCE_VIDEO_MODE, args);
1855*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1856*77c1e3ccSAndroid Build Coastguard Worker }
1857*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_obmc(aom_codec_alg_priv_t * ctx,va_list args)1858*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_obmc(aom_codec_alg_priv_t *ctx,
1859*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1860*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1861*77c1e3ccSAndroid Build Coastguard Worker const unsigned int obmc_arg = CAST(AV1E_SET_ENABLE_OBMC, args);
1862*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_REALTIME_ONLY
1863*77c1e3ccSAndroid Build Coastguard Worker if (obmc_arg) {
1864*77c1e3ccSAndroid Build Coastguard Worker ERROR("OBMC can't be enabled in realtime only build.");
1865*77c1e3ccSAndroid Build Coastguard Worker }
1866*77c1e3ccSAndroid Build Coastguard Worker #endif
1867*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_obmc = obmc_arg;
1868*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1869*77c1e3ccSAndroid Build Coastguard Worker }
1870*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_disable_trellis_quant(aom_codec_alg_priv_t * ctx,va_list args)1871*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_disable_trellis_quant(aom_codec_alg_priv_t *ctx,
1872*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1873*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1874*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.disable_trellis_quant = CAST(AV1E_SET_DISABLE_TRELLIS_QUANT, args);
1875*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1876*77c1e3ccSAndroid Build Coastguard Worker }
1877*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_qm(aom_codec_alg_priv_t * ctx,va_list args)1878*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_qm(aom_codec_alg_priv_t *ctx,
1879*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1880*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1881*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_qm = CAST(AV1E_SET_ENABLE_QM, args);
1882*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_QUANT_MATRIX
1883*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg.enable_qm) {
1884*77c1e3ccSAndroid Build Coastguard Worker ERROR("QM can't be enabled with CONFIG_QUANT_MATRIX=0.");
1885*77c1e3ccSAndroid Build Coastguard Worker }
1886*77c1e3ccSAndroid Build Coastguard Worker #endif
1887*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1888*77c1e3ccSAndroid Build Coastguard Worker }
ctrl_set_qm_y(aom_codec_alg_priv_t * ctx,va_list args)1889*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_qm_y(aom_codec_alg_priv_t *ctx, va_list args) {
1890*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1891*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.qm_y = CAST(AV1E_SET_QM_Y, args);
1892*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1893*77c1e3ccSAndroid Build Coastguard Worker }
ctrl_set_qm_u(aom_codec_alg_priv_t * ctx,va_list args)1894*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_qm_u(aom_codec_alg_priv_t *ctx, va_list args) {
1895*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1896*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.qm_u = CAST(AV1E_SET_QM_U, args);
1897*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1898*77c1e3ccSAndroid Build Coastguard Worker }
ctrl_set_qm_v(aom_codec_alg_priv_t * ctx,va_list args)1899*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_qm_v(aom_codec_alg_priv_t *ctx, va_list args) {
1900*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1901*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.qm_v = CAST(AV1E_SET_QM_V, args);
1902*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1903*77c1e3ccSAndroid Build Coastguard Worker }
ctrl_set_qm_min(aom_codec_alg_priv_t * ctx,va_list args)1904*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_qm_min(aom_codec_alg_priv_t *ctx,
1905*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1906*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1907*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.qm_min = CAST(AV1E_SET_QM_MIN, args);
1908*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1909*77c1e3ccSAndroid Build Coastguard Worker }
1910*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_qm_max(aom_codec_alg_priv_t * ctx,va_list args)1911*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_qm_max(aom_codec_alg_priv_t *ctx,
1912*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1913*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1914*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.qm_max = CAST(AV1E_SET_QM_MAX, args);
1915*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1916*77c1e3ccSAndroid Build Coastguard Worker }
1917*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_num_tg(aom_codec_alg_priv_t * ctx,va_list args)1918*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_num_tg(aom_codec_alg_priv_t *ctx,
1919*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1920*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1921*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.num_tg = CAST(AV1E_SET_NUM_TG, args);
1922*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1923*77c1e3ccSAndroid Build Coastguard Worker }
1924*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_mtu(aom_codec_alg_priv_t * ctx,va_list args)1925*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_mtu(aom_codec_alg_priv_t *ctx, va_list args) {
1926*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1927*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.mtu_size = CAST(AV1E_SET_MTU, args);
1928*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1929*77c1e3ccSAndroid Build Coastguard Worker }
ctrl_set_timing_info_type(aom_codec_alg_priv_t * ctx,va_list args)1930*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_timing_info_type(aom_codec_alg_priv_t *ctx,
1931*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1932*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1933*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.timing_info_type = CAST(AV1E_SET_TIMING_INFO_TYPE, args);
1934*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1935*77c1e3ccSAndroid Build Coastguard Worker }
1936*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_dual_filter(aom_codec_alg_priv_t * ctx,va_list args)1937*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_dual_filter(aom_codec_alg_priv_t *ctx,
1938*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1939*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1940*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_dual_filter = CAST(AV1E_SET_ENABLE_DUAL_FILTER, args);
1941*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1942*77c1e3ccSAndroid Build Coastguard Worker }
1943*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_chroma_deltaq(aom_codec_alg_priv_t * ctx,va_list args)1944*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_chroma_deltaq(aom_codec_alg_priv_t *ctx,
1945*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1946*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1947*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_chroma_deltaq = CAST(AV1E_SET_ENABLE_CHROMA_DELTAQ, args);
1948*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1949*77c1e3ccSAndroid Build Coastguard Worker }
1950*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_rect_partitions(aom_codec_alg_priv_t * ctx,va_list args)1951*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_rect_partitions(
1952*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
1953*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1954*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_rect_partitions =
1955*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_ENABLE_RECT_PARTITIONS, args);
1956*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1957*77c1e3ccSAndroid Build Coastguard Worker }
1958*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_ab_partitions(aom_codec_alg_priv_t * ctx,va_list args)1959*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_ab_partitions(aom_codec_alg_priv_t *ctx,
1960*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1961*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1962*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_ab_partitions = CAST(AV1E_SET_ENABLE_AB_PARTITIONS, args);
1963*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1964*77c1e3ccSAndroid Build Coastguard Worker }
1965*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_1to4_partitions(aom_codec_alg_priv_t * ctx,va_list args)1966*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_1to4_partitions(
1967*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
1968*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1969*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_1to4_partitions =
1970*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_ENABLE_1TO4_PARTITIONS, args);
1971*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1972*77c1e3ccSAndroid Build Coastguard Worker }
1973*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_min_partition_size(aom_codec_alg_priv_t * ctx,va_list args)1974*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_min_partition_size(aom_codec_alg_priv_t *ctx,
1975*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1976*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1977*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.min_partition_size = CAST(AV1E_SET_MIN_PARTITION_SIZE, args);
1978*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1979*77c1e3ccSAndroid Build Coastguard Worker }
1980*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_max_partition_size(aom_codec_alg_priv_t * ctx,va_list args)1981*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_max_partition_size(aom_codec_alg_priv_t *ctx,
1982*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1983*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1984*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.max_partition_size = CAST(AV1E_SET_MAX_PARTITION_SIZE, args);
1985*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1986*77c1e3ccSAndroid Build Coastguard Worker }
1987*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_intra_edge_filter(aom_codec_alg_priv_t * ctx,va_list args)1988*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_intra_edge_filter(
1989*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
1990*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1991*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_intra_edge_filter =
1992*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_ENABLE_INTRA_EDGE_FILTER, args);
1993*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
1994*77c1e3ccSAndroid Build Coastguard Worker }
1995*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_order_hint(aom_codec_alg_priv_t * ctx,va_list args)1996*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_order_hint(aom_codec_alg_priv_t *ctx,
1997*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
1998*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
1999*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_order_hint = CAST(AV1E_SET_ENABLE_ORDER_HINT, args);
2000*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2001*77c1e3ccSAndroid Build Coastguard Worker }
2002*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_tx64(aom_codec_alg_priv_t * ctx,va_list args)2003*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_tx64(aom_codec_alg_priv_t *ctx,
2004*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2005*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2006*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_tx64 = CAST(AV1E_SET_ENABLE_TX64, args);
2007*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2008*77c1e3ccSAndroid Build Coastguard Worker }
2009*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_flip_idtx(aom_codec_alg_priv_t * ctx,va_list args)2010*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_flip_idtx(aom_codec_alg_priv_t *ctx,
2011*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2012*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2013*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_flip_idtx = CAST(AV1E_SET_ENABLE_FLIP_IDTX, args);
2014*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2015*77c1e3ccSAndroid Build Coastguard Worker }
2016*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_rect_tx(aom_codec_alg_priv_t * ctx,va_list args)2017*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_rect_tx(aom_codec_alg_priv_t *ctx,
2018*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2019*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2020*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_rect_tx = CAST(AV1E_SET_ENABLE_RECT_TX, args);
2021*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2022*77c1e3ccSAndroid Build Coastguard Worker }
2023*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_dist_wtd_comp(aom_codec_alg_priv_t * ctx,va_list args)2024*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_dist_wtd_comp(aom_codec_alg_priv_t *ctx,
2025*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2026*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2027*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_dist_wtd_comp = CAST(AV1E_SET_ENABLE_DIST_WTD_COMP, args);
2028*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2029*77c1e3ccSAndroid Build Coastguard Worker }
2030*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_max_reference_frames(aom_codec_alg_priv_t * ctx,va_list args)2031*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_max_reference_frames(aom_codec_alg_priv_t *ctx,
2032*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2033*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2034*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.max_reference_frames = CAST(AV1E_SET_MAX_REFERENCE_FRAMES, args);
2035*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2036*77c1e3ccSAndroid Build Coastguard Worker }
2037*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_reduced_reference_set(aom_codec_alg_priv_t * ctx,va_list args)2038*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_reduced_reference_set(
2039*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2040*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2041*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_reduced_reference_set =
2042*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_REDUCED_REFERENCE_SET, args);
2043*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2044*77c1e3ccSAndroid Build Coastguard Worker }
2045*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_ref_frame_mvs(aom_codec_alg_priv_t * ctx,va_list args)2046*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_ref_frame_mvs(aom_codec_alg_priv_t *ctx,
2047*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2048*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2049*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_ref_frame_mvs = CAST(AV1E_SET_ENABLE_REF_FRAME_MVS, args);
2050*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2051*77c1e3ccSAndroid Build Coastguard Worker }
2052*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_allow_ref_frame_mvs(aom_codec_alg_priv_t * ctx,va_list args)2053*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_allow_ref_frame_mvs(aom_codec_alg_priv_t *ctx,
2054*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2055*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2056*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.allow_ref_frame_mvs = CAST(AV1E_SET_ALLOW_REF_FRAME_MVS, args);
2057*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2058*77c1e3ccSAndroid Build Coastguard Worker }
2059*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_masked_comp(aom_codec_alg_priv_t * ctx,va_list args)2060*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_masked_comp(aom_codec_alg_priv_t *ctx,
2061*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2062*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2063*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_masked_comp = CAST(AV1E_SET_ENABLE_MASKED_COMP, args);
2064*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2065*77c1e3ccSAndroid Build Coastguard Worker }
2066*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_onesided_comp(aom_codec_alg_priv_t * ctx,va_list args)2067*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_onesided_comp(aom_codec_alg_priv_t *ctx,
2068*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2069*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2070*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_onesided_comp = CAST(AV1E_SET_ENABLE_ONESIDED_COMP, args);
2071*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2072*77c1e3ccSAndroid Build Coastguard Worker }
2073*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_interintra_comp(aom_codec_alg_priv_t * ctx,va_list args)2074*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_interintra_comp(
2075*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2076*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2077*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_interintra_comp =
2078*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_ENABLE_INTERINTRA_COMP, args);
2079*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2080*77c1e3ccSAndroid Build Coastguard Worker }
2081*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_smooth_interintra(aom_codec_alg_priv_t * ctx,va_list args)2082*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_smooth_interintra(
2083*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2084*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2085*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_smooth_interintra =
2086*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_ENABLE_SMOOTH_INTERINTRA, args);
2087*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2088*77c1e3ccSAndroid Build Coastguard Worker }
2089*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_diff_wtd_comp(aom_codec_alg_priv_t * ctx,va_list args)2090*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_diff_wtd_comp(aom_codec_alg_priv_t *ctx,
2091*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2092*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2093*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_diff_wtd_comp = CAST(AV1E_SET_ENABLE_DIFF_WTD_COMP, args);
2094*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2095*77c1e3ccSAndroid Build Coastguard Worker }
2096*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_interinter_wedge(aom_codec_alg_priv_t * ctx,va_list args)2097*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_interinter_wedge(
2098*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2099*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2100*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_interinter_wedge =
2101*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_ENABLE_INTERINTER_WEDGE, args);
2102*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2103*77c1e3ccSAndroid Build Coastguard Worker }
2104*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_interintra_wedge(aom_codec_alg_priv_t * ctx,va_list args)2105*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_interintra_wedge(
2106*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2107*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2108*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_interintra_wedge =
2109*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_ENABLE_INTERINTRA_WEDGE, args);
2110*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2111*77c1e3ccSAndroid Build Coastguard Worker }
2112*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_global_motion(aom_codec_alg_priv_t * ctx,va_list args)2113*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_global_motion(aom_codec_alg_priv_t *ctx,
2114*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2115*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2116*77c1e3ccSAndroid Build Coastguard Worker const int global_motion_arg = CAST(AV1E_SET_ENABLE_GLOBAL_MOTION, args);
2117*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_REALTIME_ONLY
2118*77c1e3ccSAndroid Build Coastguard Worker if (global_motion_arg) {
2119*77c1e3ccSAndroid Build Coastguard Worker ERROR("Global motion can't be enabled in realtime only build.");
2120*77c1e3ccSAndroid Build Coastguard Worker }
2121*77c1e3ccSAndroid Build Coastguard Worker #endif
2122*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_global_motion = global_motion_arg;
2123*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2124*77c1e3ccSAndroid Build Coastguard Worker }
2125*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_warped_motion(aom_codec_alg_priv_t * ctx,va_list args)2126*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_warped_motion(aom_codec_alg_priv_t *ctx,
2127*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2128*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2129*77c1e3ccSAndroid Build Coastguard Worker const int warped_motion_arg = CAST(AV1E_SET_ENABLE_WARPED_MOTION, args);
2130*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_REALTIME_ONLY
2131*77c1e3ccSAndroid Build Coastguard Worker if (warped_motion_arg) {
2132*77c1e3ccSAndroid Build Coastguard Worker ERROR("Warped motion can't be enabled in realtime only build.");
2133*77c1e3ccSAndroid Build Coastguard Worker }
2134*77c1e3ccSAndroid Build Coastguard Worker #endif
2135*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_warped_motion = warped_motion_arg;
2136*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2137*77c1e3ccSAndroid Build Coastguard Worker }
2138*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_allow_warped_motion(aom_codec_alg_priv_t * ctx,va_list args)2139*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_allow_warped_motion(aom_codec_alg_priv_t *ctx,
2140*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2141*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2142*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.allow_warped_motion = CAST(AV1E_SET_ALLOW_WARPED_MOTION, args);
2143*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2144*77c1e3ccSAndroid Build Coastguard Worker }
2145*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_filter_intra(aom_codec_alg_priv_t * ctx,va_list args)2146*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_filter_intra(aom_codec_alg_priv_t *ctx,
2147*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2148*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2149*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_filter_intra = CAST(AV1E_SET_ENABLE_FILTER_INTRA, args);
2150*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2151*77c1e3ccSAndroid Build Coastguard Worker }
2152*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_smooth_intra(aom_codec_alg_priv_t * ctx,va_list args)2153*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_smooth_intra(aom_codec_alg_priv_t *ctx,
2154*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2155*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2156*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_smooth_intra = CAST(AV1E_SET_ENABLE_SMOOTH_INTRA, args);
2157*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2158*77c1e3ccSAndroid Build Coastguard Worker }
2159*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_directional_intra(aom_codec_alg_priv_t * ctx,va_list args)2160*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_directional_intra(
2161*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2162*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2163*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_directional_intra =
2164*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_ENABLE_DIRECTIONAL_INTRA, args);
2165*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2166*77c1e3ccSAndroid Build Coastguard Worker }
2167*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_diagonal_intra(aom_codec_alg_priv_t * ctx,va_list args)2168*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_diagonal_intra(aom_codec_alg_priv_t *ctx,
2169*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2170*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2171*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_diagonal_intra = CAST(AV1E_SET_ENABLE_DIAGONAL_INTRA, args);
2172*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2173*77c1e3ccSAndroid Build Coastguard Worker }
2174*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_paeth_intra(aom_codec_alg_priv_t * ctx,va_list args)2175*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_paeth_intra(aom_codec_alg_priv_t *ctx,
2176*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2177*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2178*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_paeth_intra = CAST(AV1E_SET_ENABLE_PAETH_INTRA, args);
2179*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2180*77c1e3ccSAndroid Build Coastguard Worker }
2181*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_cfl_intra(aom_codec_alg_priv_t * ctx,va_list args)2182*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_cfl_intra(aom_codec_alg_priv_t *ctx,
2183*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2184*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2185*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_cfl_intra = CAST(AV1E_SET_ENABLE_CFL_INTRA, args);
2186*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_REALTIME_ONLY
2187*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg.enable_cfl_intra) {
2188*77c1e3ccSAndroid Build Coastguard Worker ERROR("cfl can't be turned on in realtime only build.");
2189*77c1e3ccSAndroid Build Coastguard Worker }
2190*77c1e3ccSAndroid Build Coastguard Worker #endif
2191*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2192*77c1e3ccSAndroid Build Coastguard Worker }
2193*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_superres(aom_codec_alg_priv_t * ctx,va_list args)2194*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_superres(aom_codec_alg_priv_t *ctx,
2195*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2196*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2197*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_superres = CAST(AV1E_SET_ENABLE_SUPERRES, args);
2198*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2199*77c1e3ccSAndroid Build Coastguard Worker }
2200*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_overlay(aom_codec_alg_priv_t * ctx,va_list args)2201*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_overlay(aom_codec_alg_priv_t *ctx,
2202*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2203*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2204*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_overlay = CAST(AV1E_SET_ENABLE_OVERLAY, args);
2205*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2206*77c1e3ccSAndroid Build Coastguard Worker }
2207*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_palette(aom_codec_alg_priv_t * ctx,va_list args)2208*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_palette(aom_codec_alg_priv_t *ctx,
2209*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2210*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2211*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_palette = CAST(AV1E_SET_ENABLE_PALETTE, args);
2212*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2213*77c1e3ccSAndroid Build Coastguard Worker }
2214*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_intrabc(aom_codec_alg_priv_t * ctx,va_list args)2215*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_intrabc(aom_codec_alg_priv_t *ctx,
2216*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2217*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2218*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_intrabc = CAST(AV1E_SET_ENABLE_INTRABC, args);
2219*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2220*77c1e3ccSAndroid Build Coastguard Worker }
2221*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_angle_delta(aom_codec_alg_priv_t * ctx,va_list args)2222*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_angle_delta(aom_codec_alg_priv_t *ctx,
2223*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2224*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2225*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_angle_delta = CAST(AV1E_SET_ENABLE_ANGLE_DELTA, args);
2226*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2227*77c1e3ccSAndroid Build Coastguard Worker }
2228*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_error_resilient_mode(aom_codec_alg_priv_t * ctx,va_list args)2229*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_error_resilient_mode(aom_codec_alg_priv_t *ctx,
2230*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2231*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2232*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.error_resilient_mode = CAST(AV1E_SET_ERROR_RESILIENT_MODE, args);
2233*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2234*77c1e3ccSAndroid Build Coastguard Worker }
2235*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_s_frame_mode(aom_codec_alg_priv_t * ctx,va_list args)2236*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_s_frame_mode(aom_codec_alg_priv_t *ctx,
2237*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2238*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2239*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.s_frame_mode = CAST(AV1E_SET_S_FRAME_MODE, args);
2240*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2241*77c1e3ccSAndroid Build Coastguard Worker }
2242*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_frame_parallel_decoding_mode(aom_codec_alg_priv_t * ctx,va_list args)2243*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_frame_parallel_decoding_mode(
2244*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2245*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2246*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.frame_parallel_decoding_mode =
2247*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_FRAME_PARALLEL_DECODING, args);
2248*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2249*77c1e3ccSAndroid Build Coastguard Worker }
2250*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_single_tile_decoding(aom_codec_alg_priv_t * ctx,va_list args)2251*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_single_tile_decoding(aom_codec_alg_priv_t *ctx,
2252*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2253*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2254*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.single_tile_decoding = CAST(AV1E_SET_SINGLE_TILE_DECODING, args);
2255*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2256*77c1e3ccSAndroid Build Coastguard Worker }
2257*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_aq_mode(aom_codec_alg_priv_t * ctx,va_list args)2258*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_aq_mode(aom_codec_alg_priv_t *ctx,
2259*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2260*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2261*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.aq_mode = CAST(AV1E_SET_AQ_MODE, args);
2262*77c1e3ccSAndroid Build Coastguard Worker
2263*77c1e3ccSAndroid Build Coastguard Worker // Skip AQ mode if using fixed QP for current frame.
2264*77c1e3ccSAndroid Build Coastguard Worker if (ctx->ppi->cpi->rc.use_external_qp_one_pass) extra_cfg.aq_mode = 0;
2265*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2266*77c1e3ccSAndroid Build Coastguard Worker }
2267*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_reduced_tx_type_set(aom_codec_alg_priv_t * ctx,va_list args)2268*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_reduced_tx_type_set(aom_codec_alg_priv_t *ctx,
2269*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2270*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2271*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.reduced_tx_type_set = CAST(AV1E_SET_REDUCED_TX_TYPE_SET, args);
2272*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2273*77c1e3ccSAndroid Build Coastguard Worker }
2274*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_intra_dct_only(aom_codec_alg_priv_t * ctx,va_list args)2275*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_intra_dct_only(aom_codec_alg_priv_t *ctx,
2276*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2277*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2278*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.use_intra_dct_only = CAST(AV1E_SET_INTRA_DCT_ONLY, args);
2279*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2280*77c1e3ccSAndroid Build Coastguard Worker }
2281*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_inter_dct_only(aom_codec_alg_priv_t * ctx,va_list args)2282*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_inter_dct_only(aom_codec_alg_priv_t *ctx,
2283*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2284*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2285*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.use_inter_dct_only = CAST(AV1E_SET_INTER_DCT_ONLY, args);
2286*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2287*77c1e3ccSAndroid Build Coastguard Worker }
2288*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_intra_default_tx_only(aom_codec_alg_priv_t * ctx,va_list args)2289*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_intra_default_tx_only(aom_codec_alg_priv_t *ctx,
2290*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2291*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2292*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.use_intra_default_tx_only =
2293*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_INTRA_DEFAULT_TX_ONLY, args);
2294*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2295*77c1e3ccSAndroid Build Coastguard Worker }
2296*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_tx_size_search(aom_codec_alg_priv_t * ctx,va_list args)2297*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_tx_size_search(aom_codec_alg_priv_t *ctx,
2298*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2299*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2300*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_tx_size_search = CAST(AV1E_SET_ENABLE_TX_SIZE_SEARCH, args);
2301*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2302*77c1e3ccSAndroid Build Coastguard Worker }
2303*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_quant_b_adapt(aom_codec_alg_priv_t * ctx,va_list args)2304*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_quant_b_adapt(aom_codec_alg_priv_t *ctx,
2305*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2306*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_REALTIME_ONLY
2307*77c1e3ccSAndroid Build Coastguard Worker (void)ctx;
2308*77c1e3ccSAndroid Build Coastguard Worker (void)args;
2309*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INCAPABLE;
2310*77c1e3ccSAndroid Build Coastguard Worker #else
2311*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2312*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.quant_b_adapt = CAST(AV1E_SET_QUANT_B_ADAPT, args);
2313*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2314*77c1e3ccSAndroid Build Coastguard Worker #endif
2315*77c1e3ccSAndroid Build Coastguard Worker }
2316*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_vbr_corpus_complexity_lap(aom_codec_alg_priv_t * ctx,va_list args)2317*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_vbr_corpus_complexity_lap(
2318*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2319*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2320*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.vbr_corpus_complexity_lap =
2321*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_VBR_CORPUS_COMPLEXITY_LAP, args);
2322*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2323*77c1e3ccSAndroid Build Coastguard Worker }
ctrl_set_coeff_cost_upd_freq(aom_codec_alg_priv_t * ctx,va_list args)2324*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_coeff_cost_upd_freq(aom_codec_alg_priv_t *ctx,
2325*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2326*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2327*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.coeff_cost_upd_freq = CAST(AV1E_SET_COEFF_COST_UPD_FREQ, args);
2328*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2329*77c1e3ccSAndroid Build Coastguard Worker }
2330*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_mode_cost_upd_freq(aom_codec_alg_priv_t * ctx,va_list args)2331*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_mode_cost_upd_freq(aom_codec_alg_priv_t *ctx,
2332*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2333*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2334*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.mode_cost_upd_freq = CAST(AV1E_SET_MODE_COST_UPD_FREQ, args);
2335*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2336*77c1e3ccSAndroid Build Coastguard Worker }
2337*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_mv_cost_upd_freq(aom_codec_alg_priv_t * ctx,va_list args)2338*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_mv_cost_upd_freq(aom_codec_alg_priv_t *ctx,
2339*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2340*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2341*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.mv_cost_upd_freq = CAST(AV1E_SET_MV_COST_UPD_FREQ, args);
2342*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2343*77c1e3ccSAndroid Build Coastguard Worker }
2344*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_dv_cost_upd_freq(aom_codec_alg_priv_t * ctx,va_list args)2345*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_dv_cost_upd_freq(aom_codec_alg_priv_t *ctx,
2346*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2347*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2348*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.dv_cost_upd_freq = CAST(AV1E_SET_DV_COST_UPD_FREQ, args);
2349*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2350*77c1e3ccSAndroid Build Coastguard Worker }
2351*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_vmaf_model_path(aom_codec_alg_priv_t * ctx,va_list args)2352*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_vmaf_model_path(aom_codec_alg_priv_t *ctx,
2353*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2354*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2355*77c1e3ccSAndroid Build Coastguard Worker const char *str = CAST(AV1E_SET_VMAF_MODEL_PATH, args);
2356*77c1e3ccSAndroid Build Coastguard Worker const aom_codec_err_t ret = allocate_and_set_string(
2357*77c1e3ccSAndroid Build Coastguard Worker str, default_extra_cfg[0].vmaf_model_path, &extra_cfg.vmaf_model_path,
2358*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->error.detail);
2359*77c1e3ccSAndroid Build Coastguard Worker if (ret != AOM_CODEC_OK) return ret;
2360*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2361*77c1e3ccSAndroid Build Coastguard Worker }
2362*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_partition_info_path(aom_codec_alg_priv_t * ctx,va_list args)2363*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_partition_info_path(aom_codec_alg_priv_t *ctx,
2364*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2365*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2366*77c1e3ccSAndroid Build Coastguard Worker const char *str = CAST(AV1E_SET_PARTITION_INFO_PATH, args);
2367*77c1e3ccSAndroid Build Coastguard Worker const aom_codec_err_t ret = allocate_and_set_string(
2368*77c1e3ccSAndroid Build Coastguard Worker str, default_extra_cfg[0].partition_info_path,
2369*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg.partition_info_path, ctx->ppi->error.detail);
2370*77c1e3ccSAndroid Build Coastguard Worker if (ret != AOM_CODEC_OK) return ret;
2371*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2372*77c1e3ccSAndroid Build Coastguard Worker }
2373*77c1e3ccSAndroid Build Coastguard Worker
ctrl_enable_rate_guide_deltaq(aom_codec_alg_priv_t * ctx,va_list args)2374*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_enable_rate_guide_deltaq(aom_codec_alg_priv_t *ctx,
2375*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2376*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2377*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_rate_guide_deltaq =
2378*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_ENABLE_RATE_GUIDE_DELTAQ, args);
2379*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2380*77c1e3ccSAndroid Build Coastguard Worker }
2381*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_rate_distribution_info(aom_codec_alg_priv_t * ctx,va_list args)2382*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_rate_distribution_info(
2383*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2384*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2385*77c1e3ccSAndroid Build Coastguard Worker const char *str = CAST(AV1E_SET_RATE_DISTRIBUTION_INFO, args);
2386*77c1e3ccSAndroid Build Coastguard Worker const aom_codec_err_t ret = allocate_and_set_string(
2387*77c1e3ccSAndroid Build Coastguard Worker str, default_extra_cfg[0].rate_distribution_info,
2388*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg.rate_distribution_info, ctx->ppi->error.detail);
2389*77c1e3ccSAndroid Build Coastguard Worker if (ret != AOM_CODEC_OK) return ret;
2390*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2391*77c1e3ccSAndroid Build Coastguard Worker }
2392*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_film_grain_test_vector(aom_codec_alg_priv_t * ctx,va_list args)2393*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_film_grain_test_vector(
2394*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2395*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2396*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.film_grain_test_vector =
2397*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_FILM_GRAIN_TEST_VECTOR, args);
2398*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2399*77c1e3ccSAndroid Build Coastguard Worker }
2400*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_film_grain_table(aom_codec_alg_priv_t * ctx,va_list args)2401*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_film_grain_table(aom_codec_alg_priv_t *ctx,
2402*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2403*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2404*77c1e3ccSAndroid Build Coastguard Worker const char *str = CAST(AV1E_SET_FILM_GRAIN_TABLE, args);
2405*77c1e3ccSAndroid Build Coastguard Worker if (str == NULL) {
2406*77c1e3ccSAndroid Build Coastguard Worker // this parameter allows NULL as its value
2407*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.film_grain_table_filename = str;
2408*77c1e3ccSAndroid Build Coastguard Worker } else {
2409*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_REALTIME_ONLY
2410*77c1e3ccSAndroid Build Coastguard Worker ERROR("film_grain removed from realtime only build.");
2411*77c1e3ccSAndroid Build Coastguard Worker #endif
2412*77c1e3ccSAndroid Build Coastguard Worker const aom_codec_err_t ret = allocate_and_set_string(
2413*77c1e3ccSAndroid Build Coastguard Worker str, default_extra_cfg[0].film_grain_table_filename,
2414*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg.film_grain_table_filename, ctx->ppi->error.detail);
2415*77c1e3ccSAndroid Build Coastguard Worker if (ret != AOM_CODEC_OK) return ret;
2416*77c1e3ccSAndroid Build Coastguard Worker }
2417*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2418*77c1e3ccSAndroid Build Coastguard Worker }
2419*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_denoise_noise_level(aom_codec_alg_priv_t * ctx,va_list args)2420*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_denoise_noise_level(aom_codec_alg_priv_t *ctx,
2421*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2422*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_DENOISE
2423*77c1e3ccSAndroid Build Coastguard Worker (void)ctx;
2424*77c1e3ccSAndroid Build Coastguard Worker (void)args;
2425*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INCAPABLE;
2426*77c1e3ccSAndroid Build Coastguard Worker #else
2427*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2428*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.noise_level =
2429*77c1e3ccSAndroid Build Coastguard Worker ((float)CAST(AV1E_SET_DENOISE_NOISE_LEVEL, args)) / 10.0f;
2430*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2431*77c1e3ccSAndroid Build Coastguard Worker #endif
2432*77c1e3ccSAndroid Build Coastguard Worker }
2433*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_denoise_block_size(aom_codec_alg_priv_t * ctx,va_list args)2434*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_denoise_block_size(aom_codec_alg_priv_t *ctx,
2435*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2436*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_DENOISE
2437*77c1e3ccSAndroid Build Coastguard Worker (void)ctx;
2438*77c1e3ccSAndroid Build Coastguard Worker (void)args;
2439*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INCAPABLE;
2440*77c1e3ccSAndroid Build Coastguard Worker #else
2441*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2442*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.noise_block_size = CAST(AV1E_SET_DENOISE_BLOCK_SIZE, args);
2443*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2444*77c1e3ccSAndroid Build Coastguard Worker #endif
2445*77c1e3ccSAndroid Build Coastguard Worker }
2446*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_enable_dnl_denoising(aom_codec_alg_priv_t * ctx,va_list args)2447*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_enable_dnl_denoising(aom_codec_alg_priv_t *ctx,
2448*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2449*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_DENOISE
2450*77c1e3ccSAndroid Build Coastguard Worker (void)ctx;
2451*77c1e3ccSAndroid Build Coastguard Worker (void)args;
2452*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INCAPABLE;
2453*77c1e3ccSAndroid Build Coastguard Worker #else
2454*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2455*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_dnl_denoising = CAST(AV1E_SET_ENABLE_DNL_DENOISING, args);
2456*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2457*77c1e3ccSAndroid Build Coastguard Worker #endif
2458*77c1e3ccSAndroid Build Coastguard Worker }
2459*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_deltaq_mode(aom_codec_alg_priv_t * ctx,va_list args)2460*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_deltaq_mode(aom_codec_alg_priv_t *ctx,
2461*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2462*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2463*77c1e3ccSAndroid Build Coastguard Worker const DELTAQ_MODE deltaq_arg = CAST(AV1E_SET_DELTAQ_MODE, args);
2464*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_REALTIME_ONLY
2465*77c1e3ccSAndroid Build Coastguard Worker if (deltaq_arg > NO_DELTA_Q) {
2466*77c1e3ccSAndroid Build Coastguard Worker ERROR("Delta Q mode can't be enabled in realtime only build.");
2467*77c1e3ccSAndroid Build Coastguard Worker }
2468*77c1e3ccSAndroid Build Coastguard Worker #endif
2469*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.deltaq_mode = deltaq_arg;
2470*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2471*77c1e3ccSAndroid Build Coastguard Worker }
2472*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_deltaq_strength(aom_codec_alg_priv_t * ctx,va_list args)2473*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_deltaq_strength(aom_codec_alg_priv_t *ctx,
2474*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2475*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2476*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.deltaq_strength = CAST(AV1E_SET_DELTAQ_STRENGTH, args);
2477*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2478*77c1e3ccSAndroid Build Coastguard Worker }
2479*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_deltalf_mode(aom_codec_alg_priv_t * ctx,va_list args)2480*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_deltalf_mode(aom_codec_alg_priv_t *ctx,
2481*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2482*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2483*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.deltalf_mode = CAST(AV1E_SET_DELTALF_MODE, args);
2484*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2485*77c1e3ccSAndroid Build Coastguard Worker }
2486*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_min_gf_interval(aom_codec_alg_priv_t * ctx,va_list args)2487*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_min_gf_interval(aom_codec_alg_priv_t *ctx,
2488*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2489*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2490*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.min_gf_interval = CAST(AV1E_SET_MIN_GF_INTERVAL, args);
2491*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2492*77c1e3ccSAndroid Build Coastguard Worker }
2493*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_max_gf_interval(aom_codec_alg_priv_t * ctx,va_list args)2494*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_max_gf_interval(aom_codec_alg_priv_t *ctx,
2495*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2496*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2497*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.max_gf_interval = CAST(AV1E_SET_MAX_GF_INTERVAL, args);
2498*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2499*77c1e3ccSAndroid Build Coastguard Worker }
2500*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_gf_min_pyr_height(aom_codec_alg_priv_t * ctx,va_list args)2501*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_gf_min_pyr_height(aom_codec_alg_priv_t *ctx,
2502*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2503*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2504*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.gf_min_pyr_height = CAST(AV1E_SET_GF_MIN_PYRAMID_HEIGHT, args);
2505*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2506*77c1e3ccSAndroid Build Coastguard Worker }
2507*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_gf_max_pyr_height(aom_codec_alg_priv_t * ctx,va_list args)2508*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_gf_max_pyr_height(aom_codec_alg_priv_t *ctx,
2509*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2510*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2511*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.gf_max_pyr_height = CAST(AV1E_SET_GF_MAX_PYRAMID_HEIGHT, args);
2512*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2513*77c1e3ccSAndroid Build Coastguard Worker }
2514*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_frame_periodic_boost(aom_codec_alg_priv_t * ctx,va_list args)2515*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_frame_periodic_boost(aom_codec_alg_priv_t *ctx,
2516*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2517*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2518*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.frame_periodic_boost = CAST(AV1E_SET_FRAME_PERIODIC_BOOST, args);
2519*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2520*77c1e3ccSAndroid Build Coastguard Worker }
2521*77c1e3ccSAndroid Build Coastguard Worker
ctrl_enable_motion_vector_unit_test(aom_codec_alg_priv_t * ctx,va_list args)2522*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_enable_motion_vector_unit_test(
2523*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2524*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2525*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.motion_vector_unit_test =
2526*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_ENABLE_MOTION_VECTOR_UNIT_TEST, args);
2527*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2528*77c1e3ccSAndroid Build Coastguard Worker }
2529*77c1e3ccSAndroid Build Coastguard Worker
ctrl_enable_fpmt_unit_test(aom_codec_alg_priv_t * ctx,va_list args)2530*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_enable_fpmt_unit_test(aom_codec_alg_priv_t *ctx,
2531*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2532*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_FPMT_TEST
2533*77c1e3ccSAndroid Build Coastguard Worker (void)args;
2534*77c1e3ccSAndroid Build Coastguard Worker (void)ctx;
2535*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INCAPABLE;
2536*77c1e3ccSAndroid Build Coastguard Worker #else
2537*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2538*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.fpmt_unit_test = CAST(AV1E_SET_FP_MT_UNIT_TEST, args);
2539*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->fpmt_unit_test_cfg = (extra_cfg.fpmt_unit_test == 1)
2540*77c1e3ccSAndroid Build Coastguard Worker ? PARALLEL_ENCODE
2541*77c1e3ccSAndroid Build Coastguard Worker : PARALLEL_SIMULATION_ENCODE;
2542*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2543*77c1e3ccSAndroid Build Coastguard Worker #endif
2544*77c1e3ccSAndroid Build Coastguard Worker }
2545*77c1e3ccSAndroid Build Coastguard Worker
ctrl_enable_ext_tile_debug(aom_codec_alg_priv_t * ctx,va_list args)2546*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_enable_ext_tile_debug(aom_codec_alg_priv_t *ctx,
2547*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2548*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2549*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.ext_tile_debug = CAST(AV1E_ENABLE_EXT_TILE_DEBUG, args);
2550*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2551*77c1e3ccSAndroid Build Coastguard Worker }
2552*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_target_seq_level_idx(aom_codec_alg_priv_t * ctx,va_list args)2553*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_target_seq_level_idx(aom_codec_alg_priv_t *ctx,
2554*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2555*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2556*77c1e3ccSAndroid Build Coastguard Worker const int val = CAST(AV1E_SET_TARGET_SEQ_LEVEL_IDX, args);
2557*77c1e3ccSAndroid Build Coastguard Worker const int level = val % 100;
2558*77c1e3ccSAndroid Build Coastguard Worker const int operating_point_idx = val / 100;
2559*77c1e3ccSAndroid Build Coastguard Worker if (operating_point_idx < 0 ||
2560*77c1e3ccSAndroid Build Coastguard Worker operating_point_idx >= MAX_NUM_OPERATING_POINTS) {
2561*77c1e3ccSAndroid Build Coastguard Worker char *const err_string = ctx->ppi->error.detail;
2562*77c1e3ccSAndroid Build Coastguard Worker snprintf(err_string, ARG_ERR_MSG_MAX_LEN,
2563*77c1e3ccSAndroid Build Coastguard Worker "Invalid operating point index: %d", operating_point_idx);
2564*77c1e3ccSAndroid Build Coastguard Worker ctx->base.err_detail = err_string;
2565*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
2566*77c1e3ccSAndroid Build Coastguard Worker }
2567*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.target_seq_level_idx[operating_point_idx] = (AV1_LEVEL)level;
2568*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2569*77c1e3ccSAndroid Build Coastguard Worker }
2570*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_tier_mask(aom_codec_alg_priv_t * ctx,va_list args)2571*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_tier_mask(aom_codec_alg_priv_t *ctx,
2572*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2573*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2574*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.tier_mask = CAST(AV1E_SET_TIER_MASK, args);
2575*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2576*77c1e3ccSAndroid Build Coastguard Worker }
2577*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_min_cr(aom_codec_alg_priv_t * ctx,va_list args)2578*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_min_cr(aom_codec_alg_priv_t *ctx,
2579*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2580*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2581*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.min_cr = CAST(AV1E_SET_MIN_CR, args);
2582*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2583*77c1e3ccSAndroid Build Coastguard Worker }
2584*77c1e3ccSAndroid Build Coastguard Worker
ctrl_enable_sb_multipass_unit_test(aom_codec_alg_priv_t * ctx,va_list args)2585*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_enable_sb_multipass_unit_test(
2586*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2587*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2588*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.sb_multipass_unit_test =
2589*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_ENABLE_SB_MULTIPASS_UNIT_TEST, args);
2590*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2591*77c1e3ccSAndroid Build Coastguard Worker }
2592*77c1e3ccSAndroid Build Coastguard Worker
ctrl_enable_sb_qp_sweep(aom_codec_alg_priv_t * ctx,va_list args)2593*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_enable_sb_qp_sweep(aom_codec_alg_priv_t *ctx,
2594*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2595*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2596*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.sb_qp_sweep = CAST(AV1E_ENABLE_SB_QP_SWEEP, args);
2597*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2598*77c1e3ccSAndroid Build Coastguard Worker }
2599*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_external_partition(aom_codec_alg_priv_t * ctx,va_list args)2600*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_external_partition(aom_codec_alg_priv_t *ctx,
2601*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2602*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *const cpi = ctx->ppi->cpi;
2603*77c1e3ccSAndroid Build Coastguard Worker aom_ext_part_funcs_t funcs = *CAST(AV1E_SET_EXTERNAL_PARTITION, args);
2604*77c1e3ccSAndroid Build Coastguard Worker aom_ext_part_config_t config;
2605*77c1e3ccSAndroid Build Coastguard Worker // TODO(chengchen): verify the sb_size has been set at this point.
2606*77c1e3ccSAndroid Build Coastguard Worker config.superblock_size = cpi->common.seq_params->sb_size;
2607*77c1e3ccSAndroid Build Coastguard Worker const aom_codec_err_t status =
2608*77c1e3ccSAndroid Build Coastguard Worker av1_ext_part_create(funcs, config, &cpi->ext_part_controller);
2609*77c1e3ccSAndroid Build Coastguard Worker return status;
2610*77c1e3ccSAndroid Build Coastguard Worker }
2611*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_loopfilter_control(aom_codec_alg_priv_t * ctx,va_list args)2612*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_loopfilter_control(aom_codec_alg_priv_t *ctx,
2613*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2614*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2615*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.loopfilter_control = CAST(AV1E_SET_LOOPFILTER_CONTROL, args);
2616*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2617*77c1e3ccSAndroid Build Coastguard Worker }
2618*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_skip_postproc_filtering(aom_codec_alg_priv_t * ctx,va_list args)2619*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_skip_postproc_filtering(
2620*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2621*77c1e3ccSAndroid Build Coastguard Worker // Skipping the application of post-processing filters is allowed only
2622*77c1e3ccSAndroid Build Coastguard Worker // for ALLINTRA mode.
2623*77c1e3ccSAndroid Build Coastguard Worker if (ctx->cfg.g_usage != AOM_USAGE_ALL_INTRA) return AOM_CODEC_INCAPABLE;
2624*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2625*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.skip_postproc_filtering =
2626*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_SKIP_POSTPROC_FILTERING, args);
2627*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2628*77c1e3ccSAndroid Build Coastguard Worker }
2629*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_rtc_external_rc(aom_codec_alg_priv_t * ctx,va_list args)2630*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_rtc_external_rc(aom_codec_alg_priv_t *ctx,
2631*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2632*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->cpi->rc.rtc_external_ratectrl =
2633*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_RTC_EXTERNAL_RC, args);
2634*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
2635*77c1e3ccSAndroid Build Coastguard Worker }
2636*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_quantizer_one_pass(aom_codec_alg_priv_t * ctx,va_list args)2637*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_quantizer_one_pass(aom_codec_alg_priv_t *ctx,
2638*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2639*77c1e3ccSAndroid Build Coastguard Worker const int qp = CAST(AV1E_SET_QUANTIZER_ONE_PASS, args);
2640*77c1e3ccSAndroid Build Coastguard Worker
2641*77c1e3ccSAndroid Build Coastguard Worker if (qp < 0 || qp > 63) return AOM_CODEC_INVALID_PARAM;
2642*77c1e3ccSAndroid Build Coastguard Worker
2643*77c1e3ccSAndroid Build Coastguard Worker aom_codec_enc_cfg_t *cfg = &ctx->cfg;
2644*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2645*77c1e3ccSAndroid Build Coastguard Worker cfg->rc_min_quantizer = cfg->rc_max_quantizer = qp;
2646*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.aq_mode = 0;
2647*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->cpi->rc.use_external_qp_one_pass = 1;
2648*77c1e3ccSAndroid Build Coastguard Worker
2649*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2650*77c1e3ccSAndroid Build Coastguard Worker }
2651*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_bitrate_one_pass_cbr(aom_codec_alg_priv_t * ctx,va_list args)2652*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_bitrate_one_pass_cbr(aom_codec_alg_priv_t *ctx,
2653*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2654*77c1e3ccSAndroid Build Coastguard Worker AV1_PRIMARY *const ppi = ctx->ppi;
2655*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *const cpi = ppi->cpi;
2656*77c1e3ccSAndroid Build Coastguard Worker AV1EncoderConfig *oxcf = &cpi->oxcf;
2657*77c1e3ccSAndroid Build Coastguard Worker if (!is_one_pass_rt_params(cpi) || oxcf->rc_cfg.mode != AOM_CBR ||
2658*77c1e3ccSAndroid Build Coastguard Worker cpi->ppi->use_svc || ppi->num_fp_contexts != 1 || ppi->cpi_lap != NULL) {
2659*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
2660*77c1e3ccSAndroid Build Coastguard Worker }
2661*77c1e3ccSAndroid Build Coastguard Worker const int new_bitrate = CAST(AV1E_SET_BITRATE_ONE_PASS_CBR, args);
2662*77c1e3ccSAndroid Build Coastguard Worker ctx->cfg.rc_target_bitrate = new_bitrate;
2663*77c1e3ccSAndroid Build Coastguard Worker oxcf->rc_cfg.target_bandwidth = new_bitrate * 1000;
2664*77c1e3ccSAndroid Build Coastguard Worker set_primary_rc_buffer_sizes(oxcf, ppi);
2665*77c1e3ccSAndroid Build Coastguard Worker av1_new_framerate(cpi, cpi->framerate);
2666*77c1e3ccSAndroid Build Coastguard Worker check_reset_rc_flag(cpi);
2667*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
2668*77c1e3ccSAndroid Build Coastguard Worker }
2669*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_max_consec_frame_drop_cbr(aom_codec_alg_priv_t * ctx,va_list args)2670*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_max_consec_frame_drop_cbr(
2671*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2672*77c1e3ccSAndroid Build Coastguard Worker AV1_PRIMARY *const ppi = ctx->ppi;
2673*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *const cpi = ppi->cpi;
2674*77c1e3ccSAndroid Build Coastguard Worker const int max_consec_drop = CAST(AV1E_SET_MAX_CONSEC_FRAME_DROP_CBR, args);
2675*77c1e3ccSAndroid Build Coastguard Worker if (max_consec_drop < 0) return AOM_CODEC_INVALID_PARAM;
2676*77c1e3ccSAndroid Build Coastguard Worker cpi->rc.max_consec_drop = max_consec_drop;
2677*77c1e3ccSAndroid Build Coastguard Worker cpi->rc.drop_count_consec = 0;
2678*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
2679*77c1e3ccSAndroid Build Coastguard Worker }
2680*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_max_consec_frame_drop_ms_cbr(aom_codec_alg_priv_t * ctx,va_list args)2681*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_max_consec_frame_drop_ms_cbr(
2682*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
2683*77c1e3ccSAndroid Build Coastguard Worker AV1_PRIMARY *const ppi = ctx->ppi;
2684*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *const cpi = ppi->cpi;
2685*77c1e3ccSAndroid Build Coastguard Worker const int max_consec_drop_ms =
2686*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_MAX_CONSEC_FRAME_DROP_MS_CBR, args);
2687*77c1e3ccSAndroid Build Coastguard Worker if (max_consec_drop_ms < 0) return AOM_CODEC_INVALID_PARAM;
2688*77c1e3ccSAndroid Build Coastguard Worker // max_consec_drop_ms will be converted to frame units inside encoder
2689*77c1e3ccSAndroid Build Coastguard Worker // based on framerate (which can change dynamically).
2690*77c1e3ccSAndroid Build Coastguard Worker ctx->oxcf.rc_cfg.max_consec_drop_ms = max_consec_drop_ms;
2691*77c1e3ccSAndroid Build Coastguard Worker cpi->rc.drop_count_consec = 0;
2692*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
2693*77c1e3ccSAndroid Build Coastguard Worker }
2694*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_svc_frame_drop_mode(aom_codec_alg_priv_t * ctx,va_list args)2695*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_svc_frame_drop_mode(aom_codec_alg_priv_t *ctx,
2696*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2697*77c1e3ccSAndroid Build Coastguard Worker AV1_PRIMARY *const ppi = ctx->ppi;
2698*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *const cpi = ppi->cpi;
2699*77c1e3ccSAndroid Build Coastguard Worker cpi->svc.framedrop_mode = CAST(AV1E_SET_SVC_FRAME_DROP_MODE, args);
2700*77c1e3ccSAndroid Build Coastguard Worker if (cpi->svc.framedrop_mode != AOM_LAYER_DROP &&
2701*77c1e3ccSAndroid Build Coastguard Worker cpi->svc.framedrop_mode != AOM_FULL_SUPERFRAME_DROP)
2702*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
2703*77c1e3ccSAndroid Build Coastguard Worker else
2704*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
2705*77c1e3ccSAndroid Build Coastguard Worker }
2706*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_auto_tiles(aom_codec_alg_priv_t * ctx,va_list args)2707*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_auto_tiles(aom_codec_alg_priv_t *ctx,
2708*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2709*77c1e3ccSAndroid Build Coastguard Worker unsigned int auto_tiles = CAST(AV1E_SET_AUTO_TILES, args);
2710*77c1e3ccSAndroid Build Coastguard Worker if (auto_tiles == ctx->extra_cfg.auto_tiles) return AOM_CODEC_OK;
2711*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2712*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.auto_tiles = auto_tiles;
2713*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2714*77c1e3ccSAndroid Build Coastguard Worker }
2715*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_postencode_drop_rtc(aom_codec_alg_priv_t * ctx,va_list args)2716*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_postencode_drop_rtc(aom_codec_alg_priv_t *ctx,
2717*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2718*77c1e3ccSAndroid Build Coastguard Worker AV1_PRIMARY *const ppi = ctx->ppi;
2719*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *const cpi = ppi->cpi;
2720*77c1e3ccSAndroid Build Coastguard Worker int enable_postencode_drop = CAST(AV1E_SET_POSTENCODE_DROP_RTC, args);
2721*77c1e3ccSAndroid Build Coastguard Worker if (enable_postencode_drop > 1 || enable_postencode_drop < 0)
2722*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
2723*77c1e3ccSAndroid Build Coastguard Worker cpi->rc.postencode_drop = enable_postencode_drop;
2724*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
2725*77c1e3ccSAndroid Build Coastguard Worker }
2726*77c1e3ccSAndroid Build Coastguard Worker
2727*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
create_stats_buffer(FIRSTPASS_STATS ** frame_stats_buffer,STATS_BUFFER_CTX * stats_buf_context,int num_lap_buffers)2728*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t create_stats_buffer(FIRSTPASS_STATS **frame_stats_buffer,
2729*77c1e3ccSAndroid Build Coastguard Worker STATS_BUFFER_CTX *stats_buf_context,
2730*77c1e3ccSAndroid Build Coastguard Worker int num_lap_buffers) {
2731*77c1e3ccSAndroid Build Coastguard Worker aom_codec_err_t res = AOM_CODEC_OK;
2732*77c1e3ccSAndroid Build Coastguard Worker
2733*77c1e3ccSAndroid Build Coastguard Worker int size = get_stats_buf_size(num_lap_buffers, MAX_LAG_BUFFERS);
2734*77c1e3ccSAndroid Build Coastguard Worker *frame_stats_buffer =
2735*77c1e3ccSAndroid Build Coastguard Worker (FIRSTPASS_STATS *)aom_calloc(size, sizeof(FIRSTPASS_STATS));
2736*77c1e3ccSAndroid Build Coastguard Worker if (*frame_stats_buffer == NULL) return AOM_CODEC_MEM_ERROR;
2737*77c1e3ccSAndroid Build Coastguard Worker
2738*77c1e3ccSAndroid Build Coastguard Worker stats_buf_context->stats_in_start = *frame_stats_buffer;
2739*77c1e3ccSAndroid Build Coastguard Worker stats_buf_context->stats_in_end = stats_buf_context->stats_in_start;
2740*77c1e3ccSAndroid Build Coastguard Worker stats_buf_context->stats_in_buf_end =
2741*77c1e3ccSAndroid Build Coastguard Worker stats_buf_context->stats_in_start + size;
2742*77c1e3ccSAndroid Build Coastguard Worker
2743*77c1e3ccSAndroid Build Coastguard Worker stats_buf_context->total_left_stats = aom_calloc(1, sizeof(FIRSTPASS_STATS));
2744*77c1e3ccSAndroid Build Coastguard Worker if (stats_buf_context->total_left_stats == NULL) return AOM_CODEC_MEM_ERROR;
2745*77c1e3ccSAndroid Build Coastguard Worker av1_twopass_zero_stats(stats_buf_context->total_left_stats);
2746*77c1e3ccSAndroid Build Coastguard Worker stats_buf_context->total_stats = aom_calloc(1, sizeof(FIRSTPASS_STATS));
2747*77c1e3ccSAndroid Build Coastguard Worker if (stats_buf_context->total_stats == NULL) return AOM_CODEC_MEM_ERROR;
2748*77c1e3ccSAndroid Build Coastguard Worker av1_twopass_zero_stats(stats_buf_context->total_stats);
2749*77c1e3ccSAndroid Build Coastguard Worker return res;
2750*77c1e3ccSAndroid Build Coastguard Worker }
2751*77c1e3ccSAndroid Build Coastguard Worker #endif
2752*77c1e3ccSAndroid Build Coastguard Worker
av1_create_context_and_bufferpool(AV1_PRIMARY * ppi,AV1_COMP ** p_cpi,BufferPool ** p_buffer_pool,const AV1EncoderConfig * oxcf,COMPRESSOR_STAGE stage,int lap_lag_in_frames)2753*77c1e3ccSAndroid Build Coastguard Worker aom_codec_err_t av1_create_context_and_bufferpool(AV1_PRIMARY *ppi,
2754*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP **p_cpi,
2755*77c1e3ccSAndroid Build Coastguard Worker BufferPool **p_buffer_pool,
2756*77c1e3ccSAndroid Build Coastguard Worker const AV1EncoderConfig *oxcf,
2757*77c1e3ccSAndroid Build Coastguard Worker COMPRESSOR_STAGE stage,
2758*77c1e3ccSAndroid Build Coastguard Worker int lap_lag_in_frames) {
2759*77c1e3ccSAndroid Build Coastguard Worker aom_codec_err_t res = AOM_CODEC_OK;
2760*77c1e3ccSAndroid Build Coastguard Worker BufferPool *buffer_pool = *p_buffer_pool;
2761*77c1e3ccSAndroid Build Coastguard Worker
2762*77c1e3ccSAndroid Build Coastguard Worker if (buffer_pool == NULL) {
2763*77c1e3ccSAndroid Build Coastguard Worker buffer_pool = (BufferPool *)aom_calloc(1, sizeof(BufferPool));
2764*77c1e3ccSAndroid Build Coastguard Worker if (buffer_pool == NULL) return AOM_CODEC_MEM_ERROR;
2765*77c1e3ccSAndroid Build Coastguard Worker buffer_pool->num_frame_bufs =
2766*77c1e3ccSAndroid Build Coastguard Worker (oxcf->mode == ALLINTRA) ? FRAME_BUFFERS_ALLINTRA : FRAME_BUFFERS;
2767*77c1e3ccSAndroid Build Coastguard Worker buffer_pool->frame_bufs = (RefCntBuffer *)aom_calloc(
2768*77c1e3ccSAndroid Build Coastguard Worker buffer_pool->num_frame_bufs, sizeof(*buffer_pool->frame_bufs));
2769*77c1e3ccSAndroid Build Coastguard Worker if (buffer_pool->frame_bufs == NULL) {
2770*77c1e3ccSAndroid Build Coastguard Worker buffer_pool->num_frame_bufs = 0;
2771*77c1e3ccSAndroid Build Coastguard Worker aom_free(buffer_pool);
2772*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_MEM_ERROR;
2773*77c1e3ccSAndroid Build Coastguard Worker }
2774*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_MULTITHREAD
2775*77c1e3ccSAndroid Build Coastguard Worker if (pthread_mutex_init(&buffer_pool->pool_mutex, NULL)) {
2776*77c1e3ccSAndroid Build Coastguard Worker aom_free(buffer_pool->frame_bufs);
2777*77c1e3ccSAndroid Build Coastguard Worker buffer_pool->frame_bufs = NULL;
2778*77c1e3ccSAndroid Build Coastguard Worker buffer_pool->num_frame_bufs = 0;
2779*77c1e3ccSAndroid Build Coastguard Worker aom_free(buffer_pool);
2780*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_MEM_ERROR;
2781*77c1e3ccSAndroid Build Coastguard Worker }
2782*77c1e3ccSAndroid Build Coastguard Worker #endif
2783*77c1e3ccSAndroid Build Coastguard Worker *p_buffer_pool = buffer_pool;
2784*77c1e3ccSAndroid Build Coastguard Worker }
2785*77c1e3ccSAndroid Build Coastguard Worker *p_cpi =
2786*77c1e3ccSAndroid Build Coastguard Worker av1_create_compressor(ppi, oxcf, buffer_pool, stage, lap_lag_in_frames);
2787*77c1e3ccSAndroid Build Coastguard Worker if (*p_cpi == NULL) res = AOM_CODEC_MEM_ERROR;
2788*77c1e3ccSAndroid Build Coastguard Worker
2789*77c1e3ccSAndroid Build Coastguard Worker return res;
2790*77c1e3ccSAndroid Build Coastguard Worker }
2791*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_fp_mt(aom_codec_alg_priv_t * ctx,va_list args)2792*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_fp_mt(aom_codec_alg_priv_t *ctx, va_list args) {
2793*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2794*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.fp_mt = CAST(AV1E_SET_FP_MT, args);
2795*77c1e3ccSAndroid Build Coastguard Worker const aom_codec_err_t result = update_extra_cfg(ctx, &extra_cfg);
2796*77c1e3ccSAndroid Build Coastguard Worker int num_fp_contexts = 1;
2797*77c1e3ccSAndroid Build Coastguard Worker if (ctx->ppi->num_fp_contexts == 1) {
2798*77c1e3ccSAndroid Build Coastguard Worker num_fp_contexts =
2799*77c1e3ccSAndroid Build Coastguard Worker av1_compute_num_fp_contexts(ctx->ppi, &ctx->ppi->parallel_cpi[0]->oxcf);
2800*77c1e3ccSAndroid Build Coastguard Worker if (num_fp_contexts > 1) {
2801*77c1e3ccSAndroid Build Coastguard Worker int i;
2802*77c1e3ccSAndroid Build Coastguard Worker for (i = 1; i < num_fp_contexts; i++) {
2803*77c1e3ccSAndroid Build Coastguard Worker int res = av1_create_context_and_bufferpool(
2804*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi, &ctx->ppi->parallel_cpi[i], &ctx->buffer_pool, &ctx->oxcf,
2805*77c1e3ccSAndroid Build Coastguard Worker ENCODE_STAGE, -1);
2806*77c1e3ccSAndroid Build Coastguard Worker if (res != AOM_CODEC_OK) {
2807*77c1e3ccSAndroid Build Coastguard Worker return res;
2808*77c1e3ccSAndroid Build Coastguard Worker }
2809*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
2810*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->parallel_cpi[i]->twopass_frame.stats_in =
2811*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->twopass.stats_buf_ctx->stats_in_start;
2812*77c1e3ccSAndroid Build Coastguard Worker #endif
2813*77c1e3ccSAndroid Build Coastguard Worker }
2814*77c1e3ccSAndroid Build Coastguard Worker }
2815*77c1e3ccSAndroid Build Coastguard Worker }
2816*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->num_fp_contexts = num_fp_contexts;
2817*77c1e3ccSAndroid Build Coastguard Worker return result;
2818*77c1e3ccSAndroid Build Coastguard Worker }
2819*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_auto_intra_tools_off(aom_codec_alg_priv_t * ctx,va_list args)2820*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_auto_intra_tools_off(aom_codec_alg_priv_t *ctx,
2821*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
2822*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
2823*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.auto_intra_tools_off = CAST(AV1E_SET_AUTO_INTRA_TOOLS_OFF, args);
2824*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
2825*77c1e3ccSAndroid Build Coastguard Worker }
2826*77c1e3ccSAndroid Build Coastguard Worker
encoder_init(aom_codec_ctx_t * ctx)2827*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t encoder_init(aom_codec_ctx_t *ctx) {
2828*77c1e3ccSAndroid Build Coastguard Worker aom_codec_err_t res = AOM_CODEC_OK;
2829*77c1e3ccSAndroid Build Coastguard Worker
2830*77c1e3ccSAndroid Build Coastguard Worker if (ctx->priv == NULL) {
2831*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *const priv = aom_calloc(1, sizeof(*priv));
2832*77c1e3ccSAndroid Build Coastguard Worker if (priv == NULL) return AOM_CODEC_MEM_ERROR;
2833*77c1e3ccSAndroid Build Coastguard Worker
2834*77c1e3ccSAndroid Build Coastguard Worker ctx->priv = (aom_codec_priv_t *)priv;
2835*77c1e3ccSAndroid Build Coastguard Worker ctx->priv->init_flags = ctx->init_flags;
2836*77c1e3ccSAndroid Build Coastguard Worker
2837*77c1e3ccSAndroid Build Coastguard Worker // Update the reference to the config structure to an internal copy.
2838*77c1e3ccSAndroid Build Coastguard Worker assert(ctx->config.enc);
2839*77c1e3ccSAndroid Build Coastguard Worker priv->cfg = *ctx->config.enc;
2840*77c1e3ccSAndroid Build Coastguard Worker ctx->config.enc = &priv->cfg;
2841*77c1e3ccSAndroid Build Coastguard Worker
2842*77c1e3ccSAndroid Build Coastguard Worker priv->extra_cfg = default_extra_cfg[0];
2843*77c1e3ccSAndroid Build Coastguard Worker // Special handling:
2844*77c1e3ccSAndroid Build Coastguard Worker // By default, if omitted, --enable-cdef = 1.
2845*77c1e3ccSAndroid Build Coastguard Worker // Here we set its default value to 0 when --allintra is turned on.
2846*77c1e3ccSAndroid Build Coastguard Worker // However, if users set --enable-cdef = 1 from command line,
2847*77c1e3ccSAndroid Build Coastguard Worker // The encoder still respects it.
2848*77c1e3ccSAndroid Build Coastguard Worker if (priv->cfg.g_usage == AOM_USAGE_ALL_INTRA) {
2849*77c1e3ccSAndroid Build Coastguard Worker priv->extra_cfg.enable_cdef = 0;
2850*77c1e3ccSAndroid Build Coastguard Worker }
2851*77c1e3ccSAndroid Build Coastguard Worker av1_initialize_enc(priv->cfg.g_usage, priv->cfg.rc_end_usage);
2852*77c1e3ccSAndroid Build Coastguard Worker
2853*77c1e3ccSAndroid Build Coastguard Worker res = validate_config(priv, &priv->cfg, &priv->extra_cfg);
2854*77c1e3ccSAndroid Build Coastguard Worker
2855*77c1e3ccSAndroid Build Coastguard Worker if (res == AOM_CODEC_OK) {
2856*77c1e3ccSAndroid Build Coastguard Worker int *num_lap_buffers = &priv->num_lap_buffers;
2857*77c1e3ccSAndroid Build Coastguard Worker int lap_lag_in_frames = 0;
2858*77c1e3ccSAndroid Build Coastguard Worker *num_lap_buffers = 0;
2859*77c1e3ccSAndroid Build Coastguard Worker priv->timestamp_ratio.den = priv->cfg.g_timebase.den;
2860*77c1e3ccSAndroid Build Coastguard Worker priv->timestamp_ratio.num =
2861*77c1e3ccSAndroid Build Coastguard Worker (int64_t)priv->cfg.g_timebase.num * TICKS_PER_SEC;
2862*77c1e3ccSAndroid Build Coastguard Worker reduce_ratio(&priv->timestamp_ratio);
2863*77c1e3ccSAndroid Build Coastguard Worker
2864*77c1e3ccSAndroid Build Coastguard Worker set_encoder_config(&priv->oxcf, &priv->cfg, &priv->extra_cfg);
2865*77c1e3ccSAndroid Build Coastguard Worker if (priv->oxcf.rc_cfg.mode != AOM_CBR &&
2866*77c1e3ccSAndroid Build Coastguard Worker priv->oxcf.pass == AOM_RC_ONE_PASS && priv->oxcf.mode == GOOD) {
2867*77c1e3ccSAndroid Build Coastguard Worker // Enable look ahead - enabled for AOM_Q, AOM_CQ, AOM_VBR
2868*77c1e3ccSAndroid Build Coastguard Worker *num_lap_buffers =
2869*77c1e3ccSAndroid Build Coastguard Worker AOMMIN((int)priv->cfg.g_lag_in_frames,
2870*77c1e3ccSAndroid Build Coastguard Worker AOMMIN(MAX_LAP_BUFFERS, priv->oxcf.kf_cfg.key_freq_max +
2871*77c1e3ccSAndroid Build Coastguard Worker SCENE_CUT_KEY_TEST_INTERVAL));
2872*77c1e3ccSAndroid Build Coastguard Worker if ((int)priv->cfg.g_lag_in_frames - (*num_lap_buffers) >=
2873*77c1e3ccSAndroid Build Coastguard Worker LAP_LAG_IN_FRAMES) {
2874*77c1e3ccSAndroid Build Coastguard Worker lap_lag_in_frames = LAP_LAG_IN_FRAMES;
2875*77c1e3ccSAndroid Build Coastguard Worker }
2876*77c1e3ccSAndroid Build Coastguard Worker }
2877*77c1e3ccSAndroid Build Coastguard Worker priv->oxcf.use_highbitdepth =
2878*77c1e3ccSAndroid Build Coastguard Worker (ctx->init_flags & AOM_CODEC_USE_HIGHBITDEPTH) ? 1 : 0;
2879*77c1e3ccSAndroid Build Coastguard Worker
2880*77c1e3ccSAndroid Build Coastguard Worker priv->monochrome_on_init = priv->cfg.monochrome;
2881*77c1e3ccSAndroid Build Coastguard Worker
2882*77c1e3ccSAndroid Build Coastguard Worker priv->ppi = av1_create_primary_compressor(&priv->pkt_list.head,
2883*77c1e3ccSAndroid Build Coastguard Worker *num_lap_buffers, &priv->oxcf);
2884*77c1e3ccSAndroid Build Coastguard Worker if (!priv->ppi) return AOM_CODEC_MEM_ERROR;
2885*77c1e3ccSAndroid Build Coastguard Worker
2886*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
2887*77c1e3ccSAndroid Build Coastguard Worker res = create_stats_buffer(&priv->frame_stats_buffer,
2888*77c1e3ccSAndroid Build Coastguard Worker &priv->stats_buf_context, *num_lap_buffers);
2889*77c1e3ccSAndroid Build Coastguard Worker if (res != AOM_CODEC_OK) return res;
2890*77c1e3ccSAndroid Build Coastguard Worker
2891*77c1e3ccSAndroid Build Coastguard Worker assert(MAX_LAP_BUFFERS >= MAX_LAG_BUFFERS);
2892*77c1e3ccSAndroid Build Coastguard Worker int size = get_stats_buf_size(*num_lap_buffers, MAX_LAG_BUFFERS);
2893*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < size; i++)
2894*77c1e3ccSAndroid Build Coastguard Worker priv->ppi->twopass.frame_stats_arr[i] = &priv->frame_stats_buffer[i];
2895*77c1e3ccSAndroid Build Coastguard Worker
2896*77c1e3ccSAndroid Build Coastguard Worker priv->ppi->twopass.stats_buf_ctx = &priv->stats_buf_context;
2897*77c1e3ccSAndroid Build Coastguard Worker #endif
2898*77c1e3ccSAndroid Build Coastguard Worker
2899*77c1e3ccSAndroid Build Coastguard Worker assert(priv->ppi->num_fp_contexts >= 1);
2900*77c1e3ccSAndroid Build Coastguard Worker res = av1_create_context_and_bufferpool(
2901*77c1e3ccSAndroid Build Coastguard Worker priv->ppi, &priv->ppi->parallel_cpi[0], &priv->buffer_pool,
2902*77c1e3ccSAndroid Build Coastguard Worker &priv->oxcf, ENCODE_STAGE, -1);
2903*77c1e3ccSAndroid Build Coastguard Worker if (res != AOM_CODEC_OK) {
2904*77c1e3ccSAndroid Build Coastguard Worker priv->base.err_detail = "av1_create_context_and_bufferpool() failed";
2905*77c1e3ccSAndroid Build Coastguard Worker return res;
2906*77c1e3ccSAndroid Build Coastguard Worker }
2907*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
2908*77c1e3ccSAndroid Build Coastguard Worker priv->ppi->parallel_cpi[0]->twopass_frame.stats_in =
2909*77c1e3ccSAndroid Build Coastguard Worker priv->ppi->twopass.stats_buf_ctx->stats_in_start;
2910*77c1e3ccSAndroid Build Coastguard Worker #endif
2911*77c1e3ccSAndroid Build Coastguard Worker priv->ppi->cpi = priv->ppi->parallel_cpi[0];
2912*77c1e3ccSAndroid Build Coastguard Worker
2913*77c1e3ccSAndroid Build Coastguard Worker // Create another compressor if look ahead is enabled
2914*77c1e3ccSAndroid Build Coastguard Worker if (res == AOM_CODEC_OK && *num_lap_buffers) {
2915*77c1e3ccSAndroid Build Coastguard Worker res = av1_create_context_and_bufferpool(
2916*77c1e3ccSAndroid Build Coastguard Worker priv->ppi, &priv->ppi->cpi_lap, &priv->buffer_pool_lap, &priv->oxcf,
2917*77c1e3ccSAndroid Build Coastguard Worker LAP_STAGE, clamp(lap_lag_in_frames, 0, MAX_LAG_BUFFERS));
2918*77c1e3ccSAndroid Build Coastguard Worker }
2919*77c1e3ccSAndroid Build Coastguard Worker }
2920*77c1e3ccSAndroid Build Coastguard Worker }
2921*77c1e3ccSAndroid Build Coastguard Worker
2922*77c1e3ccSAndroid Build Coastguard Worker return res;
2923*77c1e3ccSAndroid Build Coastguard Worker }
2924*77c1e3ccSAndroid Build Coastguard Worker
av1_destroy_context_and_bufferpool(AV1_COMP * cpi,BufferPool ** p_buffer_pool)2925*77c1e3ccSAndroid Build Coastguard Worker void av1_destroy_context_and_bufferpool(AV1_COMP *cpi,
2926*77c1e3ccSAndroid Build Coastguard Worker BufferPool **p_buffer_pool) {
2927*77c1e3ccSAndroid Build Coastguard Worker av1_remove_compressor(cpi);
2928*77c1e3ccSAndroid Build Coastguard Worker if (*p_buffer_pool) {
2929*77c1e3ccSAndroid Build Coastguard Worker av1_free_ref_frame_buffers(*p_buffer_pool);
2930*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_MULTITHREAD
2931*77c1e3ccSAndroid Build Coastguard Worker pthread_mutex_destroy(&(*p_buffer_pool)->pool_mutex);
2932*77c1e3ccSAndroid Build Coastguard Worker #endif
2933*77c1e3ccSAndroid Build Coastguard Worker aom_free(*p_buffer_pool);
2934*77c1e3ccSAndroid Build Coastguard Worker *p_buffer_pool = NULL;
2935*77c1e3ccSAndroid Build Coastguard Worker }
2936*77c1e3ccSAndroid Build Coastguard Worker }
2937*77c1e3ccSAndroid Build Coastguard Worker
destroy_stats_buffer(STATS_BUFFER_CTX * stats_buf_context,FIRSTPASS_STATS * frame_stats_buffer)2938*77c1e3ccSAndroid Build Coastguard Worker static void destroy_stats_buffer(STATS_BUFFER_CTX *stats_buf_context,
2939*77c1e3ccSAndroid Build Coastguard Worker FIRSTPASS_STATS *frame_stats_buffer) {
2940*77c1e3ccSAndroid Build Coastguard Worker aom_free(stats_buf_context->total_left_stats);
2941*77c1e3ccSAndroid Build Coastguard Worker aom_free(stats_buf_context->total_stats);
2942*77c1e3ccSAndroid Build Coastguard Worker aom_free(frame_stats_buffer);
2943*77c1e3ccSAndroid Build Coastguard Worker }
2944*77c1e3ccSAndroid Build Coastguard Worker
check_and_free_string(const char * default_str,const char ** ptr)2945*77c1e3ccSAndroid Build Coastguard Worker static void check_and_free_string(const char *default_str, const char **ptr) {
2946*77c1e3ccSAndroid Build Coastguard Worker if (*ptr == default_str) {
2947*77c1e3ccSAndroid Build Coastguard Worker // Default should be a literal. Do not free.
2948*77c1e3ccSAndroid Build Coastguard Worker return;
2949*77c1e3ccSAndroid Build Coastguard Worker }
2950*77c1e3ccSAndroid Build Coastguard Worker aom_free((void *)*ptr);
2951*77c1e3ccSAndroid Build Coastguard Worker *ptr = NULL;
2952*77c1e3ccSAndroid Build Coastguard Worker }
2953*77c1e3ccSAndroid Build Coastguard Worker
destroy_extra_config(struct av1_extracfg * extra_cfg)2954*77c1e3ccSAndroid Build Coastguard Worker static void destroy_extra_config(struct av1_extracfg *extra_cfg) {
2955*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_TUNE_VMAF
2956*77c1e3ccSAndroid Build Coastguard Worker check_and_free_string(default_extra_cfg[0].vmaf_model_path,
2957*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg->vmaf_model_path);
2958*77c1e3ccSAndroid Build Coastguard Worker #endif
2959*77c1e3ccSAndroid Build Coastguard Worker check_and_free_string(default_extra_cfg[0].two_pass_output,
2960*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg->two_pass_output);
2961*77c1e3ccSAndroid Build Coastguard Worker check_and_free_string(default_extra_cfg[0].two_pass_output,
2962*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg->second_pass_log);
2963*77c1e3ccSAndroid Build Coastguard Worker check_and_free_string(default_extra_cfg[0].partition_info_path,
2964*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg->partition_info_path);
2965*77c1e3ccSAndroid Build Coastguard Worker check_and_free_string(default_extra_cfg[0].rate_distribution_info,
2966*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg->rate_distribution_info);
2967*77c1e3ccSAndroid Build Coastguard Worker check_and_free_string(default_extra_cfg[0].film_grain_table_filename,
2968*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg->film_grain_table_filename);
2969*77c1e3ccSAndroid Build Coastguard Worker }
2970*77c1e3ccSAndroid Build Coastguard Worker
encoder_destroy(aom_codec_alg_priv_t * ctx)2971*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t encoder_destroy(aom_codec_alg_priv_t *ctx) {
2972*77c1e3ccSAndroid Build Coastguard Worker free(ctx->cx_data);
2973*77c1e3ccSAndroid Build Coastguard Worker destroy_extra_config(&ctx->extra_cfg);
2974*77c1e3ccSAndroid Build Coastguard Worker
2975*77c1e3ccSAndroid Build Coastguard Worker if (ctx->ppi) {
2976*77c1e3ccSAndroid Build Coastguard Worker AV1_PRIMARY *ppi = ctx->ppi;
2977*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < MAX_PARALLEL_FRAMES - 1; i++) {
2978*77c1e3ccSAndroid Build Coastguard Worker if (ppi->parallel_frames_data[i].cx_data) {
2979*77c1e3ccSAndroid Build Coastguard Worker free(ppi->parallel_frames_data[i].cx_data);
2980*77c1e3ccSAndroid Build Coastguard Worker }
2981*77c1e3ccSAndroid Build Coastguard Worker }
2982*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_ENTROPY_STATS
2983*77c1e3ccSAndroid Build Coastguard Worker print_entropy_stats(ppi);
2984*77c1e3ccSAndroid Build Coastguard Worker #endif
2985*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_INTERNAL_STATS
2986*77c1e3ccSAndroid Build Coastguard Worker print_internal_stats(ppi);
2987*77c1e3ccSAndroid Build Coastguard Worker #endif
2988*77c1e3ccSAndroid Build Coastguard Worker
2989*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < MAX_PARALLEL_FRAMES; i++) {
2990*77c1e3ccSAndroid Build Coastguard Worker av1_destroy_context_and_bufferpool(ppi->parallel_cpi[i],
2991*77c1e3ccSAndroid Build Coastguard Worker &ctx->buffer_pool);
2992*77c1e3ccSAndroid Build Coastguard Worker }
2993*77c1e3ccSAndroid Build Coastguard Worker ppi->cpi = NULL;
2994*77c1e3ccSAndroid Build Coastguard Worker
2995*77c1e3ccSAndroid Build Coastguard Worker if (ppi->cpi_lap) {
2996*77c1e3ccSAndroid Build Coastguard Worker av1_destroy_context_and_bufferpool(ppi->cpi_lap, &ctx->buffer_pool_lap);
2997*77c1e3ccSAndroid Build Coastguard Worker }
2998*77c1e3ccSAndroid Build Coastguard Worker av1_remove_primary_compressor(ppi);
2999*77c1e3ccSAndroid Build Coastguard Worker }
3000*77c1e3ccSAndroid Build Coastguard Worker destroy_stats_buffer(&ctx->stats_buf_context, ctx->frame_stats_buffer);
3001*77c1e3ccSAndroid Build Coastguard Worker aom_free(ctx);
3002*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3003*77c1e3ccSAndroid Build Coastguard Worker }
3004*77c1e3ccSAndroid Build Coastguard Worker
get_frame_pkt_flags(const AV1_COMP * cpi,unsigned int lib_flags)3005*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_frame_flags_t get_frame_pkt_flags(const AV1_COMP *cpi,
3006*77c1e3ccSAndroid Build Coastguard Worker unsigned int lib_flags) {
3007*77c1e3ccSAndroid Build Coastguard Worker aom_codec_frame_flags_t flags = lib_flags << 16;
3008*77c1e3ccSAndroid Build Coastguard Worker if (lib_flags & FRAMEFLAGS_KEY) flags |= AOM_FRAME_IS_KEY;
3009*77c1e3ccSAndroid Build Coastguard Worker if (lib_flags & FRAMEFLAGS_INTRAONLY) flags |= AOM_FRAME_IS_INTRAONLY;
3010*77c1e3ccSAndroid Build Coastguard Worker if (lib_flags & FRAMEFLAGS_SWITCH) flags |= AOM_FRAME_IS_SWITCH;
3011*77c1e3ccSAndroid Build Coastguard Worker if (lib_flags & FRAMEFLAGS_ERROR_RESILIENT)
3012*77c1e3ccSAndroid Build Coastguard Worker flags |= AOM_FRAME_IS_ERROR_RESILIENT;
3013*77c1e3ccSAndroid Build Coastguard Worker if (cpi->droppable) flags |= AOM_FRAME_IS_DROPPABLE;
3014*77c1e3ccSAndroid Build Coastguard Worker
3015*77c1e3ccSAndroid Build Coastguard Worker return flags;
3016*77c1e3ccSAndroid Build Coastguard Worker }
3017*77c1e3ccSAndroid Build Coastguard Worker
get_src_border_in_pixels(AV1_COMP * cpi,BLOCK_SIZE sb_size)3018*77c1e3ccSAndroid Build Coastguard Worker static inline int get_src_border_in_pixels(AV1_COMP *cpi, BLOCK_SIZE sb_size) {
3019*77c1e3ccSAndroid Build Coastguard Worker if (cpi->oxcf.mode != REALTIME || av1_is_resize_needed(&cpi->oxcf))
3020*77c1e3ccSAndroid Build Coastguard Worker return cpi->oxcf.border_in_pixels;
3021*77c1e3ccSAndroid Build Coastguard Worker
3022*77c1e3ccSAndroid Build Coastguard Worker const int sb_size_in_pixels_log2 = mi_size_wide_log2[sb_size] + MI_SIZE_LOG2;
3023*77c1e3ccSAndroid Build Coastguard Worker const int sb_aligned_width =
3024*77c1e3ccSAndroid Build Coastguard Worker ALIGN_POWER_OF_TWO(cpi->oxcf.frm_dim_cfg.width, sb_size_in_pixels_log2);
3025*77c1e3ccSAndroid Build Coastguard Worker const int sb_aligned_height =
3026*77c1e3ccSAndroid Build Coastguard Worker ALIGN_POWER_OF_TWO(cpi->oxcf.frm_dim_cfg.height, sb_size_in_pixels_log2);
3027*77c1e3ccSAndroid Build Coastguard Worker // Align the border pixels to a multiple of 32.
3028*77c1e3ccSAndroid Build Coastguard Worker const int border_pixels_width =
3029*77c1e3ccSAndroid Build Coastguard Worker ALIGN_POWER_OF_TWO(sb_aligned_width - cpi->oxcf.frm_dim_cfg.width, 5);
3030*77c1e3ccSAndroid Build Coastguard Worker const int border_pixels_height =
3031*77c1e3ccSAndroid Build Coastguard Worker ALIGN_POWER_OF_TWO(sb_aligned_height - cpi->oxcf.frm_dim_cfg.height, 5);
3032*77c1e3ccSAndroid Build Coastguard Worker const int border_in_pixels =
3033*77c1e3ccSAndroid Build Coastguard Worker AOMMAX(AOMMAX(border_pixels_width, border_pixels_height), 32);
3034*77c1e3ccSAndroid Build Coastguard Worker return border_in_pixels;
3035*77c1e3ccSAndroid Build Coastguard Worker }
3036*77c1e3ccSAndroid Build Coastguard Worker
3037*77c1e3ccSAndroid Build Coastguard Worker // TODO(Mufaddal): Check feasibility of abstracting functions related to LAP
3038*77c1e3ccSAndroid Build Coastguard Worker // into a separate function.
encoder_encode(aom_codec_alg_priv_t * ctx,const aom_image_t * img,aom_codec_pts_t pts,unsigned long duration,aom_enc_frame_flags_t enc_flags)3039*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t encoder_encode(aom_codec_alg_priv_t *ctx,
3040*77c1e3ccSAndroid Build Coastguard Worker const aom_image_t *img,
3041*77c1e3ccSAndroid Build Coastguard Worker aom_codec_pts_t pts,
3042*77c1e3ccSAndroid Build Coastguard Worker unsigned long duration,
3043*77c1e3ccSAndroid Build Coastguard Worker aom_enc_frame_flags_t enc_flags) {
3044*77c1e3ccSAndroid Build Coastguard Worker const size_t kMinCompressedSize = 8192;
3045*77c1e3ccSAndroid Build Coastguard Worker volatile aom_codec_err_t res = AOM_CODEC_OK;
3046*77c1e3ccSAndroid Build Coastguard Worker AV1_PRIMARY *const ppi = ctx->ppi;
3047*77c1e3ccSAndroid Build Coastguard Worker volatile aom_codec_pts_t ptsvol = pts;
3048*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP_DATA cpi_data = { 0 };
3049*77c1e3ccSAndroid Build Coastguard Worker
3050*77c1e3ccSAndroid Build Coastguard Worker cpi_data.timestamp_ratio = &ctx->timestamp_ratio;
3051*77c1e3ccSAndroid Build Coastguard Worker cpi_data.flush = !img;
3052*77c1e3ccSAndroid Build Coastguard Worker // LAP context
3053*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *cpi_lap = ppi->cpi_lap;
3054*77c1e3ccSAndroid Build Coastguard Worker if (ppi->cpi == NULL) return AOM_CODEC_INVALID_PARAM;
3055*77c1e3ccSAndroid Build Coastguard Worker
3056*77c1e3ccSAndroid Build Coastguard Worker ppi->cpi->last_coded_width = ppi->cpi->oxcf.frm_dim_cfg.width;
3057*77c1e3ccSAndroid Build Coastguard Worker ppi->cpi->last_coded_height = ppi->cpi->oxcf.frm_dim_cfg.height;
3058*77c1e3ccSAndroid Build Coastguard Worker
3059*77c1e3ccSAndroid Build Coastguard Worker if (ppi->lap_enabled && cpi_lap == NULL &&
3060*77c1e3ccSAndroid Build Coastguard Worker ppi->cpi->oxcf.pass == AOM_RC_ONE_PASS)
3061*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3062*77c1e3ccSAndroid Build Coastguard Worker
3063*77c1e3ccSAndroid Build Coastguard Worker if (img != NULL) {
3064*77c1e3ccSAndroid Build Coastguard Worker res = validate_img(ctx, img);
3065*77c1e3ccSAndroid Build Coastguard Worker if (res == AOM_CODEC_OK) {
3066*77c1e3ccSAndroid Build Coastguard Worker const uint64_t uncompressed_frame_sz64 =
3067*77c1e3ccSAndroid Build Coastguard Worker (uint64_t)ALIGN_POWER_OF_TWO_UNSIGNED(ctx->cfg.g_w, 5) *
3068*77c1e3ccSAndroid Build Coastguard Worker ALIGN_POWER_OF_TWO_UNSIGNED(ctx->cfg.g_h, 5) * get_image_bps(img) / 8;
3069*77c1e3ccSAndroid Build Coastguard Worker #if UINT64_MAX > SIZE_MAX
3070*77c1e3ccSAndroid Build Coastguard Worker if (uncompressed_frame_sz64 > SIZE_MAX) return AOM_CODEC_MEM_ERROR;
3071*77c1e3ccSAndroid Build Coastguard Worker #endif
3072*77c1e3ccSAndroid Build Coastguard Worker const size_t uncompressed_frame_sz = (size_t)uncompressed_frame_sz64;
3073*77c1e3ccSAndroid Build Coastguard Worker
3074*77c1e3ccSAndroid Build Coastguard Worker // Due to the presence of no-show frames, the ctx->cx_data buffer holds
3075*77c1e3ccSAndroid Build Coastguard Worker // compressed data corresponding to multiple frames. As no-show frames are
3076*77c1e3ccSAndroid Build Coastguard Worker // not possible for all intra frame encoding with no forward key frames,
3077*77c1e3ccSAndroid Build Coastguard Worker // the buffer is allocated with a smaller size in this case.
3078*77c1e3ccSAndroid Build Coastguard Worker //
3079*77c1e3ccSAndroid Build Coastguard Worker // For pseudo random input, the compressed frame size is seen to exceed
3080*77c1e3ccSAndroid Build Coastguard Worker // the uncompressed frame size, but is less than 2 times the uncompressed
3081*77c1e3ccSAndroid Build Coastguard Worker // frame size. Hence the size of the buffer is chosen as 2 times the
3082*77c1e3ccSAndroid Build Coastguard Worker // uncompressed frame size.
3083*77c1e3ccSAndroid Build Coastguard Worker int multiplier = 8;
3084*77c1e3ccSAndroid Build Coastguard Worker if (ppi->cpi->oxcf.kf_cfg.key_freq_max == 0 &&
3085*77c1e3ccSAndroid Build Coastguard Worker !ppi->cpi->oxcf.kf_cfg.fwd_kf_enabled)
3086*77c1e3ccSAndroid Build Coastguard Worker multiplier = 2;
3087*77c1e3ccSAndroid Build Coastguard Worker if (uncompressed_frame_sz > SIZE_MAX / multiplier)
3088*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_MEM_ERROR;
3089*77c1e3ccSAndroid Build Coastguard Worker size_t data_sz = uncompressed_frame_sz * multiplier;
3090*77c1e3ccSAndroid Build Coastguard Worker if (data_sz < kMinCompressedSize) data_sz = kMinCompressedSize;
3091*77c1e3ccSAndroid Build Coastguard Worker if (ctx->cx_data == NULL || ctx->cx_data_sz < data_sz) {
3092*77c1e3ccSAndroid Build Coastguard Worker ctx->cx_data_sz = data_sz;
3093*77c1e3ccSAndroid Build Coastguard Worker free(ctx->cx_data);
3094*77c1e3ccSAndroid Build Coastguard Worker ctx->cx_data = (unsigned char *)malloc(ctx->cx_data_sz);
3095*77c1e3ccSAndroid Build Coastguard Worker if (ctx->cx_data == NULL) {
3096*77c1e3ccSAndroid Build Coastguard Worker ctx->cx_data_sz = 0;
3097*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_MEM_ERROR;
3098*77c1e3ccSAndroid Build Coastguard Worker }
3099*77c1e3ccSAndroid Build Coastguard Worker }
3100*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < ppi->num_fp_contexts - 1; i++) {
3101*77c1e3ccSAndroid Build Coastguard Worker if (ppi->parallel_frames_data[i].cx_data == NULL ||
3102*77c1e3ccSAndroid Build Coastguard Worker ppi->parallel_frames_data[i].cx_data_sz < data_sz) {
3103*77c1e3ccSAndroid Build Coastguard Worker ppi->parallel_frames_data[i].cx_data_sz = data_sz;
3104*77c1e3ccSAndroid Build Coastguard Worker free(ppi->parallel_frames_data[i].cx_data);
3105*77c1e3ccSAndroid Build Coastguard Worker ppi->parallel_frames_data[i].frame_size = 0;
3106*77c1e3ccSAndroid Build Coastguard Worker ppi->parallel_frames_data[i].cx_data =
3107*77c1e3ccSAndroid Build Coastguard Worker (unsigned char *)malloc(ppi->parallel_frames_data[i].cx_data_sz);
3108*77c1e3ccSAndroid Build Coastguard Worker if (ppi->parallel_frames_data[i].cx_data == NULL) {
3109*77c1e3ccSAndroid Build Coastguard Worker ppi->parallel_frames_data[i].cx_data_sz = 0;
3110*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_MEM_ERROR;
3111*77c1e3ccSAndroid Build Coastguard Worker }
3112*77c1e3ccSAndroid Build Coastguard Worker }
3113*77c1e3ccSAndroid Build Coastguard Worker }
3114*77c1e3ccSAndroid Build Coastguard Worker }
3115*77c1e3ccSAndroid Build Coastguard Worker }
3116*77c1e3ccSAndroid Build Coastguard Worker
3117*77c1e3ccSAndroid Build Coastguard Worker aom_codec_pkt_list_init(&ctx->pkt_list);
3118*77c1e3ccSAndroid Build Coastguard Worker
3119*77c1e3ccSAndroid Build Coastguard Worker volatile aom_enc_frame_flags_t flags = enc_flags;
3120*77c1e3ccSAndroid Build Coastguard Worker
3121*77c1e3ccSAndroid Build Coastguard Worker // The jmp_buf is valid only for the duration of the function that calls
3122*77c1e3ccSAndroid Build Coastguard Worker // setjmp(). Therefore, this function must reset the 'setjmp' field to 0
3123*77c1e3ccSAndroid Build Coastguard Worker // before it returns.
3124*77c1e3ccSAndroid Build Coastguard Worker if (setjmp(ppi->error.jmp)) {
3125*77c1e3ccSAndroid Build Coastguard Worker ppi->error.setjmp = 0;
3126*77c1e3ccSAndroid Build Coastguard Worker res = update_error_state(ctx, &ppi->error);
3127*77c1e3ccSAndroid Build Coastguard Worker return res;
3128*77c1e3ccSAndroid Build Coastguard Worker }
3129*77c1e3ccSAndroid Build Coastguard Worker ppi->error.setjmp = 1;
3130*77c1e3ccSAndroid Build Coastguard Worker
3131*77c1e3ccSAndroid Build Coastguard Worker if (ppi->use_svc && ppi->cpi->svc.use_flexible_mode == 0 && flags == 0)
3132*77c1e3ccSAndroid Build Coastguard Worker av1_set_svc_fixed_mode(ppi->cpi);
3133*77c1e3ccSAndroid Build Coastguard Worker
3134*77c1e3ccSAndroid Build Coastguard Worker // Note(yunqing): While applying encoding flags, always start from enabling
3135*77c1e3ccSAndroid Build Coastguard Worker // all, and then modifying according to the flags. Previous frame's flags are
3136*77c1e3ccSAndroid Build Coastguard Worker // overwritten.
3137*77c1e3ccSAndroid Build Coastguard Worker av1_apply_encoding_flags(ppi->cpi, flags);
3138*77c1e3ccSAndroid Build Coastguard Worker if (cpi_lap != NULL) {
3139*77c1e3ccSAndroid Build Coastguard Worker av1_apply_encoding_flags(cpi_lap, flags);
3140*77c1e3ccSAndroid Build Coastguard Worker }
3141*77c1e3ccSAndroid Build Coastguard Worker
3142*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_TUNE_VMAF
3143*77c1e3ccSAndroid Build Coastguard Worker if (ctx->extra_cfg.tuning >= AOM_TUNE_VMAF_WITH_PREPROCESSING &&
3144*77c1e3ccSAndroid Build Coastguard Worker ctx->extra_cfg.tuning <= AOM_TUNE_VMAF_NEG_MAX_GAIN) {
3145*77c1e3ccSAndroid Build Coastguard Worker aom_init_vmaf_model(&ppi->cpi->vmaf_info.vmaf_model,
3146*77c1e3ccSAndroid Build Coastguard Worker ppi->cpi->oxcf.tune_cfg.vmaf_model_path);
3147*77c1e3ccSAndroid Build Coastguard Worker }
3148*77c1e3ccSAndroid Build Coastguard Worker #endif
3149*77c1e3ccSAndroid Build Coastguard Worker
3150*77c1e3ccSAndroid Build Coastguard Worker // Handle fixed keyframe intervals
3151*77c1e3ccSAndroid Build Coastguard Worker if (is_stat_generation_stage(ppi->cpi) || is_one_pass_rt_params(ppi->cpi)) {
3152*77c1e3ccSAndroid Build Coastguard Worker if (ctx->cfg.kf_mode == AOM_KF_AUTO &&
3153*77c1e3ccSAndroid Build Coastguard Worker ctx->cfg.kf_min_dist == ctx->cfg.kf_max_dist) {
3154*77c1e3ccSAndroid Build Coastguard Worker if (ppi->cpi->common.spatial_layer_id == 0 &&
3155*77c1e3ccSAndroid Build Coastguard Worker ++ctx->fixed_kf_cntr > ctx->cfg.kf_min_dist) {
3156*77c1e3ccSAndroid Build Coastguard Worker flags |= AOM_EFLAG_FORCE_KF;
3157*77c1e3ccSAndroid Build Coastguard Worker ctx->fixed_kf_cntr = 1;
3158*77c1e3ccSAndroid Build Coastguard Worker }
3159*77c1e3ccSAndroid Build Coastguard Worker }
3160*77c1e3ccSAndroid Build Coastguard Worker }
3161*77c1e3ccSAndroid Build Coastguard Worker
3162*77c1e3ccSAndroid Build Coastguard Worker if (res == AOM_CODEC_OK) {
3163*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *cpi = ppi->cpi;
3164*77c1e3ccSAndroid Build Coastguard Worker
3165*77c1e3ccSAndroid Build Coastguard Worker // Set up internal flags
3166*77c1e3ccSAndroid Build Coastguard Worker if (ctx->base.init_flags & AOM_CODEC_USE_PSNR) ppi->b_calculate_psnr = 1;
3167*77c1e3ccSAndroid Build Coastguard Worker
3168*77c1e3ccSAndroid Build Coastguard Worker if (img != NULL) {
3169*77c1e3ccSAndroid Build Coastguard Worker if (!ctx->pts_offset_initialized) {
3170*77c1e3ccSAndroid Build Coastguard Worker ctx->pts_offset = ptsvol;
3171*77c1e3ccSAndroid Build Coastguard Worker ctx->pts_offset_initialized = 1;
3172*77c1e3ccSAndroid Build Coastguard Worker }
3173*77c1e3ccSAndroid Build Coastguard Worker if (ptsvol < ctx->pts_offset) {
3174*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_INVALID_PARAM,
3175*77c1e3ccSAndroid Build Coastguard Worker "pts is smaller than initial pts");
3176*77c1e3ccSAndroid Build Coastguard Worker }
3177*77c1e3ccSAndroid Build Coastguard Worker ptsvol -= ctx->pts_offset;
3178*77c1e3ccSAndroid Build Coastguard Worker if (ptsvol > INT64_MAX / cpi_data.timestamp_ratio->num) {
3179*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(
3180*77c1e3ccSAndroid Build Coastguard Worker &ppi->error, AOM_CODEC_INVALID_PARAM,
3181*77c1e3ccSAndroid Build Coastguard Worker "conversion of relative pts to ticks would overflow");
3182*77c1e3ccSAndroid Build Coastguard Worker }
3183*77c1e3ccSAndroid Build Coastguard Worker int64_t src_time_stamp =
3184*77c1e3ccSAndroid Build Coastguard Worker timebase_units_to_ticks(cpi_data.timestamp_ratio, ptsvol);
3185*77c1e3ccSAndroid Build Coastguard Worker #if ULONG_MAX > INT64_MAX
3186*77c1e3ccSAndroid Build Coastguard Worker if (duration > INT64_MAX) {
3187*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_INVALID_PARAM,
3188*77c1e3ccSAndroid Build Coastguard Worker "duration is too big");
3189*77c1e3ccSAndroid Build Coastguard Worker }
3190*77c1e3ccSAndroid Build Coastguard Worker #endif
3191*77c1e3ccSAndroid Build Coastguard Worker if (ptsvol > INT64_MAX - (int64_t)duration) {
3192*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_INVALID_PARAM,
3193*77c1e3ccSAndroid Build Coastguard Worker "relative pts + duration is too big");
3194*77c1e3ccSAndroid Build Coastguard Worker }
3195*77c1e3ccSAndroid Build Coastguard Worker aom_codec_pts_t pts_end = ptsvol + (int64_t)duration;
3196*77c1e3ccSAndroid Build Coastguard Worker if (pts_end > INT64_MAX / cpi_data.timestamp_ratio->num) {
3197*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(
3198*77c1e3ccSAndroid Build Coastguard Worker &ppi->error, AOM_CODEC_INVALID_PARAM,
3199*77c1e3ccSAndroid Build Coastguard Worker "conversion of relative pts + duration to ticks would overflow");
3200*77c1e3ccSAndroid Build Coastguard Worker }
3201*77c1e3ccSAndroid Build Coastguard Worker int64_t src_end_time_stamp =
3202*77c1e3ccSAndroid Build Coastguard Worker timebase_units_to_ticks(cpi_data.timestamp_ratio, pts_end);
3203*77c1e3ccSAndroid Build Coastguard Worker
3204*77c1e3ccSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG sd;
3205*77c1e3ccSAndroid Build Coastguard Worker res = image2yuvconfig(img, &sd);
3206*77c1e3ccSAndroid Build Coastguard Worker // When generating a monochrome stream, make |sd| a monochrome image.
3207*77c1e3ccSAndroid Build Coastguard Worker if (ctx->cfg.monochrome) {
3208*77c1e3ccSAndroid Build Coastguard Worker sd.u_buffer = sd.v_buffer = NULL;
3209*77c1e3ccSAndroid Build Coastguard Worker sd.uv_stride = 0;
3210*77c1e3ccSAndroid Build Coastguard Worker sd.monochrome = 1;
3211*77c1e3ccSAndroid Build Coastguard Worker }
3212*77c1e3ccSAndroid Build Coastguard Worker int use_highbitdepth = (sd.flags & YV12_FLAG_HIGHBITDEPTH) != 0;
3213*77c1e3ccSAndroid Build Coastguard Worker int subsampling_x = sd.subsampling_x;
3214*77c1e3ccSAndroid Build Coastguard Worker int subsampling_y = sd.subsampling_y;
3215*77c1e3ccSAndroid Build Coastguard Worker
3216*77c1e3ccSAndroid Build Coastguard Worker if (!ppi->lookahead) {
3217*77c1e3ccSAndroid Build Coastguard Worker int lag_in_frames = cpi_lap != NULL ? cpi_lap->oxcf.gf_cfg.lag_in_frames
3218*77c1e3ccSAndroid Build Coastguard Worker : cpi->oxcf.gf_cfg.lag_in_frames;
3219*77c1e3ccSAndroid Build Coastguard Worker AV1EncoderConfig *oxcf = &cpi->oxcf;
3220*77c1e3ccSAndroid Build Coastguard Worker const BLOCK_SIZE sb_size = av1_select_sb_size(
3221*77c1e3ccSAndroid Build Coastguard Worker oxcf, oxcf->frm_dim_cfg.width, oxcf->frm_dim_cfg.height,
3222*77c1e3ccSAndroid Build Coastguard Worker ppi->number_spatial_layers);
3223*77c1e3ccSAndroid Build Coastguard Worker oxcf->border_in_pixels =
3224*77c1e3ccSAndroid Build Coastguard Worker av1_get_enc_border_size(av1_is_resize_needed(oxcf),
3225*77c1e3ccSAndroid Build Coastguard Worker oxcf->kf_cfg.key_freq_max == 0, sb_size);
3226*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < ppi->num_fp_contexts; i++) {
3227*77c1e3ccSAndroid Build Coastguard Worker ppi->parallel_cpi[i]->oxcf.border_in_pixels = oxcf->border_in_pixels;
3228*77c1e3ccSAndroid Build Coastguard Worker }
3229*77c1e3ccSAndroid Build Coastguard Worker
3230*77c1e3ccSAndroid Build Coastguard Worker const int src_border_in_pixels = get_src_border_in_pixels(cpi, sb_size);
3231*77c1e3ccSAndroid Build Coastguard Worker ppi->lookahead = av1_lookahead_init(
3232*77c1e3ccSAndroid Build Coastguard Worker cpi->oxcf.frm_dim_cfg.width, cpi->oxcf.frm_dim_cfg.height,
3233*77c1e3ccSAndroid Build Coastguard Worker subsampling_x, subsampling_y, use_highbitdepth, lag_in_frames,
3234*77c1e3ccSAndroid Build Coastguard Worker src_border_in_pixels, cpi->common.features.byte_alignment,
3235*77c1e3ccSAndroid Build Coastguard Worker ctx->num_lap_buffers, (cpi->oxcf.kf_cfg.key_freq_max == 0),
3236*77c1e3ccSAndroid Build Coastguard Worker cpi->alloc_pyramid);
3237*77c1e3ccSAndroid Build Coastguard Worker }
3238*77c1e3ccSAndroid Build Coastguard Worker if (!ppi->lookahead)
3239*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_MEM_ERROR,
3240*77c1e3ccSAndroid Build Coastguard Worker "Failed to allocate lag buffers");
3241*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < ppi->num_fp_contexts; i++) {
3242*77c1e3ccSAndroid Build Coastguard Worker aom_codec_err_t err =
3243*77c1e3ccSAndroid Build Coastguard Worker av1_check_initial_width(ppi->parallel_cpi[i], use_highbitdepth,
3244*77c1e3ccSAndroid Build Coastguard Worker subsampling_x, subsampling_y);
3245*77c1e3ccSAndroid Build Coastguard Worker if (err != AOM_CODEC_OK) {
3246*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, err,
3247*77c1e3ccSAndroid Build Coastguard Worker "av1_check_initial_width() failed");
3248*77c1e3ccSAndroid Build Coastguard Worker }
3249*77c1e3ccSAndroid Build Coastguard Worker }
3250*77c1e3ccSAndroid Build Coastguard Worker if (cpi_lap != NULL) {
3251*77c1e3ccSAndroid Build Coastguard Worker aom_codec_err_t err = av1_check_initial_width(
3252*77c1e3ccSAndroid Build Coastguard Worker cpi_lap, use_highbitdepth, subsampling_x, subsampling_y);
3253*77c1e3ccSAndroid Build Coastguard Worker if (err != AOM_CODEC_OK) {
3254*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, err,
3255*77c1e3ccSAndroid Build Coastguard Worker "av1_check_initial_width() failed");
3256*77c1e3ccSAndroid Build Coastguard Worker }
3257*77c1e3ccSAndroid Build Coastguard Worker }
3258*77c1e3ccSAndroid Build Coastguard Worker
3259*77c1e3ccSAndroid Build Coastguard Worker // Store the original flags in to the frame buffer. Will extract the
3260*77c1e3ccSAndroid Build Coastguard Worker // key frame flag when we actually encode this frame.
3261*77c1e3ccSAndroid Build Coastguard Worker if (av1_receive_raw_frame(cpi, flags | ctx->next_frame_flags, &sd,
3262*77c1e3ccSAndroid Build Coastguard Worker src_time_stamp, src_end_time_stamp)) {
3263*77c1e3ccSAndroid Build Coastguard Worker res = update_error_state(ctx, cpi->common.error);
3264*77c1e3ccSAndroid Build Coastguard Worker }
3265*77c1e3ccSAndroid Build Coastguard Worker ctx->next_frame_flags = 0;
3266*77c1e3ccSAndroid Build Coastguard Worker }
3267*77c1e3ccSAndroid Build Coastguard Worker
3268*77c1e3ccSAndroid Build Coastguard Worker cpi_data.cx_data = ctx->cx_data;
3269*77c1e3ccSAndroid Build Coastguard Worker cpi_data.cx_data_sz = ctx->cx_data_sz;
3270*77c1e3ccSAndroid Build Coastguard Worker
3271*77c1e3ccSAndroid Build Coastguard Worker /* Any pending invisible frames? */
3272*77c1e3ccSAndroid Build Coastguard Worker if (ctx->pending_cx_data_sz) {
3273*77c1e3ccSAndroid Build Coastguard Worker cpi_data.cx_data += ctx->pending_cx_data_sz;
3274*77c1e3ccSAndroid Build Coastguard Worker cpi_data.cx_data_sz -= ctx->pending_cx_data_sz;
3275*77c1e3ccSAndroid Build Coastguard Worker
3276*77c1e3ccSAndroid Build Coastguard Worker /* TODO: this is a minimal check, the underlying codec doesn't respect
3277*77c1e3ccSAndroid Build Coastguard Worker * the buffer size anyway.
3278*77c1e3ccSAndroid Build Coastguard Worker */
3279*77c1e3ccSAndroid Build Coastguard Worker if (cpi_data.cx_data_sz < ctx->cx_data_sz / 2) {
3280*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_ERROR,
3281*77c1e3ccSAndroid Build Coastguard Worker "Compressed data buffer too small");
3282*77c1e3ccSAndroid Build Coastguard Worker }
3283*77c1e3ccSAndroid Build Coastguard Worker }
3284*77c1e3ccSAndroid Build Coastguard Worker
3285*77c1e3ccSAndroid Build Coastguard Worker int is_frame_visible = 0;
3286*77c1e3ccSAndroid Build Coastguard Worker int has_no_show_keyframe = 0;
3287*77c1e3ccSAndroid Build Coastguard Worker int num_workers = 0;
3288*77c1e3ccSAndroid Build Coastguard Worker
3289*77c1e3ccSAndroid Build Coastguard Worker if (cpi->oxcf.pass == AOM_RC_FIRST_PASS) {
3290*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
3291*77c1e3ccSAndroid Build Coastguard Worker num_workers = ppi->p_mt_info.num_mod_workers[MOD_FP] =
3292*77c1e3ccSAndroid Build Coastguard Worker av1_fp_compute_num_enc_workers(cpi);
3293*77c1e3ccSAndroid Build Coastguard Worker #endif
3294*77c1e3ccSAndroid Build Coastguard Worker } else {
3295*77c1e3ccSAndroid Build Coastguard Worker av1_compute_num_workers_for_mt(cpi);
3296*77c1e3ccSAndroid Build Coastguard Worker num_workers = av1_get_max_num_workers(cpi);
3297*77c1e3ccSAndroid Build Coastguard Worker }
3298*77c1e3ccSAndroid Build Coastguard Worker if (num_workers > 1 && ppi->p_mt_info.num_workers < num_workers) {
3299*77c1e3ccSAndroid Build Coastguard Worker // Obtain the maximum no. of frames that can be supported in a parallel
3300*77c1e3ccSAndroid Build Coastguard Worker // encode set.
3301*77c1e3ccSAndroid Build Coastguard Worker if (is_stat_consumption_stage(cpi)) {
3302*77c1e3ccSAndroid Build Coastguard Worker ppi->num_fp_contexts = av1_compute_num_fp_contexts(ppi, &cpi->oxcf);
3303*77c1e3ccSAndroid Build Coastguard Worker }
3304*77c1e3ccSAndroid Build Coastguard Worker if (ppi->p_mt_info.num_workers > 0) {
3305*77c1e3ccSAndroid Build Coastguard Worker av1_terminate_workers(ppi);
3306*77c1e3ccSAndroid Build Coastguard Worker free_thread_data(ppi);
3307*77c1e3ccSAndroid Build Coastguard Worker aom_free(ppi->p_mt_info.tile_thr_data);
3308*77c1e3ccSAndroid Build Coastguard Worker ppi->p_mt_info.tile_thr_data = NULL;
3309*77c1e3ccSAndroid Build Coastguard Worker aom_free(ppi->p_mt_info.workers);
3310*77c1e3ccSAndroid Build Coastguard Worker ppi->p_mt_info.workers = NULL;
3311*77c1e3ccSAndroid Build Coastguard Worker ppi->p_mt_info.num_workers = 0;
3312*77c1e3ccSAndroid Build Coastguard Worker for (int j = 0; j < ppi->num_fp_contexts; j++) {
3313*77c1e3ccSAndroid Build Coastguard Worker aom_free(ppi->parallel_cpi[j]->td.tctx);
3314*77c1e3ccSAndroid Build Coastguard Worker ppi->parallel_cpi[j]->td.tctx = NULL;
3315*77c1e3ccSAndroid Build Coastguard Worker }
3316*77c1e3ccSAndroid Build Coastguard Worker }
3317*77c1e3ccSAndroid Build Coastguard Worker av1_create_workers(ppi, num_workers);
3318*77c1e3ccSAndroid Build Coastguard Worker av1_init_tile_thread_data(ppi, cpi->oxcf.pass == AOM_RC_FIRST_PASS);
3319*77c1e3ccSAndroid Build Coastguard Worker }
3320*77c1e3ccSAndroid Build Coastguard Worker
3321*77c1e3ccSAndroid Build Coastguard Worker // Re-allocate thread data if workers for encoder multi-threading stage
3322*77c1e3ccSAndroid Build Coastguard Worker // exceeds prev_num_enc_workers.
3323*77c1e3ccSAndroid Build Coastguard Worker const int num_enc_workers =
3324*77c1e3ccSAndroid Build Coastguard Worker av1_get_num_mod_workers_for_alloc(&ppi->p_mt_info, MOD_ENC);
3325*77c1e3ccSAndroid Build Coastguard Worker if (ppi->p_mt_info.prev_num_enc_workers < num_enc_workers &&
3326*77c1e3ccSAndroid Build Coastguard Worker num_enc_workers <= ppi->p_mt_info.num_workers) {
3327*77c1e3ccSAndroid Build Coastguard Worker free_thread_data(ppi);
3328*77c1e3ccSAndroid Build Coastguard Worker for (int j = 0; j < ppi->num_fp_contexts; j++) {
3329*77c1e3ccSAndroid Build Coastguard Worker aom_free(ppi->parallel_cpi[j]->td.tctx);
3330*77c1e3ccSAndroid Build Coastguard Worker ppi->parallel_cpi[j]->td.tctx = NULL;
3331*77c1e3ccSAndroid Build Coastguard Worker }
3332*77c1e3ccSAndroid Build Coastguard Worker av1_init_tile_thread_data(ppi, cpi->oxcf.pass == AOM_RC_FIRST_PASS);
3333*77c1e3ccSAndroid Build Coastguard Worker }
3334*77c1e3ccSAndroid Build Coastguard Worker
3335*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < ppi->num_fp_contexts; i++) {
3336*77c1e3ccSAndroid Build Coastguard Worker av1_init_frame_mt(ppi, ppi->parallel_cpi[i]);
3337*77c1e3ccSAndroid Build Coastguard Worker }
3338*77c1e3ccSAndroid Build Coastguard Worker if (cpi_lap != NULL) {
3339*77c1e3ccSAndroid Build Coastguard Worker av1_init_frame_mt(ppi, cpi_lap);
3340*77c1e3ccSAndroid Build Coastguard Worker }
3341*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_MULTITHREAD
3342*77c1e3ccSAndroid Build Coastguard Worker if (ppi->p_mt_info.num_workers > 1) {
3343*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < ppi->num_fp_contexts; i++) {
3344*77c1e3ccSAndroid Build Coastguard Worker av1_init_mt_sync(ppi->parallel_cpi[i],
3345*77c1e3ccSAndroid Build Coastguard Worker ppi->parallel_cpi[i]->oxcf.pass == AOM_RC_FIRST_PASS);
3346*77c1e3ccSAndroid Build Coastguard Worker }
3347*77c1e3ccSAndroid Build Coastguard Worker if (cpi_lap != NULL) {
3348*77c1e3ccSAndroid Build Coastguard Worker av1_init_mt_sync(cpi_lap, 1);
3349*77c1e3ccSAndroid Build Coastguard Worker }
3350*77c1e3ccSAndroid Build Coastguard Worker }
3351*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_MULTITHREAD
3352*77c1e3ccSAndroid Build Coastguard Worker
3353*77c1e3ccSAndroid Build Coastguard Worker // Call for LAP stage
3354*77c1e3ccSAndroid Build Coastguard Worker if (cpi_lap != NULL) {
3355*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP_DATA cpi_lap_data = { 0 };
3356*77c1e3ccSAndroid Build Coastguard Worker cpi_lap_data.flush = !img;
3357*77c1e3ccSAndroid Build Coastguard Worker cpi_lap_data.timestamp_ratio = &ctx->timestamp_ratio;
3358*77c1e3ccSAndroid Build Coastguard Worker const int status = av1_get_compressed_data(cpi_lap, &cpi_lap_data);
3359*77c1e3ccSAndroid Build Coastguard Worker if (status > AOM_CODEC_OK) {
3360*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error_copy(&ppi->error, cpi_lap->common.error);
3361*77c1e3ccSAndroid Build Coastguard Worker }
3362*77c1e3ccSAndroid Build Coastguard Worker av1_post_encode_updates(cpi_lap, &cpi_lap_data);
3363*77c1e3ccSAndroid Build Coastguard Worker }
3364*77c1e3ccSAndroid Build Coastguard Worker
3365*77c1e3ccSAndroid Build Coastguard Worker // Recalculate the maximum number of frames that can be encoded in
3366*77c1e3ccSAndroid Build Coastguard Worker // parallel at the beginning of sub gop.
3367*77c1e3ccSAndroid Build Coastguard Worker if (is_stat_consumption_stage(cpi) && ppi->gf_group.size > 0 &&
3368*77c1e3ccSAndroid Build Coastguard Worker cpi->gf_frame_index == ppi->gf_group.size) {
3369*77c1e3ccSAndroid Build Coastguard Worker ppi->num_fp_contexts = av1_compute_num_fp_contexts(ppi, &cpi->oxcf);
3370*77c1e3ccSAndroid Build Coastguard Worker }
3371*77c1e3ccSAndroid Build Coastguard Worker
3372*77c1e3ccSAndroid Build Coastguard Worker // Get the next visible frame. Invisible frames get packed with the next
3373*77c1e3ccSAndroid Build Coastguard Worker // visible frame.
3374*77c1e3ccSAndroid Build Coastguard Worker while (cpi_data.cx_data_sz >= ctx->cx_data_sz / 2 && !is_frame_visible) {
3375*77c1e3ccSAndroid Build Coastguard Worker int simulate_parallel_frame = 0;
3376*77c1e3ccSAndroid Build Coastguard Worker int status = -1;
3377*77c1e3ccSAndroid Build Coastguard Worker cpi->do_frame_data_update = true;
3378*77c1e3ccSAndroid Build Coastguard Worker cpi->ref_idx_to_skip = INVALID_IDX;
3379*77c1e3ccSAndroid Build Coastguard Worker cpi->ref_refresh_index = INVALID_IDX;
3380*77c1e3ccSAndroid Build Coastguard Worker cpi->refresh_idx_available = false;
3381*77c1e3ccSAndroid Build Coastguard Worker
3382*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_FPMT_TEST
3383*77c1e3ccSAndroid Build Coastguard Worker simulate_parallel_frame =
3384*77c1e3ccSAndroid Build Coastguard Worker cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE ? 1 : 0;
3385*77c1e3ccSAndroid Build Coastguard Worker if (simulate_parallel_frame) {
3386*77c1e3ccSAndroid Build Coastguard Worker if (ppi->num_fp_contexts > 1 && ppi->gf_group.size > 1) {
3387*77c1e3ccSAndroid Build Coastguard Worker if (cpi->gf_frame_index < ppi->gf_group.size) {
3388*77c1e3ccSAndroid Build Coastguard Worker calc_frame_data_update_flag(&ppi->gf_group, cpi->gf_frame_index,
3389*77c1e3ccSAndroid Build Coastguard Worker &cpi->do_frame_data_update);
3390*77c1e3ccSAndroid Build Coastguard Worker }
3391*77c1e3ccSAndroid Build Coastguard Worker }
3392*77c1e3ccSAndroid Build Coastguard Worker status = av1_get_compressed_data(cpi, &cpi_data);
3393*77c1e3ccSAndroid Build Coastguard Worker }
3394*77c1e3ccSAndroid Build Coastguard Worker
3395*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_FPMT_TEST
3396*77c1e3ccSAndroid Build Coastguard Worker if (!simulate_parallel_frame) {
3397*77c1e3ccSAndroid Build Coastguard Worker if (ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] == 0) {
3398*77c1e3ccSAndroid Build Coastguard Worker status = av1_get_compressed_data(cpi, &cpi_data);
3399*77c1e3ccSAndroid Build Coastguard Worker } else if (ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] ==
3400*77c1e3ccSAndroid Build Coastguard Worker 1) {
3401*77c1e3ccSAndroid Build Coastguard Worker // In case of an error, longjmp() would be invoked and hence "status"
3402*77c1e3ccSAndroid Build Coastguard Worker // is set to AOM_CODEC_OK here.
3403*77c1e3ccSAndroid Build Coastguard Worker av1_compress_parallel_frames(ppi, &cpi_data);
3404*77c1e3ccSAndroid Build Coastguard Worker status = AOM_CODEC_OK;
3405*77c1e3ccSAndroid Build Coastguard Worker } else {
3406*77c1e3ccSAndroid Build Coastguard Worker // No possibility of failures from this function and hence "status" is
3407*77c1e3ccSAndroid Build Coastguard Worker // set to AOM_CODEC_OK here.
3408*77c1e3ccSAndroid Build Coastguard Worker cpi = av1_get_parallel_frame_enc_data(ppi, &cpi_data);
3409*77c1e3ccSAndroid Build Coastguard Worker status = AOM_CODEC_OK;
3410*77c1e3ccSAndroid Build Coastguard Worker }
3411*77c1e3ccSAndroid Build Coastguard Worker }
3412*77c1e3ccSAndroid Build Coastguard Worker if (status == -1) break;
3413*77c1e3ccSAndroid Build Coastguard Worker if (status != AOM_CODEC_OK) {
3414*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error_copy(&ppi->error, cpi->common.error);
3415*77c1e3ccSAndroid Build Coastguard Worker }
3416*77c1e3ccSAndroid Build Coastguard Worker if (ppi->num_fp_contexts > 0 && frame_is_intra_only(&cpi->common)) {
3417*77c1e3ccSAndroid Build Coastguard Worker av1_init_sc_decisions(ppi);
3418*77c1e3ccSAndroid Build Coastguard Worker }
3419*77c1e3ccSAndroid Build Coastguard Worker
3420*77c1e3ccSAndroid Build Coastguard Worker ppi->seq_params_locked = 1;
3421*77c1e3ccSAndroid Build Coastguard Worker av1_post_encode_updates(cpi, &cpi_data);
3422*77c1e3ccSAndroid Build Coastguard Worker
3423*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_ENTROPY_STATS
3424*77c1e3ccSAndroid Build Coastguard Worker if (ppi->cpi->oxcf.pass != 1 && !cpi->common.show_existing_frame)
3425*77c1e3ccSAndroid Build Coastguard Worker av1_accumulate_frame_counts(&ppi->aggregate_fc, &cpi->counts);
3426*77c1e3ccSAndroid Build Coastguard Worker #endif
3427*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_INTERNAL_STATS
3428*77c1e3ccSAndroid Build Coastguard Worker if (ppi->cpi->oxcf.pass != 1) {
3429*77c1e3ccSAndroid Build Coastguard Worker ppi->total_time_compress_data += cpi->time_compress_data;
3430*77c1e3ccSAndroid Build Coastguard Worker ppi->total_recode_hits += cpi->frame_recode_hits;
3431*77c1e3ccSAndroid Build Coastguard Worker ppi->total_bytes += (uint64_t)cpi->bytes;
3432*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < MAX_MODES; i++) {
3433*77c1e3ccSAndroid Build Coastguard Worker ppi->total_mode_chosen_counts[i] += cpi->mode_chosen_counts[i];
3434*77c1e3ccSAndroid Build Coastguard Worker }
3435*77c1e3ccSAndroid Build Coastguard Worker }
3436*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_INTERNAL_STATS
3437*77c1e3ccSAndroid Build Coastguard Worker
3438*77c1e3ccSAndroid Build Coastguard Worker if (!cpi_data.frame_size) continue;
3439*77c1e3ccSAndroid Build Coastguard Worker assert(cpi_data.cx_data != NULL && cpi_data.cx_data_sz != 0);
3440*77c1e3ccSAndroid Build Coastguard Worker if (cpi_data.frame_size > cpi_data.cx_data_sz) {
3441*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_ERROR,
3442*77c1e3ccSAndroid Build Coastguard Worker "cpi_data.cx_data buffer overflow");
3443*77c1e3ccSAndroid Build Coastguard Worker }
3444*77c1e3ccSAndroid Build Coastguard Worker const int write_temporal_delimiter =
3445*77c1e3ccSAndroid Build Coastguard Worker !cpi->common.spatial_layer_id && !ctx->pending_cx_data_sz;
3446*77c1e3ccSAndroid Build Coastguard Worker
3447*77c1e3ccSAndroid Build Coastguard Worker if (write_temporal_delimiter) {
3448*77c1e3ccSAndroid Build Coastguard Worker uint32_t obu_header_size = 1;
3449*77c1e3ccSAndroid Build Coastguard Worker const uint32_t obu_payload_size = 0;
3450*77c1e3ccSAndroid Build Coastguard Worker const size_t length_field_size =
3451*77c1e3ccSAndroid Build Coastguard Worker aom_uleb_size_in_bytes(obu_payload_size);
3452*77c1e3ccSAndroid Build Coastguard Worker
3453*77c1e3ccSAndroid Build Coastguard Worker const size_t move_offset = obu_header_size + length_field_size;
3454*77c1e3ccSAndroid Build Coastguard Worker assert(ctx->cx_data_sz == cpi_data.cx_data_sz);
3455*77c1e3ccSAndroid Build Coastguard Worker if (move_offset > ctx->cx_data_sz - cpi_data.frame_size) {
3456*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_ERROR,
3457*77c1e3ccSAndroid Build Coastguard Worker "ctx->cx_data buffer full");
3458*77c1e3ccSAndroid Build Coastguard Worker }
3459*77c1e3ccSAndroid Build Coastguard Worker memmove(ctx->cx_data + move_offset, ctx->cx_data, cpi_data.frame_size);
3460*77c1e3ccSAndroid Build Coastguard Worker obu_header_size = av1_write_obu_header(
3461*77c1e3ccSAndroid Build Coastguard Worker &ppi->level_params, &cpi->frame_header_count,
3462*77c1e3ccSAndroid Build Coastguard Worker OBU_TEMPORAL_DELIMITER,
3463*77c1e3ccSAndroid Build Coastguard Worker ppi->seq_params.has_nonzero_operating_point_idc, 0, ctx->cx_data);
3464*77c1e3ccSAndroid Build Coastguard Worker if (obu_header_size != 1) {
3465*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_ERROR, NULL);
3466*77c1e3ccSAndroid Build Coastguard Worker }
3467*77c1e3ccSAndroid Build Coastguard Worker
3468*77c1e3ccSAndroid Build Coastguard Worker // OBUs are preceded/succeeded by an unsigned leb128 coded integer.
3469*77c1e3ccSAndroid Build Coastguard Worker if (av1_write_uleb_obu_size(obu_payload_size,
3470*77c1e3ccSAndroid Build Coastguard Worker ctx->cx_data + obu_header_size,
3471*77c1e3ccSAndroid Build Coastguard Worker length_field_size) != AOM_CODEC_OK) {
3472*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_ERROR, NULL);
3473*77c1e3ccSAndroid Build Coastguard Worker }
3474*77c1e3ccSAndroid Build Coastguard Worker
3475*77c1e3ccSAndroid Build Coastguard Worker cpi_data.frame_size += move_offset;
3476*77c1e3ccSAndroid Build Coastguard Worker }
3477*77c1e3ccSAndroid Build Coastguard Worker
3478*77c1e3ccSAndroid Build Coastguard Worker if (ctx->oxcf.save_as_annexb) {
3479*77c1e3ccSAndroid Build Coastguard Worker if (av1_convert_sect5obus_to_annexb(
3480*77c1e3ccSAndroid Build Coastguard Worker cpi_data.cx_data, cpi_data.cx_data_sz, &cpi_data.frame_size) !=
3481*77c1e3ccSAndroid Build Coastguard Worker AOM_CODEC_OK) {
3482*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_ERROR, NULL);
3483*77c1e3ccSAndroid Build Coastguard Worker }
3484*77c1e3ccSAndroid Build Coastguard Worker
3485*77c1e3ccSAndroid Build Coastguard Worker // B_PRIME (add frame size)
3486*77c1e3ccSAndroid Build Coastguard Worker const size_t length_field_size =
3487*77c1e3ccSAndroid Build Coastguard Worker aom_uleb_size_in_bytes(cpi_data.frame_size);
3488*77c1e3ccSAndroid Build Coastguard Worker if (length_field_size > cpi_data.cx_data_sz - cpi_data.frame_size) {
3489*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_ERROR,
3490*77c1e3ccSAndroid Build Coastguard Worker "cpi_data.cx_data buffer full");
3491*77c1e3ccSAndroid Build Coastguard Worker }
3492*77c1e3ccSAndroid Build Coastguard Worker memmove(cpi_data.cx_data + length_field_size, cpi_data.cx_data,
3493*77c1e3ccSAndroid Build Coastguard Worker cpi_data.frame_size);
3494*77c1e3ccSAndroid Build Coastguard Worker if (av1_write_uleb_obu_size(cpi_data.frame_size, cpi_data.cx_data,
3495*77c1e3ccSAndroid Build Coastguard Worker length_field_size) != AOM_CODEC_OK) {
3496*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_ERROR, NULL);
3497*77c1e3ccSAndroid Build Coastguard Worker }
3498*77c1e3ccSAndroid Build Coastguard Worker cpi_data.frame_size += length_field_size;
3499*77c1e3ccSAndroid Build Coastguard Worker }
3500*77c1e3ccSAndroid Build Coastguard Worker
3501*77c1e3ccSAndroid Build Coastguard Worker ctx->pending_cx_data_sz += cpi_data.frame_size;
3502*77c1e3ccSAndroid Build Coastguard Worker
3503*77c1e3ccSAndroid Build Coastguard Worker cpi_data.cx_data += cpi_data.frame_size;
3504*77c1e3ccSAndroid Build Coastguard Worker cpi_data.cx_data_sz -= cpi_data.frame_size;
3505*77c1e3ccSAndroid Build Coastguard Worker
3506*77c1e3ccSAndroid Build Coastguard Worker is_frame_visible = cpi->common.show_frame;
3507*77c1e3ccSAndroid Build Coastguard Worker
3508*77c1e3ccSAndroid Build Coastguard Worker has_no_show_keyframe |=
3509*77c1e3ccSAndroid Build Coastguard Worker (!is_frame_visible &&
3510*77c1e3ccSAndroid Build Coastguard Worker cpi->common.current_frame.frame_type == KEY_FRAME);
3511*77c1e3ccSAndroid Build Coastguard Worker }
3512*77c1e3ccSAndroid Build Coastguard Worker if (is_frame_visible) {
3513*77c1e3ccSAndroid Build Coastguard Worker // Add the frame packet to the list of returned packets.
3514*77c1e3ccSAndroid Build Coastguard Worker aom_codec_cx_pkt_t pkt;
3515*77c1e3ccSAndroid Build Coastguard Worker
3516*77c1e3ccSAndroid Build Coastguard Worker // decrement frames_left counter
3517*77c1e3ccSAndroid Build Coastguard Worker ppi->frames_left = AOMMAX(0, ppi->frames_left - 1);
3518*77c1e3ccSAndroid Build Coastguard Worker if (ctx->oxcf.save_as_annexb) {
3519*77c1e3ccSAndroid Build Coastguard Worker // B_PRIME (add TU size)
3520*77c1e3ccSAndroid Build Coastguard Worker size_t tu_size = ctx->pending_cx_data_sz;
3521*77c1e3ccSAndroid Build Coastguard Worker const size_t length_field_size = aom_uleb_size_in_bytes(tu_size);
3522*77c1e3ccSAndroid Build Coastguard Worker if (tu_size > ctx->cx_data_sz) {
3523*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_ERROR,
3524*77c1e3ccSAndroid Build Coastguard Worker "ctx->cx_data buffer overflow");
3525*77c1e3ccSAndroid Build Coastguard Worker }
3526*77c1e3ccSAndroid Build Coastguard Worker if (length_field_size > ctx->cx_data_sz - tu_size) {
3527*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_ERROR,
3528*77c1e3ccSAndroid Build Coastguard Worker "ctx->cx_data buffer full");
3529*77c1e3ccSAndroid Build Coastguard Worker }
3530*77c1e3ccSAndroid Build Coastguard Worker memmove(ctx->cx_data + length_field_size, ctx->cx_data, tu_size);
3531*77c1e3ccSAndroid Build Coastguard Worker if (av1_write_uleb_obu_size(tu_size, ctx->cx_data, length_field_size) !=
3532*77c1e3ccSAndroid Build Coastguard Worker AOM_CODEC_OK) {
3533*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_ERROR, NULL);
3534*77c1e3ccSAndroid Build Coastguard Worker }
3535*77c1e3ccSAndroid Build Coastguard Worker ctx->pending_cx_data_sz += length_field_size;
3536*77c1e3ccSAndroid Build Coastguard Worker }
3537*77c1e3ccSAndroid Build Coastguard Worker
3538*77c1e3ccSAndroid Build Coastguard Worker pkt.kind = AOM_CODEC_CX_FRAME_PKT;
3539*77c1e3ccSAndroid Build Coastguard Worker
3540*77c1e3ccSAndroid Build Coastguard Worker pkt.data.frame.buf = ctx->cx_data;
3541*77c1e3ccSAndroid Build Coastguard Worker pkt.data.frame.sz = ctx->pending_cx_data_sz;
3542*77c1e3ccSAndroid Build Coastguard Worker pkt.data.frame.partition_id = -1;
3543*77c1e3ccSAndroid Build Coastguard Worker pkt.data.frame.vis_frame_size = cpi_data.frame_size;
3544*77c1e3ccSAndroid Build Coastguard Worker
3545*77c1e3ccSAndroid Build Coastguard Worker pkt.data.frame.pts = ticks_to_timebase_units(cpi_data.timestamp_ratio,
3546*77c1e3ccSAndroid Build Coastguard Worker cpi_data.ts_frame_start) +
3547*77c1e3ccSAndroid Build Coastguard Worker ctx->pts_offset;
3548*77c1e3ccSAndroid Build Coastguard Worker pkt.data.frame.flags = get_frame_pkt_flags(cpi, cpi_data.lib_flags);
3549*77c1e3ccSAndroid Build Coastguard Worker if (has_no_show_keyframe) {
3550*77c1e3ccSAndroid Build Coastguard Worker // If one of the invisible frames in the packet is a keyframe, set
3551*77c1e3ccSAndroid Build Coastguard Worker // the delayed random access point flag.
3552*77c1e3ccSAndroid Build Coastguard Worker pkt.data.frame.flags |= AOM_FRAME_IS_DELAYED_RANDOM_ACCESS_POINT;
3553*77c1e3ccSAndroid Build Coastguard Worker }
3554*77c1e3ccSAndroid Build Coastguard Worker const int64_t duration64 = ticks_to_timebase_units(
3555*77c1e3ccSAndroid Build Coastguard Worker cpi_data.timestamp_ratio,
3556*77c1e3ccSAndroid Build Coastguard Worker cpi_data.ts_frame_end - cpi_data.ts_frame_start);
3557*77c1e3ccSAndroid Build Coastguard Worker if (duration64 > UINT32_MAX) {
3558*77c1e3ccSAndroid Build Coastguard Worker aom_internal_error(&ppi->error, AOM_CODEC_ERROR, NULL);
3559*77c1e3ccSAndroid Build Coastguard Worker }
3560*77c1e3ccSAndroid Build Coastguard Worker pkt.data.frame.duration = (uint32_t)duration64;
3561*77c1e3ccSAndroid Build Coastguard Worker
3562*77c1e3ccSAndroid Build Coastguard Worker aom_codec_pkt_list_add(&ctx->pkt_list.head, &pkt);
3563*77c1e3ccSAndroid Build Coastguard Worker
3564*77c1e3ccSAndroid Build Coastguard Worker ctx->pending_cx_data_sz = 0;
3565*77c1e3ccSAndroid Build Coastguard Worker }
3566*77c1e3ccSAndroid Build Coastguard Worker }
3567*77c1e3ccSAndroid Build Coastguard Worker
3568*77c1e3ccSAndroid Build Coastguard Worker ppi->error.setjmp = 0;
3569*77c1e3ccSAndroid Build Coastguard Worker return res;
3570*77c1e3ccSAndroid Build Coastguard Worker }
3571*77c1e3ccSAndroid Build Coastguard Worker
encoder_get_cxdata(aom_codec_alg_priv_t * ctx,aom_codec_iter_t * iter)3572*77c1e3ccSAndroid Build Coastguard Worker static const aom_codec_cx_pkt_t *encoder_get_cxdata(aom_codec_alg_priv_t *ctx,
3573*77c1e3ccSAndroid Build Coastguard Worker aom_codec_iter_t *iter) {
3574*77c1e3ccSAndroid Build Coastguard Worker return aom_codec_pkt_list_get(&ctx->pkt_list.head, iter);
3575*77c1e3ccSAndroid Build Coastguard Worker }
3576*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_reference(aom_codec_alg_priv_t * ctx,va_list args)3577*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_reference(aom_codec_alg_priv_t *ctx,
3578*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3579*77c1e3ccSAndroid Build Coastguard Worker av1_ref_frame_t *const frame = va_arg(args, av1_ref_frame_t *);
3580*77c1e3ccSAndroid Build Coastguard Worker
3581*77c1e3ccSAndroid Build Coastguard Worker if (frame != NULL) {
3582*77c1e3ccSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG sd;
3583*77c1e3ccSAndroid Build Coastguard Worker
3584*77c1e3ccSAndroid Build Coastguard Worker image2yuvconfig(&frame->img, &sd);
3585*77c1e3ccSAndroid Build Coastguard Worker av1_set_reference_enc(ctx->ppi->cpi, frame->idx, &sd);
3586*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3587*77c1e3ccSAndroid Build Coastguard Worker } else {
3588*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3589*77c1e3ccSAndroid Build Coastguard Worker }
3590*77c1e3ccSAndroid Build Coastguard Worker }
3591*77c1e3ccSAndroid Build Coastguard Worker
ctrl_copy_reference(aom_codec_alg_priv_t * ctx,va_list args)3592*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_copy_reference(aom_codec_alg_priv_t *ctx,
3593*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3594*77c1e3ccSAndroid Build Coastguard Worker if (ctx->ppi->cpi->oxcf.algo_cfg.skip_postproc_filtering)
3595*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INCAPABLE;
3596*77c1e3ccSAndroid Build Coastguard Worker av1_ref_frame_t *const frame = va_arg(args, av1_ref_frame_t *);
3597*77c1e3ccSAndroid Build Coastguard Worker
3598*77c1e3ccSAndroid Build Coastguard Worker if (frame != NULL) {
3599*77c1e3ccSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG sd;
3600*77c1e3ccSAndroid Build Coastguard Worker
3601*77c1e3ccSAndroid Build Coastguard Worker image2yuvconfig(&frame->img, &sd);
3602*77c1e3ccSAndroid Build Coastguard Worker av1_copy_reference_enc(ctx->ppi->cpi, frame->idx, &sd);
3603*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3604*77c1e3ccSAndroid Build Coastguard Worker } else {
3605*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3606*77c1e3ccSAndroid Build Coastguard Worker }
3607*77c1e3ccSAndroid Build Coastguard Worker }
3608*77c1e3ccSAndroid Build Coastguard Worker
ctrl_get_reference(aom_codec_alg_priv_t * ctx,va_list args)3609*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_get_reference(aom_codec_alg_priv_t *ctx,
3610*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3611*77c1e3ccSAndroid Build Coastguard Worker if (ctx->ppi->cpi->oxcf.algo_cfg.skip_postproc_filtering)
3612*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INCAPABLE;
3613*77c1e3ccSAndroid Build Coastguard Worker av1_ref_frame_t *const frame = va_arg(args, av1_ref_frame_t *);
3614*77c1e3ccSAndroid Build Coastguard Worker
3615*77c1e3ccSAndroid Build Coastguard Worker if (frame != NULL) {
3616*77c1e3ccSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG *fb = get_ref_frame(&ctx->ppi->cpi->common, frame->idx);
3617*77c1e3ccSAndroid Build Coastguard Worker if (fb == NULL) return AOM_CODEC_ERROR;
3618*77c1e3ccSAndroid Build Coastguard Worker
3619*77c1e3ccSAndroid Build Coastguard Worker yuvconfig2image(&frame->img, fb, NULL);
3620*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3621*77c1e3ccSAndroid Build Coastguard Worker } else {
3622*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3623*77c1e3ccSAndroid Build Coastguard Worker }
3624*77c1e3ccSAndroid Build Coastguard Worker }
3625*77c1e3ccSAndroid Build Coastguard Worker
ctrl_get_new_frame_image(aom_codec_alg_priv_t * ctx,va_list args)3626*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_get_new_frame_image(aom_codec_alg_priv_t *ctx,
3627*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3628*77c1e3ccSAndroid Build Coastguard Worker aom_image_t *const new_img = va_arg(args, aom_image_t *);
3629*77c1e3ccSAndroid Build Coastguard Worker
3630*77c1e3ccSAndroid Build Coastguard Worker if (new_img != NULL) {
3631*77c1e3ccSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG new_frame;
3632*77c1e3ccSAndroid Build Coastguard Worker
3633*77c1e3ccSAndroid Build Coastguard Worker if (av1_get_last_show_frame(ctx->ppi->cpi, &new_frame) == 0) {
3634*77c1e3ccSAndroid Build Coastguard Worker yuvconfig2image(new_img, &new_frame, NULL);
3635*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3636*77c1e3ccSAndroid Build Coastguard Worker } else {
3637*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_ERROR;
3638*77c1e3ccSAndroid Build Coastguard Worker }
3639*77c1e3ccSAndroid Build Coastguard Worker } else {
3640*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3641*77c1e3ccSAndroid Build Coastguard Worker }
3642*77c1e3ccSAndroid Build Coastguard Worker }
3643*77c1e3ccSAndroid Build Coastguard Worker
ctrl_copy_new_frame_image(aom_codec_alg_priv_t * ctx,va_list args)3644*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_copy_new_frame_image(aom_codec_alg_priv_t *ctx,
3645*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3646*77c1e3ccSAndroid Build Coastguard Worker aom_image_t *const new_img = va_arg(args, aom_image_t *);
3647*77c1e3ccSAndroid Build Coastguard Worker
3648*77c1e3ccSAndroid Build Coastguard Worker if (new_img != NULL) {
3649*77c1e3ccSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG new_frame;
3650*77c1e3ccSAndroid Build Coastguard Worker
3651*77c1e3ccSAndroid Build Coastguard Worker if (av1_get_last_show_frame(ctx->ppi->cpi, &new_frame) == 0) {
3652*77c1e3ccSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG sd;
3653*77c1e3ccSAndroid Build Coastguard Worker image2yuvconfig(new_img, &sd);
3654*77c1e3ccSAndroid Build Coastguard Worker return av1_copy_new_frame_enc(&ctx->ppi->cpi->common, &new_frame, &sd);
3655*77c1e3ccSAndroid Build Coastguard Worker } else {
3656*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_ERROR;
3657*77c1e3ccSAndroid Build Coastguard Worker }
3658*77c1e3ccSAndroid Build Coastguard Worker } else {
3659*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3660*77c1e3ccSAndroid Build Coastguard Worker }
3661*77c1e3ccSAndroid Build Coastguard Worker }
3662*77c1e3ccSAndroid Build Coastguard Worker
encoder_get_preview(aom_codec_alg_priv_t * ctx)3663*77c1e3ccSAndroid Build Coastguard Worker static aom_image_t *encoder_get_preview(aom_codec_alg_priv_t *ctx) {
3664*77c1e3ccSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG sd;
3665*77c1e3ccSAndroid Build Coastguard Worker
3666*77c1e3ccSAndroid Build Coastguard Worker if (av1_get_preview_raw_frame(ctx->ppi->cpi, &sd) == 0) {
3667*77c1e3ccSAndroid Build Coastguard Worker yuvconfig2image(&ctx->preview_img, &sd, NULL);
3668*77c1e3ccSAndroid Build Coastguard Worker return &ctx->preview_img;
3669*77c1e3ccSAndroid Build Coastguard Worker } else {
3670*77c1e3ccSAndroid Build Coastguard Worker return NULL;
3671*77c1e3ccSAndroid Build Coastguard Worker }
3672*77c1e3ccSAndroid Build Coastguard Worker }
3673*77c1e3ccSAndroid Build Coastguard Worker
ctrl_use_reference(aom_codec_alg_priv_t * ctx,va_list args)3674*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_use_reference(aom_codec_alg_priv_t *ctx,
3675*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3676*77c1e3ccSAndroid Build Coastguard Worker const int reference_flag = va_arg(args, int);
3677*77c1e3ccSAndroid Build Coastguard Worker
3678*77c1e3ccSAndroid Build Coastguard Worker av1_use_as_reference(&ctx->ppi->cpi->ext_flags.ref_frame_flags,
3679*77c1e3ccSAndroid Build Coastguard Worker reference_flag);
3680*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3681*77c1e3ccSAndroid Build Coastguard Worker }
3682*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_roi_map(aom_codec_alg_priv_t * ctx,va_list args)3683*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_roi_map(aom_codec_alg_priv_t *ctx,
3684*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3685*77c1e3ccSAndroid Build Coastguard Worker (void)ctx;
3686*77c1e3ccSAndroid Build Coastguard Worker (void)args;
3687*77c1e3ccSAndroid Build Coastguard Worker
3688*77c1e3ccSAndroid Build Coastguard Worker // TODO(yaowu): Need to re-implement and test for AV1.
3689*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3690*77c1e3ccSAndroid Build Coastguard Worker }
3691*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_active_map(aom_codec_alg_priv_t * ctx,va_list args)3692*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_active_map(aom_codec_alg_priv_t *ctx,
3693*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3694*77c1e3ccSAndroid Build Coastguard Worker aom_active_map_t *const map = va_arg(args, aom_active_map_t *);
3695*77c1e3ccSAndroid Build Coastguard Worker
3696*77c1e3ccSAndroid Build Coastguard Worker if (map) {
3697*77c1e3ccSAndroid Build Coastguard Worker if (!av1_set_active_map(ctx->ppi->cpi, map->active_map, (int)map->rows,
3698*77c1e3ccSAndroid Build Coastguard Worker (int)map->cols))
3699*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3700*77c1e3ccSAndroid Build Coastguard Worker else
3701*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3702*77c1e3ccSAndroid Build Coastguard Worker } else {
3703*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3704*77c1e3ccSAndroid Build Coastguard Worker }
3705*77c1e3ccSAndroid Build Coastguard Worker }
3706*77c1e3ccSAndroid Build Coastguard Worker
ctrl_get_active_map(aom_codec_alg_priv_t * ctx,va_list args)3707*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_get_active_map(aom_codec_alg_priv_t *ctx,
3708*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3709*77c1e3ccSAndroid Build Coastguard Worker aom_active_map_t *const map = va_arg(args, aom_active_map_t *);
3710*77c1e3ccSAndroid Build Coastguard Worker
3711*77c1e3ccSAndroid Build Coastguard Worker if (map) {
3712*77c1e3ccSAndroid Build Coastguard Worker if (!av1_get_active_map(ctx->ppi->cpi, map->active_map, (int)map->rows,
3713*77c1e3ccSAndroid Build Coastguard Worker (int)map->cols))
3714*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3715*77c1e3ccSAndroid Build Coastguard Worker else
3716*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3717*77c1e3ccSAndroid Build Coastguard Worker } else {
3718*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3719*77c1e3ccSAndroid Build Coastguard Worker }
3720*77c1e3ccSAndroid Build Coastguard Worker }
3721*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_scale_mode(aom_codec_alg_priv_t * ctx,va_list args)3722*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_scale_mode(aom_codec_alg_priv_t *ctx,
3723*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3724*77c1e3ccSAndroid Build Coastguard Worker aom_scaling_mode_t *const mode = va_arg(args, aom_scaling_mode_t *);
3725*77c1e3ccSAndroid Build Coastguard Worker
3726*77c1e3ccSAndroid Build Coastguard Worker if (mode) {
3727*77c1e3ccSAndroid Build Coastguard Worker AV1EncoderConfig *const oxcf =
3728*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->seq_params_locked ? &ctx->ppi->cpi->oxcf : &ctx->oxcf;
3729*77c1e3ccSAndroid Build Coastguard Worker const int res =
3730*77c1e3ccSAndroid Build Coastguard Worker av1_set_internal_size(oxcf, &ctx->ppi->cpi->resize_pending_params,
3731*77c1e3ccSAndroid Build Coastguard Worker mode->h_scaling_mode, mode->v_scaling_mode);
3732*77c1e3ccSAndroid Build Coastguard Worker if (res == 0) {
3733*77c1e3ccSAndroid Build Coastguard Worker // update_encoder_cfg() is somewhat costly and this control may be called
3734*77c1e3ccSAndroid Build Coastguard Worker // multiple times, so update_encoder_cfg() is only called to ensure frame
3735*77c1e3ccSAndroid Build Coastguard Worker // and superblock sizes are updated before they're fixed by the first
3736*77c1e3ccSAndroid Build Coastguard Worker // encode call.
3737*77c1e3ccSAndroid Build Coastguard Worker if (ctx->ppi->seq_params_locked) {
3738*77c1e3ccSAndroid Build Coastguard Worker av1_check_fpmt_config(ctx->ppi, &ctx->ppi->cpi->oxcf);
3739*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3740*77c1e3ccSAndroid Build Coastguard Worker }
3741*77c1e3ccSAndroid Build Coastguard Worker return update_encoder_cfg(ctx);
3742*77c1e3ccSAndroid Build Coastguard Worker }
3743*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3744*77c1e3ccSAndroid Build Coastguard Worker } else {
3745*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3746*77c1e3ccSAndroid Build Coastguard Worker }
3747*77c1e3ccSAndroid Build Coastguard Worker }
3748*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_spatial_layer_id(aom_codec_alg_priv_t * ctx,va_list args)3749*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_spatial_layer_id(aom_codec_alg_priv_t *ctx,
3750*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3751*77c1e3ccSAndroid Build Coastguard Worker const int spatial_layer_id = va_arg(args, int);
3752*77c1e3ccSAndroid Build Coastguard Worker if (spatial_layer_id >= MAX_NUM_SPATIAL_LAYERS)
3753*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3754*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->cpi->common.spatial_layer_id = spatial_layer_id;
3755*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3756*77c1e3ccSAndroid Build Coastguard Worker }
3757*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_number_spatial_layers(aom_codec_alg_priv_t * ctx,va_list args)3758*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_number_spatial_layers(aom_codec_alg_priv_t *ctx,
3759*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3760*77c1e3ccSAndroid Build Coastguard Worker const int number_spatial_layers = va_arg(args, int);
3761*77c1e3ccSAndroid Build Coastguard Worker if (number_spatial_layers > MAX_NUM_SPATIAL_LAYERS)
3762*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3763*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->number_spatial_layers = number_spatial_layers;
3764*77c1e3ccSAndroid Build Coastguard Worker // update_encoder_cfg() is somewhat costly and this control may be called
3765*77c1e3ccSAndroid Build Coastguard Worker // multiple times, so update_encoder_cfg() is only called to ensure frame and
3766*77c1e3ccSAndroid Build Coastguard Worker // superblock sizes are updated before they're fixed by the first encode
3767*77c1e3ccSAndroid Build Coastguard Worker // call.
3768*77c1e3ccSAndroid Build Coastguard Worker if (!ctx->ppi->seq_params_locked) {
3769*77c1e3ccSAndroid Build Coastguard Worker return update_encoder_cfg(ctx);
3770*77c1e3ccSAndroid Build Coastguard Worker }
3771*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3772*77c1e3ccSAndroid Build Coastguard Worker }
3773*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_layer_id(aom_codec_alg_priv_t * ctx,va_list args)3774*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_layer_id(aom_codec_alg_priv_t *ctx,
3775*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3776*77c1e3ccSAndroid Build Coastguard Worker aom_svc_layer_id_t *const data = va_arg(args, aom_svc_layer_id_t *);
3777*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->cpi->common.spatial_layer_id = data->spatial_layer_id;
3778*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->cpi->common.temporal_layer_id = data->temporal_layer_id;
3779*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->cpi->svc.spatial_layer_id = data->spatial_layer_id;
3780*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->cpi->svc.temporal_layer_id = data->temporal_layer_id;
3781*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3782*77c1e3ccSAndroid Build Coastguard Worker }
3783*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_svc_params(aom_codec_alg_priv_t * ctx,va_list args)3784*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_svc_params(aom_codec_alg_priv_t *ctx,
3785*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3786*77c1e3ccSAndroid Build Coastguard Worker AV1_PRIMARY *const ppi = ctx->ppi;
3787*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *const cpi = ppi->cpi;
3788*77c1e3ccSAndroid Build Coastguard Worker aom_svc_params_t *const params = va_arg(args, aom_svc_params_t *);
3789*77c1e3ccSAndroid Build Coastguard Worker int64_t target_bandwidth = 0;
3790*77c1e3ccSAndroid Build Coastguard Worker ppi->number_spatial_layers = params->number_spatial_layers;
3791*77c1e3ccSAndroid Build Coastguard Worker ppi->number_temporal_layers = params->number_temporal_layers;
3792*77c1e3ccSAndroid Build Coastguard Worker cpi->svc.number_spatial_layers = params->number_spatial_layers;
3793*77c1e3ccSAndroid Build Coastguard Worker cpi->svc.number_temporal_layers = params->number_temporal_layers;
3794*77c1e3ccSAndroid Build Coastguard Worker if (ppi->number_spatial_layers > 1 || ppi->number_temporal_layers > 1) {
3795*77c1e3ccSAndroid Build Coastguard Worker unsigned int sl, tl;
3796*77c1e3ccSAndroid Build Coastguard Worker ctx->ppi->use_svc = 1;
3797*77c1e3ccSAndroid Build Coastguard Worker const int num_layers =
3798*77c1e3ccSAndroid Build Coastguard Worker ppi->number_spatial_layers * ppi->number_temporal_layers;
3799*77c1e3ccSAndroid Build Coastguard Worker for (int layer = 0; layer < num_layers; ++layer) {
3800*77c1e3ccSAndroid Build Coastguard Worker if (params->max_quantizers[layer] > 63 ||
3801*77c1e3ccSAndroid Build Coastguard Worker params->min_quantizers[layer] < 0 ||
3802*77c1e3ccSAndroid Build Coastguard Worker params->min_quantizers[layer] > params->max_quantizers[layer]) {
3803*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3804*77c1e3ccSAndroid Build Coastguard Worker }
3805*77c1e3ccSAndroid Build Coastguard Worker }
3806*77c1e3ccSAndroid Build Coastguard Worker if (!av1_alloc_layer_context(cpi, num_layers)) return AOM_CODEC_MEM_ERROR;
3807*77c1e3ccSAndroid Build Coastguard Worker
3808*77c1e3ccSAndroid Build Coastguard Worker for (sl = 0; sl < ppi->number_spatial_layers; ++sl) {
3809*77c1e3ccSAndroid Build Coastguard Worker for (tl = 0; tl < ppi->number_temporal_layers; ++tl) {
3810*77c1e3ccSAndroid Build Coastguard Worker const int layer = LAYER_IDS_TO_IDX(sl, tl, ppi->number_temporal_layers);
3811*77c1e3ccSAndroid Build Coastguard Worker LAYER_CONTEXT *lc = &cpi->svc.layer_context[layer];
3812*77c1e3ccSAndroid Build Coastguard Worker lc->max_q = params->max_quantizers[layer];
3813*77c1e3ccSAndroid Build Coastguard Worker lc->min_q = params->min_quantizers[layer];
3814*77c1e3ccSAndroid Build Coastguard Worker lc->scaling_factor_num = AOMMAX(1, params->scaling_factor_num[sl]);
3815*77c1e3ccSAndroid Build Coastguard Worker lc->scaling_factor_den = AOMMAX(1, params->scaling_factor_den[sl]);
3816*77c1e3ccSAndroid Build Coastguard Worker const int layer_target_bitrate = params->layer_target_bitrate[layer];
3817*77c1e3ccSAndroid Build Coastguard Worker if (layer_target_bitrate > INT_MAX / 1000) {
3818*77c1e3ccSAndroid Build Coastguard Worker lc->layer_target_bitrate = INT_MAX;
3819*77c1e3ccSAndroid Build Coastguard Worker } else {
3820*77c1e3ccSAndroid Build Coastguard Worker lc->layer_target_bitrate = 1000 * layer_target_bitrate;
3821*77c1e3ccSAndroid Build Coastguard Worker }
3822*77c1e3ccSAndroid Build Coastguard Worker lc->framerate_factor = params->framerate_factor[tl];
3823*77c1e3ccSAndroid Build Coastguard Worker if (tl == ppi->number_temporal_layers - 1)
3824*77c1e3ccSAndroid Build Coastguard Worker target_bandwidth += lc->layer_target_bitrate;
3825*77c1e3ccSAndroid Build Coastguard Worker }
3826*77c1e3ccSAndroid Build Coastguard Worker }
3827*77c1e3ccSAndroid Build Coastguard Worker
3828*77c1e3ccSAndroid Build Coastguard Worker if (ppi->seq_params_locked) {
3829*77c1e3ccSAndroid Build Coastguard Worker AV1EncoderConfig *const oxcf = &cpi->oxcf;
3830*77c1e3ccSAndroid Build Coastguard Worker // Keep ctx->oxcf in sync in case further codec controls are made prior
3831*77c1e3ccSAndroid Build Coastguard Worker // to encoding.
3832*77c1e3ccSAndroid Build Coastguard Worker ctx->oxcf.rc_cfg.target_bandwidth = oxcf->rc_cfg.target_bandwidth =
3833*77c1e3ccSAndroid Build Coastguard Worker target_bandwidth;
3834*77c1e3ccSAndroid Build Coastguard Worker set_primary_rc_buffer_sizes(oxcf, ppi);
3835*77c1e3ccSAndroid Build Coastguard Worker av1_update_layer_context_change_config(cpi, target_bandwidth);
3836*77c1e3ccSAndroid Build Coastguard Worker check_reset_rc_flag(cpi);
3837*77c1e3ccSAndroid Build Coastguard Worker } else {
3838*77c1e3ccSAndroid Build Coastguard Worker // Note av1_init_layer_context() relies on cpi->oxcf. The order of that
3839*77c1e3ccSAndroid Build Coastguard Worker // call and the ones in the other half of this block (which
3840*77c1e3ccSAndroid Build Coastguard Worker // update_encoder_cfg() transitively makes) is important. So we keep
3841*77c1e3ccSAndroid Build Coastguard Worker // ctx->oxcf and cpi->oxcf in sync here as update_encoder_cfg() will
3842*77c1e3ccSAndroid Build Coastguard Worker // overwrite cpi->oxcf with ctx->oxcf.
3843*77c1e3ccSAndroid Build Coastguard Worker ctx->oxcf.rc_cfg.target_bandwidth = cpi->oxcf.rc_cfg.target_bandwidth =
3844*77c1e3ccSAndroid Build Coastguard Worker target_bandwidth;
3845*77c1e3ccSAndroid Build Coastguard Worker SequenceHeader *const seq_params = &ppi->seq_params;
3846*77c1e3ccSAndroid Build Coastguard Worker seq_params->operating_points_cnt_minus_1 =
3847*77c1e3ccSAndroid Build Coastguard Worker ppi->number_spatial_layers * ppi->number_temporal_layers - 1;
3848*77c1e3ccSAndroid Build Coastguard Worker
3849*77c1e3ccSAndroid Build Coastguard Worker av1_init_layer_context(cpi);
3850*77c1e3ccSAndroid Build Coastguard Worker // update_encoder_cfg() is somewhat costly and this control may be called
3851*77c1e3ccSAndroid Build Coastguard Worker // multiple times, so update_encoder_cfg() is only called to ensure frame
3852*77c1e3ccSAndroid Build Coastguard Worker // and superblock sizes are updated before they're fixed by the first
3853*77c1e3ccSAndroid Build Coastguard Worker // encode call.
3854*77c1e3ccSAndroid Build Coastguard Worker return update_encoder_cfg(ctx);
3855*77c1e3ccSAndroid Build Coastguard Worker }
3856*77c1e3ccSAndroid Build Coastguard Worker } else if (!ppi->seq_params_locked) {
3857*77c1e3ccSAndroid Build Coastguard Worker // Ensure frame and superblock sizes are updated.
3858*77c1e3ccSAndroid Build Coastguard Worker return update_encoder_cfg(ctx);
3859*77c1e3ccSAndroid Build Coastguard Worker }
3860*77c1e3ccSAndroid Build Coastguard Worker av1_check_fpmt_config(ctx->ppi, &ctx->ppi->cpi->oxcf);
3861*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3862*77c1e3ccSAndroid Build Coastguard Worker }
3863*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_svc_ref_frame_config(aom_codec_alg_priv_t * ctx,va_list args)3864*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_svc_ref_frame_config(aom_codec_alg_priv_t *ctx,
3865*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3866*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *const cpi = ctx->ppi->cpi;
3867*77c1e3ccSAndroid Build Coastguard Worker aom_svc_ref_frame_config_t *const data =
3868*77c1e3ccSAndroid Build Coastguard Worker va_arg(args, aom_svc_ref_frame_config_t *);
3869*77c1e3ccSAndroid Build Coastguard Worker cpi->ppi->rtc_ref.set_ref_frame_config = 1;
3870*77c1e3ccSAndroid Build Coastguard Worker for (unsigned int i = 0; i < INTER_REFS_PER_FRAME; ++i) {
3871*77c1e3ccSAndroid Build Coastguard Worker if (data->reference[i] != 0 && data->reference[i] != 1)
3872*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3873*77c1e3ccSAndroid Build Coastguard Worker if (data->ref_idx[i] > 7 || data->ref_idx[i] < 0)
3874*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3875*77c1e3ccSAndroid Build Coastguard Worker cpi->ppi->rtc_ref.reference[i] = data->reference[i];
3876*77c1e3ccSAndroid Build Coastguard Worker cpi->ppi->rtc_ref.ref_idx[i] = data->ref_idx[i];
3877*77c1e3ccSAndroid Build Coastguard Worker }
3878*77c1e3ccSAndroid Build Coastguard Worker for (unsigned int i = 0; i < REF_FRAMES; ++i) {
3879*77c1e3ccSAndroid Build Coastguard Worker if (data->refresh[i] != 0 && data->refresh[i] != 1)
3880*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3881*77c1e3ccSAndroid Build Coastguard Worker cpi->ppi->rtc_ref.refresh[i] = data->refresh[i];
3882*77c1e3ccSAndroid Build Coastguard Worker }
3883*77c1e3ccSAndroid Build Coastguard Worker cpi->svc.use_flexible_mode = 1;
3884*77c1e3ccSAndroid Build Coastguard Worker cpi->svc.ksvc_fixed_mode = 0;
3885*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3886*77c1e3ccSAndroid Build Coastguard Worker }
3887*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_svc_ref_frame_comp_pred(aom_codec_alg_priv_t * ctx,va_list args)3888*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_svc_ref_frame_comp_pred(
3889*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
3890*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *const cpi = ctx->ppi->cpi;
3891*77c1e3ccSAndroid Build Coastguard Worker aom_svc_ref_frame_comp_pred_t *const data =
3892*77c1e3ccSAndroid Build Coastguard Worker va_arg(args, aom_svc_ref_frame_comp_pred_t *);
3893*77c1e3ccSAndroid Build Coastguard Worker cpi->ppi->rtc_ref.ref_frame_comp[0] = data->use_comp_pred[0];
3894*77c1e3ccSAndroid Build Coastguard Worker cpi->ppi->rtc_ref.ref_frame_comp[1] = data->use_comp_pred[1];
3895*77c1e3ccSAndroid Build Coastguard Worker cpi->ppi->rtc_ref.ref_frame_comp[2] = data->use_comp_pred[2];
3896*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
3897*77c1e3ccSAndroid Build Coastguard Worker }
3898*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_tune_content(aom_codec_alg_priv_t * ctx,va_list args)3899*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_tune_content(aom_codec_alg_priv_t *ctx,
3900*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3901*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
3902*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.content = CAST(AV1E_SET_TUNE_CONTENT, args);
3903*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
3904*77c1e3ccSAndroid Build Coastguard Worker }
3905*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_cdf_update_mode(aom_codec_alg_priv_t * ctx,va_list args)3906*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_cdf_update_mode(aom_codec_alg_priv_t *ctx,
3907*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3908*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
3909*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.cdf_update_mode = CAST(AV1E_SET_CDF_UPDATE_MODE, args);
3910*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
3911*77c1e3ccSAndroid Build Coastguard Worker }
3912*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_color_primaries(aom_codec_alg_priv_t * ctx,va_list args)3913*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_color_primaries(aom_codec_alg_priv_t *ctx,
3914*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3915*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
3916*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.color_primaries = CAST(AV1E_SET_COLOR_PRIMARIES, args);
3917*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
3918*77c1e3ccSAndroid Build Coastguard Worker }
3919*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_transfer_characteristics(aom_codec_alg_priv_t * ctx,va_list args)3920*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_transfer_characteristics(
3921*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
3922*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
3923*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.transfer_characteristics =
3924*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_TRANSFER_CHARACTERISTICS, args);
3925*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
3926*77c1e3ccSAndroid Build Coastguard Worker }
3927*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_matrix_coefficients(aom_codec_alg_priv_t * ctx,va_list args)3928*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_matrix_coefficients(aom_codec_alg_priv_t *ctx,
3929*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3930*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
3931*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.matrix_coefficients = CAST(AV1E_SET_MATRIX_COEFFICIENTS, args);
3932*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
3933*77c1e3ccSAndroid Build Coastguard Worker }
3934*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_chroma_sample_position(aom_codec_alg_priv_t * ctx,va_list args)3935*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_chroma_sample_position(
3936*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
3937*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
3938*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.chroma_sample_position =
3939*77c1e3ccSAndroid Build Coastguard Worker CAST(AV1E_SET_CHROMA_SAMPLE_POSITION, args);
3940*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
3941*77c1e3ccSAndroid Build Coastguard Worker }
3942*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_color_range(aom_codec_alg_priv_t * ctx,va_list args)3943*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_color_range(aom_codec_alg_priv_t *ctx,
3944*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3945*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
3946*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.color_range = CAST(AV1E_SET_COLOR_RANGE, args);
3947*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
3948*77c1e3ccSAndroid Build Coastguard Worker }
3949*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_render_size(aom_codec_alg_priv_t * ctx,va_list args)3950*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_render_size(aom_codec_alg_priv_t *ctx,
3951*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3952*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
3953*77c1e3ccSAndroid Build Coastguard Worker int *const render_size = va_arg(args, int *);
3954*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.render_width = render_size[0];
3955*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.render_height = render_size[1];
3956*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
3957*77c1e3ccSAndroid Build Coastguard Worker }
3958*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_superblock_size(aom_codec_alg_priv_t * ctx,va_list args)3959*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_superblock_size(aom_codec_alg_priv_t *ctx,
3960*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3961*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
3962*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.superblock_size = CAST(AV1E_SET_SUPERBLOCK_SIZE, args);
3963*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
3964*77c1e3ccSAndroid Build Coastguard Worker }
3965*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_chroma_subsampling_x(aom_codec_alg_priv_t * ctx,va_list args)3966*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_chroma_subsampling_x(aom_codec_alg_priv_t *ctx,
3967*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3968*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
3969*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.chroma_subsampling_x = CAST(AV1E_SET_CHROMA_SUBSAMPLING_X, args);
3970*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
3971*77c1e3ccSAndroid Build Coastguard Worker }
3972*77c1e3ccSAndroid Build Coastguard Worker
ctrl_set_chroma_subsampling_y(aom_codec_alg_priv_t * ctx,va_list args)3973*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_set_chroma_subsampling_y(aom_codec_alg_priv_t *ctx,
3974*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
3975*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
3976*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.chroma_subsampling_y = CAST(AV1E_SET_CHROMA_SUBSAMPLING_Y, args);
3977*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
3978*77c1e3ccSAndroid Build Coastguard Worker }
3979*77c1e3ccSAndroid Build Coastguard Worker
encoder_set_option(aom_codec_alg_priv_t * ctx,const char * name,const char * value)3980*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t encoder_set_option(aom_codec_alg_priv_t *ctx,
3981*77c1e3ccSAndroid Build Coastguard Worker const char *name, const char *value) {
3982*77c1e3ccSAndroid Build Coastguard Worker if (ctx == NULL || name == NULL || value == NULL)
3983*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
3984*77c1e3ccSAndroid Build Coastguard Worker struct av1_extracfg extra_cfg = ctx->extra_cfg;
3985*77c1e3ccSAndroid Build Coastguard Worker // Used to mock the argv with just one string "--{name}={value}"
3986*77c1e3ccSAndroid Build Coastguard Worker char *argv[2] = { NULL, "" };
3987*77c1e3ccSAndroid Build Coastguard Worker size_t len = strlen(name) + strlen(value) + 4;
3988*77c1e3ccSAndroid Build Coastguard Worker char *const err_string = ctx->ppi->error.detail;
3989*77c1e3ccSAndroid Build Coastguard Worker
3990*77c1e3ccSAndroid Build Coastguard Worker #if __STDC_VERSION__ >= 201112L
3991*77c1e3ccSAndroid Build Coastguard Worker // We use the keyword _Static_assert because clang-cl does not allow the
3992*77c1e3ccSAndroid Build Coastguard Worker // convenience macro static_assert to be used in function scope. See
3993*77c1e3ccSAndroid Build Coastguard Worker // https://bugs.llvm.org/show_bug.cgi?id=48904.
3994*77c1e3ccSAndroid Build Coastguard Worker _Static_assert(sizeof(ctx->ppi->error.detail) >= ARG_ERR_MSG_MAX_LEN,
3995*77c1e3ccSAndroid Build Coastguard Worker "The size of the err_msg buffer for arg_match_helper must be "
3996*77c1e3ccSAndroid Build Coastguard Worker "at least ARG_ERR_MSG_MAX_LEN");
3997*77c1e3ccSAndroid Build Coastguard Worker #else
3998*77c1e3ccSAndroid Build Coastguard Worker assert(sizeof(ctx->ppi->error.detail) >= ARG_ERR_MSG_MAX_LEN);
3999*77c1e3ccSAndroid Build Coastguard Worker #endif
4000*77c1e3ccSAndroid Build Coastguard Worker
4001*77c1e3ccSAndroid Build Coastguard Worker argv[0] = aom_malloc(len * sizeof(argv[1][0]));
4002*77c1e3ccSAndroid Build Coastguard Worker if (!argv[0]) return AOM_CODEC_MEM_ERROR;
4003*77c1e3ccSAndroid Build Coastguard Worker snprintf(argv[0], len, "--%s=%s", name, value);
4004*77c1e3ccSAndroid Build Coastguard Worker struct arg arg;
4005*77c1e3ccSAndroid Build Coastguard Worker aom_codec_err_t err = AOM_CODEC_OK;
4006*77c1e3ccSAndroid Build Coastguard Worker
4007*77c1e3ccSAndroid Build Coastguard Worker int match = 1;
4008*77c1e3ccSAndroid Build Coastguard Worker if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_keyframe_filtering,
4009*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4010*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_keyframe_filtering =
4011*77c1e3ccSAndroid Build Coastguard Worker arg_parse_uint_helper(&arg, err_string);
4012*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.min_gf_interval, argv,
4013*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4014*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.min_gf_interval = arg_parse_uint_helper(&arg, err_string);
4015*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.max_gf_interval, argv,
4016*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4017*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.max_gf_interval = arg_parse_uint_helper(&arg, err_string);
4018*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.gf_min_pyr_height,
4019*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4020*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.gf_min_pyr_height = arg_parse_uint_helper(&arg, err_string);
4021*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.gf_max_pyr_height,
4022*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4023*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.gf_max_pyr_height = arg_parse_uint_helper(&arg, err_string);
4024*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.cpu_used_av1, argv,
4025*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4026*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.cpu_used = arg_parse_uint_helper(&arg, err_string);
4027*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.auto_altref, argv,
4028*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4029*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_auto_alt_ref = arg_parse_uint_helper(&arg, err_string);
4030*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.noise_sens, argv,
4031*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4032*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.noise_sensitivity = arg_parse_uint_helper(&arg, err_string);
4033*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.sharpness, argv,
4034*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4035*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.sharpness = arg_parse_uint_helper(&arg, err_string);
4036*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.static_thresh, argv,
4037*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4038*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.static_thresh = arg_parse_uint_helper(&arg, err_string);
4039*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.rowmtarg, argv,
4040*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4041*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.row_mt = arg_parse_uint_helper(&arg, err_string);
4042*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.fpmtarg, argv,
4043*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4044*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.fp_mt = arg_parse_uint_helper(&arg, err_string);
4045*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.tile_cols, argv,
4046*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4047*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.tile_columns = arg_parse_uint_helper(&arg, err_string);
4048*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg.auto_tiles) {
4049*77c1e3ccSAndroid Build Coastguard Worker snprintf(err_string, ARG_ERR_MSG_MAX_LEN,
4050*77c1e3ccSAndroid Build Coastguard Worker "Cannot set tile-cols because auto-tiles is already set.");
4051*77c1e3ccSAndroid Build Coastguard Worker err = AOM_CODEC_INVALID_PARAM;
4052*77c1e3ccSAndroid Build Coastguard Worker }
4053*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.tile_rows, argv,
4054*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4055*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.tile_rows = arg_parse_uint_helper(&arg, err_string);
4056*77c1e3ccSAndroid Build Coastguard Worker if (extra_cfg.auto_tiles) {
4057*77c1e3ccSAndroid Build Coastguard Worker snprintf(err_string, ARG_ERR_MSG_MAX_LEN,
4058*77c1e3ccSAndroid Build Coastguard Worker "Cannot set tile-rows because auto-tiles is already set.");
4059*77c1e3ccSAndroid Build Coastguard Worker err = AOM_CODEC_INVALID_PARAM;
4060*77c1e3ccSAndroid Build Coastguard Worker }
4061*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.auto_tiles, argv,
4062*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4063*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.auto_tiles = arg_parse_uint_helper(&arg, err_string);
4064*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_tpl_model,
4065*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4066*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_tpl_model = arg_parse_uint_helper(&arg, err_string);
4067*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.arnr_maxframes, argv,
4068*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4069*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.arnr_max_frames = arg_parse_uint_helper(&arg, err_string);
4070*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.arnr_strength, argv,
4071*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4072*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.arnr_strength = arg_parse_uint_helper(&arg, err_string);
4073*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.tune_metric, argv,
4074*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4075*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.tuning = arg_parse_enum_helper(&arg, err_string);
4076*77c1e3ccSAndroid Build Coastguard Worker }
4077*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_TUNE_VMAF
4078*77c1e3ccSAndroid Build Coastguard Worker else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.vmaf_model_path, argv,
4079*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4080*77c1e3ccSAndroid Build Coastguard Worker err = allocate_and_set_string(value, default_extra_cfg[0].vmaf_model_path,
4081*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg.vmaf_model_path, err_string);
4082*77c1e3ccSAndroid Build Coastguard Worker }
4083*77c1e3ccSAndroid Build Coastguard Worker #endif
4084*77c1e3ccSAndroid Build Coastguard Worker else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.partition_info_path,
4085*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4086*77c1e3ccSAndroid Build Coastguard Worker err =
4087*77c1e3ccSAndroid Build Coastguard Worker allocate_and_set_string(value, default_extra_cfg[0].partition_info_path,
4088*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg.partition_info_path, err_string);
4089*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4090*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.enable_rate_guide_deltaq,
4091*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4092*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_rate_guide_deltaq =
4093*77c1e3ccSAndroid Build Coastguard Worker arg_parse_uint_helper(&arg, err_string);
4094*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4095*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.rate_distribution_info,
4096*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4097*77c1e3ccSAndroid Build Coastguard Worker err = allocate_and_set_string(
4098*77c1e3ccSAndroid Build Coastguard Worker value, default_extra_cfg[0].rate_distribution_info,
4099*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg.rate_distribution_info, err_string);
4100*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.dist_metric, argv,
4101*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4102*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.dist_metric = arg_parse_enum_helper(&arg, err_string);
4103*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.cq_level, argv,
4104*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4105*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.cq_level = arg_parse_uint_helper(&arg, err_string);
4106*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.max_intra_rate_pct,
4107*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4108*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.rc_max_intra_bitrate_pct =
4109*77c1e3ccSAndroid Build Coastguard Worker arg_parse_uint_helper(&arg, err_string);
4110*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.max_inter_rate_pct,
4111*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4112*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.rc_max_inter_bitrate_pct =
4113*77c1e3ccSAndroid Build Coastguard Worker arg_parse_uint_helper(&arg, err_string);
4114*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.gf_cbr_boost_pct,
4115*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4116*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.gf_cbr_boost_pct = arg_parse_uint_helper(&arg, err_string);
4117*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.lossless, argv,
4118*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4119*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.lossless = arg_parse_uint_helper(&arg, err_string);
4120*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_cdef, argv,
4121*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4122*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_cdef = arg_parse_uint_helper(&arg, err_string);
4123*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_restoration,
4124*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4125*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_restoration = arg_parse_uint_helper(&arg, err_string);
4126*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.force_video_mode,
4127*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4128*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.force_video_mode = arg_parse_uint_helper(&arg, err_string);
4129*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_obmc, argv,
4130*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4131*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_obmc = arg_parse_uint_helper(&arg, err_string);
4132*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.disable_trellis_quant,
4133*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4134*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.disable_trellis_quant = arg_parse_uint_helper(&arg, err_string);
4135*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_qm, argv,
4136*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4137*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_qm = arg_parse_uint_helper(&arg, err_string);
4138*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.qm_max, argv,
4139*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4140*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.qm_max = arg_parse_uint_helper(&arg, err_string);
4141*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.qm_min, argv,
4142*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4143*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.qm_min = arg_parse_uint_helper(&arg, err_string);
4144*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.num_tg, argv,
4145*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4146*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.num_tg = arg_parse_uint_helper(&arg, err_string);
4147*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.mtu_size, argv,
4148*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4149*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.mtu_size = arg_parse_uint_helper(&arg, err_string);
4150*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.timing_info, argv,
4151*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4152*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.timing_info_type = arg_parse_enum_helper(&arg, err_string);
4153*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4154*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.frame_parallel_decoding,
4155*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4156*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.frame_parallel_decoding_mode =
4157*77c1e3ccSAndroid Build Coastguard Worker arg_parse_uint_helper(&arg, err_string);
4158*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_dual_filter,
4159*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4160*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_dual_filter = arg_parse_uint_helper(&arg, err_string);
4161*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_chroma_deltaq,
4162*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4163*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_chroma_deltaq = arg_parse_uint_helper(&arg, err_string);
4164*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.aq_mode, argv,
4165*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4166*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.aq_mode = arg_parse_uint_helper(&arg, err_string);
4167*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.deltaq_mode, argv,
4168*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4169*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.deltaq_mode = arg_parse_uint_helper(&arg, err_string);
4170*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.deltaq_strength, argv,
4171*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4172*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.deltaq_strength = arg_parse_uint_helper(&arg, err_string);
4173*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.deltalf_mode, argv,
4174*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4175*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.deltalf_mode = arg_parse_uint_helper(&arg, err_string);
4176*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.frame_periodic_boost,
4177*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4178*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.frame_periodic_boost = arg_parse_uint_helper(&arg, err_string);
4179*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.tune_content, argv,
4180*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4181*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.content = arg_parse_enum_helper(&arg, err_string);
4182*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.input_color_primaries,
4183*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4184*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.color_primaries = arg_parse_enum_helper(&arg, err_string);
4185*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(
4186*77c1e3ccSAndroid Build Coastguard Worker &arg, &g_av1_codec_arg_defs.input_transfer_characteristics,
4187*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4188*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.transfer_characteristics =
4189*77c1e3ccSAndroid Build Coastguard Worker arg_parse_enum_helper(&arg, err_string);
4190*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4191*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.input_matrix_coefficients,
4192*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4193*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.matrix_coefficients = arg_parse_enum_helper(&arg, err_string);
4194*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(
4195*77c1e3ccSAndroid Build Coastguard Worker &arg, &g_av1_codec_arg_defs.input_chroma_sample_position, argv,
4196*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4197*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.chroma_sample_position = arg_parse_enum_helper(&arg, err_string);
4198*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.superblock_size, argv,
4199*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4200*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.superblock_size = arg_parse_enum_helper(&arg, err_string);
4201*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.error_resilient_mode,
4202*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4203*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.error_resilient_mode = arg_parse_int_helper(&arg, err_string);
4204*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.sframe_mode, argv,
4205*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4206*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.s_frame_mode = arg_parse_int_helper(&arg, err_string);
4207*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.film_grain_test, argv,
4208*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4209*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.film_grain_test_vector = arg_parse_int_helper(&arg, err_string);
4210*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.film_grain_table,
4211*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4212*77c1e3ccSAndroid Build Coastguard Worker if (value == NULL) {
4213*77c1e3ccSAndroid Build Coastguard Worker // this parameter allows NULL as its value
4214*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.film_grain_table_filename = value;
4215*77c1e3ccSAndroid Build Coastguard Worker } else {
4216*77c1e3ccSAndroid Build Coastguard Worker err = allocate_and_set_string(
4217*77c1e3ccSAndroid Build Coastguard Worker value, default_extra_cfg[0].film_grain_table_filename,
4218*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg.film_grain_table_filename, err_string);
4219*77c1e3ccSAndroid Build Coastguard Worker }
4220*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.cdf_update_mode, argv,
4221*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4222*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.cdf_update_mode = arg_parse_int_helper(&arg, err_string);
4223*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4224*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.enable_rect_partitions,
4225*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4226*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_rect_partitions = arg_parse_int_helper(&arg, err_string);
4227*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_ab_partitions,
4228*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4229*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_ab_partitions = arg_parse_int_helper(&arg, err_string);
4230*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4231*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.enable_1to4_partitions,
4232*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4233*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_1to4_partitions = arg_parse_int_helper(&arg, err_string);
4234*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.min_partition_size,
4235*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4236*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.min_partition_size = arg_parse_int_helper(&arg, err_string);
4237*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.max_partition_size,
4238*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4239*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.max_partition_size = arg_parse_int_helper(&arg, err_string);
4240*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4241*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.enable_intra_edge_filter,
4242*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4243*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_intra_edge_filter =
4244*77c1e3ccSAndroid Build Coastguard Worker arg_parse_uint_helper(&arg, err_string);
4245*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_order_hint,
4246*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4247*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_order_hint = arg_parse_int_helper(&arg, err_string);
4248*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_tx64, argv,
4249*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4250*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_tx64 = arg_parse_int_helper(&arg, err_string);
4251*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_flip_idtx,
4252*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4253*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_flip_idtx = arg_parse_int_helper(&arg, err_string);
4254*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_rect_tx, argv,
4255*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4256*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_rect_tx = arg_parse_int_helper(&arg, err_string);
4257*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_dist_wtd_comp,
4258*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4259*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_dist_wtd_comp = arg_parse_int_helper(&arg, err_string);
4260*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.max_reference_frames,
4261*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4262*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.max_reference_frames = arg_parse_int_helper(&arg, err_string);
4263*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.reduced_reference_set,
4264*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4265*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_reduced_reference_set =
4266*77c1e3ccSAndroid Build Coastguard Worker arg_parse_int_helper(&arg, err_string);
4267*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_ref_frame_mvs,
4268*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4269*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_ref_frame_mvs = arg_parse_int_helper(&arg, err_string);
4270*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_masked_comp,
4271*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4272*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_masked_comp = arg_parse_int_helper(&arg, err_string);
4273*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_onesided_comp,
4274*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4275*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_onesided_comp = arg_parse_int_helper(&arg, err_string);
4276*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4277*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.enable_interintra_comp,
4278*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4279*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_interintra_comp = arg_parse_int_helper(&arg, err_string);
4280*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4281*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.enable_smooth_interintra,
4282*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4283*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_smooth_interintra = arg_parse_int_helper(&arg, err_string);
4284*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_diff_wtd_comp,
4285*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4286*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_diff_wtd_comp = arg_parse_int_helper(&arg, err_string);
4287*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4288*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.enable_interinter_wedge,
4289*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4290*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_interinter_wedge = arg_parse_int_helper(&arg, err_string);
4291*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4292*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.enable_interintra_wedge,
4293*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4294*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_interintra_wedge = arg_parse_int_helper(&arg, err_string);
4295*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_global_motion,
4296*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4297*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_global_motion = arg_parse_int_helper(&arg, err_string);
4298*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_warped_motion,
4299*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4300*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_warped_motion = arg_parse_int_helper(&arg, err_string);
4301*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_filter_intra,
4302*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4303*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_filter_intra = arg_parse_int_helper(&arg, err_string);
4304*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_smooth_intra,
4305*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4306*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_smooth_intra = arg_parse_int_helper(&arg, err_string);
4307*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_paeth_intra,
4308*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4309*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_paeth_intra = arg_parse_int_helper(&arg, err_string);
4310*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_cfl_intra,
4311*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4312*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_cfl_intra = arg_parse_int_helper(&arg, err_string);
4313*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4314*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.enable_directional_intra,
4315*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4316*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_directional_intra = arg_parse_int_helper(&arg, err_string);
4317*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_diagonal_intra,
4318*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4319*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_diagonal_intra = arg_parse_int_helper(&arg, err_string);
4320*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_overlay, argv,
4321*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4322*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_overlay = arg_parse_int_helper(&arg, err_string);
4323*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_palette, argv,
4324*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4325*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_palette = arg_parse_int_helper(&arg, err_string);
4326*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_intrabc, argv,
4327*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4328*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_intrabc = arg_parse_int_helper(&arg, err_string);
4329*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_angle_delta,
4330*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4331*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_angle_delta = arg_parse_int_helper(&arg, err_string);
4332*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.reduced_tx_type_set,
4333*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4334*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.reduced_tx_type_set = arg_parse_int_helper(&arg, err_string);
4335*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.use_intra_dct_only,
4336*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4337*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.use_intra_dct_only = arg_parse_int_helper(&arg, err_string);
4338*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.use_inter_dct_only,
4339*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4340*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.use_inter_dct_only = arg_parse_int_helper(&arg, err_string);
4341*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4342*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.use_intra_default_tx_only,
4343*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4344*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.use_intra_default_tx_only =
4345*77c1e3ccSAndroid Build Coastguard Worker arg_parse_int_helper(&arg, err_string);
4346*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.quant_b_adapt, argv,
4347*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4348*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.quant_b_adapt = arg_parse_int_helper(&arg, err_string);
4349*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4350*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.vbr_corpus_complexity_lap,
4351*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4352*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.vbr_corpus_complexity_lap =
4353*77c1e3ccSAndroid Build Coastguard Worker arg_parse_uint_helper(&arg, err_string);
4354*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.set_tier_mask, argv,
4355*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4356*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.tier_mask = arg_parse_uint_helper(&arg, err_string);
4357*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.set_min_cr, argv,
4358*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4359*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.min_cr = arg_parse_uint_helper(&arg, err_string);
4360*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.coeff_cost_upd_freq,
4361*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4362*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.coeff_cost_upd_freq = arg_parse_uint_helper(&arg, err_string);
4363*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.mode_cost_upd_freq,
4364*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4365*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.mode_cost_upd_freq = arg_parse_uint_helper(&arg, err_string);
4366*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.mv_cost_upd_freq,
4367*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4368*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.mv_cost_upd_freq = arg_parse_uint_helper(&arg, err_string);
4369*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.dv_cost_upd_freq,
4370*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4371*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.dv_cost_upd_freq = arg_parse_uint_helper(&arg, err_string);
4372*77c1e3ccSAndroid Build Coastguard Worker }
4373*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_DENOISE
4374*77c1e3ccSAndroid Build Coastguard Worker else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.denoise_noise_level,
4375*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4376*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.noise_level =
4377*77c1e3ccSAndroid Build Coastguard Worker (float)arg_parse_int_helper(&arg, err_string) / 10.0f;
4378*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.denoise_block_size,
4379*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4380*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.noise_block_size = arg_parse_uint_helper(&arg, err_string);
4381*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_dnl_denoising,
4382*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4383*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.enable_dnl_denoising = arg_parse_uint_helper(&arg, err_string);
4384*77c1e3ccSAndroid Build Coastguard Worker }
4385*77c1e3ccSAndroid Build Coastguard Worker #endif
4386*77c1e3ccSAndroid Build Coastguard Worker else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.target_seq_level_idx,
4387*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4388*77c1e3ccSAndroid Build Coastguard Worker const int val = arg_parse_int_helper(&arg, err_string);
4389*77c1e3ccSAndroid Build Coastguard Worker const int level = val % 100;
4390*77c1e3ccSAndroid Build Coastguard Worker const int operating_point_idx = val / 100;
4391*77c1e3ccSAndroid Build Coastguard Worker if (operating_point_idx < 0 ||
4392*77c1e3ccSAndroid Build Coastguard Worker operating_point_idx >= MAX_NUM_OPERATING_POINTS) {
4393*77c1e3ccSAndroid Build Coastguard Worker snprintf(err_string, ARG_ERR_MSG_MAX_LEN,
4394*77c1e3ccSAndroid Build Coastguard Worker "Invalid operating point index: %d", operating_point_idx);
4395*77c1e3ccSAndroid Build Coastguard Worker err = AOM_CODEC_INVALID_PARAM;
4396*77c1e3ccSAndroid Build Coastguard Worker } else {
4397*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.target_seq_level_idx[operating_point_idx] = (AV1_LEVEL)level;
4398*77c1e3ccSAndroid Build Coastguard Worker }
4399*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4400*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.input_chroma_subsampling_x,
4401*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4402*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.chroma_subsampling_x = arg_parse_uint_helper(&arg, err_string);
4403*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4404*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.input_chroma_subsampling_y,
4405*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4406*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.chroma_subsampling_y = arg_parse_uint_helper(&arg, err_string);
4407*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.passes, argv,
4408*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4409*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.passes = arg_parse_int_helper(&arg, err_string);
4410*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.fwd_kf_dist, argv,
4411*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4412*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.fwd_kf_dist = arg_parse_int_helper(&arg, err_string);
4413*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.two_pass_output, argv,
4414*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4415*77c1e3ccSAndroid Build Coastguard Worker err = allocate_and_set_string(value, default_extra_cfg[0].two_pass_output,
4416*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg.two_pass_output, err_string);
4417*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.second_pass_log, argv,
4418*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4419*77c1e3ccSAndroid Build Coastguard Worker err = allocate_and_set_string(value, default_extra_cfg[0].second_pass_log,
4420*77c1e3ccSAndroid Build Coastguard Worker &extra_cfg.second_pass_log, err_string);
4421*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.loopfilter_control,
4422*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4423*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.loopfilter_control = arg_parse_int_helper(&arg, err_string);
4424*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.auto_intra_tools_off,
4425*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4426*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.auto_intra_tools_off = arg_parse_uint_helper(&arg, err_string);
4427*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg,
4428*77c1e3ccSAndroid Build Coastguard Worker &g_av1_codec_arg_defs.strict_level_conformance,
4429*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4430*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.strict_level_conformance = arg_parse_int_helper(&arg, err_string);
4431*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.sb_qp_sweep, argv,
4432*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4433*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.sb_qp_sweep = arg_parse_int_helper(&arg, err_string);
4434*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.kf_max_pyr_height,
4435*77c1e3ccSAndroid Build Coastguard Worker argv, err_string)) {
4436*77c1e3ccSAndroid Build Coastguard Worker extra_cfg.kf_max_pyr_height = arg_parse_int_helper(&arg, err_string);
4437*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.tile_width, argv,
4438*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4439*77c1e3ccSAndroid Build Coastguard Worker ctx->cfg.tile_width_count = arg_parse_list_helper(
4440*77c1e3ccSAndroid Build Coastguard Worker &arg, ctx->cfg.tile_widths, MAX_TILE_WIDTHS, err_string);
4441*77c1e3ccSAndroid Build Coastguard Worker } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.tile_height, argv,
4442*77c1e3ccSAndroid Build Coastguard Worker err_string)) {
4443*77c1e3ccSAndroid Build Coastguard Worker ctx->cfg.tile_height_count = arg_parse_list_helper(
4444*77c1e3ccSAndroid Build Coastguard Worker &arg, ctx->cfg.tile_heights, MAX_TILE_HEIGHTS, err_string);
4445*77c1e3ccSAndroid Build Coastguard Worker } else {
4446*77c1e3ccSAndroid Build Coastguard Worker match = 0;
4447*77c1e3ccSAndroid Build Coastguard Worker snprintf(err_string, ARG_ERR_MSG_MAX_LEN, "Cannot find aom option %s",
4448*77c1e3ccSAndroid Build Coastguard Worker name);
4449*77c1e3ccSAndroid Build Coastguard Worker }
4450*77c1e3ccSAndroid Build Coastguard Worker aom_free(argv[0]);
4451*77c1e3ccSAndroid Build Coastguard Worker
4452*77c1e3ccSAndroid Build Coastguard Worker if (err != AOM_CODEC_OK) {
4453*77c1e3ccSAndroid Build Coastguard Worker ctx->base.err_detail = err_string;
4454*77c1e3ccSAndroid Build Coastguard Worker return err;
4455*77c1e3ccSAndroid Build Coastguard Worker }
4456*77c1e3ccSAndroid Build Coastguard Worker
4457*77c1e3ccSAndroid Build Coastguard Worker if (strlen(err_string) != 0) {
4458*77c1e3ccSAndroid Build Coastguard Worker ctx->base.err_detail = err_string;
4459*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
4460*77c1e3ccSAndroid Build Coastguard Worker }
4461*77c1e3ccSAndroid Build Coastguard Worker
4462*77c1e3ccSAndroid Build Coastguard Worker ctx->base.err_detail = NULL;
4463*77c1e3ccSAndroid Build Coastguard Worker
4464*77c1e3ccSAndroid Build Coastguard Worker if (!match) {
4465*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_INVALID_PARAM;
4466*77c1e3ccSAndroid Build Coastguard Worker }
4467*77c1e3ccSAndroid Build Coastguard Worker return update_extra_cfg(ctx, &extra_cfg);
4468*77c1e3ccSAndroid Build Coastguard Worker }
4469*77c1e3ccSAndroid Build Coastguard Worker
ctrl_get_seq_level_idx(aom_codec_alg_priv_t * ctx,va_list args)4470*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_get_seq_level_idx(aom_codec_alg_priv_t *ctx,
4471*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
4472*77c1e3ccSAndroid Build Coastguard Worker int *const arg = va_arg(args, int *);
4473*77c1e3ccSAndroid Build Coastguard Worker if (arg == NULL) return AOM_CODEC_INVALID_PARAM;
4474*77c1e3ccSAndroid Build Coastguard Worker return av1_get_seq_level_idx(&ctx->ppi->seq_params, &ctx->ppi->level_params,
4475*77c1e3ccSAndroid Build Coastguard Worker arg);
4476*77c1e3ccSAndroid Build Coastguard Worker }
4477*77c1e3ccSAndroid Build Coastguard Worker
ctrl_get_target_seq_level_idx(aom_codec_alg_priv_t * ctx,va_list args)4478*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_get_target_seq_level_idx(aom_codec_alg_priv_t *ctx,
4479*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
4480*77c1e3ccSAndroid Build Coastguard Worker int *const arg = va_arg(args, int *);
4481*77c1e3ccSAndroid Build Coastguard Worker if (arg == NULL) return AOM_CODEC_INVALID_PARAM;
4482*77c1e3ccSAndroid Build Coastguard Worker return av1_get_target_seq_level_idx(&ctx->ppi->seq_params,
4483*77c1e3ccSAndroid Build Coastguard Worker &ctx->ppi->level_params, arg);
4484*77c1e3ccSAndroid Build Coastguard Worker }
4485*77c1e3ccSAndroid Build Coastguard Worker
ctrl_get_num_operating_points(aom_codec_alg_priv_t * ctx,va_list args)4486*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_get_num_operating_points(aom_codec_alg_priv_t *ctx,
4487*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
4488*77c1e3ccSAndroid Build Coastguard Worker int *const arg = va_arg(args, int *);
4489*77c1e3ccSAndroid Build Coastguard Worker if (arg == NULL) return AOM_CODEC_INVALID_PARAM;
4490*77c1e3ccSAndroid Build Coastguard Worker *arg = ctx->ppi->seq_params.operating_points_cnt_minus_1 + 1;
4491*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
4492*77c1e3ccSAndroid Build Coastguard Worker }
4493*77c1e3ccSAndroid Build Coastguard Worker
ctrl_get_luma_cdef_strength(aom_codec_alg_priv_t * ctx,va_list args)4494*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_get_luma_cdef_strength(aom_codec_alg_priv_t *ctx,
4495*77c1e3ccSAndroid Build Coastguard Worker va_list args) {
4496*77c1e3ccSAndroid Build Coastguard Worker int *arg = va_arg(args, int *);
4497*77c1e3ccSAndroid Build Coastguard Worker AV1_COMMON const *cm = &ctx->ppi->cpi->common;
4498*77c1e3ccSAndroid Build Coastguard Worker if (arg == NULL) return AOM_CODEC_INVALID_PARAM;
4499*77c1e3ccSAndroid Build Coastguard Worker memcpy(arg, cm->cdef_info.cdef_strengths, CDEF_MAX_STRENGTHS * sizeof(*arg));
4500*77c1e3ccSAndroid Build Coastguard Worker
4501*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
4502*77c1e3ccSAndroid Build Coastguard Worker }
4503*77c1e3ccSAndroid Build Coastguard Worker
ctrl_get_high_motion_content_screen_rtc(aom_codec_alg_priv_t * ctx,va_list args)4504*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_err_t ctrl_get_high_motion_content_screen_rtc(
4505*77c1e3ccSAndroid Build Coastguard Worker aom_codec_alg_priv_t *ctx, va_list args) {
4506*77c1e3ccSAndroid Build Coastguard Worker int *arg = va_arg(args, int *);
4507*77c1e3ccSAndroid Build Coastguard Worker AV1_COMP *const cpi = ctx->ppi->cpi;
4508*77c1e3ccSAndroid Build Coastguard Worker if (arg == NULL) return AOM_CODEC_INVALID_PARAM;
4509*77c1e3ccSAndroid Build Coastguard Worker *arg = cpi->rc.high_motion_content_screen_rtc;
4510*77c1e3ccSAndroid Build Coastguard Worker return AOM_CODEC_OK;
4511*77c1e3ccSAndroid Build Coastguard Worker }
4512*77c1e3ccSAndroid Build Coastguard Worker
4513*77c1e3ccSAndroid Build Coastguard Worker static aom_codec_ctrl_fn_map_t encoder_ctrl_maps[] = {
4514*77c1e3ccSAndroid Build Coastguard Worker { AV1_COPY_REFERENCE, ctrl_copy_reference },
4515*77c1e3ccSAndroid Build Coastguard Worker { AOME_USE_REFERENCE, ctrl_use_reference },
4516*77c1e3ccSAndroid Build Coastguard Worker
4517*77c1e3ccSAndroid Build Coastguard Worker // Setters
4518*77c1e3ccSAndroid Build Coastguard Worker { AV1_SET_REFERENCE, ctrl_set_reference },
4519*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_ROI_MAP, ctrl_set_roi_map },
4520*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_ACTIVEMAP, ctrl_set_active_map },
4521*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_SCALEMODE, ctrl_set_scale_mode },
4522*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_SPATIAL_LAYER_ID, ctrl_set_spatial_layer_id },
4523*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_CPUUSED, ctrl_set_cpuused },
4524*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_ENABLEAUTOALTREF, ctrl_set_enable_auto_alt_ref },
4525*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_ENABLEAUTOBWDREF, ctrl_set_enable_auto_bwd_ref },
4526*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_SHARPNESS, ctrl_set_sharpness },
4527*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_STATIC_THRESHOLD, ctrl_set_static_thresh },
4528*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ROW_MT, ctrl_set_row_mt },
4529*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_FP_MT, ctrl_set_fp_mt },
4530*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_TILE_COLUMNS, ctrl_set_tile_columns },
4531*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_TILE_ROWS, ctrl_set_tile_rows },
4532*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_TPL_MODEL, ctrl_set_enable_tpl_model },
4533*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_KEYFRAME_FILTERING, ctrl_set_enable_keyframe_filtering },
4534*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_ARNR_MAXFRAMES, ctrl_set_arnr_max_frames },
4535*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_ARNR_STRENGTH, ctrl_set_arnr_strength },
4536*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_TUNING, ctrl_set_tuning },
4537*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_CQ_LEVEL, ctrl_set_cq_level },
4538*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_MAX_INTRA_BITRATE_PCT, ctrl_set_rc_max_intra_bitrate_pct },
4539*77c1e3ccSAndroid Build Coastguard Worker { AOME_SET_NUMBER_SPATIAL_LAYERS, ctrl_set_number_spatial_layers },
4540*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MAX_INTER_BITRATE_PCT, ctrl_set_rc_max_inter_bitrate_pct },
4541*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_GF_CBR_BOOST_PCT, ctrl_set_rc_gf_cbr_boost_pct },
4542*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_LOSSLESS, ctrl_set_lossless },
4543*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_CDEF, ctrl_set_enable_cdef },
4544*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_RESTORATION, ctrl_set_enable_restoration },
4545*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_FORCE_VIDEO_MODE, ctrl_set_force_video_mode },
4546*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_OBMC, ctrl_set_enable_obmc },
4547*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_DISABLE_TRELLIS_QUANT, ctrl_set_disable_trellis_quant },
4548*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_QM, ctrl_set_enable_qm },
4549*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_QM_Y, ctrl_set_qm_y },
4550*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_QM_U, ctrl_set_qm_u },
4551*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_QM_V, ctrl_set_qm_v },
4552*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_QM_MIN, ctrl_set_qm_min },
4553*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_QM_MAX, ctrl_set_qm_max },
4554*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_NUM_TG, ctrl_set_num_tg },
4555*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MTU, ctrl_set_mtu },
4556*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_TIMING_INFO_TYPE, ctrl_set_timing_info_type },
4557*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_FRAME_PARALLEL_DECODING, ctrl_set_frame_parallel_decoding_mode },
4558*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ERROR_RESILIENT_MODE, ctrl_set_error_resilient_mode },
4559*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_S_FRAME_MODE, ctrl_set_s_frame_mode },
4560*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_RECT_PARTITIONS, ctrl_set_enable_rect_partitions },
4561*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_AB_PARTITIONS, ctrl_set_enable_ab_partitions },
4562*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_1TO4_PARTITIONS, ctrl_set_enable_1to4_partitions },
4563*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MIN_PARTITION_SIZE, ctrl_set_min_partition_size },
4564*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MAX_PARTITION_SIZE, ctrl_set_max_partition_size },
4565*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_DUAL_FILTER, ctrl_set_enable_dual_filter },
4566*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_CHROMA_DELTAQ, ctrl_set_enable_chroma_deltaq },
4567*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_INTRA_EDGE_FILTER, ctrl_set_enable_intra_edge_filter },
4568*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_ORDER_HINT, ctrl_set_enable_order_hint },
4569*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_TX64, ctrl_set_enable_tx64 },
4570*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_FLIP_IDTX, ctrl_set_enable_flip_idtx },
4571*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_RECT_TX, ctrl_set_enable_rect_tx },
4572*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_DIST_WTD_COMP, ctrl_set_enable_dist_wtd_comp },
4573*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MAX_REFERENCE_FRAMES, ctrl_set_max_reference_frames },
4574*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_REDUCED_REFERENCE_SET, ctrl_set_enable_reduced_reference_set },
4575*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_REF_FRAME_MVS, ctrl_set_enable_ref_frame_mvs },
4576*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ALLOW_REF_FRAME_MVS, ctrl_set_allow_ref_frame_mvs },
4577*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_MASKED_COMP, ctrl_set_enable_masked_comp },
4578*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_ONESIDED_COMP, ctrl_set_enable_onesided_comp },
4579*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_INTERINTRA_COMP, ctrl_set_enable_interintra_comp },
4580*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_SMOOTH_INTERINTRA, ctrl_set_enable_smooth_interintra },
4581*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_DIFF_WTD_COMP, ctrl_set_enable_diff_wtd_comp },
4582*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_INTERINTER_WEDGE, ctrl_set_enable_interinter_wedge },
4583*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_INTERINTRA_WEDGE, ctrl_set_enable_interintra_wedge },
4584*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_GLOBAL_MOTION, ctrl_set_enable_global_motion },
4585*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_WARPED_MOTION, ctrl_set_enable_warped_motion },
4586*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ALLOW_WARPED_MOTION, ctrl_set_allow_warped_motion },
4587*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_FILTER_INTRA, ctrl_set_enable_filter_intra },
4588*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_SMOOTH_INTRA, ctrl_set_enable_smooth_intra },
4589*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_PAETH_INTRA, ctrl_set_enable_paeth_intra },
4590*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_CFL_INTRA, ctrl_set_enable_cfl_intra },
4591*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_DIRECTIONAL_INTRA, ctrl_set_enable_directional_intra },
4592*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_DIAGONAL_INTRA, ctrl_set_enable_diagonal_intra },
4593*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_SUPERRES, ctrl_set_enable_superres },
4594*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_OVERLAY, ctrl_set_enable_overlay },
4595*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_PALETTE, ctrl_set_enable_palette },
4596*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_INTRABC, ctrl_set_enable_intrabc },
4597*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_ANGLE_DELTA, ctrl_set_enable_angle_delta },
4598*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_AQ_MODE, ctrl_set_aq_mode },
4599*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_REDUCED_TX_TYPE_SET, ctrl_set_reduced_tx_type_set },
4600*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_INTRA_DCT_ONLY, ctrl_set_intra_dct_only },
4601*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_INTER_DCT_ONLY, ctrl_set_inter_dct_only },
4602*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_INTRA_DEFAULT_TX_ONLY, ctrl_set_intra_default_tx_only },
4603*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_QUANT_B_ADAPT, ctrl_set_quant_b_adapt },
4604*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_COEFF_COST_UPD_FREQ, ctrl_set_coeff_cost_upd_freq },
4605*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MODE_COST_UPD_FREQ, ctrl_set_mode_cost_upd_freq },
4606*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MV_COST_UPD_FREQ, ctrl_set_mv_cost_upd_freq },
4607*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_DELTAQ_MODE, ctrl_set_deltaq_mode },
4608*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_DELTAQ_STRENGTH, ctrl_set_deltaq_strength },
4609*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_DELTALF_MODE, ctrl_set_deltalf_mode },
4610*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_FRAME_PERIODIC_BOOST, ctrl_set_frame_periodic_boost },
4611*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_TUNE_CONTENT, ctrl_set_tune_content },
4612*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_CDF_UPDATE_MODE, ctrl_set_cdf_update_mode },
4613*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_COLOR_PRIMARIES, ctrl_set_color_primaries },
4614*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_TRANSFER_CHARACTERISTICS, ctrl_set_transfer_characteristics },
4615*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MATRIX_COEFFICIENTS, ctrl_set_matrix_coefficients },
4616*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_CHROMA_SAMPLE_POSITION, ctrl_set_chroma_sample_position },
4617*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_COLOR_RANGE, ctrl_set_color_range },
4618*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_NOISE_SENSITIVITY, ctrl_set_noise_sensitivity },
4619*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MIN_GF_INTERVAL, ctrl_set_min_gf_interval },
4620*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MAX_GF_INTERVAL, ctrl_set_max_gf_interval },
4621*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_GF_MIN_PYRAMID_HEIGHT, ctrl_set_gf_min_pyr_height },
4622*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_GF_MAX_PYRAMID_HEIGHT, ctrl_set_gf_max_pyr_height },
4623*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_RENDER_SIZE, ctrl_set_render_size },
4624*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_SUPERBLOCK_SIZE, ctrl_set_superblock_size },
4625*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_SINGLE_TILE_DECODING, ctrl_set_single_tile_decoding },
4626*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_VMAF_MODEL_PATH, ctrl_set_vmaf_model_path },
4627*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_PARTITION_INFO_PATH, ctrl_set_partition_info_path },
4628*77c1e3ccSAndroid Build Coastguard Worker { AV1E_ENABLE_RATE_GUIDE_DELTAQ, ctrl_enable_rate_guide_deltaq },
4629*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_RATE_DISTRIBUTION_INFO, ctrl_set_rate_distribution_info },
4630*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_FILM_GRAIN_TEST_VECTOR, ctrl_set_film_grain_test_vector },
4631*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_FILM_GRAIN_TABLE, ctrl_set_film_grain_table },
4632*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_DENOISE_NOISE_LEVEL, ctrl_set_denoise_noise_level },
4633*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_DENOISE_BLOCK_SIZE, ctrl_set_denoise_block_size },
4634*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_DNL_DENOISING, ctrl_set_enable_dnl_denoising },
4635*77c1e3ccSAndroid Build Coastguard Worker { AV1E_ENABLE_MOTION_VECTOR_UNIT_TEST, ctrl_enable_motion_vector_unit_test },
4636*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_FP_MT_UNIT_TEST, ctrl_enable_fpmt_unit_test },
4637*77c1e3ccSAndroid Build Coastguard Worker { AV1E_ENABLE_EXT_TILE_DEBUG, ctrl_enable_ext_tile_debug },
4638*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_TARGET_SEQ_LEVEL_IDX, ctrl_set_target_seq_level_idx },
4639*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_TIER_MASK, ctrl_set_tier_mask },
4640*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MIN_CR, ctrl_set_min_cr },
4641*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_SVC_LAYER_ID, ctrl_set_layer_id },
4642*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_SVC_PARAMS, ctrl_set_svc_params },
4643*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_SVC_REF_FRAME_CONFIG, ctrl_set_svc_ref_frame_config },
4644*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_SVC_REF_FRAME_COMP_PRED, ctrl_set_svc_ref_frame_comp_pred },
4645*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_VBR_CORPUS_COMPLEXITY_LAP, ctrl_set_vbr_corpus_complexity_lap },
4646*77c1e3ccSAndroid Build Coastguard Worker { AV1E_ENABLE_SB_MULTIPASS_UNIT_TEST, ctrl_enable_sb_multipass_unit_test },
4647*77c1e3ccSAndroid Build Coastguard Worker { AV1E_ENABLE_SB_QP_SWEEP, ctrl_enable_sb_qp_sweep },
4648*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_DV_COST_UPD_FREQ, ctrl_set_dv_cost_upd_freq },
4649*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_EXTERNAL_PARTITION, ctrl_set_external_partition },
4650*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_ENABLE_TX_SIZE_SEARCH, ctrl_set_enable_tx_size_search },
4651*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_LOOPFILTER_CONTROL, ctrl_set_loopfilter_control },
4652*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_SKIP_POSTPROC_FILTERING, ctrl_set_skip_postproc_filtering },
4653*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_AUTO_INTRA_TOOLS_OFF, ctrl_set_auto_intra_tools_off },
4654*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_RTC_EXTERNAL_RC, ctrl_set_rtc_external_rc },
4655*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_QUANTIZER_ONE_PASS, ctrl_set_quantizer_one_pass },
4656*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_BITRATE_ONE_PASS_CBR, ctrl_set_bitrate_one_pass_cbr },
4657*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MAX_CONSEC_FRAME_DROP_CBR, ctrl_set_max_consec_frame_drop_cbr },
4658*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_SVC_FRAME_DROP_MODE, ctrl_set_svc_frame_drop_mode },
4659*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_AUTO_TILES, ctrl_set_auto_tiles },
4660*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_POSTENCODE_DROP_RTC, ctrl_set_postencode_drop_rtc },
4661*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_MAX_CONSEC_FRAME_DROP_MS_CBR,
4662*77c1e3ccSAndroid Build Coastguard Worker ctrl_set_max_consec_frame_drop_ms_cbr },
4663*77c1e3ccSAndroid Build Coastguard Worker
4664*77c1e3ccSAndroid Build Coastguard Worker // Getters
4665*77c1e3ccSAndroid Build Coastguard Worker { AOME_GET_LAST_QUANTIZER, ctrl_get_quantizer },
4666*77c1e3ccSAndroid Build Coastguard Worker { AOME_GET_LAST_QUANTIZER_64, ctrl_get_quantizer64 },
4667*77c1e3ccSAndroid Build Coastguard Worker { AOME_GET_LOOPFILTER_LEVEL, ctrl_get_loopfilter_level },
4668*77c1e3ccSAndroid Build Coastguard Worker { AV1_GET_REFERENCE, ctrl_get_reference },
4669*77c1e3ccSAndroid Build Coastguard Worker { AV1E_GET_ACTIVEMAP, ctrl_get_active_map },
4670*77c1e3ccSAndroid Build Coastguard Worker { AV1_GET_NEW_FRAME_IMAGE, ctrl_get_new_frame_image },
4671*77c1e3ccSAndroid Build Coastguard Worker { AV1_COPY_NEW_FRAME_IMAGE, ctrl_copy_new_frame_image },
4672*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_CHROMA_SUBSAMPLING_X, ctrl_set_chroma_subsampling_x },
4673*77c1e3ccSAndroid Build Coastguard Worker { AV1E_SET_CHROMA_SUBSAMPLING_Y, ctrl_set_chroma_subsampling_y },
4674*77c1e3ccSAndroid Build Coastguard Worker { AV1E_GET_SEQ_LEVEL_IDX, ctrl_get_seq_level_idx },
4675*77c1e3ccSAndroid Build Coastguard Worker { AV1E_GET_BASELINE_GF_INTERVAL, ctrl_get_baseline_gf_interval },
4676*77c1e3ccSAndroid Build Coastguard Worker { AV1E_GET_TARGET_SEQ_LEVEL_IDX, ctrl_get_target_seq_level_idx },
4677*77c1e3ccSAndroid Build Coastguard Worker { AV1E_GET_NUM_OPERATING_POINTS, ctrl_get_num_operating_points },
4678*77c1e3ccSAndroid Build Coastguard Worker { AV1E_GET_LUMA_CDEF_STRENGTH, ctrl_get_luma_cdef_strength },
4679*77c1e3ccSAndroid Build Coastguard Worker { AV1E_GET_HIGH_MOTION_CONTENT_SCREEN_RTC,
4680*77c1e3ccSAndroid Build Coastguard Worker ctrl_get_high_motion_content_screen_rtc },
4681*77c1e3ccSAndroid Build Coastguard Worker
4682*77c1e3ccSAndroid Build Coastguard Worker CTRL_MAP_END,
4683*77c1e3ccSAndroid Build Coastguard Worker };
4684*77c1e3ccSAndroid Build Coastguard Worker
4685*77c1e3ccSAndroid Build Coastguard Worker static const aom_codec_enc_cfg_t encoder_usage_cfg[] = {
4686*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
4687*77c1e3ccSAndroid Build Coastguard Worker {
4688*77c1e3ccSAndroid Build Coastguard Worker // NOLINT
4689*77c1e3ccSAndroid Build Coastguard Worker AOM_USAGE_GOOD_QUALITY, // g_usage - non-realtime usage
4690*77c1e3ccSAndroid Build Coastguard Worker 0, // g_threads
4691*77c1e3ccSAndroid Build Coastguard Worker 0, // g_profile
4692*77c1e3ccSAndroid Build Coastguard Worker
4693*77c1e3ccSAndroid Build Coastguard Worker 320, // g_w
4694*77c1e3ccSAndroid Build Coastguard Worker 240, // g_h
4695*77c1e3ccSAndroid Build Coastguard Worker 0, // g_limit
4696*77c1e3ccSAndroid Build Coastguard Worker 0, // g_forced_max_frame_width
4697*77c1e3ccSAndroid Build Coastguard Worker 0, // g_forced_max_frame_height
4698*77c1e3ccSAndroid Build Coastguard Worker AOM_BITS_8, // g_bit_depth
4699*77c1e3ccSAndroid Build Coastguard Worker 8, // g_input_bit_depth
4700*77c1e3ccSAndroid Build Coastguard Worker
4701*77c1e3ccSAndroid Build Coastguard Worker { 1, 30 }, // g_timebase
4702*77c1e3ccSAndroid Build Coastguard Worker
4703*77c1e3ccSAndroid Build Coastguard Worker 0, // g_error_resilient
4704*77c1e3ccSAndroid Build Coastguard Worker
4705*77c1e3ccSAndroid Build Coastguard Worker AOM_RC_ONE_PASS, // g_pass
4706*77c1e3ccSAndroid Build Coastguard Worker
4707*77c1e3ccSAndroid Build Coastguard Worker 35, // g_lag_in_frames
4708*77c1e3ccSAndroid Build Coastguard Worker
4709*77c1e3ccSAndroid Build Coastguard Worker 0, // rc_dropframe_thresh
4710*77c1e3ccSAndroid Build Coastguard Worker RESIZE_NONE, // rc_resize_mode
4711*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR, // rc_resize_denominator
4712*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR, // rc_resize_kf_denominator
4713*77c1e3ccSAndroid Build Coastguard Worker
4714*77c1e3ccSAndroid Build Coastguard Worker AOM_SUPERRES_NONE, // rc_superres_mode
4715*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR, // rc_superres_denominator
4716*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR, // rc_superres_kf_denominator
4717*77c1e3ccSAndroid Build Coastguard Worker 63, // rc_superres_qthresh
4718*77c1e3ccSAndroid Build Coastguard Worker 32, // rc_superres_kf_qthresh
4719*77c1e3ccSAndroid Build Coastguard Worker
4720*77c1e3ccSAndroid Build Coastguard Worker AOM_VBR, // rc_end_usage
4721*77c1e3ccSAndroid Build Coastguard Worker { NULL, 0 }, // rc_twopass_stats_in
4722*77c1e3ccSAndroid Build Coastguard Worker { NULL, 0 }, // rc_firstpass_mb_stats_in
4723*77c1e3ccSAndroid Build Coastguard Worker 256, // rc_target_bitrate
4724*77c1e3ccSAndroid Build Coastguard Worker 0, // rc_min_quantizer
4725*77c1e3ccSAndroid Build Coastguard Worker 63, // rc_max_quantizer
4726*77c1e3ccSAndroid Build Coastguard Worker 25, // rc_undershoot_pct
4727*77c1e3ccSAndroid Build Coastguard Worker 25, // rc_overshoot_pct
4728*77c1e3ccSAndroid Build Coastguard Worker
4729*77c1e3ccSAndroid Build Coastguard Worker 6000, // rc_buf_sz
4730*77c1e3ccSAndroid Build Coastguard Worker 4000, // rc_buf_initial_sz
4731*77c1e3ccSAndroid Build Coastguard Worker 5000, // rc_buf_optimal_sz
4732*77c1e3ccSAndroid Build Coastguard Worker
4733*77c1e3ccSAndroid Build Coastguard Worker 50, // rc_2pass_vbr_bias_pct
4734*77c1e3ccSAndroid Build Coastguard Worker 0, // rc_2pass_vbr_minsection_pct
4735*77c1e3ccSAndroid Build Coastguard Worker 2000, // rc_2pass_vbr_maxsection_pct
4736*77c1e3ccSAndroid Build Coastguard Worker
4737*77c1e3ccSAndroid Build Coastguard Worker // keyframing settings (kf)
4738*77c1e3ccSAndroid Build Coastguard Worker 0, // fwd_kf_enabled
4739*77c1e3ccSAndroid Build Coastguard Worker AOM_KF_AUTO, // kf_mode
4740*77c1e3ccSAndroid Build Coastguard Worker 0, // kf_min_dist
4741*77c1e3ccSAndroid Build Coastguard Worker 9999, // kf_max_dist
4742*77c1e3ccSAndroid Build Coastguard Worker 0, // sframe_dist
4743*77c1e3ccSAndroid Build Coastguard Worker 1, // sframe_mode
4744*77c1e3ccSAndroid Build Coastguard Worker 0, // large_scale_tile
4745*77c1e3ccSAndroid Build Coastguard Worker 0, // monochrome
4746*77c1e3ccSAndroid Build Coastguard Worker 0, // full_still_picture_hdr
4747*77c1e3ccSAndroid Build Coastguard Worker 0, // save_as_annexb
4748*77c1e3ccSAndroid Build Coastguard Worker 0, // tile_width_count
4749*77c1e3ccSAndroid Build Coastguard Worker 0, // tile_height_count
4750*77c1e3ccSAndroid Build Coastguard Worker { 0 }, // tile_widths
4751*77c1e3ccSAndroid Build Coastguard Worker { 0 }, // tile_heights
4752*77c1e3ccSAndroid Build Coastguard Worker 0, // use_fixed_qp_offsets
4753*77c1e3ccSAndroid Build Coastguard Worker { -1, -1, -1, -1, -1 }, // fixed_qp_offsets
4754*77c1e3ccSAndroid Build Coastguard Worker { 0, 128, 128, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4755*77c1e3ccSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // encoder_cfg
4756*77c1e3ccSAndroid Build Coastguard Worker },
4757*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY
4758*77c1e3ccSAndroid Build Coastguard Worker {
4759*77c1e3ccSAndroid Build Coastguard Worker // NOLINT
4760*77c1e3ccSAndroid Build Coastguard Worker AOM_USAGE_REALTIME, // g_usage - real-time usage
4761*77c1e3ccSAndroid Build Coastguard Worker 0, // g_threads
4762*77c1e3ccSAndroid Build Coastguard Worker 0, // g_profile
4763*77c1e3ccSAndroid Build Coastguard Worker
4764*77c1e3ccSAndroid Build Coastguard Worker 320, // g_w
4765*77c1e3ccSAndroid Build Coastguard Worker 240, // g_h
4766*77c1e3ccSAndroid Build Coastguard Worker 0, // g_limit
4767*77c1e3ccSAndroid Build Coastguard Worker 0, // g_forced_max_frame_width
4768*77c1e3ccSAndroid Build Coastguard Worker 0, // g_forced_max_frame_height
4769*77c1e3ccSAndroid Build Coastguard Worker AOM_BITS_8, // g_bit_depth
4770*77c1e3ccSAndroid Build Coastguard Worker 8, // g_input_bit_depth
4771*77c1e3ccSAndroid Build Coastguard Worker
4772*77c1e3ccSAndroid Build Coastguard Worker { 1, 30 }, // g_timebase
4773*77c1e3ccSAndroid Build Coastguard Worker
4774*77c1e3ccSAndroid Build Coastguard Worker 0, // g_error_resilient
4775*77c1e3ccSAndroid Build Coastguard Worker
4776*77c1e3ccSAndroid Build Coastguard Worker AOM_RC_ONE_PASS, // g_pass
4777*77c1e3ccSAndroid Build Coastguard Worker
4778*77c1e3ccSAndroid Build Coastguard Worker 0, // g_lag_in_frames
4779*77c1e3ccSAndroid Build Coastguard Worker
4780*77c1e3ccSAndroid Build Coastguard Worker 0, // rc_dropframe_thresh
4781*77c1e3ccSAndroid Build Coastguard Worker RESIZE_NONE, // rc_resize_mode
4782*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR, // rc_resize_denominator
4783*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR, // rc_resize_kf_denominator
4784*77c1e3ccSAndroid Build Coastguard Worker
4785*77c1e3ccSAndroid Build Coastguard Worker AOM_SUPERRES_NONE, // rc_superres_mode
4786*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR, // rc_superres_denominator
4787*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR, // rc_superres_kf_denominator
4788*77c1e3ccSAndroid Build Coastguard Worker 63, // rc_superres_qthresh
4789*77c1e3ccSAndroid Build Coastguard Worker 32, // rc_superres_kf_qthresh
4790*77c1e3ccSAndroid Build Coastguard Worker
4791*77c1e3ccSAndroid Build Coastguard Worker AOM_CBR, // rc_end_usage
4792*77c1e3ccSAndroid Build Coastguard Worker { NULL, 0 }, // rc_twopass_stats_in
4793*77c1e3ccSAndroid Build Coastguard Worker { NULL, 0 }, // rc_firstpass_mb_stats_in
4794*77c1e3ccSAndroid Build Coastguard Worker 256, // rc_target_bitrate
4795*77c1e3ccSAndroid Build Coastguard Worker 0, // rc_min_quantizer
4796*77c1e3ccSAndroid Build Coastguard Worker 63, // rc_max_quantizer
4797*77c1e3ccSAndroid Build Coastguard Worker 50, // rc_undershoot_pct
4798*77c1e3ccSAndroid Build Coastguard Worker 50, // rc_overshoot_pct
4799*77c1e3ccSAndroid Build Coastguard Worker
4800*77c1e3ccSAndroid Build Coastguard Worker 1000, // rc_buf_sz
4801*77c1e3ccSAndroid Build Coastguard Worker 600, // rc_buf_initial_sz
4802*77c1e3ccSAndroid Build Coastguard Worker 600, // rc_buf_optimal_sz
4803*77c1e3ccSAndroid Build Coastguard Worker
4804*77c1e3ccSAndroid Build Coastguard Worker 50, // rc_2pass_vbr_bias_pct
4805*77c1e3ccSAndroid Build Coastguard Worker 0, // rc_2pass_vbr_minsection_pct
4806*77c1e3ccSAndroid Build Coastguard Worker 2000, // rc_2pass_vbr_maxsection_pct
4807*77c1e3ccSAndroid Build Coastguard Worker
4808*77c1e3ccSAndroid Build Coastguard Worker // keyframing settings (kf)
4809*77c1e3ccSAndroid Build Coastguard Worker 0, // fwd_kf_enabled
4810*77c1e3ccSAndroid Build Coastguard Worker AOM_KF_AUTO, // kf_mode
4811*77c1e3ccSAndroid Build Coastguard Worker 0, // kf_min_dist
4812*77c1e3ccSAndroid Build Coastguard Worker 9999, // kf_max_dist
4813*77c1e3ccSAndroid Build Coastguard Worker 0, // sframe_dist
4814*77c1e3ccSAndroid Build Coastguard Worker 1, // sframe_mode
4815*77c1e3ccSAndroid Build Coastguard Worker 0, // large_scale_tile
4816*77c1e3ccSAndroid Build Coastguard Worker 0, // monochrome
4817*77c1e3ccSAndroid Build Coastguard Worker 0, // full_still_picture_hdr
4818*77c1e3ccSAndroid Build Coastguard Worker 0, // save_as_annexb
4819*77c1e3ccSAndroid Build Coastguard Worker 0, // tile_width_count
4820*77c1e3ccSAndroid Build Coastguard Worker 0, // tile_height_count
4821*77c1e3ccSAndroid Build Coastguard Worker { 0 }, // tile_widths
4822*77c1e3ccSAndroid Build Coastguard Worker { 0 }, // tile_heights
4823*77c1e3ccSAndroid Build Coastguard Worker 0, // use_fixed_qp_offsets
4824*77c1e3ccSAndroid Build Coastguard Worker { -1, -1, -1, -1, -1 }, // fixed_qp_offsets
4825*77c1e3ccSAndroid Build Coastguard Worker { 0, 128, 128, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4826*77c1e3ccSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // encoder_cfg
4827*77c1e3ccSAndroid Build Coastguard Worker },
4828*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
4829*77c1e3ccSAndroid Build Coastguard Worker {
4830*77c1e3ccSAndroid Build Coastguard Worker // NOLINT
4831*77c1e3ccSAndroid Build Coastguard Worker AOM_USAGE_ALL_INTRA, // g_usage - all intra usage
4832*77c1e3ccSAndroid Build Coastguard Worker 0, // g_threads
4833*77c1e3ccSAndroid Build Coastguard Worker 0, // g_profile
4834*77c1e3ccSAndroid Build Coastguard Worker
4835*77c1e3ccSAndroid Build Coastguard Worker 320, // g_w
4836*77c1e3ccSAndroid Build Coastguard Worker 240, // g_h
4837*77c1e3ccSAndroid Build Coastguard Worker 0, // g_limit
4838*77c1e3ccSAndroid Build Coastguard Worker 0, // g_forced_max_frame_width
4839*77c1e3ccSAndroid Build Coastguard Worker 0, // g_forced_max_frame_height
4840*77c1e3ccSAndroid Build Coastguard Worker AOM_BITS_8, // g_bit_depth
4841*77c1e3ccSAndroid Build Coastguard Worker 8, // g_input_bit_depth
4842*77c1e3ccSAndroid Build Coastguard Worker
4843*77c1e3ccSAndroid Build Coastguard Worker { 1, 30 }, // g_timebase
4844*77c1e3ccSAndroid Build Coastguard Worker
4845*77c1e3ccSAndroid Build Coastguard Worker 0, // g_error_resilient
4846*77c1e3ccSAndroid Build Coastguard Worker
4847*77c1e3ccSAndroid Build Coastguard Worker AOM_RC_ONE_PASS, // g_pass
4848*77c1e3ccSAndroid Build Coastguard Worker
4849*77c1e3ccSAndroid Build Coastguard Worker 0, // g_lag_in_frames
4850*77c1e3ccSAndroid Build Coastguard Worker
4851*77c1e3ccSAndroid Build Coastguard Worker 0, // rc_dropframe_thresh
4852*77c1e3ccSAndroid Build Coastguard Worker RESIZE_NONE, // rc_resize_mode
4853*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR, // rc_resize_denominator
4854*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR, // rc_resize_kf_denominator
4855*77c1e3ccSAndroid Build Coastguard Worker
4856*77c1e3ccSAndroid Build Coastguard Worker AOM_SUPERRES_NONE, // rc_superres_mode
4857*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR, // rc_superres_denominator
4858*77c1e3ccSAndroid Build Coastguard Worker SCALE_NUMERATOR, // rc_superres_kf_denominator
4859*77c1e3ccSAndroid Build Coastguard Worker 63, // rc_superres_qthresh
4860*77c1e3ccSAndroid Build Coastguard Worker 32, // rc_superres_kf_qthresh
4861*77c1e3ccSAndroid Build Coastguard Worker
4862*77c1e3ccSAndroid Build Coastguard Worker AOM_Q, // rc_end_usage
4863*77c1e3ccSAndroid Build Coastguard Worker { NULL, 0 }, // rc_twopass_stats_in
4864*77c1e3ccSAndroid Build Coastguard Worker { NULL, 0 }, // rc_firstpass_mb_stats_in
4865*77c1e3ccSAndroid Build Coastguard Worker 256, // rc_target_bitrate
4866*77c1e3ccSAndroid Build Coastguard Worker 0, // rc_min_quantizer
4867*77c1e3ccSAndroid Build Coastguard Worker 63, // rc_max_quantizer
4868*77c1e3ccSAndroid Build Coastguard Worker 25, // rc_undershoot_pct
4869*77c1e3ccSAndroid Build Coastguard Worker 25, // rc_overshoot_pct
4870*77c1e3ccSAndroid Build Coastguard Worker
4871*77c1e3ccSAndroid Build Coastguard Worker 6000, // rc_buf_sz
4872*77c1e3ccSAndroid Build Coastguard Worker 4000, // rc_buf_initial_sz
4873*77c1e3ccSAndroid Build Coastguard Worker 5000, // rc_buf_optimal_sz
4874*77c1e3ccSAndroid Build Coastguard Worker
4875*77c1e3ccSAndroid Build Coastguard Worker 50, // rc_2pass_vbr_bias_pct
4876*77c1e3ccSAndroid Build Coastguard Worker 0, // rc_2pass_vbr_minsection_pct
4877*77c1e3ccSAndroid Build Coastguard Worker 2000, // rc_2pass_vbr_maxsection_pct
4878*77c1e3ccSAndroid Build Coastguard Worker
4879*77c1e3ccSAndroid Build Coastguard Worker // keyframing settings (kf)
4880*77c1e3ccSAndroid Build Coastguard Worker 0, // fwd_kf_enabled
4881*77c1e3ccSAndroid Build Coastguard Worker AOM_KF_DISABLED, // kf_mode
4882*77c1e3ccSAndroid Build Coastguard Worker 0, // kf_min_dist
4883*77c1e3ccSAndroid Build Coastguard Worker 0, // kf_max_dist
4884*77c1e3ccSAndroid Build Coastguard Worker 0, // sframe_dist
4885*77c1e3ccSAndroid Build Coastguard Worker 1, // sframe_mode
4886*77c1e3ccSAndroid Build Coastguard Worker 0, // large_scale_tile
4887*77c1e3ccSAndroid Build Coastguard Worker 0, // monochrome
4888*77c1e3ccSAndroid Build Coastguard Worker 0, // full_still_picture_hdr
4889*77c1e3ccSAndroid Build Coastguard Worker 0, // save_as_annexb
4890*77c1e3ccSAndroid Build Coastguard Worker 0, // tile_width_count
4891*77c1e3ccSAndroid Build Coastguard Worker 0, // tile_height_count
4892*77c1e3ccSAndroid Build Coastguard Worker { 0 }, // tile_widths
4893*77c1e3ccSAndroid Build Coastguard Worker { 0 }, // tile_heights
4894*77c1e3ccSAndroid Build Coastguard Worker 0, // use_fixed_qp_offsets
4895*77c1e3ccSAndroid Build Coastguard Worker { -1, -1, -1, -1, -1 }, // fixed_qp_offsets
4896*77c1e3ccSAndroid Build Coastguard Worker { 0, 128, 128, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4897*77c1e3ccSAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // encoder_cfg
4898*77c1e3ccSAndroid Build Coastguard Worker },
4899*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY
4900*77c1e3ccSAndroid Build Coastguard Worker };
4901*77c1e3ccSAndroid Build Coastguard Worker
4902*77c1e3ccSAndroid Build Coastguard Worker // This data structure and function are exported in aom/aomcx.h
4903*77c1e3ccSAndroid Build Coastguard Worker #ifndef VERSION_STRING
4904*77c1e3ccSAndroid Build Coastguard Worker #define VERSION_STRING
4905*77c1e3ccSAndroid Build Coastguard Worker #endif
4906*77c1e3ccSAndroid Build Coastguard Worker aom_codec_iface_t aom_codec_av1_cx_algo = {
4907*77c1e3ccSAndroid Build Coastguard Worker "AOMedia Project AV1 Encoder" VERSION_STRING,
4908*77c1e3ccSAndroid Build Coastguard Worker AOM_CODEC_INTERNAL_ABI_VERSION,
4909*77c1e3ccSAndroid Build Coastguard Worker (CONFIG_AV1_HIGHBITDEPTH ? AOM_CODEC_CAP_HIGHBITDEPTH : 0) |
4910*77c1e3ccSAndroid Build Coastguard Worker AOM_CODEC_CAP_ENCODER | AOM_CODEC_CAP_PSNR, // aom_codec_caps_t
4911*77c1e3ccSAndroid Build Coastguard Worker encoder_init, // aom_codec_init_fn_t
4912*77c1e3ccSAndroid Build Coastguard Worker encoder_destroy, // aom_codec_destroy_fn_t
4913*77c1e3ccSAndroid Build Coastguard Worker encoder_ctrl_maps, // aom_codec_ctrl_fn_map_t
4914*77c1e3ccSAndroid Build Coastguard Worker {
4915*77c1e3ccSAndroid Build Coastguard Worker // NOLINT
4916*77c1e3ccSAndroid Build Coastguard Worker NULL, // aom_codec_peek_si_fn_t
4917*77c1e3ccSAndroid Build Coastguard Worker NULL, // aom_codec_get_si_fn_t
4918*77c1e3ccSAndroid Build Coastguard Worker NULL, // aom_codec_decode_fn_t
4919*77c1e3ccSAndroid Build Coastguard Worker NULL, // aom_codec_get_frame_fn_t
4920*77c1e3ccSAndroid Build Coastguard Worker NULL // aom_codec_set_fb_fn_t
4921*77c1e3ccSAndroid Build Coastguard Worker },
4922*77c1e3ccSAndroid Build Coastguard Worker {
4923*77c1e3ccSAndroid Build Coastguard Worker // NOLINT
4924*77c1e3ccSAndroid Build Coastguard Worker NELEMENTS(encoder_usage_cfg), // cfg_count
4925*77c1e3ccSAndroid Build Coastguard Worker encoder_usage_cfg, // aom_codec_enc_cfg_t
4926*77c1e3ccSAndroid Build Coastguard Worker encoder_encode, // aom_codec_encode_fn_t
4927*77c1e3ccSAndroid Build Coastguard Worker encoder_get_cxdata, // aom_codec_get_cx_data_fn_t
4928*77c1e3ccSAndroid Build Coastguard Worker encoder_set_config, // aom_codec_enc_config_set_fn_t
4929*77c1e3ccSAndroid Build Coastguard Worker encoder_get_global_headers, // aom_codec_get_global_headers_fn_t
4930*77c1e3ccSAndroid Build Coastguard Worker encoder_get_preview // aom_codec_get_preview_frame_fn_t
4931*77c1e3ccSAndroid Build Coastguard Worker },
4932*77c1e3ccSAndroid Build Coastguard Worker encoder_set_option // aom_codec_set_option_fn_t
4933*77c1e3ccSAndroid Build Coastguard Worker };
4934*77c1e3ccSAndroid Build Coastguard Worker
aom_codec_av1_cx(void)4935*77c1e3ccSAndroid Build Coastguard Worker aom_codec_iface_t *aom_codec_av1_cx(void) { return &aom_codec_av1_cx_algo; }
4936