Index: source/libvpx/vpxenc.c |
diff --git a/source/libvpx/vpxenc.c b/source/libvpx/vpxenc.c |
index cb9b8fecddcd88b65b823473aa1a41ae4950a407..06604ea0e6664a1fb87c8f23e055e660eee0ef6e 100644 |
--- a/source/libvpx/vpxenc.c |
+++ b/source/libvpx/vpxenc.c |
@@ -32,10 +32,10 @@ |
#include "./ivfenc.h" |
#include "./tools_common.h" |
-#if CONFIG_VP8_ENCODER || CONFIG_VP9_ENCODER |
+#if CONFIG_VP8_ENCODER || CONFIG_VP9_ENCODER || CONFIG_VP10_ENCODER |
#include "vpx/vp8cx.h" |
#endif |
-#if CONFIG_VP8_DECODER || CONFIG_VP9_DECODER |
+#if CONFIG_VP8_DECODER || CONFIG_VP9_DECODER || CONFIG_VP10_DECODER |
#include "vpx/vp8dx.h" |
#endif |
@@ -201,7 +201,7 @@ static const arg_def_t disable_warning_prompt = ARG_DEF( |
"y", "disable-warning-prompt", 0, |
"Display warnings, but do not prompt user to continue."); |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
static const arg_def_t test16bitinternalarg = ARG_DEF( |
NULL, "test-16bit-internal", 0, "Force use of 16 bit internal buffer"); |
#endif |
@@ -211,7 +211,7 @@ static const arg_def_t *main_args[] = { |
&outputfile, &codecarg, &passes, &pass_arg, &fpf_name, &limit, &skip, |
&deadline, &best_dl, &good_dl, &rt_dl, |
&quietarg, &verbosearg, &psnrarg, &use_webm, &use_ivf, &out_part, &q_hist_n, |
- &rate_hist_n, &disable_warnings, &disable_warning_prompt, |
+ &rate_hist_n, &disable_warnings, &disable_warning_prompt, &recontest, |
NULL |
}; |
@@ -251,7 +251,7 @@ static const arg_def_t *global_args[] = { |
#endif |
&timebase, &framerate, |
&error_resilient, |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
&test16bitinternalarg, |
#endif |
&lag_in_frames, NULL |
@@ -374,7 +374,7 @@ static const int vp8_arg_ctrl_map[] = { |
}; |
#endif |
-#if CONFIG_VP9_ENCODER |
+#if CONFIG_VP9_ENCODER || CONFIG_VP10_ENCODER |
static const arg_def_t cpu_used_vp9 = ARG_DEF( |
NULL, "cpu-used", 1, "CPU Used (-8..8)"); |
static const arg_def_t tile_cols = ARG_DEF( |
@@ -419,7 +419,7 @@ 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_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
static const struct arg_enum_list bitdepth_enum[] = { |
{"8", VPX_BITS_8}, |
{"10", VPX_BITS_10}, |
@@ -443,7 +443,9 @@ static const struct arg_enum_list tune_content_enum[] = { |
static const arg_def_t tune_content = ARG_DEF_ENUM( |
NULL, "tune-content", 1, "Tune content type", tune_content_enum); |
+#endif |
+#if CONFIG_VP9_ENCODER |
static const arg_def_t *vp9_args[] = { |
&cpu_used_vp9, &auto_altref, &sharpness, &static_thresh, |
&tile_cols, &tile_rows, &arnr_maxframes, &arnr_strength, &arnr_type, |
@@ -452,9 +454,6 @@ static const arg_def_t *vp9_args[] = { |
&frame_parallel_decoding, &aq_mode, &frame_periodic_boost, |
&noise_sens, &tune_content, &input_color_space, |
&min_gf_interval, &max_gf_interval, |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
- &bitdeptharg, &inbitdeptharg, |
-#endif |
NULL |
}; |
static const int vp9_arg_ctrl_map[] = { |
@@ -472,6 +471,32 @@ static const int vp9_arg_ctrl_map[] = { |
}; |
#endif |
+#if CONFIG_VP10_ENCODER |
+static const arg_def_t *vp10_args[] = { |
+ &cpu_used_vp9, &auto_altref, &sharpness, &static_thresh, |
+ &tile_cols, &tile_rows, &arnr_maxframes, &arnr_strength, &arnr_type, |
+ &tune_ssim, &cq_level, &max_intra_rate_pct, &max_inter_rate_pct, |
+ &gf_cbr_boost_pct, &lossless, |
+ &frame_parallel_decoding, &aq_mode, &frame_periodic_boost, |
+ &noise_sens, &tune_content, &input_color_space, |
+ &min_gf_interval, &max_gf_interval, |
+ NULL |
+}; |
+static const int vp10_arg_ctrl_map[] = { |
+ VP8E_SET_CPUUSED, VP8E_SET_ENABLEAUTOALTREF, |
+ VP8E_SET_SHARPNESS, VP8E_SET_STATIC_THRESHOLD, |
+ VP9E_SET_TILE_COLUMNS, VP9E_SET_TILE_ROWS, |
+ VP8E_SET_ARNR_MAXFRAMES, VP8E_SET_ARNR_STRENGTH, VP8E_SET_ARNR_TYPE, |
+ VP8E_SET_TUNING, VP8E_SET_CQ_LEVEL, VP8E_SET_MAX_INTRA_BITRATE_PCT, |
+ VP9E_SET_MAX_INTER_BITRATE_PCT, VP9E_SET_GF_CBR_BOOST_PCT, |
+ VP9E_SET_LOSSLESS, VP9E_SET_FRAME_PARALLEL_DECODING, VP9E_SET_AQ_MODE, |
+ VP9E_SET_FRAME_PERIODIC_BOOST, VP9E_SET_NOISE_SENSITIVITY, |
+ VP9E_SET_TUNE_CONTENT, VP9E_SET_COLOR_SPACE, |
+ VP9E_SET_MIN_GF_INTERVAL, VP9E_SET_MAX_GF_INTERVAL, |
+ 0 |
+}; |
+#endif |
+ |
static const arg_def_t *no_args[] = { NULL }; |
void usage_exit(void) { |
@@ -499,6 +524,10 @@ void usage_exit(void) { |
fprintf(stderr, "\nVP9 Specific Options:\n"); |
arg_show_usage(stderr, vp9_args); |
#endif |
+#if CONFIG_VP10_ENCODER |
+ fprintf(stderr, "\nVP10 Specific Options:\n"); |
+ arg_show_usage(stderr, vp10_args); |
+#endif |
fprintf(stderr, "\nStream timebase (--timebase):\n" |
" The desired precision of timestamps in the output, expressed\n" |
" in fractional seconds. Default is 1/1000.\n"); |
@@ -519,7 +548,7 @@ void usage_exit(void) { |
#define mmin(a, b) ((a) < (b) ? (a) : (b)) |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
static void find_mismatch_high(const vpx_image_t *const img1, |
const vpx_image_t *const img2, |
int yloc[4], int uloc[4], int vloc[4]) { |
@@ -717,7 +746,7 @@ static int compare_img(const vpx_image_t *const img1, |
match &= (img1->fmt == img2->fmt); |
match &= (img1->d_w == img2->d_w); |
match &= (img1->d_h == img2->d_h); |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
if (img1->fmt & VPX_IMG_FMT_HIGHBITDEPTH) { |
l_w *= 2; |
c_w *= 2; |
@@ -744,14 +773,12 @@ static int compare_img(const vpx_image_t *const img1, |
#define NELEMENTS(x) (sizeof(x)/sizeof(x[0])) |
-#define MAX(x,y) ((x)>(y)?(x):(y)) |
-#if CONFIG_VP8_ENCODER && !CONFIG_VP9_ENCODER |
-#define ARG_CTRL_CNT_MAX NELEMENTS(vp8_arg_ctrl_map) |
-#elif !CONFIG_VP8_ENCODER && CONFIG_VP9_ENCODER |
+#if CONFIG_VP10_ENCODER |
+#define ARG_CTRL_CNT_MAX NELEMENTS(vp10_arg_ctrl_map) |
+#elif CONFIG_VP9_ENCODER |
#define ARG_CTRL_CNT_MAX NELEMENTS(vp9_arg_ctrl_map) |
#else |
-#define ARG_CTRL_CNT_MAX MAX(NELEMENTS(vp8_arg_ctrl_map), \ |
- NELEMENTS(vp9_arg_ctrl_map)) |
+#define ARG_CTRL_CNT_MAX NELEMENTS(vp8_arg_ctrl_map) |
#endif |
#if !CONFIG_WEBM_IO |
@@ -772,7 +799,7 @@ struct stream_config { |
int arg_ctrl_cnt; |
int write_webm; |
int have_kf_max_dist; |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
// whether to use 16bit internal buffers |
int use_16bit_internal; |
#endif |
@@ -916,7 +943,7 @@ static void parse_global_config(struct VpxEncoderConfig *global, char **argv) { |
} |
/* Validate global config */ |
if (global->passes == 0) { |
-#if CONFIG_VP9_ENCODER |
+#if CONFIG_VP9_ENCODER || CONFIG_VP10_ENCODER |
// Make default VP9 passes = 2 until there is a better quality 1-pass |
// encoder |
if (global->codec != NULL && global->codec->name != NULL) |
@@ -1058,7 +1085,7 @@ static int parse_stream_params(struct VpxEncoderConfig *global, |
static const int *ctrl_args_map = NULL; |
struct stream_config *config = &stream->config; |
int eos_mark_found = 0; |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
int test_16bit_internal = 0; |
#endif |
@@ -1074,6 +1101,13 @@ static int parse_stream_params(struct VpxEncoderConfig *global, |
ctrl_args = vp9_args; |
ctrl_args_map = vp9_arg_ctrl_map; |
#endif |
+#if CONFIG_VP10_ENCODER |
+ } else if (strcmp(global->codec->name, "vp10") == 0) { |
+ // TODO(jingning): Reuse VP9 specific encoder configuration parameters. |
+ // Consider to expand this set for VP10 encoder control. |
+ ctrl_args = vp10_args; |
+ ctrl_args_map = vp10_arg_ctrl_map; |
+#endif |
} |
for (argi = argj = argv; (*argj = *argi); argi += arg.argv_step) { |
@@ -1114,7 +1148,7 @@ static int parse_stream_params(struct VpxEncoderConfig *global, |
config->cfg.g_w = arg_parse_uint(&arg); |
} else if (arg_match(&arg, &height, argi)) { |
config->cfg.g_h = arg_parse_uint(&arg); |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
} else if (arg_match(&arg, &bitdeptharg, argi)) { |
config->cfg.g_bit_depth = arg_parse_enum_or_int(&arg); |
} else if (arg_match(&arg, &inbitdeptharg, argi)) { |
@@ -1187,9 +1221,10 @@ static int parse_stream_params(struct VpxEncoderConfig *global, |
config->have_kf_max_dist = 1; |
} else if (arg_match(&arg, &kf_disabled, argi)) { |
config->cfg.kf_mode = VPX_KF_DISABLED; |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
} else if (arg_match(&arg, &test16bitinternalarg, argi)) { |
- if (strcmp(global->codec->name, "vp9") == 0) { |
+ if (strcmp(global->codec->name, "vp9") == 0 || |
+ strcmp(global->codec->name, "vp10") == 0) { |
test_16bit_internal = 1; |
} |
#endif |
@@ -1222,8 +1257,9 @@ static int parse_stream_params(struct VpxEncoderConfig *global, |
argj++; |
} |
} |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
- if (strcmp(global->codec->name, "vp9") == 0) { |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ if (strcmp(global->codec->name, "vp9") == 0 || |
+ strcmp(global->codec->name, "vp10") == 0) { |
config->use_16bit_internal = test_16bit_internal | |
(config->cfg.g_profile > 1); |
} |
@@ -1507,7 +1543,7 @@ static void initialize_encoder(struct stream_state *stream, |
flags |= global->show_psnr ? VPX_CODEC_USE_PSNR : 0; |
flags |= global->out_part ? VPX_CODEC_USE_OUTPUT_PARTITION : 0; |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
flags |= stream->config.use_16bit_internal ? VPX_CODEC_USE_HIGHBITDEPTH : 0; |
#endif |
@@ -1555,7 +1591,7 @@ static void encode_frame(struct stream_state *stream, |
/ cfg->g_timebase.num / global->framerate.num; |
/* Scale if necessary */ |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
if (img) { |
if ((img->fmt & VPX_IMG_FMT_HIGHBITDEPTH) && |
(img->d_w != cfg->g_w || img->d_h != cfg->g_h)) { |
@@ -1806,7 +1842,7 @@ static void test_decode(struct stream_state *stream, |
enc_img = ref_enc.img; |
vpx_codec_control(&stream->decoder, VP9_GET_REFERENCE, &ref_dec); |
dec_img = ref_dec.img; |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
if ((enc_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH) != |
(dec_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH)) { |
if (enc_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH) { |
@@ -1827,7 +1863,7 @@ static void test_decode(struct stream_state *stream, |
if (!compare_img(&enc_img, &dec_img)) { |
int y[4], u[4], v[4]; |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
if (enc_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH) { |
find_mismatch_high(&enc_img, &dec_img, y, u, v); |
} else { |
@@ -1877,7 +1913,7 @@ static void print_time(const char *label, int64_t etl) { |
int main(int argc, const char **argv_) { |
int pass; |
vpx_image_t raw; |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
vpx_image_t raw_shift; |
int allocated_raw_shift = 0; |
int use_16bit_internal = 0; |
@@ -2063,8 +2099,9 @@ int main(int argc, const char **argv_) { |
&input.pixel_aspect_ratio)); |
FOREACH_STREAM(initialize_encoder(stream, &global)); |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
- if (strcmp(global.codec->name, "vp9") == 0) { |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ if (strcmp(global.codec->name, "vp9") == 0 || |
+ strcmp(global.codec->name, "vp10") == 0) { |
// 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. |
@@ -2119,7 +2156,7 @@ int main(int argc, const char **argv_) { |
frame_avail = 0; |
if (frames_in > global.skip_frames) { |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
vpx_image_t *frame_to_encode; |
if (input_shift || (use_16bit_internal && input.bit_depth == 8)) { |
assert(use_16bit_internal); |
@@ -2280,7 +2317,7 @@ int main(int argc, const char **argv_) { |
}); |
#endif |
-#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#if CONFIG_VP9_HIGHBITDEPTH |
if (allocated_raw_shift) |
vpx_img_free(&raw_shift); |
#endif |