From 910ca857df5df679839c3ccdf4e5ca97159b1fd2 Mon Sep 17 00:00:00 2001 From: Alex Converse Date: Mon, 12 Jan 2015 16:26:05 -0800 Subject: Allow external resize via vpx_codec_enc_config_set Change-Id: I3d324e2baa4de2d266c5f7ca7b635b62372e90a7 --- test/resize_test.cc | 7 +++++-- vp9/encoder/vp9_encoder.c | 2 ++ vp9/vp9_cx_iface.c | 21 +++++++++++++++++---- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/test/resize_test.cc b/test/resize_test.cc index 9d0c570ae..5c25dc11c 100644 --- a/test/resize_test.cc +++ b/test/resize_test.cc @@ -144,6 +144,7 @@ class ResizeTest : public ::libvpx_test::EncoderTest, TEST_P(ResizeTest, TestExternalResizeWorks) { ResizingVideoSource video; + cfg_.g_lag_in_frames = 0; ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); for (std::vector::const_iterator info = frame_info_list_.begin(); @@ -153,9 +154,9 @@ TEST_P(ResizeTest, TestExternalResizeWorks) { const unsigned int expected_h = ScaleForFrameNumber(frame, kInitialHeight); EXPECT_EQ(expected_w, info->w) - << "Frame " << frame << "had unexpected width"; + << "Frame " << frame << " had unexpected width"; EXPECT_EQ(expected_h, info->h) - << "Frame " << frame << "had unexpected height"; + << "Frame " << frame << " had unexpected height"; } } @@ -261,6 +262,8 @@ TEST_P(ResizeInternalTest, TestInternalResizeWorks) { } VP8_INSTANTIATE_TEST_CASE(ResizeTest, ONE_PASS_TEST_MODES); +VP9_INSTANTIATE_TEST_CASE(ResizeTest, + ::testing::Values(::libvpx_test::kRealTime)); VP9_INSTANTIATE_TEST_CASE(ResizeInternalTest, ::testing::Values(::libvpx_test::kOnePassBest)); } // namespace diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 35fea57f5..c85bf2a0e 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -1312,6 +1312,8 @@ void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) { cm->display_width = cpi->oxcf.width; cm->display_height = cpi->oxcf.height; + cm->width = cpi->oxcf.width; + cm->height = cpi->oxcf.height; if (cpi->initial_width) { // Increasing the size of the frame beyond the first seen frame, or some diff --git a/vp9/vp9_cx_iface.c b/vp9/vp9_cx_iface.c index 46e6e919c..589f0b1bf 100644 --- a/vp9/vp9_cx_iface.c +++ b/vp9/vp9_cx_iface.c @@ -83,6 +83,7 @@ struct vpx_codec_alg_priv { size_t pending_frame_sizes[8]; size_t pending_frame_magnitude; vpx_image_t preview_img; + vpx_enc_frame_flags_t next_frame_flags; vp8_postproc_cfg_t preview_ppcfg; vpx_codec_pkt_list_decl(256) pkt_list; unsigned int fixed_kf_cntr; @@ -524,9 +525,17 @@ static vpx_codec_err_t set_encoder_config( static vpx_codec_err_t encoder_set_config(vpx_codec_alg_priv_t *ctx, const vpx_codec_enc_cfg_t *cfg) { vpx_codec_err_t res; - - if (cfg->g_w != ctx->cfg.g_w || cfg->g_h != ctx->cfg.g_h) - ERROR("Cannot change width or height after initialization"); + int force_key = 0; + + if (cfg->g_w != ctx->cfg.g_w || cfg->g_h != ctx->cfg.g_h) { + if (cfg->g_lag_in_frames > 1 || cfg->g_pass != VPX_RC_ONE_PASS) + ERROR("Cannot change width or height after initialization"); + if ((ctx->cpi->initial_width && (int)cfg->g_w > ctx->cpi->initial_width) || + (ctx->cpi->initial_height && (int)cfg->g_h > ctx->cpi->initial_height)) + ERROR("Cannot increase width or height larger than their initial values"); + if (!valid_ref_frame_size(ctx->cfg.g_w, ctx->cfg.g_h, cfg->g_w, cfg->g_h)) + force_key = 1; + } // Prevent increasing lag_in_frames. This check is stricter than it needs // to be -- the limit is not increasing past the first lag_in_frames @@ -543,6 +552,9 @@ static vpx_codec_err_t encoder_set_config(vpx_codec_alg_priv_t *ctx, vp9_change_config(ctx->cpi, &ctx->oxcf); } + if (force_key) + ctx->next_frame_flags |= VPX_EFLAG_FORCE_KF; + return res; } @@ -955,10 +967,11 @@ static vpx_codec_err_t encoder_encode(vpx_codec_alg_priv_t *ctx, // Store the original flags in to the frame buffer. Will extract the // key frame flag when we actually encode this frame. - if (vp9_receive_raw_frame(cpi, flags, + if (vp9_receive_raw_frame(cpi, flags | ctx->next_frame_flags, &sd, dst_time_stamp, dst_end_time_stamp)) { res = update_error_state(ctx, &cpi->common.error); } + ctx->next_frame_flags = 0; } cx_data = ctx->cx_data; -- cgit v1.2.3