summaryrefslogtreecommitdiff
path: root/chromium/third_party/webrtc/video/video_send_stream_tests.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/webrtc/video/video_send_stream_tests.cc')
-rw-r--r--chromium/third_party/webrtc/video/video_send_stream_tests.cc154
1 files changed, 69 insertions, 85 deletions
diff --git a/chromium/third_party/webrtc/video/video_send_stream_tests.cc b/chromium/third_party/webrtc/video/video_send_stream_tests.cc
index 53f72de5025..1d4acfcb04f 100644
--- a/chromium/third_party/webrtc/video/video_send_stream_tests.cc
+++ b/chromium/third_party/webrtc/video/video_send_stream_tests.cc
@@ -21,7 +21,7 @@
#include "webrtc/base/platform_thread.h"
#include "webrtc/call.h"
#include "webrtc/call/transport_adapter.h"
-#include "webrtc/frame_callback.h"
+#include "webrtc/common_video/include/frame_callback.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
#include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h"
@@ -32,6 +32,7 @@
#include "webrtc/test/call_test.h"
#include "webrtc/test/configurable_frame_size_encoder.h"
#include "webrtc/test/fake_texture_frame.h"
+#include "webrtc/test/frame_utils.h"
#include "webrtc/test/null_transport.h"
#include "webrtc/test/testsupport/perf_test.h"
#include "webrtc/video/send_statistics_proxy.h"
@@ -42,11 +43,6 @@ namespace webrtc {
enum VideoFormat { kGeneric, kVP8, };
-void ExpectEqualFrames(const VideoFrame& frame1, const VideoFrame& frame2);
-void ExpectEqualTextureFrames(const VideoFrame& frame1,
- const VideoFrame& frame2);
-void ExpectEqualBufferFrames(const VideoFrame& frame1,
- const VideoFrame& frame2);
void ExpectEqualFramesVector(const std::vector<VideoFrame>& frames1,
const std::vector<VideoFrame>& frames2);
VideoFrame CreateVideoFrame(int width, int height, uint8_t data);
@@ -312,11 +308,13 @@ class FecObserver : public test::EndToEndTest {
FecObserver(bool header_extensions_enabled,
bool use_nack,
bool expect_red,
+ bool expect_fec,
const std::string& codec)
: EndToEndTest(VideoSendStreamTest::kDefaultTimeoutMs),
payload_name_(codec),
use_nack_(use_nack),
expect_red_(expect_red),
+ expect_fec_(expect_fec),
send_count_(0),
received_media_(false),
received_fec_(false),
@@ -379,6 +377,7 @@ class FecObserver : public test::EndToEndTest {
if (encapsulated_payload_type != -1) {
if (encapsulated_payload_type ==
VideoSendStreamTest::kUlpfecPayloadType) {
+ EXPECT_TRUE(expect_fec_);
received_fec_ = true;
} else {
received_media_ = true;
@@ -386,7 +385,7 @@ class FecObserver : public test::EndToEndTest {
}
if (send_count_ > 100 && received_media_) {
- if (received_fec_ || !expect_red_)
+ if (received_fec_ || !expect_fec_)
observation_complete_.Set();
}
@@ -446,6 +445,7 @@ class FecObserver : public test::EndToEndTest {
const std::string payload_name_;
const bool use_nack_;
const bool expect_red_;
+ const bool expect_fec_;
int send_count_;
bool received_media_;
bool received_fec_;
@@ -454,12 +454,12 @@ class FecObserver : public test::EndToEndTest {
};
TEST_F(VideoSendStreamTest, SupportsFecWithExtensions) {
- FecObserver test(true, false, true, "VP8");
+ FecObserver test(true, false, true, true, "VP8");
RunBaseTest(&test);
}
TEST_F(VideoSendStreamTest, SupportsFecWithoutExtensions) {
- FecObserver test(false, false, true, "VP8");
+ FecObserver test(false, false, true, true, "VP8");
RunBaseTest(&test);
}
@@ -467,26 +467,28 @@ TEST_F(VideoSendStreamTest, SupportsFecWithoutExtensions) {
// since we'll still have to re-request FEC packets, effectively wasting
// bandwidth since the receiver has to wait for FEC retransmissions to determine
// that the received state is actually decodable.
-TEST_F(VideoSendStreamTest, DoesNotUtilizeRedForH264WithNackEnabled) {
- FecObserver test(false, true, false, "H264");
+TEST_F(VideoSendStreamTest, DoesNotUtilizeFecForH264WithNackEnabled) {
+ FecObserver test(false, true, true, false, "H264");
RunBaseTest(&test);
}
// Without retransmissions FEC for H264 is fine.
TEST_F(VideoSendStreamTest, DoesUtilizeRedForH264WithoutNackEnabled) {
- FecObserver test(false, false, true, "H264");
+ FecObserver test(false, false, true, true, "H264");
RunBaseTest(&test);
}
TEST_F(VideoSendStreamTest, DoesUtilizeRedForVp8WithNackEnabled) {
- FecObserver test(false, true, true, "VP8");
+ FecObserver test(false, true, true, true, "VP8");
RunBaseTest(&test);
}
+#if !defined(RTC_DISABLE_VP9)
TEST_F(VideoSendStreamTest, DoesUtilizeRedForVp9WithNackEnabled) {
- FecObserver test(false, true, true, "VP9");
+ FecObserver test(false, true, true, true, "VP9");
RunBaseTest(&test);
}
+#endif // !defined(RTC_DISABLE_VP9)
void VideoSendStreamTest::TestNackRetransmission(
uint32_t retransmit_ssrc,
@@ -712,7 +714,7 @@ void VideoSendStreamTest::TestPacketFragmentationSize(VideoFormat format,
}
}
- virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) {
+ void EncodedFrameCallback(const EncodedFrame& encoded_frame) override {
// Increase frame size for next encoded frame, in the context of the
// encoder thread.
if (!use_fec_ &&
@@ -811,7 +813,8 @@ TEST_F(VideoSendStreamTest, FragmentsVp8AccordingToMaxPacketSizeWithFec) {
TEST_F(VideoSendStreamTest, SuspendBelowMinBitrate) {
static const int kSuspendTimeFrames = 60; // Suspend for 2 seconds @ 30 fps.
- class RembObserver : public test::SendTest, public I420FrameCallback {
+ class RembObserver : public test::SendTest,
+ public rtc::VideoSinkInterface<VideoFrame> {
public:
RembObserver()
: SendTest(kDefaultTimeoutMs),
@@ -862,8 +865,8 @@ TEST_F(VideoSendStreamTest, SuspendBelowMinBitrate) {
return SEND_PACKET;
}
- // This method implements the I420FrameCallback.
- void FrameCallback(VideoFrame* video_frame) override {
+ // This method implements the rtc::VideoSinkInterface
+ void OnFrame(const VideoFrame& video_frame) override {
rtc::CritScope lock(&crit_);
if (test_state_ == kDuringSuspend &&
++suspended_frame_count_ > kSuspendTimeFrames) {
@@ -1002,8 +1005,8 @@ TEST_F(VideoSendStreamTest, NoPaddingWhenVideoIsMuted) {
size_t GetNumVideoStreams() const override { return 3; }
- virtual void OnFrameGeneratorCapturerCreated(
- test::FrameGeneratorCapturer* frame_generator_capturer) {
+ void OnFrameGeneratorCapturerCreated(
+ test::FrameGeneratorCapturer* frame_generator_capturer) override {
rtc::CritScope lock(&crit_);
capturer_ = frame_generator_capturer;
}
@@ -1043,7 +1046,7 @@ TEST_F(VideoSendStreamTest, MinTransmitBitrateRespectsRemb) {
}
private:
- virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
+ Action OnSendRtp(const uint8_t* packet, size_t length) override {
if (RtpHeaderParser::IsRtcp(packet, length))
return DROP_PACKET;
@@ -1115,18 +1118,22 @@ TEST_F(VideoSendStreamTest, CanReconfigureToUseStartBitrateAbovePreviousMax) {
class StartBitrateObserver : public test::FakeEncoder {
public:
StartBitrateObserver()
- : FakeEncoder(Clock::GetRealTimeClock()), start_bitrate_kbps_(0) {}
+ : FakeEncoder(Clock::GetRealTimeClock()),
+ start_bitrate_changed_(false, false),
+ start_bitrate_kbps_(0) {}
int32_t InitEncode(const VideoCodec* config,
int32_t number_of_cores,
size_t max_payload_size) override {
rtc::CritScope lock(&crit_);
start_bitrate_kbps_ = config->startBitrate;
+ start_bitrate_changed_.Set();
return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
}
int32_t SetRates(uint32_t new_target_bitrate, uint32_t framerate) override {
rtc::CritScope lock(&crit_);
start_bitrate_kbps_ = new_target_bitrate;
+ start_bitrate_changed_.Set();
return FakeEncoder::SetRates(new_target_bitrate, framerate);
}
@@ -1135,8 +1142,14 @@ TEST_F(VideoSendStreamTest, CanReconfigureToUseStartBitrateAbovePreviousMax) {
return start_bitrate_kbps_;
}
+ bool WaitForStartBitrate() {
+ return start_bitrate_changed_.Wait(
+ VideoSendStreamTest::kDefaultTimeoutMs);
+ }
+
private:
rtc::CriticalSection crit_;
+ rtc::Event start_bitrate_changed_;
int start_bitrate_kbps_ GUARDED_BY(crit_);
};
@@ -1155,6 +1168,7 @@ TEST_F(VideoSendStreamTest, CanReconfigureToUseStartBitrateAbovePreviousMax) {
CreateVideoStreams();
+ EXPECT_TRUE(encoder.WaitForStartBitrate());
EXPECT_EQ(video_encoder_config_.streams[0].max_bitrate_bps / 1000,
encoder.GetStartBitrateKbps());
@@ -1165,6 +1179,7 @@ TEST_F(VideoSendStreamTest, CanReconfigureToUseStartBitrateAbovePreviousMax) {
// New bitrate should be reconfigured above the previous max. As there's no
// network connection this shouldn't be flaky, as no bitrate should've been
// reported in between.
+ EXPECT_TRUE(encoder.WaitForStartBitrate());
EXPECT_EQ(bitrate_config.start_bitrate_bps / 1000,
encoder.GetStartBitrateKbps());
@@ -1172,12 +1187,12 @@ TEST_F(VideoSendStreamTest, CanReconfigureToUseStartBitrateAbovePreviousMax) {
}
TEST_F(VideoSendStreamTest, CapturesTextureAndVideoFrames) {
- class FrameObserver : public I420FrameCallback {
+ class FrameObserver : public rtc::VideoSinkInterface<VideoFrame> {
public:
FrameObserver() : output_frame_event_(false, false) {}
- void FrameCallback(VideoFrame* video_frame) override {
- output_frames_.push_back(*video_frame);
+ void OnFrame(const VideoFrame& video_frame) override {
+ output_frames_.push_back(video_frame);
output_frame_event_.Set();
}
@@ -1244,49 +1259,13 @@ TEST_F(VideoSendStreamTest, CapturesTextureAndVideoFrames) {
DestroyStreams();
}
-void ExpectEqualFrames(const VideoFrame& frame1, const VideoFrame& frame2) {
- if (frame1.native_handle() || frame2.native_handle())
- ExpectEqualTextureFrames(frame1, frame2);
- else
- ExpectEqualBufferFrames(frame1, frame2);
-}
-
-void ExpectEqualTextureFrames(const VideoFrame& frame1,
- const VideoFrame& frame2) {
- EXPECT_EQ(frame1.native_handle(), frame2.native_handle());
- EXPECT_EQ(frame1.width(), frame2.width());
- EXPECT_EQ(frame1.height(), frame2.height());
-}
-
-void ExpectEqualBufferFrames(const VideoFrame& frame1,
- const VideoFrame& frame2) {
- EXPECT_EQ(frame1.width(), frame2.width());
- EXPECT_EQ(frame1.height(), frame2.height());
- EXPECT_EQ(frame1.stride(kYPlane), frame2.stride(kYPlane));
- EXPECT_EQ(frame1.stride(kUPlane), frame2.stride(kUPlane));
- EXPECT_EQ(frame1.stride(kVPlane), frame2.stride(kVPlane));
- ASSERT_EQ(frame1.allocated_size(kYPlane), frame2.allocated_size(kYPlane));
- EXPECT_EQ(0,
- memcmp(frame1.buffer(kYPlane),
- frame2.buffer(kYPlane),
- frame1.allocated_size(kYPlane)));
- ASSERT_EQ(frame1.allocated_size(kUPlane), frame2.allocated_size(kUPlane));
- EXPECT_EQ(0,
- memcmp(frame1.buffer(kUPlane),
- frame2.buffer(kUPlane),
- frame1.allocated_size(kUPlane)));
- ASSERT_EQ(frame1.allocated_size(kVPlane), frame2.allocated_size(kVPlane));
- EXPECT_EQ(0,
- memcmp(frame1.buffer(kVPlane),
- frame2.buffer(kVPlane),
- frame1.allocated_size(kVPlane)));
-}
-
void ExpectEqualFramesVector(const std::vector<VideoFrame>& frames1,
const std::vector<VideoFrame>& frames2) {
EXPECT_EQ(frames1.size(), frames2.size());
for (size_t i = 0; i < std::min(frames1.size(), frames2.size()); ++i)
- ExpectEqualFrames(frames1[i], frames2[i]);
+ // Compare frame buffers, since we don't care about differing timestamps.
+ EXPECT_TRUE(test::FrameBufsEqual(frames1[i].video_frame_buffer(),
+ frames2[i].video_frame_buffer()));
}
VideoFrame CreateVideoFrame(int width, int height, uint8_t data) {
@@ -1378,9 +1357,6 @@ TEST_F(VideoSendStreamTest, EncoderIsProperlyInitializedAndDestroyed) {
void OnVideoStreamsCreated(
VideoSendStream* send_stream,
const std::vector<VideoReceiveStream*>& receive_streams) override {
- // Encoder initialization should be done in stream construction before
- // starting.
- EXPECT_TRUE(IsReadyForEncode());
stream_ = send_stream;
}
@@ -1428,6 +1404,7 @@ TEST_F(VideoSendStreamTest, EncoderSetupPropagatesCommonEncoderConfigValues) {
VideoCodecConfigObserver()
: SendTest(kDefaultTimeoutMs),
FakeEncoder(Clock::GetRealTimeClock()),
+ init_encode_event_(false, false),
num_initializations_(0) {}
private:
@@ -1456,19 +1433,23 @@ TEST_F(VideoSendStreamTest, EncoderSetupPropagatesCommonEncoderConfigValues) {
EXPECT_EQ(kScreensharing, config->mode);
}
++num_initializations_;
+ init_encode_event_.Set();
return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
}
void PerformTest() override {
+ EXPECT_TRUE(init_encode_event_.Wait(kDefaultTimeoutMs));
EXPECT_EQ(1u, num_initializations_) << "VideoEncoder not initialized.";
encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen;
stream_->ReconfigureVideoEncoder(encoder_config_);
+ EXPECT_TRUE(init_encode_event_.Wait(kDefaultTimeoutMs));
EXPECT_EQ(2u, num_initializations_)
<< "ReconfigureVideoEncoder did not reinitialize the encoder with "
"new encoder settings.";
}
+ rtc::Event init_encode_event_;
size_t num_initializations_;
VideoSendStream* stream_;
VideoEncoderConfig encoder_config_;
@@ -1488,6 +1469,7 @@ class VideoCodecConfigObserver : public test::SendTest,
FakeEncoder(Clock::GetRealTimeClock()),
video_codec_type_(video_codec_type),
codec_name_(codec_name),
+ init_encode_event_(false, false),
num_initializations_(0) {
memset(&encoder_settings_, 0, sizeof(encoder_settings_));
}
@@ -1521,16 +1503,21 @@ class VideoCodecConfigObserver : public test::SendTest,
EXPECT_EQ(video_codec_type_, config->codecType);
VerifyCodecSpecifics(*config);
++num_initializations_;
+ init_encode_event_.Set();
return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
}
void VerifyCodecSpecifics(const VideoCodec& config) const;
void PerformTest() override {
- EXPECT_EQ(1u, num_initializations_) << "VideoEncoder not initialized.";
+ EXPECT_TRUE(
+ init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
+ ASSERT_EQ(1u, num_initializations_) << "VideoEncoder not initialized.";
encoder_settings_.frameDroppingOn = true;
stream_->ReconfigureVideoEncoder(encoder_config_);
+ ASSERT_TRUE(
+ init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
EXPECT_EQ(2u, num_initializations_)
<< "ReconfigureVideoEncoder did not reinitialize the encoder with "
"new encoder settings.";
@@ -1546,6 +1533,7 @@ class VideoCodecConfigObserver : public test::SendTest,
T encoder_settings_;
const VideoCodecType video_codec_type_;
const char* const codec_name_;
+ rtc::Event init_encode_event_;
size_t num_initializations_;
VideoSendStream* stream_;
VideoEncoderConfig encoder_config_;
@@ -1708,18 +1696,7 @@ TEST_F(VideoSendStreamTest, TranslatesTwoLayerScreencastToTargetBitrate) {
RunBaseTest(&test);
}
-// Disabled on LinuxAsan:
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=5382
-#if defined(ADDRESS_SANITIZER) && defined(WEBRTC_LINUX)
-#define MAYBE_ReconfigureBitratesSetsEncoderBitratesCorrectly \
- DISABLED_ReconfigureBitratesSetsEncoderBitratesCorrectly
-#else
-#define MAYBE_ReconfigureBitratesSetsEncoderBitratesCorrectly \
- ReconfigureBitratesSetsEncoderBitratesCorrectly
-#endif
-
-TEST_F(VideoSendStreamTest,
- MAYBE_ReconfigureBitratesSetsEncoderBitratesCorrectly) {
+TEST_F(VideoSendStreamTest, ReconfigureBitratesSetsEncoderBitratesCorrectly) {
// These are chosen to be "kind of odd" to not be accidentally checked against
// default values.
static const int kMinBitrateKbps = 137;
@@ -1734,6 +1711,7 @@ TEST_F(VideoSendStreamTest,
EncoderBitrateThresholdObserver()
: SendTest(kDefaultTimeoutMs),
FakeEncoder(Clock::GetRealTimeClock()),
+ init_encode_event_(false, false),
num_initializations_(0) {}
private:
@@ -1762,6 +1740,7 @@ TEST_F(VideoSendStreamTest,
codecSettings->startBitrate);
}
++num_initializations_;
+ init_encode_event_.Set();
return FakeEncoder::InitEncode(codecSettings, numberOfCores,
maxPayloadSize);
}
@@ -1797,6 +1776,9 @@ TEST_F(VideoSendStreamTest,
}
void PerformTest() override {
+ ASSERT_TRUE(
+ init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs))
+ << "Timed out while waiting encoder to be configured.";
Call::Config::BitrateConfig bitrate_config;
bitrate_config.start_bitrate_bps = kIncreasedStartBitrateKbps * 1000;
bitrate_config.max_bitrate_bps = kIncreasedMaxBitrateKbps * 1000;
@@ -1806,6 +1788,8 @@ TEST_F(VideoSendStreamTest,
encoder_config_.streams[0].min_bitrate_bps = 0;
encoder_config_.streams[0].max_bitrate_bps = kLowerMaxBitrateKbps * 1000;
send_stream_->ReconfigureVideoEncoder(encoder_config_);
+ ASSERT_TRUE(
+ init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
EXPECT_EQ(2, num_initializations_)
<< "Encoder should have been reconfigured with the new value.";
encoder_config_.streams[0].target_bitrate_bps =
@@ -1813,10 +1797,13 @@ TEST_F(VideoSendStreamTest,
encoder_config_.streams[0].max_bitrate_bps =
kIncreasedMaxBitrateKbps * 1000;
send_stream_->ReconfigureVideoEncoder(encoder_config_);
+ ASSERT_TRUE(
+ init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
EXPECT_EQ(3, num_initializations_)
<< "Encoder should have been reconfigured with the new value.";
}
+ rtc::Event init_encode_event_;
int num_initializations_;
webrtc::Call* call_;
webrtc::VideoSendStream* send_stream_;
@@ -1846,7 +1833,6 @@ TEST_F(VideoSendStreamTest, ReportsSentResolution) {
const CodecSpecificInfo* codecSpecificInfo,
const std::vector<FrameType>* frame_types) override {
CodecSpecificInfo specifics;
- memset(&specifics, 0, sizeof(specifics));
specifics.codecType = kVideoCodecGeneric;
uint8_t buffer[16] = {0};
@@ -1906,6 +1892,7 @@ TEST_F(VideoSendStreamTest, ReportsSentResolution) {
RunBaseTest(&test);
}
+#if !defined(RTC_DISABLE_VP9)
class Vp9HeaderObserver : public test::SendTest {
public:
Vp9HeaderObserver()
@@ -2289,9 +2276,6 @@ TEST_F(VideoSendStreamTest, Vp9NonFlexModeSmallResolution) {
RunBaseTest(&test);
}
-#if !defined(MEMORY_SANITIZER)
-// Fails under MemorySanitizer:
-// See https://code.google.com/p/webrtc/issues/detail?id=5402.
TEST_F(VideoSendStreamTest, Vp9FlexModeRefCount) {
class FlexibleMode : public Vp9HeaderObserver {
void ModifyVideoConfigsHook(
@@ -2316,6 +2300,6 @@ TEST_F(VideoSendStreamTest, Vp9FlexModeRefCount) {
RunBaseTest(&test);
}
-#endif
+#endif // !defined(RTC_DISABLE_VP9)
} // namespace webrtc