X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=examples%2Fvpx_temporal_svc_encoder.c;h=309a2fe2e2b23b9b3fa406f1ec0207f853bec6ea;hb=63f7e131fe32853825dd1932cf748115f79db407;hp=e6c09fb713d447989a3e517f6e1690cc72a1188f;hpb=9dfec135a69b9ebafbaf7b28d33e46797828d7de;p=libvpx diff --git a/examples/vpx_temporal_svc_encoder.c b/examples/vpx_temporal_svc_encoder.c index e6c09fb71..309a2fe2e 100644 --- a/examples/vpx_temporal_svc_encoder.c +++ b/examples/vpx_temporal_svc_encoder.c @@ -28,9 +28,7 @@ static const char *exec_name; -void usage_exit(void) { - exit(EXIT_FAILURE); -} +void usage_exit(void) { exit(EXIT_FAILURE); } // Denoiser states, for temporal denoising. enum denoiserState { @@ -41,7 +39,7 @@ enum denoiserState { kDenoiserOnAdaptive }; -static int mode_to_num_layers[13] = {1, 2, 2, 3, 3, 3, 3, 5, 2, 3, 3, 3, 3}; +static int mode_to_num_layers[13] = { 1, 2, 2, 3, 3, 3, 3, 5, 2, 3, 3, 3, 3 }; // For rate control encoding stats. struct RateControlMetrics { @@ -86,14 +84,14 @@ 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 * rc->layer_target_bitrate[0] / - rc->layer_framerate[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 * - (rc->layer_target_bitrate[i] - rc->layer_target_bitrate[i - 1]) / - (rc->layer_framerate[i] - rc->layer_framerate[i - 1]); + rc->layer_pfb[i] = 1000.0 * (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; rc->layer_enc_frames[i] = 0; @@ -114,29 +112,31 @@ static void printout_rate_control_summary(struct RateControlMetrics *rc, 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("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); + cfg->ts_number_layers); for (i = 0; i < cfg->ts_number_layers; ++i) { - const int num_dropped = (i > 0) ? - (rc->layer_input_frames[i] - rc->layer_enc_frames[i]) : - (rc->layer_input_frames[i] - rc->layer_enc_frames[i] - 1); + const int num_dropped = + (i > 0) ? (rc->layer_input_frames[i] - rc->layer_enc_frames[i]) + : (rc->layer_input_frames[i] - rc->layer_enc_frames[i] - 1); tot_num_frames += rc->layer_input_frames[i]; rc->layer_encoding_bitrate[i] = 0.001 * rc->layer_framerate[i] * - rc->layer_encoding_bitrate[i] / tot_num_frames; - rc->layer_avg_frame_size[i] = rc->layer_avg_frame_size[i] / - rc->layer_enc_frames[i]; - rc->layer_avg_rate_mismatch[i] = 100.0 * rc->layer_avg_rate_mismatch[i] / - rc->layer_enc_frames[i]; + rc->layer_encoding_bitrate[i] / + tot_num_frames; + rc->layer_avg_frame_size[i] = + rc->layer_avg_frame_size[i] / rc->layer_enc_frames[i]; + 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", 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]); printf("Average rate_mismatch: %f \n", rc->layer_avg_rate_mismatch[i]); - printf("Number of input frames, encoded (non-key) frames, " - "and perc dropped frames: %d %d %f \n", rc->layer_input_frames[i], - rc->layer_enc_frames[i], + printf( + "Number of input frames, encoded (non-key) frames, " + "and perc dropped frames: %d %d %f \n", + rc->layer_input_frames[i], rc->layer_enc_frames[i], 100.0 * num_dropped / rc->layer_input_frames[i]); printf("\n"); } @@ -145,11 +145,10 @@ static void printout_rate_control_summary(struct RateControlMetrics *rc, 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); + 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), + 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"); @@ -167,20 +166,20 @@ static void set_temporal_layer_pattern(int layering_mode, switch (layering_mode) { case 0: { // 1-layer. - int ids[1] = {0}; + int ids[1] = { 0 }; cfg->ts_periodicity = 1; *flag_periodicity = 1; cfg->ts_number_layers = 1; cfg->ts_rate_decimator[0] = 1; memcpy(cfg->ts_layer_id, ids, sizeof(ids)); // Update L only. - layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_UPD_GF | - VP8_EFLAG_NO_UPD_ARF; + layer_flags[0] = + VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; break; } case 1: { // 2-layers, 2-frame period. - int ids[2] = {0, 1}; + int ids[2] = { 0, 1 }; cfg->ts_periodicity = 2; *flag_periodicity = 2; cfg->ts_number_layers = 2; @@ -189,22 +188,24 @@ static void set_temporal_layer_pattern(int layering_mode, memcpy(cfg->ts_layer_id, ids, sizeof(ids)); #if 1 // 0=L, 1=GF, Intra-layer prediction enabled. - layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_UPD_GF | - VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF; - layer_flags[1] = VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST | - VP8_EFLAG_NO_REF_ARF; + layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_REF_ARF; + layer_flags[1] = + VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_REF_ARF; #else - // 0=L, 1=GF, Intra-layer prediction disabled. - layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_UPD_GF | - VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF; + // 0=L, 1=GF, Intra-layer prediction disabled. + layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_REF_ARF; layer_flags[1] = VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST | - VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_REF_LAST; + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_REF_LAST; #endif break; } case 2: { // 2-layers, 3-frame period. - int ids[3] = {0, 1, 1}; + int ids[3] = { 0, 1, 1 }; cfg->ts_periodicity = 3; *flag_periodicity = 3; cfg->ts_number_layers = 2; @@ -212,16 +213,17 @@ static void set_temporal_layer_pattern(int layering_mode, cfg->ts_rate_decimator[1] = 1; memcpy(cfg->ts_layer_id, ids, sizeof(ids)); // 0=L, 1=GF, Intra-layer prediction enabled. - layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | - VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; - layer_flags[1] = - layer_flags[2] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST; + layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF; + layer_flags[1] = layer_flags[2] = + VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_UPD_LAST; break; } case 3: { // 3-layers, 6-frame period. - int ids[6] = {0, 2, 2, 1, 2, 2}; + int ids[6] = { 0, 2, 2, 1, 2, 2 }; cfg->ts_periodicity = 6; *flag_periodicity = 6; cfg->ts_number_layers = 3; @@ -230,19 +232,18 @@ static void set_temporal_layer_pattern(int layering_mode, cfg->ts_rate_decimator[2] = 1; memcpy(cfg->ts_layer_id, ids, sizeof(ids)); // 0=L, 1=GF, 2=ARF, Intra-layer prediction enabled. - layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | - VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; - layer_flags[3] = VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_ARF | - VP8_EFLAG_NO_UPD_LAST; - layer_flags[1] = - layer_flags[2] = - layer_flags[4] = - layer_flags[5] = VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_LAST; + layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF; + layer_flags[3] = + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST; + layer_flags[1] = layer_flags[2] = layer_flags[4] = layer_flags[5] = + VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_LAST; break; } case 4: { // 3-layers, 4-frame period. - int ids[4] = {0, 2, 1, 2}; + int ids[4] = { 0, 2, 1, 2 }; cfg->ts_periodicity = 4; *flag_periodicity = 4; cfg->ts_number_layers = 3; @@ -251,39 +252,41 @@ static void set_temporal_layer_pattern(int layering_mode, cfg->ts_rate_decimator[2] = 1; memcpy(cfg->ts_layer_id, ids, sizeof(ids)); // 0=L, 1=GF, 2=ARF, Intra-layer prediction disabled. - layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | - VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; + layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF; layer_flags[2] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST; - layer_flags[1] = - layer_flags[3] = VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_LAST | - VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; + VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST; + layer_flags[1] = layer_flags[3] = + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF; break; } case 5: { // 3-layers, 4-frame period. - int ids[4] = {0, 2, 1, 2}; + int ids[4] = { 0, 2, 1, 2 }; cfg->ts_periodicity = 4; *flag_periodicity = 4; - cfg->ts_number_layers = 3; + cfg->ts_number_layers = 3; cfg->ts_rate_decimator[0] = 4; cfg->ts_rate_decimator[1] = 2; cfg->ts_rate_decimator[2] = 1; memcpy(cfg->ts_layer_id, ids, sizeof(ids)); // 0=L, 1=GF, 2=ARF, Intra-layer prediction enabled in layer 1, disabled // in layer 2. - layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | - VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; - layer_flags[2] = VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_LAST | + layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF; + layer_flags[2] = + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ARF; + layer_flags[1] = layer_flags[3] = + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; - layer_flags[1] = - layer_flags[3] = VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_LAST | - VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; break; } case 6: { // 3-layers, 4-frame period. - int ids[4] = {0, 2, 1, 2}; + int ids[4] = { 0, 2, 1, 2 }; cfg->ts_periodicity = 4; *flag_periodicity = 4; cfg->ts_number_layers = 3; @@ -292,18 +295,19 @@ static void set_temporal_layer_pattern(int layering_mode, cfg->ts_rate_decimator[2] = 1; memcpy(cfg->ts_layer_id, ids, sizeof(ids)); // 0=L, 1=GF, 2=ARF, Intra-layer prediction enabled. - layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | - VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; - layer_flags[2] = VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_LAST | - VP8_EFLAG_NO_UPD_ARF; - layer_flags[1] = - layer_flags[3] = VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF; + layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF; + layer_flags[2] = + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ARF; + layer_flags[1] = layer_flags[3] = + VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF; break; } case 7: { // NOTE: Probably of academic interest only. // 5-layers, 16-frame period. - int ids[16] = {0, 4, 3, 4, 2, 4, 3, 4, 1, 4, 3, 4, 2, 4, 3, 4}; + int ids[16] = { 0, 4, 3, 4, 2, 4, 3, 4, 1, 4, 3, 4, 2, 4, 3, 4 }; cfg->ts_periodicity = 16; *flag_periodicity = 16; cfg->ts_number_layers = 5; @@ -313,28 +317,21 @@ static void set_temporal_layer_pattern(int layering_mode, cfg->ts_rate_decimator[3] = 2; cfg->ts_rate_decimator[4] = 1; memcpy(cfg->ts_layer_id, ids, sizeof(ids)); - layer_flags[0] = VPX_EFLAG_FORCE_KF; - layer_flags[1] = - layer_flags[3] = - layer_flags[5] = - layer_flags[7] = - layer_flags[9] = - layer_flags[11] = - layer_flags[13] = - layer_flags[15] = VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF | - VP8_EFLAG_NO_UPD_ARF; - layer_flags[2] = - layer_flags[6] = - layer_flags[10] = - layer_flags[14] = VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_GF; - layer_flags[4] = - layer_flags[12] = VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_UPD_ARF; - layer_flags[8] = VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_REF_GF; + layer_flags[0] = VPX_EFLAG_FORCE_KF; + layer_flags[1] = layer_flags[3] = layer_flags[5] = layer_flags[7] = + layer_flags[9] = layer_flags[11] = layer_flags[13] = layer_flags[15] = + VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF; + layer_flags[2] = layer_flags[6] = layer_flags[10] = layer_flags[14] = + VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_GF; + layer_flags[4] = layer_flags[12] = + VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_UPD_ARF; + layer_flags[8] = VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_REF_GF; break; } case 8: { // 2-layers, with sync point at first frame of layer 1. - int ids[2] = {0, 1}; + int ids[2] = { 0, 1 }; cfg->ts_periodicity = 2; *flag_periodicity = 8; cfg->ts_number_layers = 2; @@ -346,17 +343,17 @@ static void set_temporal_layer_pattern(int layering_mode, // key frame. Sync point every 8 frames. // Layer 0: predict from L and ARF, update L and G. - layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | - VP8_EFLAG_NO_UPD_ARF; + layer_flags[0] = + VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_ARF; // Layer 1: sync point: predict from L and ARF, and update G. - layer_flags[1] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_LAST | - VP8_EFLAG_NO_UPD_ARF; + layer_flags[1] = + VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ARF; // Layer 0, predict from L and ARF, update L. - layer_flags[2] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_GF | - VP8_EFLAG_NO_UPD_ARF; + layer_flags[2] = + VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; // Layer 1: predict from L, G and ARF, and update G. layer_flags[3] = VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST | - VP8_EFLAG_NO_UPD_ENTROPY; + VP8_EFLAG_NO_UPD_ENTROPY; // Layer 0. layer_flags[4] = layer_flags[2]; // Layer 1. @@ -365,11 +362,11 @@ static void set_temporal_layer_pattern(int layering_mode, layer_flags[6] = layer_flags[4]; // Layer 1. layer_flags[7] = layer_flags[5]; - break; + break; } case 9: { // 3-layers: Sync points for layer 1 and 2 every 8 frames. - int ids[4] = {0, 2, 1, 2}; + int ids[4] = { 0, 2, 1, 2 }; cfg->ts_periodicity = 4; *flag_periodicity = 8; cfg->ts_number_layers = 3; @@ -378,20 +375,21 @@ static void set_temporal_layer_pattern(int layering_mode, cfg->ts_rate_decimator[2] = 1; memcpy(cfg->ts_layer_id, ids, sizeof(ids)); // 0=L, 1=GF, 2=ARF. - layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | - VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; + layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF; layer_flags[1] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | + VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF; + layer_flags[2] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | + VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ARF; + layer_flags[3] = layer_flags[5] = VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF; - layer_flags[2] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ARF; - layer_flags[3] = - layer_flags[5] = VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF; layer_flags[4] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; - layer_flags[6] = VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_LAST | - VP8_EFLAG_NO_UPD_ARF; + VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; + layer_flags[6] = + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ARF; layer_flags[7] = VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF | - VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_ENTROPY; + VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_ENTROPY; break; } case 10: { @@ -399,7 +397,7 @@ static void set_temporal_layer_pattern(int layering_mode, // and is only updated on key frame. // Sync points for layer 1 and 2 every 8 frames. - int ids[4] = {0, 2, 1, 2}; + int ids[4] = { 0, 2, 1, 2 }; cfg->ts_periodicity = 4; *flag_periodicity = 8; cfg->ts_number_layers = 3; @@ -409,21 +407,21 @@ static void set_temporal_layer_pattern(int layering_mode, memcpy(cfg->ts_layer_id, ids, sizeof(ids)); // 0=L, 1=GF, 2=ARF. // Layer 0: predict from L and ARF; update L and G. - layer_flags[0] = VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_UPD_ARF | - VP8_EFLAG_NO_REF_GF; + layer_flags[0] = + VPX_EFLAG_FORCE_KF | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_REF_GF; // Layer 2: sync point: predict from L and ARF; update none. layer_flags[1] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_GF | - VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST | - VP8_EFLAG_NO_UPD_ENTROPY; + VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST | + VP8_EFLAG_NO_UPD_ENTROPY; // Layer 1: sync point: predict from L and ARF; update G. - layer_flags[2] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_ARF | - VP8_EFLAG_NO_UPD_LAST; + layer_flags[2] = + VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST; // Layer 2: predict from L, G, ARF; update none. layer_flags[3] = VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF | - VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ENTROPY; + VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ENTROPY; // Layer 0: predict from L and ARF; update L. - layer_flags[4] = VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF | - VP8_EFLAG_NO_REF_GF; + layer_flags[4] = + VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_REF_GF; // Layer 2: predict from L, G, ARF; update none. layer_flags[5] = layer_flags[3]; // Layer 1: predict from L, G, ARF; update G. @@ -438,7 +436,7 @@ static void set_temporal_layer_pattern(int layering_mode, // This was added to compare with vp9_spatial_svc_encoder. // 3-layers, 4-frame period. - int ids[4] = {0, 2, 1, 2}; + int ids[4] = { 0, 2, 1, 2 }; cfg->ts_periodicity = 4; *flag_periodicity = 4; cfg->ts_number_layers = 3; @@ -448,20 +446,20 @@ static void set_temporal_layer_pattern(int layering_mode, memcpy(cfg->ts_layer_id, ids, sizeof(ids)); // 0=L, 1=GF, 2=ARF, Intra-layer prediction disabled. layer_flags[0] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; + VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; layer_flags[2] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST; + VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST; layer_flags[1] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF; + VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF; layer_flags[3] = VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF; + VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF; break; } case 12: default: { // 3-layers structure as in case 10, but no sync/refresh points for // layer 1 and 2. - int ids[4] = {0, 2, 1, 2}; + int ids[4] = { 0, 2, 1, 2 }; cfg->ts_periodicity = 4; *flag_periodicity = 8; cfg->ts_number_layers = 3; @@ -471,15 +469,15 @@ static void set_temporal_layer_pattern(int layering_mode, memcpy(cfg->ts_layer_id, ids, sizeof(ids)); // 0=L, 1=GF, 2=ARF. // Layer 0: predict from L and ARF; update L. - layer_flags[0] = VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF | - VP8_EFLAG_NO_REF_GF; + layer_flags[0] = + VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_REF_GF; layer_flags[4] = layer_flags[0]; // Layer 1: predict from L, G, ARF; update G. layer_flags[2] = VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST; layer_flags[6] = layer_flags[2]; // Layer 2: predict from L, G, ARF; update none. layer_flags[1] = VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF | - VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ENTROPY; + VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ENTROPY; layer_flags[3] = layer_flags[1]; layer_flags[5] = layer_flags[1]; layer_flags[7] = layer_flags[1]; @@ -489,7 +487,7 @@ static void set_temporal_layer_pattern(int layering_mode, } int main(int argc, char **argv) { - VpxVideoWriter *outfile[VPX_TS_MAX_LAYERS] = {NULL}; + VpxVideoWriter *outfile[VPX_TS_MAX_LAYERS] = { NULL }; vpx_codec_ctx_t codec; vpx_codec_enc_cfg_t cfg; int frame_cnt = 0; @@ -502,15 +500,15 @@ int main(int argc, char **argv) { int got_data; int flags = 0; unsigned int i; - int pts = 0; // PTS starts at 0. + int pts = 0; // PTS starts at 0. int frame_duration = 1; // 1 timebase tick per frame. int layering_mode = 0; - int layer_flags[VPX_TS_MAX_PERIODICITY] = {0}; + int layer_flags[VPX_TS_MAX_PERIODICITY] = { 0 }; int flag_periodicity = 1; #if VPX_ENCODER_ABI_VERSION > (4 + VPX_CODEC_ABI_VERSION) - vpx_svc_layer_id_t layer_id = {0, 0}; + vpx_svc_layer_id_t layer_id = { 0, 0 }; #else - vpx_svc_layer_id_t layer_id = {0}; + vpx_svc_layer_id_t layer_id = { 0 }; #endif const VpxInterface *encoder = NULL; FILE *infile = NULL; @@ -526,7 +524,7 @@ int main(int argc, char **argv) { #endif // CONFIG_VP9_HIGHBITDEPTH double sum_bitrate = 0.0; double sum_bitrate2 = 0.0; - double framerate = 30.0; + double framerate = 30.0; exec_name = argv[0]; // Check usage and arguments. @@ -534,27 +532,28 @@ int main(int argc, char **argv) { #if CONFIG_VP9_HIGHBITDEPTH die("Usage: %s " " " - " ... \n", argv[0]); + " ... \n", + argv[0]); #else die("Usage: %s " " " - " ... \n", argv[0]); + " ... \n", + argv[0]); #endif // CONFIG_VP9_HIGHBITDEPTH } encoder = get_vpx_encoder_by_name(argv[3]); - if (!encoder) - die("Unsupported codec."); + if (!encoder) die("Unsupported codec."); printf("Using %s\n", vpx_codec_iface_name(encoder->codec_interface())); - width = strtol(argv[4], NULL, 0); - height = strtol(argv[5], NULL, 0); + width = (unsigned int)strtoul(argv[4], NULL, 0); + height = (unsigned int)strtoul(argv[5], NULL, 0); if (width < 16 || width % 2 || height < 16 || height % 2) { die("Invalid resolution: %d x %d", width, height); } - layering_mode = strtol(argv[10], NULL, 0); + layering_mode = (int)strtol(argv[10], NULL, 0); if (layering_mode < 0 || layering_mode > 13) { die("Invalid layering mode (0..12) %s", argv[10]); } @@ -564,7 +563,7 @@ int main(int argc, char **argv) { } #if CONFIG_VP9_HIGHBITDEPTH - switch (strtol(argv[argc-1], NULL, 0)) { + switch (strtol(argv[argc - 1], NULL, 0)) { case 8: bit_depth = VPX_BITS_8; input_bit_depth = 8; @@ -577,13 +576,11 @@ int main(int argc, char **argv) { bit_depth = VPX_BITS_12; input_bit_depth = 12; break; - default: - die("Invalid bit depth (8, 10, 12) %s", argv[argc-1]); + 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)) { + 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 @@ -612,18 +609,17 @@ int main(int argc, char **argv) { #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); + cfg.g_timebase.num = (int)strtol(argv[6], NULL, 0); + cfg.g_timebase.den = (int)strtol(argv[7], NULL, 0); - speed = strtol(argv[8], NULL, 0); + speed = (int)strtol(argv[8], NULL, 0); if (speed < 0) { die("Invalid speed setting: must be positive"); } for (i = min_args_base; - (int)i < min_args_base + mode_to_num_layers[layering_mode]; - ++i) { - rc.layer_target_bitrate[i - 11] = strtol(argv[i], NULL, 0); + (int)i < min_args_base + mode_to_num_layers[layering_mode]; ++i) { + rc.layer_target_bitrate[i - 11] = (int)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) @@ -631,12 +627,11 @@ int main(int argc, char **argv) { } // Real time parameters. - cfg.rc_dropframe_thresh = strtol(argv[9], NULL, 0); + cfg.rc_dropframe_thresh = (unsigned int)strtoul(argv[9], NULL, 0); cfg.rc_end_usage = VPX_CBR; cfg.rc_min_quantizer = 2; cfg.rc_max_quantizer = 56; - if (strncmp(encoder->name, "vp9", 3) == 0) - cfg.rc_max_quantizer = 52; + if (strncmp(encoder->name, "vp9", 3) == 0) cfg.rc_max_quantizer = 52; cfg.rc_undershoot_pct = 50; cfg.rc_overshoot_pct = 50; cfg.rc_buf_initial_sz = 500; @@ -651,7 +646,7 @@ int main(int argc, char **argv) { // Enable error resilient mode. cfg.g_error_resilient = 1; - cfg.g_lag_in_frames = 0; + cfg.g_lag_in_frames = 0; cfg.kf_mode = VPX_KF_AUTO; // Disable automatic keyframe placement. @@ -659,9 +654,7 @@ int main(int argc, char **argv) { cfg.temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS; - set_temporal_layer_pattern(layering_mode, - &cfg, - layer_flags, + set_temporal_layer_pattern(layering_mode, &cfg, layer_flags, &flag_periodicity); set_rate_control_metrics(&rc, &cfg); @@ -688,15 +681,14 @@ int main(int argc, char **argv) { snprintf(file_name, sizeof(file_name), "%s_%d.ivf", argv[2], i); outfile[i] = vpx_video_writer_open(file_name, kContainerIVF, &info); - if (!outfile[i]) - die("Failed to open %s for writing", file_name); + if (!outfile[i]) die("Failed to open %s for writing", file_name); assert(outfile[i] != NULL); } // No spatial layers in this encoder. cfg.ss_number_layers = 1; - // Initialize codec. +// Initialize codec. #if CONFIG_VP9_HIGHBITDEPTH if (vpx_codec_enc_init( &codec, encoder->codec_interface(), &cfg, @@ -712,6 +704,7 @@ int main(int argc, char **argv) { vpx_codec_control(&codec, VP8E_SET_STATIC_THRESHOLD, 1); } else if (strncmp(encoder->name, "vp9", 3) == 0) { vpx_svc_extra_cfg_t svc_params; + memset(&svc_params, 0, sizeof(svc_params)); vpx_codec_control(&codec, VP8E_SET_CPUUSED, speed); vpx_codec_control(&codec, VP9E_SET_AQ_MODE, 3); vpx_codec_control(&codec, VP9E_SET_FRAME_PERIODIC_BOOST, 0); @@ -719,7 +712,7 @@ int main(int argc, char **argv) { vpx_codec_control(&codec, VP8E_SET_STATIC_THRESHOLD, 1); vpx_codec_control(&codec, VP9E_SET_TUNE_CONTENT, 0); vpx_codec_control(&codec, VP9E_SET_TILE_COLUMNS, (cfg.g_threads >> 1)); - if (vpx_codec_control(&codec, VP9E_SET_SVC, layering_mode > 0 ? 1: 0)) + if (vpx_codec_control(&codec, VP9E_SET_SVC, layering_mode > 0 ? 1 : 0)) die_codec(&codec, "Failed to set SVC"); for (i = 0; i < cfg.ts_number_layers; ++i) { svc_params.max_quantizers[i] = cfg.rc_max_quantizer; @@ -760,14 +753,12 @@ int main(int argc, char **argv) { layer_id.temporal_layer_id); } flags = layer_flags[frame_cnt % flag_periodicity]; - if (layering_mode == 0) - flags = 0; + if (layering_mode == 0) flags = 0; frame_avail = vpx_img_read(&raw, infile); - if (frame_avail) - ++rc.layer_input_frames[layer_id.temporal_layer_id]; + if (frame_avail) ++rc.layer_input_frames[layer_id.temporal_layer_id]; vpx_usec_timer_start(&timer); - if (vpx_codec_encode(&codec, frame_avail? &raw : NULL, pts, 1, flags, - VPX_DL_REALTIME)) { + if (vpx_codec_encode(&codec, frame_avail ? &raw : NULL, pts, 1, flags, + VPX_DL_REALTIME)) { die_codec(&codec, "Failed to encode frame"); } vpx_usec_timer_mark(&timer); @@ -777,12 +768,12 @@ int main(int argc, char **argv) { layer_flags[0] &= ~VPX_EFLAG_FORCE_KF; } got_data = 0; - while ( (pkt = vpx_codec_get_cx_data(&codec, &iter)) ) { + while ((pkt = vpx_codec_get_cx_data(&codec, &iter))) { got_data = 1; switch (pkt->kind) { case VPX_CODEC_CX_FRAME_PKT: for (i = cfg.ts_layer_id[frame_cnt % cfg.ts_periodicity]; - i < cfg.ts_number_layers; ++i) { + i < cfg.ts_number_layers; ++i) { vpx_video_writer_write_frame(outfile[i], pkt->data.frame.buf, pkt->data.frame.sz, pts); ++rc.layer_tot_enc_frames[i]; @@ -825,8 +816,7 @@ int main(int argc, char **argv) { } } break; - default: - break; + default: break; } } ++frame_cnt; @@ -836,16 +826,13 @@ int main(int argc, char **argv) { printout_rate_control_summary(&rc, &cfg, frame_cnt); printf("\n"); printf("Frame cnt and encoding time/FPS stats for encoding: %d %f %f \n", - frame_cnt, - 1000 * (float)cx_time / (double)(frame_cnt * 1000000), - 1000000 * (double)frame_cnt / (double)cx_time); + frame_cnt, 1000 * (float)cx_time / (double)(frame_cnt * 1000000), + 1000000 * (double)frame_cnt / (double)cx_time); - if (vpx_codec_destroy(&codec)) - die_codec(&codec, "Failed to destroy codec"); + if (vpx_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec"); // Try to rewrite the output file headers with the actual frame count. - for (i = 0; i < cfg.ts_number_layers; ++i) - vpx_video_writer_close(outfile[i]); + for (i = 0; i < cfg.ts_number_layers; ++i) vpx_video_writer_close(outfile[i]); vpx_img_free(&raw); return EXIT_SUCCESS;