Replace WAIT_UNTIL macros in video_stream_encoder_unittest

Bug: webrtc:381524905
Change-Id: I8515238a0921dd0e0c9ce00eadf12ddcb6dbe87d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/372301
Auto-Submit: Evan Shrubsole <eshr@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43716}
This commit is contained in:
Evan Shrubsole 2025-01-07 11:31:44 +00:00 committed by WebRTC LUCI CQ
parent dde865f5bc
commit f3dafd1d43
2 changed files with 101 additions and 33 deletions

View File

@ -849,6 +849,7 @@ if (rtc_include_tests) {
"../api:fec_controller_api", "../api:fec_controller_api",
"../api:field_trials_view", "../api:field_trials_view",
"../api:frame_generator_api", "../api:frame_generator_api",
"../api:location",
"../api:make_ref_counted", "../api:make_ref_counted",
"../api:mock_fec_controller_override", "../api:mock_fec_controller_override",
"../api:mock_frame_decryptor", "../api:mock_frame_decryptor",
@ -856,12 +857,15 @@ if (rtc_include_tests) {
"../api:mock_video_codec_factory", "../api:mock_video_codec_factory",
"../api:mock_video_decoder", "../api:mock_video_decoder",
"../api:mock_video_encoder", "../api:mock_video_encoder",
"../api:rtc_error_matchers",
"../api:rtp_headers", "../api:rtp_headers",
"../api:rtp_parameters", "../api:rtp_parameters",
"../api:scoped_refptr", "../api:scoped_refptr",
"../api:sequence_checker", "../api:sequence_checker",
"../api:simulated_network_api", "../api:simulated_network_api",
"../api:time_controller", "../api:time_controller",
"../api:video_track_source_constraints",
"../api/adaptation:resource_adaptation_api",
"../api/crypto:options", "../api/crypto:options",
"../api/environment", "../api/environment",
"../api/environment:environment_factory", "../api/environment:environment_factory",
@ -882,15 +886,18 @@ if (rtc_include_tests) {
"../api/video:builtin_video_bitrate_allocator_factory", "../api/video:builtin_video_bitrate_allocator_factory",
"../api/video:encoded_image", "../api/video:encoded_image",
"../api/video:recordable_encoded_frame", "../api/video:recordable_encoded_frame",
"../api/video:render_resolution",
"../api/video:resolution", "../api/video:resolution",
"../api/video:video_adaptation", "../api/video:video_adaptation",
"../api/video:video_bitrate_allocation", "../api/video:video_bitrate_allocation",
"../api/video:video_bitrate_allocator", "../api/video:video_bitrate_allocator",
"../api/video:video_bitrate_allocator_factory", "../api/video:video_bitrate_allocator_factory",
"../api/video:video_codec_constants",
"../api/video:video_frame", "../api/video:video_frame",
"../api/video:video_frame_type", "../api/video:video_frame_type",
"../api/video:video_layers_allocation", "../api/video:video_layers_allocation",
"../api/video:video_rtp_headers", "../api/video:video_rtp_headers",
"../api/video:video_stream_encoder",
"../api/video/test:video_frame_matchers", "../api/video/test:video_frame_matchers",
"../api/video_codecs:scalability_mode", "../api/video_codecs:scalability_mode",
"../api/video_codecs:video_codecs_api", "../api/video_codecs:video_codecs_api",
@ -958,6 +965,7 @@ if (rtc_include_tests) {
"../rtc_base/containers:flat_map", "../rtc_base/containers:flat_map",
"../rtc_base/experiments:alr_experiment", "../rtc_base/experiments:alr_experiment",
"../rtc_base/experiments:encoder_info_settings", "../rtc_base/experiments:encoder_info_settings",
"../rtc_base/experiments:rate_control_settings",
"../rtc_base/synchronization:mutex", "../rtc_base/synchronization:mutex",
"../system_wrappers", "../system_wrappers",
"../system_wrappers:metrics", "../system_wrappers:metrics",
@ -978,13 +986,16 @@ if (rtc_include_tests) {
"../test:test_support", "../test:test_support",
"../test:video_test_common", "../test:video_test_common",
"../test:video_test_constants", "../test:video_test_constants",
"../test:wait_until",
"../test/network:simulated_network", "../test/network:simulated_network",
"../test/time_controller", "../test/time_controller",
"adaptation:video_adaptation",
"config:encoder_config", "config:encoder_config",
"config:streams_config", "config:streams_config",
"config:video_config_tests", "config:video_config_tests",
"corruption_detection:corruption_detection_tests", "corruption_detection:corruption_detection_tests",
"//third_party/abseil-cpp/absl/algorithm:container", "//third_party/abseil-cpp/absl/algorithm:container",
"//third_party/abseil-cpp/absl/container:inlined_vector",
"//third_party/abseil-cpp/absl/functional:any_invocable", "//third_party/abseil-cpp/absl/functional:any_invocable",
"//third_party/abseil-cpp/absl/memory", "//third_party/abseil-cpp/absl/memory",
"//third_party/abseil-cpp/absl/strings", "//third_party/abseil-cpp/absl/strings",

View File

@ -10,64 +10,96 @@
#include "video/video_stream_encoder.h" #include "video/video_stream_encoder.h"
#include <algorithm> #include <algorithm>
#include <cstddef>
#include <cstdint> #include <cstdint>
#include <functional>
#include <limits> #include <limits>
#include <memory> #include <memory>
#include <optional> #include <optional>
#include <tuple> #include <string>
#include <utility> #include <utility>
#include <vector>
#include "absl/memory/memory.h" #include "absl/algorithm/container.h"
#include "absl/container/inlined_vector.h"
#include "absl/functional/any_invocable.h"
#include "absl/types/variant.h" #include "absl/types/variant.h"
#include "api/adaptation/resource.h"
#include "api/array_view.h"
#include "api/environment/environment.h" #include "api/environment/environment.h"
#include "api/environment/environment_factory.h" #include "api/environment/environment_factory.h"
#include "api/field_trials_view.h" #include "api/field_trials_view.h"
#include "api/location.h"
#include "api/make_ref_counted.h"
#include "api/rtp_parameters.h" #include "api/rtp_parameters.h"
#include "api/task_queue/default_task_queue_factory.h" #include "api/scoped_refptr.h"
#include "api/sequence_checker.h"
#include "api/task_queue/task_queue_base.h" #include "api/task_queue/task_queue_base.h"
#include "api/task_queue/task_queue_factory.h" #include "api/task_queue/task_queue_factory.h"
#include "api/test/mock_fec_controller_override.h" #include "api/test/mock_fec_controller_override.h"
#include "api/test/mock_video_encoder.h" #include "api/test/mock_video_encoder.h"
#include "api/test/mock_video_encoder_factory.h" #include "api/test/mock_video_encoder_factory.h"
#include "api/test/rtc_error_matchers.h"
#include "api/test/time_controller.h"
#include "api/units/data_rate.h" #include "api/units/data_rate.h"
#include "api/units/time_delta.h" #include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "api/video/builtin_video_bitrate_allocator_factory.h" #include "api/video/builtin_video_bitrate_allocator_factory.h"
#include "api/video/encoded_image.h" #include "api/video/encoded_image.h"
#include "api/video/i420_buffer.h" #include "api/video/i420_buffer.h"
#include "api/video/nv12_buffer.h" #include "api/video/nv12_buffer.h"
#include "api/video/render_resolution.h"
#include "api/video/resolution.h" #include "api/video/resolution.h"
#include "api/video/video_adaptation_counters.h"
#include "api/video/video_adaptation_reason.h" #include "api/video/video_adaptation_reason.h"
#include "api/video/video_bitrate_allocation.h" #include "api/video/video_bitrate_allocation.h"
#include "api/video/video_bitrate_allocator.h"
#include "api/video/video_bitrate_allocator_factory.h"
#include "api/video/video_codec_constants.h"
#include "api/video/video_codec_type.h"
#include "api/video/video_frame.h"
#include "api/video/video_frame_buffer.h"
#include "api/video/video_frame_type.h"
#include "api/video/video_layers_allocation.h"
#include "api/video/video_rotation.h"
#include "api/video/video_sink_interface.h"
#include "api/video/video_source_interface.h" #include "api/video/video_source_interface.h"
#include "api/video/video_stream_encoder_settings.h"
#include "api/video_codecs/scalability_mode.h"
#include "api/video_codecs/sdp_video_format.h" #include "api/video_codecs/sdp_video_format.h"
#include "api/video_codecs/video_codec.h" #include "api/video_codecs/video_codec.h"
#include "api/video_codecs/video_encoder.h" #include "api/video_codecs/video_encoder.h"
#include "api/video_codecs/vp8_temporal_layers.h" #include "api/video_codecs/vp8_frame_buffer_controller.h"
#include "api/video_codecs/vp8_temporal_layers_factory.h" #include "api/video_codecs/vp8_temporal_layers_factory.h"
#include "api/video_track_source_constraints.h"
#include "call/adaptation/test/fake_adaptation_constraint.h" #include "call/adaptation/test/fake_adaptation_constraint.h"
#include "call/adaptation/test/fake_resource.h" #include "call/adaptation/test/fake_resource.h"
#include "call/adaptation/video_source_restrictions.h"
#include "call/adaptation/video_stream_adapter.h"
#include "call/video_send_stream.h"
#include "common_video/frame_instrumentation_data.h" #include "common_video/frame_instrumentation_data.h"
#include "common_video/h264/h264_common.h" #include "common_video/h264/h264_common.h"
#include "common_video/include/video_frame_buffer.h"
#include "media/base/video_adapter.h" #include "media/base/video_adapter.h"
#include "media/engine/webrtc_video_engine.h" #include "media/engine/webrtc_video_engine.h"
#include "modules/video_coding/codecs/av1/libaom_av1_encoder.h" #include "modules/video_coding/codecs/av1/libaom_av1_encoder.h"
#include "modules/video_coding/codecs/h264/include/h264.h" #include "modules/video_coding/codecs/h264/include/h264.h"
#include "modules/video_coding/codecs/vp8/include/vp8.h" #include "modules/video_coding/codecs/vp8/include/vp8.h"
#include "modules/video_coding/codecs/vp9/include/vp9.h" #include "modules/video_coding/codecs/vp9/include/vp9.h"
#include "modules/video_coding/codecs/vp9/include/vp9_globals.h"
#include "modules/video_coding/codecs/vp9/svc_config.h" #include "modules/video_coding/codecs/vp9/svc_config.h"
#include "modules/video_coding/include/video_codec_interface.h" #include "modules/video_coding/include/video_codec_interface.h"
#include "modules/video_coding/utility/quality_scaler.h" #include "modules/video_coding/include/video_error_codes.h"
#include "modules/video_coding/utility/simulcast_rate_allocator.h" #include "modules/video_coding/utility/simulcast_rate_allocator.h"
#include "modules/video_coding/utility/vp8_constants.h" #include "modules/video_coding/utility/vp8_constants.h"
#include "rtc_base/checks.h"
#include "rtc_base/event.h" #include "rtc_base/event.h"
#include "rtc_base/experiments/encoder_info_settings.h" #include "rtc_base/experiments/encoder_info_settings.h"
#include "rtc_base/gunit.h" #include "rtc_base/experiments/rate_control_settings.h"
#include "rtc_base/logging.h" #include "rtc_base/logging.h"
#include "rtc_base/ref_counted_object.h" #include "rtc_base/ref_counted_object.h"
#include "rtc_base/strings/string_builder.h"
#include "rtc_base/synchronization/mutex.h" #include "rtc_base/synchronization/mutex.h"
#include "rtc_base/thread_annotations.h" #include "rtc_base/thread_annotations.h"
#include "rtc_base/time_utils.h"
#include "system_wrappers/include/metrics.h" #include "system_wrappers/include/metrics.h"
#include "test/encoder_settings.h" #include "test/encoder_settings.h"
#include "test/fake_encoder.h" #include "test/fake_encoder.h"
@ -79,11 +111,14 @@
#include "test/time_controller/simulated_time_controller.h" #include "test/time_controller/simulated_time_controller.h"
#include "test/video_encoder_nullable_proxy_factory.h" #include "test/video_encoder_nullable_proxy_factory.h"
#include "test/video_encoder_proxy_factory.h" #include "test/video_encoder_proxy_factory.h"
#include "video/config/encoder_stream_factory.h" #include "test/wait_until.h"
#include "video/adaptation/overuse_frame_detector.h"
#include "video/config/video_encoder_config.h" #include "video/config/video_encoder_config.h"
#include "video/encoder_bitrate_adjuster.h" #include "video/encoder_bitrate_adjuster.h"
#include "video/frame_cadence_adapter.h" #include "video/frame_cadence_adapter.h"
#include "video/send_statistics_proxy.h" #include "video/send_statistics_proxy.h"
#include "video/video_stream_encoder_interface.h"
#include "video/video_stream_encoder_observer.h"
namespace webrtc { namespace webrtc {
@ -94,6 +129,7 @@ using ::testing::Field;
using ::testing::Ge; using ::testing::Ge;
using ::testing::Gt; using ::testing::Gt;
using ::testing::Invoke; using ::testing::Invoke;
using ::testing::IsTrue;
using ::testing::Le; using ::testing::Le;
using ::testing::Lt; using ::testing::Lt;
using ::testing::Matcher; using ::testing::Matcher;
@ -4480,7 +4516,9 @@ TEST_F(VideoStreamEncoderTest, DropFirstFramesIfBwEstimateIsTooLow) {
int64_t timestamp_ms = kFrameIntervalMs; int64_t timestamp_ms = kFrameIntervalMs;
source.IncomingCapturedFrame(CreateFrame(timestamp_ms, 1280, 720)); source.IncomingCapturedFrame(CreateFrame(timestamp_ms, 1280, 720));
ExpectDroppedFrame(); ExpectDroppedFrame();
EXPECT_TRUE_WAIT(source.sink_wants().max_pixel_count < 1280 * 720, 5000); EXPECT_THAT(WaitUntil([&] { return source.sink_wants().max_pixel_count; },
Lt(1280 * 720)),
IsRtcOk());
// Insert 720p frame. It should be downscaled and encoded. // Insert 720p frame. It should be downscaled and encoded.
timestamp_ms += kFrameIntervalMs; timestamp_ms += kFrameIntervalMs;
@ -5847,8 +5885,10 @@ TEST_F(VideoStreamEncoderTest, DropsFramesAndScalesWhenBitrateIsTooLow) {
ExpectDroppedFrame(); ExpectDroppedFrame();
// Expect the sink_wants to specify a scaled frame. // Expect the sink_wants to specify a scaled frame.
EXPECT_TRUE_WAIT( EXPECT_THAT(
video_source_.sink_wants().max_pixel_count < kWidth * kHeight, 5000); WaitUntil([&] { return video_source_.sink_wants().max_pixel_count; },
Lt(kWidth * kHeight)),
IsRtcOk());
int last_pixel_count = video_source_.sink_wants().max_pixel_count; int last_pixel_count = video_source_.sink_wants().max_pixel_count;
@ -5859,8 +5899,10 @@ TEST_F(VideoStreamEncoderTest, DropsFramesAndScalesWhenBitrateIsTooLow) {
// Expect to drop this frame, the wait should time out. // Expect to drop this frame, the wait should time out.
ExpectDroppedFrame(); ExpectDroppedFrame();
EXPECT_TRUE_WAIT( EXPECT_THAT(
video_source_.sink_wants().max_pixel_count < last_pixel_count, 5000); WaitUntil([&] { return video_source_.sink_wants().max_pixel_count; },
Lt(last_pixel_count)),
IsRtcOk());
video_stream_encoder_->Stop(); video_stream_encoder_->Stop();
} }
@ -5970,8 +6012,10 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenBweDrops) {
ExpectDroppedFrame(); ExpectDroppedFrame();
// Expect the sink_wants to specify a scaled frame. // Expect the sink_wants to specify a scaled frame.
EXPECT_TRUE_WAIT( EXPECT_THAT(
video_source_.sink_wants().max_pixel_count < kWidth * kHeight, 5000); WaitUntil([&] { return video_source_.sink_wants().max_pixel_count; },
Lt(kWidth * kHeight)),
IsRtcOk());
video_stream_encoder_->Stop(); video_stream_encoder_->Stop();
} }
@ -6104,8 +6148,10 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenLayersChange) {
ExpectDroppedFrame(); ExpectDroppedFrame();
// Expect the sink_wants to specify a scaled frame. // Expect the sink_wants to specify a scaled frame.
EXPECT_TRUE_WAIT( EXPECT_THAT(
video_source_.sink_wants().max_pixel_count < kWidth * kHeight, 5000); WaitUntil([&] { return video_source_.sink_wants().max_pixel_count; },
Lt(kWidth * kHeight)),
IsRtcOk());
video_stream_encoder_->Stop(); video_stream_encoder_->Stop();
} }
@ -6167,8 +6213,10 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenSVCLayersChange) {
ExpectDroppedFrame(); ExpectDroppedFrame();
// Expect the sink_wants to specify a scaled frame. // Expect the sink_wants to specify a scaled frame.
EXPECT_TRUE_WAIT( EXPECT_THAT(
video_source_.sink_wants().max_pixel_count < kWidth * kHeight, 5000); WaitUntil([&] { return video_source_.sink_wants().max_pixel_count; },
Lt(kWidth * kHeight)),
IsRtcOk());
video_stream_encoder_->Stop(); video_stream_encoder_->Stop();
} }
@ -6515,8 +6563,10 @@ TEST_P(VideoStreamEncoderInitialFrameDropperTest,
ExpectDroppedFrame(); ExpectDroppedFrame();
// Expect the sink_wants to specify a scaled frame. // Expect the sink_wants to specify a scaled frame.
EXPECT_TRUE_WAIT( EXPECT_THAT(
video_source_.sink_wants().max_pixel_count < kWidth * kHeight, 5000); WaitUntil([&] { return video_source_.sink_wants().max_pixel_count; },
Lt(kWidth * kHeight)),
IsRtcOk());
video_stream_encoder_->Stop(); video_stream_encoder_->Stop();
} }
@ -6560,8 +6610,9 @@ TEST_P(VideoStreamEncoderInitialFrameDropperTest,
video_stream_encoder_->TriggerQualityLow(); video_stream_encoder_->TriggerQualityLow();
// Adaptation has an effect. // Adaptation has an effect.
EXPECT_TRUE_WAIT(source.sink_wants().max_pixel_count < kWidth * kHeight, EXPECT_THAT(WaitUntil([&] { return source.sink_wants().max_pixel_count; },
5000); Lt(kWidth * kHeight)),
IsRtcOk());
// Frame isn't dropped as initial frame dropper is disabled. // Frame isn't dropped as initial frame dropper is disabled.
source.IncomingCapturedFrame( source.IncomingCapturedFrame(
@ -6574,8 +6625,9 @@ TEST_P(VideoStreamEncoderInitialFrameDropperTest,
video_stream_encoder_->TriggerQualityHigh(); video_stream_encoder_->TriggerQualityHigh();
// Adaptation has an effect. // Adaptation has an effect.
EXPECT_TRUE_WAIT(source.sink_wants().max_pixel_count > kWidth * kHeight, EXPECT_THAT(WaitUntil([&] { return source.sink_wants().max_pixel_count; },
5000); Gt(kWidth * kHeight)),
IsRtcOk());
source.IncomingCapturedFrame( source.IncomingCapturedFrame(
CreateFrame(timestamp, captureWidth, captureHeight)); CreateFrame(timestamp, captureWidth, captureHeight));
@ -6615,8 +6667,10 @@ TEST_P(VideoStreamEncoderInitialFrameDropperTest,
ExpectDroppedFrame(); ExpectDroppedFrame();
// Expect sink_wants to specify a scaled frame. // Expect sink_wants to specify a scaled frame.
EXPECT_TRUE_WAIT(video_source_.sink_wants().max_pixel_count < 640 * 360, EXPECT_THAT(
5000); WaitUntil([&] { return video_source_.sink_wants().max_pixel_count; },
Lt(640 * 360)),
IsRtcOk());
video_stream_encoder_->Stop(); video_stream_encoder_->Stop();
} }
@ -6679,8 +6733,11 @@ TEST_F(VideoStreamEncoderTest,
// for the first time. // for the first time.
// TODO(eshr): We should avoid these waits by using threads with simulated // TODO(eshr): We should avoid these waits by using threads with simulated
// time. // time.
EXPECT_TRUE_WAIT(stats_proxy_->GetStats().bw_limited_resolution, EXPECT_THAT(
2000 * 2.5 * 2); WaitUntil([&] { return stats_proxy_->GetStats().bw_limited_resolution; },
IsTrue(),
{.timeout = webrtc::TimeDelta::Millis(2000 * 2.5 * 2)}),
IsRtcOk());
timestamp_ms += kFrameIntervalMs; timestamp_ms += kFrameIntervalMs;
source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
WaitForEncodedFrame(timestamp_ms); WaitForEncodedFrame(timestamp_ms);
@ -8855,7 +8912,7 @@ TEST_F(VideoStreamEncoderTest,
} }
TEST_F(VideoStreamEncoderTest, NormalComplexityWithMoreThanTwoCores) { TEST_F(VideoStreamEncoderTest, NormalComplexityWithMoreThanTwoCores) {
ResetEncoder("VP9", /*num_stream=*/1, /*num_temporal_layers=*/1, ResetEncoder("VP9", /*num_streams=*/1, /*num_temporal_layers=*/1,
/*num_spatial_layers=*/1, /*num_spatial_layers=*/1,
/*screenshare=*/false, /*screenshare=*/false,
kDefaultFramerate, /*allocation_callback_type=*/ kDefaultFramerate, /*allocation_callback_type=*/
@ -8878,7 +8935,7 @@ TEST_F(VideoStreamEncoderTest,
webrtc::test::ScopedKeyValueConfig field_trials( webrtc::test::ScopedKeyValueConfig field_trials(
field_trials_, "WebRTC-VP9-LowTierOptimizations/Disabled/"); field_trials_, "WebRTC-VP9-LowTierOptimizations/Disabled/");
ResetEncoder("VP9", /*num_stream=*/1, /*num_temporal_layers=*/1, ResetEncoder("VP9", /*num_streams=*/1, /*num_temporal_layers=*/1,
/*num_spatial_layers=*/1, /*num_spatial_layers=*/1,
/*screenshare=*/false, /*screenshare=*/false,
kDefaultFramerate, /*allocation_callback_type=*/ kDefaultFramerate, /*allocation_callback_type=*/
@ -8897,7 +8954,7 @@ TEST_F(VideoStreamEncoderTest,
} }
TEST_F(VideoStreamEncoderTest, LowComplexityWithTwoCores) { TEST_F(VideoStreamEncoderTest, LowComplexityWithTwoCores) {
ResetEncoder("VP9", /*num_stream=*/1, /*num_temporal_layers=*/1, ResetEncoder("VP9", /*num_streams=*/1, /*num_temporal_layers=*/1,
/*num_spatial_layers=*/1, /*num_spatial_layers=*/1,
/*screenshare=*/false, /*screenshare=*/false,
kDefaultFramerate, /*allocation_callback_type=*/ kDefaultFramerate, /*allocation_callback_type=*/