From 5df6c0458555dd03fd5796e9d9342d1394ade446 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 3 Jun 2015 13:52:44 -0700 Subject: [PATCH] Fix to sample encoder: vpx_temporal_svc_encoder.c vp8 uses ts_target_bitrate for layer settings. Change-Id: Ie72477b549051396feebff87a3744fed04366bf4 --- examples/vpx_temporal_svc_encoder.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/examples/vpx_temporal_svc_encoder.c b/examples/vpx_temporal_svc_encoder.c index f39fd1e..a7616f3 100644 --- a/examples/vpx_temporal_svc_encoder.c +++ b/examples/vpx_temporal_svc_encoder.c @@ -70,6 +70,7 @@ struct RateControlMetrics { int window_size; // Number of window measurements. int window_count; + int layer_target_bitrate[VPX_MAX_LAYERS]; }; // Note: these rate control metrics assume only 1 key frame in the @@ -85,13 +86,13 @@ static void set_rate_control_metrics(struct RateControlMetrics *rc, // per-frame-bandwidth, for the rate control encoding stats below. const double framerate = cfg->g_timebase.den / cfg->g_timebase.num; rc->layer_framerate[0] = framerate / cfg->ts_rate_decimator[0]; - rc->layer_pfb[0] = 1000.0 * cfg->layer_target_bitrate[0] / + rc->layer_pfb[0] = 1000.0 * rc->layer_target_bitrate[0] / rc->layer_framerate[0]; for (i = 0; i < cfg->ts_number_layers; ++i) { if (i > 0) { rc->layer_framerate[i] = framerate / cfg->ts_rate_decimator[i]; rc->layer_pfb[i] = 1000.0 * - (cfg->layer_target_bitrate[i] - cfg->layer_target_bitrate[i - 1]) / + (rc->layer_target_bitrate[i] - rc->layer_target_bitrate[i - 1]) / (rc->layer_framerate[i] - rc->layer_framerate[i - 1]); } rc->layer_input_frames[i] = 0; @@ -128,7 +129,7 @@ static void printout_rate_control_summary(struct RateControlMetrics *rc, rc->layer_avg_rate_mismatch[i] = 100.0 * rc->layer_avg_rate_mismatch[i] / rc->layer_enc_frames[i]; printf("For layer#: %d \n", i); - printf("Bitrate (target vs actual): %d %f \n", cfg->layer_target_bitrate[i], + printf("Bitrate (target vs actual): %d %f \n", rc->layer_target_bitrate[i], rc->layer_encoding_bitrate[i]); printf("Average frame size (target vs actual): %f %f \n", rc->layer_pfb[i], rc->layer_avg_frame_size[i]); @@ -597,7 +598,11 @@ int main(int argc, char **argv) { for (i = min_args_base; (int)i < min_args_base + mode_to_num_layers[layering_mode]; ++i) { - cfg.layer_target_bitrate[i - 11] = strtol(argv[i], NULL, 0); + rc.layer_target_bitrate[i - 11] = strtol(argv[i], NULL, 0); + if (strncmp(encoder->name, "vp8", 3) == 0) + cfg.ts_target_bitrate[i - 11] = rc.layer_target_bitrate[i - 11]; + else if (strncmp(encoder->name, "vp9", 3) == 0) + cfg.layer_target_bitrate[i - 11] = rc.layer_target_bitrate[i - 11]; } // Real time parameters. @@ -636,7 +641,7 @@ int main(int argc, char **argv) { // Target bandwidth for the whole stream. // Set to layer_target_bitrate for highest layer (total bitrate). - cfg.rc_target_bitrate = cfg.layer_target_bitrate[cfg.ts_number_layers - 1]; + cfg.rc_target_bitrate = rc.layer_target_bitrate[cfg.ts_number_layers - 1]; // Open input file. if (!(infile = fopen(argv[1], "rb"))) { -- 2.7.4