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 |