| Index: source/libvpx/examples/vpx_temporal_svc_encoder.c
|
| ===================================================================
|
| --- source/libvpx/examples/vpx_temporal_svc_encoder.c (revision 293081)
|
| +++ source/libvpx/examples/vpx_temporal_svc_encoder.c (working copy)
|
| @@ -61,6 +61,15 @@
|
| double layer_avg_rate_mismatch[VPX_TS_MAX_LAYERS];
|
| // Actual encoding bitrate per layer (cumulative).
|
| double layer_encoding_bitrate[VPX_TS_MAX_LAYERS];
|
| + // Average of the short-time encoder actual bitrate.
|
| + // TODO(marpan): Should we add these short-time stats for each layer?
|
| + double avg_st_encoding_bitrate;
|
| + // Variance of the short-time encoder actual bitrate.
|
| + double variance_st_encoding_bitrate;
|
| + // Window (number of frames) for computing short-timee encoding bitrate.
|
| + int window_size;
|
| + // Number of window measurements.
|
| + int window_count;
|
| };
|
|
|
| // Note: these rate control metrics assume only 1 key frame in the
|
| @@ -92,6 +101,10 @@
|
| rc->layer_avg_frame_size[i] = 0.0;
|
| rc->layer_avg_rate_mismatch[i] = 0.0;
|
| }
|
| + rc->window_count = 0;
|
| + rc->window_size = 15;
|
| + rc->avg_st_encoding_bitrate = 0.0;
|
| + rc->variance_st_encoding_bitrate = 0.0;
|
| }
|
|
|
| static void printout_rate_control_summary(struct RateControlMetrics *rc,
|
| @@ -99,6 +112,7 @@
|
| int frame_cnt) {
|
| unsigned int i = 0;
|
| int tot_num_frames = 0;
|
| + double perc_fluctuation = 0.0;
|
| printf("Total number of processed frames: %d\n\n", frame_cnt -1);
|
| printf("Rate control layer stats for %d layer(s):\n\n",
|
| cfg->ts_number_layers);
|
| @@ -125,6 +139,17 @@
|
| 100.0 * num_dropped / rc->layer_input_frames[i]);
|
| printf("\n");
|
| }
|
| + rc->avg_st_encoding_bitrate = rc->avg_st_encoding_bitrate / rc->window_count;
|
| + rc->variance_st_encoding_bitrate =
|
| + rc->variance_st_encoding_bitrate / rc->window_count -
|
| + (rc->avg_st_encoding_bitrate * rc->avg_st_encoding_bitrate);
|
| + perc_fluctuation = 100.0 * sqrt(rc->variance_st_encoding_bitrate) /
|
| + rc->avg_st_encoding_bitrate;
|
| + printf("Short-time stats, for window of %d frames: \n",rc->window_size);
|
| + printf("Average, rms-variance, and percent-fluct: %f %f %f \n",
|
| + rc->avg_st_encoding_bitrate,
|
| + sqrt(rc->variance_st_encoding_bitrate),
|
| + perc_fluctuation);
|
| if ((frame_cnt - 1) != tot_num_frames)
|
| die("Error: Number of input frames not equal to output! \n");
|
| }
|
| @@ -469,6 +494,9 @@
|
| #else
|
| const int min_args = min_args_base;
|
| #endif // CONFIG_VP9_HIGHBITDEPTH
|
| + double sum_bitrate = 0.0;
|
| + double sum_bitrate2 = 0.0;
|
| + double framerate = 30.0;
|
|
|
| exec_name = argv[0];
|
| // Check usage and arguments.
|
| @@ -604,6 +632,7 @@
|
| die("Failed to open %s for reading", argv[1]);
|
| }
|
|
|
| + framerate = cfg.g_timebase.den / cfg.g_timebase.num;
|
| // Open an output file for each stream.
|
| for (i = 0; i < cfg.ts_number_layers; ++i) {
|
| char file_name[PATH_MAX];
|
| @@ -652,7 +681,7 @@
|
| // For generating smaller key frames, use a smaller max_intra_size_pct
|
| // value, like 100 or 200.
|
| {
|
| - const int max_intra_size_pct = 200;
|
| + const int max_intra_size_pct = 900;
|
| vpx_codec_control(&codec, VP8E_SET_MAX_INTRA_BITRATE_PCT,
|
| max_intra_size_pct);
|
| }
|
| @@ -705,6 +734,33 @@
|
| ++rc.layer_enc_frames[i];
|
| }
|
| }
|
| + // Update for short-time encoding bitrate states, for moving window
|
| + // of size rc->window, shifted by rc->window / 2.
|
| + // Ignore first window segment, due to key frame.
|
| + if (frame_cnt > rc.window_size) {
|
| + sum_bitrate += 0.001 * 8.0 * pkt->data.frame.sz * framerate;
|
| + if (frame_cnt % rc.window_size == 0) {
|
| + rc.window_count += 1;
|
| + rc.avg_st_encoding_bitrate += sum_bitrate / rc.window_size;
|
| + rc.variance_st_encoding_bitrate +=
|
| + (sum_bitrate / rc.window_size) *
|
| + (sum_bitrate / rc.window_size);
|
| + sum_bitrate = 0.0;
|
| + }
|
| + }
|
| + // Second shifted window.
|
| + if (frame_cnt > rc.window_size + rc.window_size / 2) {
|
| + sum_bitrate2 += 0.001 * 8.0 * pkt->data.frame.sz * framerate;
|
| + if (frame_cnt > 2 * rc.window_size &&
|
| + frame_cnt % rc.window_size == 0) {
|
| + rc.window_count += 1;
|
| + rc.avg_st_encoding_bitrate += sum_bitrate2 / rc.window_size;
|
| + rc.variance_st_encoding_bitrate +=
|
| + (sum_bitrate2 / rc.window_size) *
|
| + (sum_bitrate2 / rc.window_size);
|
| + sum_bitrate2 = 0.0;
|
| + }
|
| + }
|
| break;
|
| default:
|
| break;
|
|
|