From: Tom Finegan Date: Wed, 15 Jun 2016 20:42:59 +0000 (-0700) Subject: Output frames in first pass for VPX_DL_REALTIME. X-Git-Tag: v1.6.0~41 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5a9f21db548f1a3d9b31dfc4f758a0af83bab725;p=libvpx Output frames in first pass for VPX_DL_REALTIME. Since combining VPX_DL_REALTIME with VPX_RC_FIRST_PASS is basically nonsense, ignore the user's pass setting when this happens and behave as if the requested encode is a single pass encode. BUG=webm:1233 Change-Id: I5ee4c4e5838c4ca6d24988890aae490b10826db2 --- diff --git a/test/realtime_test.cc b/test/realtime_test.cc new file mode 100644 index 000000000..c362bdc06 --- /dev/null +++ b/test/realtime_test.cc @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2016 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ +#include "test/codec_factory.h" +#include "test/encode_test_driver.h" +#include "test/util.h" +#include "test/video_source.h" +#include "third_party/googletest/src/include/gtest/gtest.h" + +namespace { + +const int kVideoSourceWidth = 320; +const int kVideoSourceHeight = 240; +const int kFramesToEncode = 2; + +class RealtimeTest + : public ::libvpx_test::EncoderTest, + public ::libvpx_test::CodecTestWithParam { + protected: + RealtimeTest() + : EncoderTest(GET_PARAM(0)), num_decoded_(0), frame_packets_(0) {} + virtual ~RealtimeTest() {} + + virtual void SetUp() { + InitializeConfig(); + cfg_.g_lag_in_frames = 0; + SetMode(::libvpx_test::kRealTime); + } + + virtual void BeginPassHook(unsigned int /*pass*/) { + // TODO(tomfinegan): We're changing the pass value here to make sure + // we get frames when real time mode is combined with |g_pass| set to + // VPX_RC_FIRST_PASS. This is necessary because EncoderTest::RunLoop() sets + // the pass value based on the mode passed into EncoderTest::SetMode(), + // which overrides the one specified in SetUp() above. + cfg_.g_pass = VPX_RC_FIRST_PASS; + } + virtual void FramePktHook(const vpx_codec_cx_pkt_t * /*pkt*/) { + frame_packets_++; + } + virtual void DecompressedFrameHook(const vpx_image_t & /*img*/, + vpx_codec_pts_t /*pts*/) { + num_decoded_++; + } + virtual bool HandleDecodeResult(const vpx_codec_err_t res_dec, + const libvpx_test::VideoSource & /*video*/, + libvpx_test::Decoder *decoder) { + EXPECT_EQ(VPX_CODEC_OK, res_dec) << decoder->DecodeError(); + return !::testing::Test::HasFailure(); + } + + int num_decoded_; + int frame_packets_; +}; + +TEST_P(RealtimeTest, RealtimeFirstPassProducesFrames) { + ::libvpx_test::RandomVideoSource video; + video.SetSize(kVideoSourceWidth, kVideoSourceHeight); + video.set_limit(kFramesToEncode); + ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); + EXPECT_EQ(kFramesToEncode, num_decoded_); + EXPECT_EQ(kFramesToEncode, frame_packets_); +} + +VP8_INSTANTIATE_TEST_CASE(RealtimeTest, + ::testing::Values(::libvpx_test::kRealTime)); +VP9_INSTANTIATE_TEST_CASE(RealtimeTest, + ::testing::Values(::libvpx_test::kRealTime)); + +} // namespace diff --git a/test/test.mk b/test/test.mk index 1eb702fc2..04acd9626 100644 --- a/test/test.mk +++ b/test/test.mk @@ -24,6 +24,7 @@ LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += datarate_test.cc LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += encode_api_test.cc LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += error_resilience_test.cc LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += i420_video_source.h +LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += realtime_test.cc LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += resize_test.cc LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += y4m_video_source.h LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += yuv_video_source.h diff --git a/vp8/vp8_cx_iface.c b/vp8/vp8_cx_iface.c index 75af40a00..b19ab7a23 100644 --- a/vp8/vp8_cx_iface.c +++ b/vp8/vp8_cx_iface.c @@ -786,7 +786,9 @@ static void pick_quickcompress_mode(vpx_codec_alg_priv_t *ctx, new_qc = MODE_REALTIME; #endif - if (ctx->cfg.g_pass == VPX_RC_FIRST_PASS) + if (deadline == VPX_DL_REALTIME) + new_qc = MODE_REALTIME; + else if (ctx->cfg.g_pass == VPX_RC_FIRST_PASS) new_qc = MODE_FIRSTPASS; else if (ctx->cfg.g_pass == VPX_RC_LAST_PASS) new_qc = (new_qc == MODE_BESTQUALITY) diff --git a/vp9/vp9_cx_iface.c b/vp9/vp9_cx_iface.c index 73a089bcf..9ad86cbf8 100644 --- a/vp9/vp9_cx_iface.c +++ b/vp9/vp9_cx_iface.c @@ -905,6 +905,11 @@ static void pick_quickcompress_mode(vpx_codec_alg_priv_t *ctx, break; } + if (deadline == VPX_DL_REALTIME) { + ctx->oxcf.pass = 0; + new_mode = REALTIME; + } + if (ctx->oxcf.mode != new_mode) { ctx->oxcf.mode = new_mode; vp9_change_config(ctx->cpi, &ctx->oxcf);