| Index: source/libvpx/vp9/vp9_cx_iface.c
|
| ===================================================================
|
| --- source/libvpx/vp9/vp9_cx_iface.c (revision 293081)
|
| +++ source/libvpx/vp9/vp9_cx_iface.c (working copy)
|
| @@ -33,6 +33,8 @@
|
| vp8e_tuning tuning;
|
| unsigned int cq_level; // constrained quality level
|
| unsigned int rc_max_intra_bitrate_pct;
|
| + unsigned int rc_max_inter_bitrate_pct;
|
| + unsigned int gf_cbr_boost_pct;
|
| unsigned int lossless;
|
| unsigned int frame_parallel_decoding_mode;
|
| AQ_MODE aq_mode;
|
| @@ -54,6 +56,8 @@
|
| VP8_TUNE_PSNR, // tuning
|
| 10, // cq_level
|
| 0, // rc_max_intra_bitrate_pct
|
| + 0, // rc_max_inter_bitrate_pct
|
| + 0, // gf_cbr_boost_pct
|
| 0, // lossless
|
| 0, // frame_parallel_decoding_mode
|
| NO_AQ, // aq_mode
|
| @@ -79,6 +83,7 @@
|
| vp8_postproc_cfg_t preview_ppcfg;
|
| vpx_codec_pkt_list_decl(256) pkt_list;
|
| unsigned int fixed_kf_cntr;
|
| + vpx_codec_priv_output_cx_pkt_cb_pair_t output_cx_pkt_cb;
|
| };
|
|
|
| static VP9_REFFRAME ref_frame_to_vp9_reframe(vpx_ref_frame_type_t frame) {
|
| @@ -158,8 +163,8 @@
|
| RANGE_CHECK(cfg, g_pass, VPX_RC_ONE_PASS, VPX_RC_LAST_PASS);
|
|
|
| if (cfg->rc_resize_allowed == 1) {
|
| - RANGE_CHECK(cfg, rc_scaled_width, 1, cfg->g_w);
|
| - RANGE_CHECK(cfg, rc_scaled_height, 1, cfg->g_h);
|
| + RANGE_CHECK(cfg, rc_scaled_width, 0, cfg->g_w);
|
| + RANGE_CHECK(cfg, rc_scaled_height, 0, cfg->g_h);
|
| }
|
|
|
| RANGE_CHECK(cfg, ss_number_layers, 1, VPX_SS_MAX_LAYERS);
|
| @@ -202,7 +207,7 @@
|
| ERROR("kf_min_dist not supported in auto mode, use 0 "
|
| "or kf_max_dist instead.");
|
|
|
| - RANGE_CHECK_BOOL(extra_cfg, enable_auto_alt_ref);
|
| + RANGE_CHECK(extra_cfg, enable_auto_alt_ref, 0, 2);
|
| RANGE_CHECK(extra_cfg, cpu_used, -16, 16);
|
| RANGE_CHECK_HI(extra_cfg, noise_sensitivity, 6);
|
| RANGE_CHECK(extra_cfg, tile_columns, 0, 6);
|
| @@ -380,6 +385,8 @@
|
| // Convert target bandwidth from Kbit/s to Bit/s
|
| oxcf->target_bandwidth = 1000 * cfg->rc_target_bitrate;
|
| oxcf->rc_max_intra_bitrate_pct = extra_cfg->rc_max_intra_bitrate_pct;
|
| + oxcf->rc_max_inter_bitrate_pct = extra_cfg->rc_max_inter_bitrate_pct;
|
| + oxcf->gf_cbr_boost_pct = extra_cfg->gf_cbr_boost_pct;
|
|
|
| oxcf->best_allowed_q =
|
| extra_cfg->lossless ? 0 : vp9_quantizer_to_qindex(cfg->rc_min_quantizer);
|
| @@ -391,9 +398,15 @@
|
| oxcf->under_shoot_pct = cfg->rc_undershoot_pct;
|
| oxcf->over_shoot_pct = cfg->rc_overshoot_pct;
|
|
|
| - oxcf->allow_spatial_resampling = cfg->rc_resize_allowed;
|
| - oxcf->scaled_frame_width = cfg->rc_scaled_width;
|
| - oxcf->scaled_frame_height = cfg->rc_scaled_height;
|
| + oxcf->scaled_frame_width = cfg->rc_scaled_width;
|
| + oxcf->scaled_frame_height = cfg->rc_scaled_height;
|
| + if (cfg->rc_resize_allowed == 1) {
|
| + oxcf->resize_mode =
|
| + (oxcf->scaled_frame_width == 0 || oxcf->scaled_frame_height == 0) ?
|
| + RESIZE_DYNAMIC : RESIZE_FIXED;
|
| + } else {
|
| + oxcf->resize_mode = RESIZE_NONE;
|
| + }
|
|
|
| oxcf->maximum_buffer_size_ms = is_vbr ? 240000 : cfg->rc_buf_sz;
|
| oxcf->starting_buffer_level_ms = is_vbr ? 60000 : cfg->rc_buf_initial_sz;
|
| @@ -412,7 +425,7 @@
|
|
|
| oxcf->speed = abs(extra_cfg->cpu_used);
|
| oxcf->encode_breakout = extra_cfg->static_thresh;
|
| - oxcf->play_alternate = extra_cfg->enable_auto_alt_ref;
|
| + oxcf->enable_auto_arf = extra_cfg->enable_auto_alt_ref;
|
| oxcf->noise_sensitivity = extra_cfg->noise_sensitivity;
|
| oxcf->sharpness = extra_cfg->sharpness;
|
|
|
| @@ -445,13 +458,13 @@
|
| for (i = 0; i < VPX_SS_MAX_LAYERS; ++i) {
|
| oxcf->ss_target_bitrate[i] = 1000 * cfg->ss_target_bitrate[i];
|
| #if CONFIG_SPATIAL_SVC
|
| - oxcf->ss_play_alternate[i] = cfg->ss_enable_auto_alt_ref[i];
|
| + oxcf->ss_enable_auto_arf[i] = cfg->ss_enable_auto_alt_ref[i];
|
| #endif
|
| }
|
| } else if (oxcf->ss_number_layers == 1) {
|
| oxcf->ss_target_bitrate[0] = (int)oxcf->target_bandwidth;
|
| #if CONFIG_SPATIAL_SVC
|
| - oxcf->ss_play_alternate[0] = extra_cfg->enable_auto_alt_ref;
|
| + oxcf->ss_enable_auto_arf[0] = extra_cfg->enable_auto_alt_ref;
|
| #endif
|
| }
|
|
|
| @@ -493,7 +506,7 @@
|
| printf("two_pass_vbrmin_section: %d\n", oxcf->two_pass_vbrmin_section);
|
| printf("two_pass_vbrmax_section: %d\n", oxcf->two_pass_vbrmax_section);
|
| printf("lag_in_frames: %d\n", oxcf->lag_in_frames);
|
| - printf("play_alternate: %d\n", oxcf->play_alternate);
|
| + printf("enable_auto_arf: %d\n", oxcf->enable_auto_arf);
|
| printf("Version: %d\n", oxcf->Version);
|
| printf("encode_breakout: %d\n", oxcf->encode_breakout);
|
| printf("error resilient: %d\n", oxcf->error_resilient_mode);
|
| @@ -649,6 +662,22 @@
|
| return update_extra_cfg(ctx, &extra_cfg);
|
| }
|
|
|
| +static vpx_codec_err_t ctrl_set_rc_max_inter_bitrate_pct(
|
| + vpx_codec_alg_priv_t *ctx, va_list args) {
|
| + struct vp9_extracfg extra_cfg = ctx->extra_cfg;
|
| + extra_cfg.rc_max_inter_bitrate_pct =
|
| + CAST(VP8E_SET_MAX_INTER_BITRATE_PCT, args);
|
| + return update_extra_cfg(ctx, &extra_cfg);
|
| +}
|
| +
|
| +static vpx_codec_err_t ctrl_set_rc_gf_cbr_boost_pct(
|
| + vpx_codec_alg_priv_t *ctx, va_list args) {
|
| + struct vp9_extracfg extra_cfg = ctx->extra_cfg;
|
| + extra_cfg.gf_cbr_boost_pct =
|
| + CAST(VP8E_SET_GF_CBR_BOOST_PCT, args);
|
| + return update_extra_cfg(ctx, &extra_cfg);
|
| +}
|
| +
|
| static vpx_codec_err_t ctrl_set_lossless(vpx_codec_alg_priv_t *ctx,
|
| va_list args) {
|
| struct vp9_extracfg extra_cfg = ctx->extra_cfg;
|
| @@ -972,6 +1001,24 @@
|
| ctx->pending_frame_magnitude |= size;
|
| cx_data += size;
|
| cx_data_sz -= size;
|
| +
|
| + if (ctx->output_cx_pkt_cb.output_cx_pkt) {
|
| + pkt.kind = VPX_CODEC_CX_FRAME_PKT;
|
| + pkt.data.frame.pts = ticks_to_timebase_units(timebase,
|
| + dst_time_stamp);
|
| + pkt.data.frame.duration =
|
| + (unsigned long)ticks_to_timebase_units(timebase,
|
| + dst_end_time_stamp - dst_time_stamp);
|
| + pkt.data.frame.flags = get_frame_pkt_flags(cpi, lib_flags);
|
| + pkt.data.frame.buf = ctx->pending_cx_data;
|
| + pkt.data.frame.sz = size;
|
| + ctx->pending_cx_data = NULL;
|
| + ctx->pending_cx_data_sz = 0;
|
| + ctx->pending_frame_count = 0;
|
| + ctx->pending_frame_magnitude = 0;
|
| + ctx->output_cx_pkt_cb.output_cx_pkt(
|
| + &pkt, ctx->output_cx_pkt_cb.user_priv);
|
| + }
|
| continue;
|
| }
|
|
|
| @@ -987,7 +1034,9 @@
|
| ctx->pending_frame_sizes[ctx->pending_frame_count++] = size;
|
| ctx->pending_frame_magnitude |= size;
|
| ctx->pending_cx_data_sz += size;
|
| - size += write_superframe_index(ctx);
|
| + // write the superframe only for the case when
|
| + if (!ctx->output_cx_pkt_cb.output_cx_pkt)
|
| + size += write_superframe_index(ctx);
|
| pkt.data.frame.buf = ctx->pending_cx_data;
|
| pkt.data.frame.sz = ctx->pending_cx_data_sz;
|
| ctx->pending_cx_data = NULL;
|
| @@ -999,11 +1048,16 @@
|
| pkt.data.frame.sz = size;
|
| }
|
| pkt.data.frame.partition_id = -1;
|
| - vpx_codec_pkt_list_add(&ctx->pkt_list.head, &pkt);
|
| +
|
| + if(ctx->output_cx_pkt_cb.output_cx_pkt)
|
| + ctx->output_cx_pkt_cb.output_cx_pkt(&pkt, ctx->output_cx_pkt_cb.user_priv);
|
| + else
|
| + vpx_codec_pkt_list_add(&ctx->pkt_list.head, &pkt);
|
| +
|
| cx_data += size;
|
| cx_data_sz -= size;
|
| #if CONFIG_SPATIAL_SVC
|
| - if (is_two_pass_svc(cpi)) {
|
| + if (is_two_pass_svc(cpi) && !ctx->output_cx_pkt_cb.output_cx_pkt) {
|
| vpx_codec_cx_pkt_t pkt_sizes, pkt_psnr;
|
| int i;
|
| vp9_zero(pkt_sizes);
|
| @@ -1016,7 +1070,9 @@
|
| pkt_psnr.data.layer_psnr[i] = lc->psnr_pkt;
|
| lc->layer_size = 0;
|
| }
|
| +
|
| vpx_codec_pkt_list_add(&ctx->pkt_list.head, &pkt_sizes);
|
| +
|
| vpx_codec_pkt_list_add(&ctx->pkt_list.head, &pkt_psnr);
|
| }
|
| #endif
|
| @@ -1217,6 +1273,18 @@
|
| return VPX_CODEC_OK;
|
| }
|
|
|
| +static vpx_codec_err_t ctrl_get_svc_layer_id(vpx_codec_alg_priv_t *ctx,
|
| + va_list args) {
|
| + vpx_svc_layer_id_t *data = va_arg(args, vpx_svc_layer_id_t *);
|
| + VP9_COMP *const cpi = (VP9_COMP *)ctx->cpi;
|
| + SVC *const svc = &cpi->svc;
|
| +
|
| + data->spatial_layer_id = svc->spatial_layer_id;
|
| + data->temporal_layer_id = svc->temporal_layer_id;
|
| +
|
| + return VPX_CODEC_OK;
|
| +}
|
| +
|
| static vpx_codec_err_t ctrl_set_svc_parameters(vpx_codec_alg_priv_t *ctx,
|
| va_list args) {
|
| VP9_COMP *const cpi = ctx->cpi;
|
| @@ -1235,6 +1303,16 @@
|
| return VPX_CODEC_OK;
|
| }
|
|
|
| +static vpx_codec_err_t ctrl_register_cx_callback(vpx_codec_alg_priv_t *ctx,
|
| + va_list args) {
|
| + vpx_codec_priv_output_cx_pkt_cb_pair_t *cbp =
|
| + (vpx_codec_priv_output_cx_pkt_cb_pair_t *)va_arg(args, void *);
|
| + ctx->output_cx_pkt_cb.output_cx_pkt = cbp->output_cx_pkt;
|
| + ctx->output_cx_pkt_cb.user_priv = cbp->user_priv;
|
| +
|
| + return VPX_CODEC_OK;
|
| +}
|
| +
|
| static vpx_codec_err_t ctrl_set_tune_content(vpx_codec_alg_priv_t *ctx,
|
| va_list args) {
|
| struct vp9_extracfg extra_cfg = ctx->extra_cfg;
|
| @@ -1266,6 +1344,8 @@
|
| {VP8E_SET_TUNING, ctrl_set_tuning},
|
| {VP8E_SET_CQ_LEVEL, ctrl_set_cq_level},
|
| {VP8E_SET_MAX_INTRA_BITRATE_PCT, ctrl_set_rc_max_intra_bitrate_pct},
|
| + {VP8E_SET_MAX_INTER_BITRATE_PCT, ctrl_set_rc_max_inter_bitrate_pct},
|
| + {VP8E_SET_GF_CBR_BOOST_PCT, ctrl_set_rc_gf_cbr_boost_pct},
|
| {VP9E_SET_LOSSLESS, ctrl_set_lossless},
|
| {VP9E_SET_FRAME_PARALLEL_DECODING, ctrl_set_frame_parallel_decoding_mode},
|
| {VP9E_SET_AQ_MODE, ctrl_set_aq_mode},
|
| @@ -1272,6 +1352,7 @@
|
| {VP9E_SET_FRAME_PERIODIC_BOOST, ctrl_set_frame_periodic_boost},
|
| {VP9E_SET_SVC, ctrl_set_svc},
|
| {VP9E_SET_SVC_PARAMETERS, ctrl_set_svc_parameters},
|
| + {VP9E_REGISTER_CX_CALLBACK, ctrl_register_cx_callback},
|
| {VP9E_SET_SVC_LAYER_ID, ctrl_set_svc_layer_id},
|
| {VP9E_SET_TUNE_CONTENT, ctrl_set_tune_content},
|
| {VP9E_SET_NOISE_SENSITIVITY, ctrl_set_noise_sensitivity},
|
| @@ -1280,6 +1361,7 @@
|
| {VP8E_GET_LAST_QUANTIZER, ctrl_get_quantizer},
|
| {VP8E_GET_LAST_QUANTIZER_64, ctrl_get_quantizer64},
|
| {VP9_GET_REFERENCE, ctrl_get_reference},
|
| + {VP9E_GET_SVC_LAYER_ID, ctrl_get_svc_layer_id},
|
|
|
| { -1, NULL},
|
| };
|
| @@ -1307,8 +1389,8 @@
|
|
|
| 0, // rc_dropframe_thresh
|
| 0, // rc_resize_allowed
|
| - 1, // rc_scaled_width
|
| - 1, // rc_scaled_height
|
| + 0, // rc_scaled_width
|
| + 0, // rc_scaled_height
|
| 60, // rc_resize_down_thresold
|
| 30, // rc_resize_up_thresold
|
|
|
|
|