mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-16 23:30:48 +01:00
Add more unit tests for sender video with frame transformer.
Bug: webrtc:11380 Change-Id: Iaf499420f3512fd78421e234a646d53f8fc649bf Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/174005 Commit-Queue: Marina Ciocea <marinaciocea@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/master@{#31154}
This commit is contained in:
parent
a81e9c82fc
commit
07ed0f4f93
1 changed files with 114 additions and 30 deletions
|
@ -16,6 +16,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "api/test/mock_frame_encryptor.h"
|
#include "api/test/mock_frame_encryptor.h"
|
||||||
|
#include "api/transport/field_trial_based_config.h"
|
||||||
#include "api/transport/rtp/dependency_descriptor.h"
|
#include "api/transport/rtp/dependency_descriptor.h"
|
||||||
#include "api/video/video_codec_constants.h"
|
#include "api/video/video_codec_constants.h"
|
||||||
#include "api/video/video_timing.h"
|
#include "api/video/video_timing.h"
|
||||||
|
@ -34,6 +35,7 @@
|
||||||
#include "modules/rtp_rtcp/source/time_util.h"
|
#include "modules/rtp_rtcp/source/time_util.h"
|
||||||
#include "rtc_base/arraysize.h"
|
#include "rtc_base/arraysize.h"
|
||||||
#include "rtc_base/rate_limiter.h"
|
#include "rtc_base/rate_limiter.h"
|
||||||
|
#include "rtc_base/task_queue_for_test.h"
|
||||||
#include "test/gmock.h"
|
#include "test/gmock.h"
|
||||||
#include "test/gtest.h"
|
#include "test/gtest.h"
|
||||||
#include "test/mock_frame_transformer.h"
|
#include "test/mock_frame_transformer.h"
|
||||||
|
@ -49,6 +51,7 @@ using ::testing::IsEmpty;
|
||||||
using ::testing::NiceMock;
|
using ::testing::NiceMock;
|
||||||
using ::testing::Return;
|
using ::testing::Return;
|
||||||
using ::testing::ReturnArg;
|
using ::testing::ReturnArg;
|
||||||
|
using ::testing::SaveArg;
|
||||||
using ::testing::SizeIs;
|
using ::testing::SizeIs;
|
||||||
using ::testing::WithArgs;
|
using ::testing::WithArgs;
|
||||||
|
|
||||||
|
@ -117,8 +120,6 @@ class LoopbackTransportTest : public webrtc::Transport {
|
||||||
std::vector<RtpPacketReceived> sent_packets_;
|
std::vector<RtpPacketReceived> sent_packets_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
class TestRtpSenderVideo : public RTPSenderVideo {
|
class TestRtpSenderVideo : public RTPSenderVideo {
|
||||||
public:
|
public:
|
||||||
TestRtpSenderVideo(Clock* clock,
|
TestRtpSenderVideo(Clock* clock,
|
||||||
|
@ -874,36 +875,119 @@ TEST_P(RtpSenderVideoTest, PopulatesPlayoutDelay) {
|
||||||
EXPECT_EQ(received_delay, kExpectedDelay);
|
EXPECT_EQ(received_delay, kExpectedDelay);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(RtpSenderVideoTest, SendEncodedImageWithFrameTransformer) {
|
|
||||||
rtc::scoped_refptr<MockFrameTransformer> transformer =
|
|
||||||
new rtc::RefCountedObject<NiceMock<MockFrameTransformer>>();
|
|
||||||
RTPSenderVideo::Config config;
|
|
||||||
config.clock = &fake_clock_;
|
|
||||||
config.rtp_sender = rtp_module_->RtpSender();
|
|
||||||
config.field_trials = &field_trials_;
|
|
||||||
config.frame_transformer = transformer;
|
|
||||||
|
|
||||||
EXPECT_CALL(*transformer, RegisterTransformedFrameSinkCallback);
|
|
||||||
std::unique_ptr<RTPSenderVideo> rtp_sender_video =
|
|
||||||
std::make_unique<RTPSenderVideo>(config);
|
|
||||||
|
|
||||||
const uint8_t data[] = {1, 2, 3, 4};
|
|
||||||
EncodedImage encoded_image;
|
|
||||||
encoded_image.SetEncodedData(
|
|
||||||
webrtc::EncodedImageBuffer::Create(data, sizeof(data)));
|
|
||||||
RTPVideoHeader hdr;
|
|
||||||
EXPECT_CALL(*transformer, TransformFrame(_, RtpDescriptorAuthentication(hdr),
|
|
||||||
rtp_module_->RtpSender()->SSRC()));
|
|
||||||
rtp_sender_video->SendEncodedImage(kPayload, kType, kTimestamp, encoded_image,
|
|
||||||
nullptr, hdr,
|
|
||||||
kDefaultExpectedRetransmissionTimeMs);
|
|
||||||
|
|
||||||
EXPECT_CALL(*transformer, UnregisterTransformedFrameSinkCallback);
|
|
||||||
rtp_sender_video.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
|
INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
|
||||||
RtpSenderVideoTest,
|
RtpSenderVideoTest,
|
||||||
::testing::Bool());
|
::testing::Bool());
|
||||||
|
|
||||||
|
class RtpSenderVideoWithFrameTransformerTest : public ::testing::Test {
|
||||||
|
public:
|
||||||
|
RtpSenderVideoWithFrameTransformerTest()
|
||||||
|
: fake_clock_(kStartTime),
|
||||||
|
retransmission_rate_limiter_(&fake_clock_, 1000),
|
||||||
|
rtp_module_(RtpRtcp::Create([&] {
|
||||||
|
RtpRtcp::Configuration config;
|
||||||
|
config.clock = &fake_clock_;
|
||||||
|
config.outgoing_transport = &transport_;
|
||||||
|
config.retransmission_rate_limiter = &retransmission_rate_limiter_;
|
||||||
|
config.field_trials = &field_trials_;
|
||||||
|
config.local_media_ssrc = kSsrc;
|
||||||
|
return config;
|
||||||
|
}())) {
|
||||||
|
rtp_module_->SetSequenceNumber(kSeqNum);
|
||||||
|
rtp_module_->SetStartTimestamp(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<RTPSenderVideo> CreateSenderWithFrameTransformer(
|
||||||
|
rtc::scoped_refptr<FrameTransformerInterface> transformer) {
|
||||||
|
RTPSenderVideo::Config config;
|
||||||
|
config.clock = &fake_clock_;
|
||||||
|
config.rtp_sender = rtp_module_->RtpSender();
|
||||||
|
config.field_trials = &field_trials_;
|
||||||
|
config.frame_transformer = transformer;
|
||||||
|
return std::make_unique<RTPSenderVideo>(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
FieldTrialBasedConfig field_trials_;
|
||||||
|
SimulatedClock fake_clock_;
|
||||||
|
LoopbackTransportTest transport_;
|
||||||
|
RateLimiter retransmission_rate_limiter_;
|
||||||
|
std::unique_ptr<RtpRtcp> rtp_module_;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::unique_ptr<EncodedImage> CreateDefaultEncodedImage() {
|
||||||
|
const uint8_t data[] = {1, 2, 3, 4};
|
||||||
|
auto encoded_image = std::make_unique<EncodedImage>();
|
||||||
|
encoded_image->SetEncodedData(
|
||||||
|
webrtc::EncodedImageBuffer::Create(data, sizeof(data)));
|
||||||
|
return encoded_image;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RtpSenderVideoWithFrameTransformerTest,
|
||||||
|
CreateSenderRegistersFrameTransformer) {
|
||||||
|
rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
|
||||||
|
new rtc::RefCountedObject<NiceMock<MockFrameTransformer>>();
|
||||||
|
EXPECT_CALL(*mock_frame_transformer,
|
||||||
|
RegisterTransformedFrameSinkCallback(_, kSsrc));
|
||||||
|
std::unique_ptr<RTPSenderVideo> rtp_sender_video =
|
||||||
|
CreateSenderWithFrameTransformer(mock_frame_transformer);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RtpSenderVideoWithFrameTransformerTest,
|
||||||
|
DestroySenderUnregistersFrameTransformer) {
|
||||||
|
rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
|
||||||
|
new rtc::RefCountedObject<NiceMock<MockFrameTransformer>>();
|
||||||
|
std::unique_ptr<RTPSenderVideo> rtp_sender_video =
|
||||||
|
CreateSenderWithFrameTransformer(mock_frame_transformer);
|
||||||
|
EXPECT_CALL(*mock_frame_transformer,
|
||||||
|
UnregisterTransformedFrameSinkCallback(kSsrc));
|
||||||
|
rtp_sender_video = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RtpSenderVideoWithFrameTransformerTest,
|
||||||
|
SendEncodedImageTransformsFrame) {
|
||||||
|
rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
|
||||||
|
new rtc::RefCountedObject<NiceMock<MockFrameTransformer>>();
|
||||||
|
std::unique_ptr<RTPSenderVideo> rtp_sender_video =
|
||||||
|
CreateSenderWithFrameTransformer(mock_frame_transformer);
|
||||||
|
auto encoded_image = CreateDefaultEncodedImage();
|
||||||
|
RTPVideoHeader video_header;
|
||||||
|
|
||||||
|
EXPECT_CALL(*mock_frame_transformer, Transform);
|
||||||
|
rtp_sender_video->SendEncodedImage(kPayload, kType, kTimestamp,
|
||||||
|
*encoded_image, nullptr, video_header,
|
||||||
|
kDefaultExpectedRetransmissionTimeMs);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RtpSenderVideoWithFrameTransformerTest, OnTransformedFrameSendsVideo) {
|
||||||
|
rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
|
||||||
|
new rtc::RefCountedObject<NiceMock<MockFrameTransformer>>();
|
||||||
|
rtc::scoped_refptr<TransformedFrameCallback> callback;
|
||||||
|
EXPECT_CALL(*mock_frame_transformer, RegisterTransformedFrameSinkCallback)
|
||||||
|
.WillOnce(SaveArg<0>(&callback));
|
||||||
|
std::unique_ptr<RTPSenderVideo> rtp_sender_video =
|
||||||
|
CreateSenderWithFrameTransformer(mock_frame_transformer);
|
||||||
|
ASSERT_TRUE(callback);
|
||||||
|
|
||||||
|
auto encoded_image = CreateDefaultEncodedImage();
|
||||||
|
RTPVideoHeader video_header;
|
||||||
|
video_header.frame_type = VideoFrameType::kVideoFrameKey;
|
||||||
|
ON_CALL(*mock_frame_transformer, Transform)
|
||||||
|
.WillByDefault(
|
||||||
|
[&callback](std::unique_ptr<TransformableFrameInterface> frame) {
|
||||||
|
callback->OnTransformedFrame(std::move(frame));
|
||||||
|
});
|
||||||
|
TaskQueueForTest encoder_queue;
|
||||||
|
encoder_queue.SendTask(
|
||||||
|
[&] {
|
||||||
|
rtp_sender_video->SendEncodedImage(
|
||||||
|
kPayload, kType, kTimestamp, *encoded_image, nullptr, video_header,
|
||||||
|
kDefaultExpectedRetransmissionTimeMs);
|
||||||
|
},
|
||||||
|
RTC_FROM_HERE);
|
||||||
|
encoder_queue.WaitForPreviouslyPostedTasks();
|
||||||
|
EXPECT_EQ(transport_.packets_sent(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|
Loading…
Reference in a new issue