summaryrefslogtreecommitdiffstats
path: root/third_party/aom/aomenc.c
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/aom/aomenc.c')
-rw-r--r--third_party/aom/aomenc.c428
1 files changed, 253 insertions, 175 deletions
diff --git a/third_party/aom/aomenc.c b/third_party/aom/aomenc.c
index ec1935aed..27372712e 100644
--- a/third_party/aom/aomenc.c
+++ b/third_party/aom/aomenc.c
@@ -194,9 +194,6 @@ static const arg_def_t disable_warning_prompt =
"Display warnings, but do not prompt user to continue.");
#if CONFIG_HIGHBITDEPTH
-static const arg_def_t test16bitinternalarg = ARG_DEF(
- NULL, "test-16bit-internal", 0, "Force use of 16 bit internal buffer");
-
static const struct arg_enum_list bitdepth_enum[] = {
{ "8", AOM_BITS_8 }, { "10", AOM_BITS_10 }, { "12", AOM_BITS_12 }, { NULL, 0 }
};
@@ -258,6 +255,11 @@ static const arg_def_t error_resilient =
ARG_DEF(NULL, "error-resilient", 1, "Enable error resiliency features");
static const arg_def_t lag_in_frames =
ARG_DEF(NULL, "lag-in-frames", 1, "Max number of frames to lag");
+#if CONFIG_EXT_TILE
+static const arg_def_t large_scale_tile =
+ ARG_DEF(NULL, "large-scale-tile", 1,
+ "Large scale tile coding (0: off (default), 1: on)");
+#endif // CONFIG_EXT_TILE
static const arg_def_t *global_args[] = { &use_yv12,
&use_i420,
@@ -276,24 +278,31 @@ static const arg_def_t *global_args[] = { &use_yv12,
&framerate,
&error_resilient,
#if CONFIG_HIGHBITDEPTH
- &test16bitinternalarg,
&bitdeptharg,
#endif
&lag_in_frames,
+#if CONFIG_EXT_TILE
+ &large_scale_tile,
+#endif // CONFIG_EXT_TILE
NULL };
static const arg_def_t dropframe_thresh =
ARG_DEF(NULL, "drop-frame", 1, "Temporal resampling threshold (buf %)");
-static const arg_def_t resize_allowed =
- ARG_DEF(NULL, "resize-allowed", 1, "Spatial resampling enabled (bool)");
-static const arg_def_t resize_width =
- ARG_DEF(NULL, "resize-width", 1, "Width of encoded frame");
-static const arg_def_t resize_height =
- ARG_DEF(NULL, "resize-height", 1, "Height of encoded frame");
-static const arg_def_t resize_up_thresh =
- ARG_DEF(NULL, "resize-up", 1, "Upscale threshold (buf %)");
-static const arg_def_t resize_down_thresh =
- ARG_DEF(NULL, "resize-down", 1, "Downscale threshold (buf %)");
+static const arg_def_t resize_mode =
+ ARG_DEF(NULL, "resize-mode", 1, "Frame resize mode");
+static const arg_def_t resize_numerator =
+ ARG_DEF(NULL, "resize-numerator", 1, "Frame resize numerator");
+static const arg_def_t resize_kf_numerator =
+ ARG_DEF(NULL, "resize-kf-numerator", 1, "Frame resize keyframe numerator");
+#if CONFIG_FRAME_SUPERRES
+static const arg_def_t superres_mode =
+ ARG_DEF(NULL, "superres-mode", 1, "Frame super-resolution mode");
+static const arg_def_t superres_numerator =
+ ARG_DEF(NULL, "superres-numerator", 1, "Frame super-resolution numerator");
+static const arg_def_t superres_kf_numerator =
+ ARG_DEF(NULL, "superres-kf-numerator", 1,
+ "Frame super-resolution keyframe numerator");
+#endif // CONFIG_FRAME_SUPERRES
static const struct arg_enum_list end_usage_enum[] = { { "vbr", AOM_VBR },
{ "cbr", AOM_CBR },
{ "cq", AOM_CQ },
@@ -317,12 +326,25 @@ static const arg_def_t buf_initial_sz =
ARG_DEF(NULL, "buf-initial-sz", 1, "Client initial buffer size (ms)");
static const arg_def_t buf_optimal_sz =
ARG_DEF(NULL, "buf-optimal-sz", 1, "Client optimal buffer size (ms)");
-static const arg_def_t *rc_args[] = {
- &dropframe_thresh, &resize_allowed, &resize_width, &resize_height,
- &resize_up_thresh, &resize_down_thresh, &end_usage, &target_bitrate,
- &min_quantizer, &max_quantizer, &undershoot_pct, &overshoot_pct,
- &buf_sz, &buf_initial_sz, &buf_optimal_sz, NULL
-};
+static const arg_def_t *rc_args[] = { &dropframe_thresh,
+ &resize_mode,
+ &resize_numerator,
+ &resize_kf_numerator,
+#if CONFIG_FRAME_SUPERRES
+ &superres_mode,
+ &superres_numerator,
+ &superres_kf_numerator,
+#endif // CONFIG_FRAME_SUPERRES
+ &end_usage,
+ &target_bitrate,
+ &min_quantizer,
+ &max_quantizer,
+ &undershoot_pct,
+ &overshoot_pct,
+ &buf_sz,
+ &buf_initial_sz,
+ &buf_optimal_sz,
+ NULL };
static const arg_def_t bias_pct =
ARG_DEF(NULL, "bias-pct", 1, "CBR/VBR bias (0=CBR, 100=VBR)");
@@ -367,17 +389,16 @@ static const arg_def_t max_intra_rate_pct =
#if CONFIG_AV1_ENCODER
static const arg_def_t cpu_used_av1 =
ARG_DEF(NULL, "cpu-used", 1, "CPU Used (0..8)");
+#if CONFIG_EXT_TILE
+static const arg_def_t single_tile_decoding =
+ ARG_DEF(NULL, "single-tile-decoding", 1,
+ "Single tile decoding (0: off (default), 1: on)");
+#endif // CONFIG_EXT_TILE
static const arg_def_t tile_cols =
ARG_DEF(NULL, "tile-columns", 1, "Number of tile columns to use, log2");
static const arg_def_t tile_rows =
ARG_DEF(NULL, "tile-rows", 1,
"Number of tile rows to use, log2 (set to 0 while threads > 1)");
-#if CONFIG_EXT_TILE
-static const arg_def_t tile_encoding_mode =
- ARG_DEF(NULL, "tile-encoding-mode", 1,
- "Tile encoding mode (0: normal"
- " (default), 1: vr)");
-#endif
#if CONFIG_DEPENDENT_HORZTILES
static const arg_def_t tile_dependent_rows =
ARG_DEF(NULL, "tile-dependent-rows", 1, "Enable dependent Tile rows");
@@ -397,14 +418,12 @@ static const arg_def_t qm_min = ARG_DEF(
static const arg_def_t qm_max = ARG_DEF(
NULL, "qm-max", 1, "Max quant matrix flatness (0..15), default is 16");
#endif
-#if CONFIG_TILE_GROUPS
static const arg_def_t num_tg = ARG_DEF(
NULL, "num-tile-groups", 1, "Maximum number of tile groups, default is 1");
static const arg_def_t mtu_size =
ARG_DEF(NULL, "mtu-size", 1,
"MTU size for a tile group, default is 0 (no MTU targeting), "
"overrides maximum number of tile groups");
-#endif
#if CONFIG_TEMPMV_SIGNALING
static const arg_def_t disable_tempmv = ARG_DEF(
NULL, "disable-tempmv", 1, "Disable temporal mv prediction (default is 0)");
@@ -449,9 +468,16 @@ static const struct arg_enum_list color_space_enum[] = {
{ "bt709", AOM_CS_BT_709 },
{ "smpte170", AOM_CS_SMPTE_170 },
{ "smpte240", AOM_CS_SMPTE_240 },
+#if CONFIG_COLORSPACE_HEADERS
+ { "bt2020ncl", AOM_CS_BT_2020_NCL },
+ { "bt2020cl", AOM_CS_BT_2020_CL },
+ { "sRGB", AOM_CS_SRGB },
+ { "ICtCp", AOM_CS_ICTCP },
+#else
{ "bt2020", AOM_CS_BT_2020 },
{ "reserved", AOM_CS_RESERVED },
{ "sRGB", AOM_CS_SRGB },
+#endif
{ NULL, 0 }
};
@@ -459,6 +485,32 @@ static const arg_def_t input_color_space =
ARG_DEF_ENUM(NULL, "color-space", 1, "The color space of input content:",
color_space_enum);
+#if CONFIG_COLORSPACE_HEADERS
+static const struct arg_enum_list transfer_function_enum[] = {
+ { "unknown", AOM_TF_UNKNOWN },
+ { "bt709", AOM_TF_BT_709 },
+ { "pq", AOM_TF_PQ },
+ { "hlg", AOM_TF_HLG },
+ { NULL, 0 }
+};
+
+static const arg_def_t input_transfer_function = ARG_DEF_ENUM(
+ NULL, "transfer-function", 1, "The transfer function of input content:",
+ transfer_function_enum);
+
+static const struct arg_enum_list chroma_sample_position_enum[] = {
+ { "unknown", AOM_CSP_UNKNOWN },
+ { "vertical", AOM_CSP_VERTICAL },
+ { "colocated", AOM_CSP_COLOCATED },
+ { NULL, 0 }
+};
+
+static const arg_def_t input_chroma_sample_position =
+ ARG_DEF_ENUM(NULL, "chroma-sample-position", 1,
+ "The chroma sample position when chroma 4:2:0 is signaled:",
+ chroma_sample_position_enum);
+#endif
+
static const struct arg_enum_list tune_content_enum[] = {
{ "default", AOM_CONTENT_DEFAULT },
{ "screen", AOM_CONTENT_SCREEN },
@@ -485,11 +537,11 @@ static const arg_def_t *av1_args[] = { &cpu_used_av1,
&auto_altref,
&sharpness,
&static_thresh,
+#if CONFIG_EXT_TILE
+ &single_tile_decoding,
+#endif // CONFIG_EXT_TILE
&tile_cols,
&tile_rows,
-#if CONFIG_EXT_TILE
- &tile_encoding_mode,
-#endif
#if CONFIG_DEPENDENT_HORZTILES
&tile_dependent_rows,
#endif
@@ -518,15 +570,17 @@ static const arg_def_t *av1_args[] = { &cpu_used_av1,
&noise_sens,
&tune_content,
&input_color_space,
+#if CONFIG_COLORSPACE_HEADERS
+ &input_transfer_function,
+ &input_chroma_sample_position,
+#endif
&min_gf_interval,
&max_gf_interval,
#if CONFIG_EXT_PARTITION
&superblock_size,
#endif // CONFIG_EXT_PARTITION
-#if CONFIG_TILE_GROUPS
&num_tg,
&mtu_size,
-#endif
#if CONFIG_TEMPMV_SIGNALING
&disable_tempmv,
#endif
@@ -539,11 +593,11 @@ static const int av1_arg_ctrl_map[] = { AOME_SET_CPUUSED,
AOME_SET_ENABLEAUTOALTREF,
AOME_SET_SHARPNESS,
AOME_SET_STATIC_THRESHOLD,
+#if CONFIG_EXT_TILE
+ AV1E_SET_SINGLE_TILE_DECODING,
+#endif // CONFIG_EXT_TILE
AV1E_SET_TILE_COLUMNS,
AV1E_SET_TILE_ROWS,
-#if CONFIG_EXT_TILE
- AV1E_SET_TILE_ENCODING_MODE,
-#endif
#if CONFIG_DEPENDENT_HORZTILES
AV1E_SET_TILE_DEPENDENT_ROWS,
#endif
@@ -572,15 +626,17 @@ static const int av1_arg_ctrl_map[] = { AOME_SET_CPUUSED,
AV1E_SET_NOISE_SENSITIVITY,
AV1E_SET_TUNE_CONTENT,
AV1E_SET_COLOR_SPACE,
+#if CONFIG_COLORSPACE_HEADERS
+ AV1E_SET_TRANSFER_FUNCTION,
+ AV1E_SET_CHROMA_SAMPLE_POSITION,
+#endif
AV1E_SET_MIN_GF_INTERVAL,
AV1E_SET_MAX_GF_INTERVAL,
#if CONFIG_EXT_PARTITION
AV1E_SET_SUPERBLOCK_SIZE,
#endif // CONFIG_EXT_PARTITION
-#if CONFIG_TILE_GROUPS
AV1E_SET_NUM_TG,
AV1E_SET_MTU,
-#endif
#if CONFIG_TEMPMV_SIGNALING
AV1E_SET_DISABLE_TEMPMV,
#endif
@@ -651,10 +707,8 @@ struct stream_config {
int arg_ctrls[ARG_CTRL_CNT_MAX][2];
int arg_ctrl_cnt;
int write_webm;
-#if CONFIG_HIGHBITDEPTH
// whether to use 16bit internal buffers
int use_16bit_internal;
-#endif
};
struct stream_state {
@@ -906,9 +960,7 @@ static int parse_stream_params(struct AvxEncoderConfig *global,
static const int *ctrl_args_map = NULL;
struct stream_config *config = &stream->config;
int eos_mark_found = 0;
-#if CONFIG_HIGHBITDEPTH
- int test_16bit_internal = 0;
-#endif
+ int webm_forced = 0;
// Handle codec specific options
if (0) {
@@ -937,6 +989,13 @@ static int parse_stream_params(struct AvxEncoderConfig *global,
if (arg_match(&arg, &outputfile, argi)) {
config->out_fn = arg.val;
+ if (!webm_forced) {
+ const size_t out_fn_len = strlen(config->out_fn);
+ if (out_fn_len >= 4 &&
+ !strcmp(config->out_fn + out_fn_len - 4, ".ivf")) {
+ config->write_webm = 0;
+ }
+ }
} else if (arg_match(&arg, &fpf_name, argi)) {
config->stats_fn = arg.val;
#if CONFIG_FP_MB_STATS
@@ -946,6 +1005,7 @@ static int parse_stream_params(struct AvxEncoderConfig *global,
} else if (arg_match(&arg, &use_webm, argi)) {
#if CONFIG_WEBM_IO
config->write_webm = 1;
+ webm_forced = 1;
#else
die("Error: --webm specified but webm is disabled.");
#endif
@@ -976,18 +1036,26 @@ static int parse_stream_params(struct AvxEncoderConfig *global,
config->cfg.g_error_resilient = arg_parse_uint(&arg);
} else if (arg_match(&arg, &lag_in_frames, argi)) {
config->cfg.g_lag_in_frames = arg_parse_uint(&arg);
+#if CONFIG_EXT_TILE
+ } else if (arg_match(&arg, &large_scale_tile, argi)) {
+ config->cfg.large_scale_tile = arg_parse_uint(&arg);
+#endif // CONFIG_EXT_TILE
} else if (arg_match(&arg, &dropframe_thresh, argi)) {
config->cfg.rc_dropframe_thresh = arg_parse_uint(&arg);
- } else if (arg_match(&arg, &resize_allowed, argi)) {
- config->cfg.rc_resize_allowed = arg_parse_uint(&arg);
- } else if (arg_match(&arg, &resize_width, argi)) {
- config->cfg.rc_scaled_width = arg_parse_uint(&arg);
- } else if (arg_match(&arg, &resize_height, argi)) {
- config->cfg.rc_scaled_height = arg_parse_uint(&arg);
- } else if (arg_match(&arg, &resize_up_thresh, argi)) {
- config->cfg.rc_resize_up_thresh = arg_parse_uint(&arg);
- } else if (arg_match(&arg, &resize_down_thresh, argi)) {
- config->cfg.rc_resize_down_thresh = arg_parse_uint(&arg);
+ } else if (arg_match(&arg, &resize_mode, argi)) {
+ config->cfg.rc_resize_mode = arg_parse_uint(&arg);
+ } else if (arg_match(&arg, &resize_numerator, argi)) {
+ config->cfg.rc_resize_numerator = arg_parse_uint(&arg);
+ } else if (arg_match(&arg, &resize_kf_numerator, argi)) {
+ config->cfg.rc_resize_kf_numerator = arg_parse_uint(&arg);
+#if CONFIG_FRAME_SUPERRES
+ } else if (arg_match(&arg, &superres_mode, argi)) {
+ config->cfg.rc_superres_mode = arg_parse_uint(&arg);
+ } else if (arg_match(&arg, &superres_numerator, argi)) {
+ config->cfg.rc_superres_numerator = arg_parse_uint(&arg);
+ } else if (arg_match(&arg, &superres_kf_numerator, argi)) {
+ config->cfg.rc_superres_kf_numerator = arg_parse_uint(&arg);
+#endif // CONFIG_FRAME_SUPERRES
} else if (arg_match(&arg, &end_usage, argi)) {
config->cfg.rc_end_usage = arg_parse_enum_or_int(&arg);
} else if (arg_match(&arg, &target_bitrate, argi)) {
@@ -1026,13 +1094,6 @@ static int parse_stream_params(struct AvxEncoderConfig *global,
config->cfg.kf_max_dist = arg_parse_uint(&arg);
} else if (arg_match(&arg, &kf_disabled, argi)) {
config->cfg.kf_mode = AOM_KF_DISABLED;
-#if CONFIG_HIGHBITDEPTH
- } else if (arg_match(&arg, &test16bitinternalarg, argi)) {
- if (strcmp(global->codec->name, "av1") == 0 ||
- strcmp(global->codec->name, "av1") == 0) {
- test_16bit_internal = 1;
- }
-#endif
} else {
int i, match = 0;
for (i = 0; ctrl_args[i]; i++) {
@@ -1062,18 +1123,14 @@ static int parse_stream_params(struct AvxEncoderConfig *global,
}
#if CONFIG_HIGHBITDEPTH
config->use_16bit_internal =
- test_16bit_internal || (config->cfg.g_profile > 1) || !CONFIG_LOWBITDEPTH;
+ config->cfg.g_bit_depth > AOM_BITS_8 || !CONFIG_LOWBITDEPTH;
#endif
return eos_mark_found;
}
-#define FOREACH_STREAM(func) \
- do { \
- struct stream_state *stream; \
- for (stream = streams; stream; stream = stream->next) { \
- func; \
- } \
- } while (0)
+#define FOREACH_STREAM(iterator, list) \
+ for (struct stream_state *iterator = list; iterator; \
+ iterator = iterator->next)
static void validate_stream_config(const struct stream_state *stream,
const struct AvxEncoderConfig *global) {
@@ -1183,6 +1240,8 @@ static void show_stream_config(struct stream_state *stream,
if (stream->next || stream->index)
fprintf(stderr, "\nStream Index: %d\n", stream->index);
fprintf(stderr, "Destination file: %s\n", stream->config.out_fn);
+ fprintf(stderr, "Coding path: %s\n",
+ stream->config.use_16bit_internal ? "HBD" : "LBD");
fprintf(stderr, "Encoder parameters:\n");
SHOW(g_usage);
@@ -1197,12 +1256,18 @@ static void show_stream_config(struct stream_state *stream,
SHOW(g_error_resilient);
SHOW(g_pass);
SHOW(g_lag_in_frames);
+#if CONFIG_EXT_TILE
+ SHOW(large_scale_tile);
+#endif // CONFIG_EXT_TILE
SHOW(rc_dropframe_thresh);
- SHOW(rc_resize_allowed);
- SHOW(rc_scaled_width);
- SHOW(rc_scaled_height);
- SHOW(rc_resize_up_thresh);
- SHOW(rc_resize_down_thresh);
+ SHOW(rc_resize_mode);
+ SHOW(rc_resize_numerator);
+ SHOW(rc_resize_kf_numerator);
+#if CONFIG_FRAME_SUPERRES
+ SHOW(rc_superres_mode);
+ SHOW(rc_superres_numerator);
+ SHOW(rc_superres_kf_numerator);
+#endif // CONFIG_FRAME_SUPERRES
SHOW(rc_end_usage);
SHOW(rc_target_bitrate);
SHOW(rc_min_quantizer);
@@ -1340,7 +1405,7 @@ static void initialize_encoder(struct stream_state *stream,
#if CONFIG_AV1_DECODER
if (global->test_decode != TEST_DECODE_OFF) {
const AvxInterface *decoder = get_aom_decoder_by_name(global->codec->name);
- aom_codec_dec_cfg_t cfg = { 0, 0, 0 };
+ aom_codec_dec_cfg_t cfg = { 0, 0, 0, CONFIG_LOWBITDEPTH };
aom_codec_dec_init(&stream->decoder, decoder->codec_interface(), &cfg, 0);
#if CONFIG_EXT_TILE
@@ -1351,7 +1416,7 @@ static void initialize_encoder(struct stream_state *stream,
aom_codec_control(&stream->decoder, AV1_SET_DECODE_TILE_COL, -1);
ctx_exit_on_error(&stream->decoder, "Failed to set decode_tile_col");
}
-#endif
+#endif // CONFIG_EXT_TILE
}
#endif
}
@@ -1730,8 +1795,10 @@ int main(int argc, const char **argv_) {
if (argi[0][0] == '-' && argi[0][1])
die("Error: Unrecognized option %s\n", *argi);
- FOREACH_STREAM(check_encoder_config(global.disable_warning_prompt, &global,
- &stream->config.cfg););
+ FOREACH_STREAM(stream, streams) {
+ check_encoder_config(global.disable_warning_prompt, &global,
+ &stream->config.cfg);
+ }
/* Handle non-option arguments */
input.filename = argv[0];
@@ -1753,13 +1820,13 @@ int main(int argc, const char **argv_) {
* the data from the first stream's configuration.
*/
if (!input.width || !input.height) {
- FOREACH_STREAM({
+ FOREACH_STREAM(stream, streams) {
if (stream->config.cfg.g_w && stream->config.cfg.g_h) {
input.width = stream->config.cfg.g_w;
input.height = stream->config.cfg.g_h;
break;
}
- });
+ };
}
/* Update stream configurations from the input file's parameters */
@@ -1774,21 +1841,21 @@ int main(int argc, const char **argv_) {
* to be the same as the codec bit-depth.
*/
if (!input.bit_depth) {
- FOREACH_STREAM({
+ FOREACH_STREAM(stream, streams) {
if (stream->config.cfg.g_input_bit_depth)
input.bit_depth = stream->config.cfg.g_input_bit_depth;
else
input.bit_depth = stream->config.cfg.g_input_bit_depth =
(int)stream->config.cfg.g_bit_depth;
- });
+ }
if (input.bit_depth > 8) input.fmt |= AOM_IMG_FMT_HIGHBITDEPTH;
} else {
- FOREACH_STREAM(
- { stream->config.cfg.g_input_bit_depth = input.bit_depth; });
+ FOREACH_STREAM(stream, streams) {
+ stream->config.cfg.g_input_bit_depth = input.bit_depth;
+ }
}
-#if CONFIG_HIGHBITDEPTH
- FOREACH_STREAM({
+ FOREACH_STREAM(stream, streams) {
if (input.fmt != AOM_IMG_FMT_I420 && input.fmt != AOM_IMG_FMT_I42016) {
/* Automatically upgrade if input is non-4:2:0 but a 4:2:0 profile
was selected. */
@@ -1824,6 +1891,7 @@ int main(int argc, const char **argv_) {
}
}
if (stream->config.cfg.g_profile > 1) {
+ if (!CONFIG_HIGHBITDEPTH) fatal("Unsupported profile.");
stream->config.use_16bit_internal = 1;
}
if (profile_updated && !global.quiet) {
@@ -1832,56 +1900,34 @@ int main(int argc, const char **argv_) {
"match input format.\n",
stream->config.cfg.g_profile);
}
- });
-#else
- FOREACH_STREAM({
- if (input.fmt != AOM_IMG_FMT_I420 && input.fmt != AOM_IMG_FMT_I42016) {
- /* Automatically upgrade if input is non-4:2:0 but a 4:2:0 profile
- was selected. */
- switch (stream->config.cfg.g_profile) {
- case 0:
- stream->config.cfg.g_profile = 1;
- profile_updated = 1;
- break;
- case 2:
- stream->config.cfg.g_profile = 3;
- profile_updated = 1;
- break;
- default: break;
- }
- }
- if (profile_updated && !global.quiet) {
- fprintf(stderr,
- "Warning: automatically upgrading to profile %d to "
- "match input format.\n",
- stream->config.cfg.g_profile);
- }
- });
-#endif
+ }
- FOREACH_STREAM(set_stream_dimensions(stream, input.width, input.height));
- FOREACH_STREAM(validate_stream_config(stream, &global));
+ FOREACH_STREAM(stream, streams) {
+ set_stream_dimensions(stream, input.width, input.height);
+ }
+ FOREACH_STREAM(stream, streams) { validate_stream_config(stream, &global); }
/* Ensure that --passes and --pass are consistent. If --pass is set and
* --passes=2, ensure --fpf was set.
*/
- if (global.pass && global.passes == 2)
- FOREACH_STREAM({
+ if (global.pass && global.passes == 2) {
+ FOREACH_STREAM(stream, streams) {
if (!stream->config.stats_fn)
die("Stream %d: Must specify --fpf when --pass=%d"
" and --passes=2\n",
stream->index, global.pass);
- });
+ }
+ }
#if !CONFIG_WEBM_IO
- FOREACH_STREAM({
+ FOREACH_STREAM(stream, streams) {
if (stream->config.write_webm) {
stream->config.write_webm = 0;
warn(
"aomenc was compiled without WebM container support."
"Producing IVF output");
}
- });
+ }
#endif
/* Use the frame rate from the file only if none was specified
@@ -1890,31 +1936,39 @@ int main(int argc, const char **argv_) {
if (!global.have_framerate) {
global.framerate.num = input.framerate.numerator;
global.framerate.den = input.framerate.denominator;
- FOREACH_STREAM(stream->config.cfg.g_timebase.den = global.framerate.num;
- stream->config.cfg.g_timebase.num = global.framerate.den);
+ FOREACH_STREAM(stream, streams) {
+ stream->config.cfg.g_timebase.den = global.framerate.num;
+ stream->config.cfg.g_timebase.num = global.framerate.den;
+ }
}
/* Show configuration */
- if (global.verbose && pass == 0)
- FOREACH_STREAM(show_stream_config(stream, &global, &input));
+ if (global.verbose && pass == 0) {
+ FOREACH_STREAM(stream, streams) {
+ show_stream_config(stream, &global, &input);
+ }
+ }
if (pass == (global.pass ? global.pass - 1 : 0)) {
if (input.file_type == FILE_TYPE_Y4M)
/*The Y4M reader does its own allocation.
Just initialize this here to avoid problems if we never read any
- frames.*/
+ frames.*/
memset(&raw, 0, sizeof(raw));
else
aom_img_alloc(&raw, input.fmt, input.width, input.height, 32);
- FOREACH_STREAM(stream->rate_hist = init_rate_histogram(
- &stream->config.cfg, &global.framerate));
+ FOREACH_STREAM(stream, streams) {
+ stream->rate_hist =
+ init_rate_histogram(&stream->config.cfg, &global.framerate);
+ }
}
- FOREACH_STREAM(setup_pass(stream, &global, pass));
- FOREACH_STREAM(
- open_output_file(stream, &global, &input.pixel_aspect_ratio));
- FOREACH_STREAM(initialize_encoder(stream, &global));
+ FOREACH_STREAM(stream, streams) { setup_pass(stream, &global, pass); }
+ FOREACH_STREAM(stream, streams) {
+ open_output_file(stream, &global, &input.pixel_aspect_ratio);
+ }
+ FOREACH_STREAM(stream, streams) { initialize_encoder(stream, &global); }
#if CONFIG_HIGHBITDEPTH
if (strcmp(global.codec->name, "av1") == 0 ||
@@ -1922,7 +1976,7 @@ int main(int argc, const char **argv_) {
// Check to see if at least one stream uses 16 bit internal.
// Currently assume that the bit_depths for all streams using
// highbitdepth are the same.
- FOREACH_STREAM({
+ FOREACH_STREAM(stream, streams) {
if (stream->config.use_16bit_internal) {
use_16bit_internal = 1;
}
@@ -1932,7 +1986,7 @@ int main(int argc, const char **argv_) {
input_shift = (int)stream->config.cfg.g_bit_depth -
stream->config.cfg.g_input_bit_depth;
}
- });
+ };
}
#endif
@@ -1990,31 +2044,35 @@ int main(int argc, const char **argv_) {
aom_usec_timer_start(&timer);
if (use_16bit_internal) {
assert(frame_to_encode->fmt & AOM_IMG_FMT_HIGHBITDEPTH);
- FOREACH_STREAM({
+ FOREACH_STREAM(stream, streams) {
if (stream->config.use_16bit_internal)
encode_frame(stream, &global,
frame_avail ? frame_to_encode : NULL, frames_in);
else
assert(0);
- });
+ };
} else {
assert((frame_to_encode->fmt & AOM_IMG_FMT_HIGHBITDEPTH) == 0);
- FOREACH_STREAM(encode_frame(stream, &global,
- frame_avail ? frame_to_encode : NULL,
- frames_in));
+ FOREACH_STREAM(stream, streams) {
+ encode_frame(stream, &global, frame_avail ? frame_to_encode : NULL,
+ frames_in);
+ }
}
#else
aom_usec_timer_start(&timer);
- FOREACH_STREAM(encode_frame(stream, &global, frame_avail ? &raw : NULL,
- frames_in));
+ FOREACH_STREAM(stream, streams) {
+ encode_frame(stream, &global, frame_avail ? &raw : NULL, frames_in);
+ }
#endif
aom_usec_timer_mark(&timer);
cx_time += aom_usec_timer_elapsed(&timer);
- FOREACH_STREAM(update_quantizer_histogram(stream));
+ FOREACH_STREAM(stream, streams) { update_quantizer_histogram(stream); }
got_data = 0;
- FOREACH_STREAM(get_cx_data(stream, &global, &got_data));
+ FOREACH_STREAM(stream, streams) {
+ get_cx_data(stream, &global, &got_data);
+ }
if (!got_data && input.length && streams != NULL &&
!streams->frames_out) {
@@ -2043,8 +2101,11 @@ int main(int argc, const char **argv_) {
estimated_time_left = average_rate ? remaining / average_rate : -1;
}
- if (got_data && global.test_decode != TEST_DECODE_OFF)
- FOREACH_STREAM(test_decode(stream, global.test_decode, global.codec));
+ if (got_data && global.test_decode != TEST_DECODE_OFF) {
+ FOREACH_STREAM(stream, streams) {
+ test_decode(stream, global.test_decode, global.codec);
+ }
+ }
}
fflush(stdout);
@@ -2054,68 +2115,84 @@ int main(int argc, const char **argv_) {
if (stream_cnt > 1) fprintf(stderr, "\n");
if (!global.quiet) {
- FOREACH_STREAM(fprintf(
- stderr, "\rPass %d/%d frame %4d/%-4d %7" PRId64 "B %7" PRId64
- "b/f %7" PRId64 "b/s"
- " %7" PRId64 " %s (%.2f fps)\033[K\n",
- pass + 1, global.passes, frames_in, stream->frames_out,
- (int64_t)stream->nbytes,
- seen_frames ? (int64_t)(stream->nbytes * 8 / seen_frames) : 0,
- seen_frames
- ? (int64_t)stream->nbytes * 8 * (int64_t)global.framerate.num /
- global.framerate.den / seen_frames
- : 0,
- stream->cx_time > 9999999 ? stream->cx_time / 1000 : stream->cx_time,
- stream->cx_time > 9999999 ? "ms" : "us",
- usec_to_fps(stream->cx_time, seen_frames)));
+ FOREACH_STREAM(stream, streams) {
+ fprintf(stderr, "\rPass %d/%d frame %4d/%-4d %7" PRId64 "B %7" PRId64
+ "b/f %7" PRId64
+ "b/s"
+ " %7" PRId64 " %s (%.2f fps)\033[K\n",
+ pass + 1, global.passes, frames_in, stream->frames_out,
+ (int64_t)stream->nbytes,
+ seen_frames ? (int64_t)(stream->nbytes * 8 / seen_frames) : 0,
+ seen_frames
+ ? (int64_t)stream->nbytes * 8 *
+ (int64_t)global.framerate.num / global.framerate.den /
+ seen_frames
+ : 0,
+ stream->cx_time > 9999999 ? stream->cx_time / 1000
+ : stream->cx_time,
+ stream->cx_time > 9999999 ? "ms" : "us",
+ usec_to_fps(stream->cx_time, seen_frames));
+ }
}
if (global.show_psnr) {
if (global.codec->fourcc == AV1_FOURCC) {
- FOREACH_STREAM(
- show_psnr(stream, (1 << stream->config.cfg.g_input_bit_depth) - 1));
+ FOREACH_STREAM(stream, streams) {
+ show_psnr(stream, (1 << stream->config.cfg.g_input_bit_depth) - 1);
+ }
} else {
- FOREACH_STREAM(show_psnr(stream, 255.0));
+ FOREACH_STREAM(stream, streams) { show_psnr(stream, 255.0); }
}
}
- FOREACH_STREAM(aom_codec_destroy(&stream->encoder));
+ FOREACH_STREAM(stream, streams) { aom_codec_destroy(&stream->encoder); }
if (global.test_decode != TEST_DECODE_OFF) {
- FOREACH_STREAM(aom_codec_destroy(&stream->decoder));
+ FOREACH_STREAM(stream, streams) { aom_codec_destroy(&stream->decoder); }
}
close_input_file(&input);
if (global.test_decode == TEST_DECODE_FATAL) {
- FOREACH_STREAM(res |= stream->mismatch_seen);
+ FOREACH_STREAM(stream, streams) { res |= stream->mismatch_seen; }
+ }
+ FOREACH_STREAM(stream, streams) {
+ close_output_file(stream, global.codec->fourcc);
}
- FOREACH_STREAM(close_output_file(stream, global.codec->fourcc));
- FOREACH_STREAM(stats_close(&stream->stats, global.passes - 1));
+ FOREACH_STREAM(stream, streams) {
+ stats_close(&stream->stats, global.passes - 1);
+ }
#if CONFIG_FP_MB_STATS
- FOREACH_STREAM(stats_close(&stream->fpmb_stats, global.passes - 1));
+ FOREACH_STREAM(stream, streams) {
+ stats_close(&stream->fpmb_stats, global.passes - 1);
+ }
#endif
if (global.pass) break;
}
- if (global.show_q_hist_buckets)
- FOREACH_STREAM(
- show_q_histogram(stream->counts, global.show_q_hist_buckets));
+ if (global.show_q_hist_buckets) {
+ FOREACH_STREAM(stream, streams) {
+ show_q_histogram(stream->counts, global.show_q_hist_buckets);
+ }
+ }
- if (global.show_rate_hist_buckets)
- FOREACH_STREAM(show_rate_histogram(stream->rate_hist, &stream->config.cfg,
- global.show_rate_hist_buckets));
- FOREACH_STREAM(destroy_rate_histogram(stream->rate_hist));
+ if (global.show_rate_hist_buckets) {
+ FOREACH_STREAM(stream, streams) {
+ show_rate_histogram(stream->rate_hist, &stream->config.cfg,
+ global.show_rate_hist_buckets);
+ }
+ }
+ FOREACH_STREAM(stream, streams) { destroy_rate_histogram(stream->rate_hist); }
#if CONFIG_INTERNAL_STATS
/* TODO(jkoleszar): This doesn't belong in this executable. Do it for now,
* to match some existing utilities.
*/
- if (!(global.pass == 1 && global.passes == 2))
- FOREACH_STREAM({
+ if (!(global.pass == 1 && global.passes == 2)) {
+ FOREACH_STREAM(stream, streams) {
FILE *f = fopen("opsnr.stt", "a");
if (stream->mismatch_seen) {
fprintf(f, "First mismatch occurred in frame %d\n",
@@ -2124,7 +2201,8 @@ int main(int argc, const char **argv_) {
fprintf(f, "No mismatch detected in recon buffers\n");
}
fclose(f);
- });
+ }
+ }
#endif
#if CONFIG_HIGHBITDEPTH