Index: source/libvpx/examples/vpx_temporal_svc_encoder.c |
=================================================================== |
--- source/libvpx/examples/vpx_temporal_svc_encoder.c (revision 292608) |
+++ source/libvpx/examples/vpx_temporal_svc_encoder.c (working copy) |
@@ -461,13 +461,27 @@ |
FILE *infile = NULL; |
struct RateControlMetrics rc; |
int64_t cx_time = 0; |
+ const int min_args_base = 11; |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ vpx_bit_depth_t bit_depth = VPX_BITS_8; |
+ int input_bit_depth = 8; |
+ const int min_args = min_args_base + 1; |
+#else |
+ const int min_args = min_args_base; |
+#endif // CONFIG_VP9_HIGHBITDEPTH |
exec_name = argv[0]; |
// Check usage and arguments. |
- if (argc < 11) { |
+ if (argc < min_args) { |
+#if CONFIG_VP9_HIGHBITDEPTH |
die("Usage: %s <infile> <outfile> <codec_type(vp8/vp9)> <width> <height> " |
"<rate_num> <rate_den> <speed> <frame_drop_threshold> <mode> " |
+ "<Rate_0> ... <Rate_nlayers-1> <bit-depth> \n", argv[0]); |
+#else |
+ die("Usage: %s <infile> <outfile> <codec_type(vp8/vp9)> <width> <height> " |
+ "<rate_num> <rate_den> <speed> <frame_drop_threshold> <mode> " |
"<Rate_0> ... <Rate_nlayers-1> \n", argv[0]); |
+#endif // CONFIG_VP9_HIGHBITDEPTH |
} |
encoder = get_vpx_encoder_by_name(argv[3]); |
@@ -487,13 +501,38 @@ |
die("Invalid layering mode (0..12) %s", argv[10]); |
} |
- if (argc != 11 + mode_to_num_layers[layering_mode]) { |
+ if (argc != min_args + mode_to_num_layers[layering_mode]) { |
die("Invalid number of arguments"); |
} |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ switch (strtol(argv[argc-1], NULL, 0)) { |
+ case 8: |
+ bit_depth = VPX_BITS_8; |
+ input_bit_depth = 8; |
+ break; |
+ case 10: |
+ bit_depth = VPX_BITS_10; |
+ input_bit_depth = 10; |
+ break; |
+ case 12: |
+ bit_depth = VPX_BITS_12; |
+ input_bit_depth = 12; |
+ break; |
+ default: |
+ die("Invalid bit depth (8, 10, 12) %s", argv[argc-1]); |
+ } |
+ if (!vpx_img_alloc(&raw, |
+ bit_depth == VPX_BITS_8 ? VPX_IMG_FMT_I420 : |
+ VPX_IMG_FMT_I42016, |
+ width, height, 32)) { |
+ die("Failed to allocate image", width, height); |
+ } |
+#else |
if (!vpx_img_alloc(&raw, VPX_IMG_FMT_I420, width, height, 32)) { |
die("Failed to allocate image", width, height); |
} |
+#endif // CONFIG_VP9_HIGHBITDEPTH |
// Populate encoder configuration. |
res = vpx_codec_enc_config_default(encoder->codec_interface(), &cfg, 0); |
@@ -506,6 +545,14 @@ |
cfg.g_w = width; |
cfg.g_h = height; |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ if (bit_depth != VPX_BITS_8) { |
+ cfg.g_bit_depth = bit_depth; |
+ cfg.g_input_bit_depth = input_bit_depth; |
+ cfg.g_profile = 2; |
+ } |
+#endif // CONFIG_VP9_HIGHBITDEPTH |
+ |
// Timebase format e.g. 30fps: numerator=1, demoninator = 30. |
cfg.g_timebase.num = strtol(argv[6], NULL, 0); |
cfg.g_timebase.den = strtol(argv[7], NULL, 0); |
@@ -515,7 +562,9 @@ |
die("Invalid speed setting: must be positive"); |
} |
- for (i = 11; (int)i < 11 + mode_to_num_layers[layering_mode]; ++i) { |
+ for (i = min_args_base; |
+ (int)i < min_args_base + mode_to_num_layers[layering_mode]; |
+ ++i) { |
cfg.ts_target_bitrate[i - 11] = strtol(argv[i], NULL, 0); |
} |
@@ -576,7 +625,13 @@ |
cfg.ss_number_layers = 1; |
// Initialize codec. |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ if (vpx_codec_enc_init( |
+ &codec, encoder->codec_interface(), &cfg, |
+ bit_depth == VPX_BITS_8 ? 0 : VPX_CODEC_USE_HIGHBITDEPTH)) |
+#else |
if (vpx_codec_enc_init(&codec, encoder->codec_interface(), &cfg, 0)) |
+#endif // CONFIG_VP9_HIGHBITDEPTH |
die_codec(&codec, "Failed to initialize encoder"); |
if (strncmp(encoder->name, "vp8", 3) == 0) { |