Migrate video/adaptation and video/end_to_end_tests to webrtc::Mutex.
Bug: webrtc:11567 Change-Id: I6c2d0c7e3e8fac85cf4d19223c4ef3d144598fda Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/178812 Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Markus Handell <handellm@webrtc.org> Cr-Commit-Position: refs/heads/master@{#31651}
This commit is contained in:
parent
101750ac5b
commit
9bbff07b20
@ -641,6 +641,7 @@ if (rtc_include_tests) {
|
|||||||
"../rtc_base:rtc_task_queue",
|
"../rtc_base:rtc_task_queue",
|
||||||
"../rtc_base:task_queue_for_test",
|
"../rtc_base:task_queue_for_test",
|
||||||
"../rtc_base/experiments:alr_experiment",
|
"../rtc_base/experiments:alr_experiment",
|
||||||
|
"../rtc_base/synchronization:mutex",
|
||||||
"../rtc_base/synchronization:sequence_checker",
|
"../rtc_base/synchronization:sequence_checker",
|
||||||
"../rtc_base/task_utils:to_queued_task",
|
"../rtc_base/task_utils:to_queued_task",
|
||||||
"../system_wrappers",
|
"../system_wrappers",
|
||||||
|
|||||||
@ -48,6 +48,7 @@ rtc_library("video_adaptation") {
|
|||||||
"../../rtc_base/experiments:field_trial_parser",
|
"../../rtc_base/experiments:field_trial_parser",
|
||||||
"../../rtc_base/experiments:quality_rampup_experiment",
|
"../../rtc_base/experiments:quality_rampup_experiment",
|
||||||
"../../rtc_base/experiments:quality_scaler_settings",
|
"../../rtc_base/experiments:quality_scaler_settings",
|
||||||
|
"../../rtc_base/synchronization:mutex",
|
||||||
"../../rtc_base/synchronization:sequence_checker",
|
"../../rtc_base/synchronization:sequence_checker",
|
||||||
"../../rtc_base/task_utils:repeating_task",
|
"../../rtc_base/task_utils:repeating_task",
|
||||||
"../../rtc_base/task_utils:to_queued_task",
|
"../../rtc_base/task_utils:to_queued_task",
|
||||||
|
|||||||
@ -37,14 +37,14 @@ void VideoStreamEncoderResource::RegisterEncoderTaskQueue(
|
|||||||
|
|
||||||
void VideoStreamEncoderResource::RegisterAdaptationTaskQueue(
|
void VideoStreamEncoderResource::RegisterAdaptationTaskQueue(
|
||||||
TaskQueueBase* resource_adaptation_queue) {
|
TaskQueueBase* resource_adaptation_queue) {
|
||||||
rtc::CritScope crit(&lock_);
|
MutexLock lock(&lock_);
|
||||||
RTC_DCHECK(!resource_adaptation_queue_);
|
RTC_DCHECK(!resource_adaptation_queue_);
|
||||||
RTC_DCHECK(resource_adaptation_queue);
|
RTC_DCHECK(resource_adaptation_queue);
|
||||||
resource_adaptation_queue_ = resource_adaptation_queue;
|
resource_adaptation_queue_ = resource_adaptation_queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoStreamEncoderResource::UnregisterAdaptationTaskQueue() {
|
void VideoStreamEncoderResource::UnregisterAdaptationTaskQueue() {
|
||||||
rtc::CritScope crit(&lock_);
|
MutexLock lock(&lock_);
|
||||||
RTC_DCHECK(resource_adaptation_queue_);
|
RTC_DCHECK(resource_adaptation_queue_);
|
||||||
RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
|
RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
|
||||||
resource_adaptation_queue_ = nullptr;
|
resource_adaptation_queue_ = nullptr;
|
||||||
@ -76,7 +76,7 @@ TaskQueueBase* VideoStreamEncoderResource::encoder_queue() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TaskQueueBase* VideoStreamEncoderResource::resource_adaptation_queue() const {
|
TaskQueueBase* VideoStreamEncoderResource::resource_adaptation_queue() const {
|
||||||
rtc::CritScope crit(&lock_);
|
MutexLock lock(&lock_);
|
||||||
RTC_DCHECK(resource_adaptation_queue_);
|
RTC_DCHECK(resource_adaptation_queue_);
|
||||||
RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
|
RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
|
||||||
return resource_adaptation_queue_;
|
return resource_adaptation_queue_;
|
||||||
|
|||||||
@ -19,7 +19,7 @@
|
|||||||
#include "api/task_queue/task_queue_base.h"
|
#include "api/task_queue/task_queue_base.h"
|
||||||
#include "call/adaptation/adaptation_constraint.h"
|
#include "call/adaptation/adaptation_constraint.h"
|
||||||
#include "call/adaptation/adaptation_listener.h"
|
#include "call/adaptation/adaptation_listener.h"
|
||||||
#include "rtc_base/critical_section.h"
|
#include "rtc_base/synchronization/mutex.h"
|
||||||
#include "rtc_base/synchronization/sequence_checker.h"
|
#include "rtc_base/synchronization/sequence_checker.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
@ -60,14 +60,14 @@ class VideoStreamEncoderResource : public Resource {
|
|||||||
TaskQueueBase* resource_adaptation_queue() const;
|
TaskQueueBase* resource_adaptation_queue() const;
|
||||||
template <typename Closure>
|
template <typename Closure>
|
||||||
void MaybePostTaskToResourceAdaptationQueue(Closure&& closure) {
|
void MaybePostTaskToResourceAdaptationQueue(Closure&& closure) {
|
||||||
rtc::CritScope crit(&lock_);
|
MutexLock lock(&lock_);
|
||||||
if (!resource_adaptation_queue_)
|
if (!resource_adaptation_queue_)
|
||||||
return;
|
return;
|
||||||
resource_adaptation_queue_->PostTask(ToQueuedTask(closure));
|
resource_adaptation_queue_->PostTask(ToQueuedTask(closure));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
rtc::CriticalSection lock_;
|
mutable Mutex lock_;
|
||||||
const std::string name_;
|
const std::string name_;
|
||||||
// Treated as const after initialization.
|
// Treated as const after initialization.
|
||||||
TaskQueueBase* encoder_queue_;
|
TaskQueueBase* encoder_queue_;
|
||||||
|
|||||||
@ -354,7 +354,7 @@ void VideoStreamEncoderResourceManager::StopManagedResources() {
|
|||||||
void VideoStreamEncoderResourceManager::MapResourceToReason(
|
void VideoStreamEncoderResourceManager::MapResourceToReason(
|
||||||
rtc::scoped_refptr<Resource> resource,
|
rtc::scoped_refptr<Resource> resource,
|
||||||
VideoAdaptationReason reason) {
|
VideoAdaptationReason reason) {
|
||||||
rtc::CritScope crit(&resource_lock_);
|
MutexLock lock(&resource_lock_);
|
||||||
RTC_DCHECK(resource);
|
RTC_DCHECK(resource);
|
||||||
RTC_DCHECK(absl::c_find_if(resources_,
|
RTC_DCHECK(absl::c_find_if(resources_,
|
||||||
[resource](const ResourceAndReason& r) {
|
[resource](const ResourceAndReason& r) {
|
||||||
@ -366,7 +366,7 @@ void VideoStreamEncoderResourceManager::MapResourceToReason(
|
|||||||
|
|
||||||
std::vector<rtc::scoped_refptr<Resource>>
|
std::vector<rtc::scoped_refptr<Resource>>
|
||||||
VideoStreamEncoderResourceManager::MappedResources() const {
|
VideoStreamEncoderResourceManager::MappedResources() const {
|
||||||
rtc::CritScope crit(&resource_lock_);
|
MutexLock lock(&resource_lock_);
|
||||||
std::vector<rtc::scoped_refptr<Resource>> resources;
|
std::vector<rtc::scoped_refptr<Resource>> resources;
|
||||||
for (auto const& resource_and_reason : resources_) {
|
for (auto const& resource_and_reason : resources_) {
|
||||||
resources.push_back(resource_and_reason.resource);
|
resources.push_back(resource_and_reason.resource);
|
||||||
@ -386,7 +386,7 @@ VideoStreamEncoderResourceManager::AdaptationListeners() const {
|
|||||||
|
|
||||||
rtc::scoped_refptr<QualityScalerResource>
|
rtc::scoped_refptr<QualityScalerResource>
|
||||||
VideoStreamEncoderResourceManager::quality_scaler_resource_for_testing() {
|
VideoStreamEncoderResourceManager::quality_scaler_resource_for_testing() {
|
||||||
rtc::CritScope crit(&resource_lock_);
|
MutexLock lock(&resource_lock_);
|
||||||
return quality_scaler_resource_;
|
return quality_scaler_resource_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -559,7 +559,7 @@ void VideoStreamEncoderResourceManager::ConfigureQualityScaler(
|
|||||||
|
|
||||||
VideoAdaptationReason VideoStreamEncoderResourceManager::GetReasonFromResource(
|
VideoAdaptationReason VideoStreamEncoderResourceManager::GetReasonFromResource(
|
||||||
rtc::scoped_refptr<Resource> resource) const {
|
rtc::scoped_refptr<Resource> resource) const {
|
||||||
rtc::CritScope crit(&resource_lock_);
|
MutexLock lock(&resource_lock_);
|
||||||
const auto& registered_resource =
|
const auto& registered_resource =
|
||||||
absl::c_find_if(resources_, [&resource](const ResourceAndReason& r) {
|
absl::c_find_if(resources_, [&resource](const ResourceAndReason& r) {
|
||||||
return r.resource == resource;
|
return r.resource == resource;
|
||||||
|
|||||||
@ -35,10 +35,10 @@
|
|||||||
#include "call/adaptation/resource_adaptation_processor_interface.h"
|
#include "call/adaptation/resource_adaptation_processor_interface.h"
|
||||||
#include "call/adaptation/video_stream_adapter.h"
|
#include "call/adaptation/video_stream_adapter.h"
|
||||||
#include "call/adaptation/video_stream_input_state_provider.h"
|
#include "call/adaptation/video_stream_input_state_provider.h"
|
||||||
#include "rtc_base/critical_section.h"
|
|
||||||
#include "rtc_base/experiments/quality_scaler_settings.h"
|
#include "rtc_base/experiments/quality_scaler_settings.h"
|
||||||
#include "rtc_base/ref_count.h"
|
#include "rtc_base/ref_count.h"
|
||||||
#include "rtc_base/strings/string_builder.h"
|
#include "rtc_base/strings/string_builder.h"
|
||||||
|
#include "rtc_base/synchronization/mutex.h"
|
||||||
#include "rtc_base/task_queue.h"
|
#include "rtc_base/task_queue.h"
|
||||||
#include "system_wrappers/include/clock.h"
|
#include "system_wrappers/include/clock.h"
|
||||||
#include "video/adaptation/encode_usage_resource.h"
|
#include "video/adaptation/encode_usage_resource.h"
|
||||||
@ -277,7 +277,7 @@ class VideoStreamEncoderResourceManager
|
|||||||
const rtc::scoped_refptr<Resource> resource;
|
const rtc::scoped_refptr<Resource> resource;
|
||||||
const VideoAdaptationReason reason;
|
const VideoAdaptationReason reason;
|
||||||
};
|
};
|
||||||
rtc::CriticalSection resource_lock_;
|
mutable Mutex resource_lock_;
|
||||||
std::vector<ResourceAndReason> resources_ RTC_GUARDED_BY(&resource_lock_);
|
std::vector<ResourceAndReason> resources_ RTC_GUARDED_BY(&resource_lock_);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
#include "call/simulated_network.h"
|
#include "call/simulated_network.h"
|
||||||
#include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h"
|
#include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h"
|
||||||
#include "rtc_base/rate_limiter.h"
|
#include "rtc_base/rate_limiter.h"
|
||||||
|
#include "rtc_base/synchronization/mutex.h"
|
||||||
#include "rtc_base/task_queue_for_test.h"
|
#include "rtc_base/task_queue_for_test.h"
|
||||||
#include "rtc_base/task_utils/to_queued_task.h"
|
#include "rtc_base/task_utils/to_queued_task.h"
|
||||||
#include "system_wrappers/include/sleep.h"
|
#include "system_wrappers/include/sleep.h"
|
||||||
@ -353,7 +354,7 @@ TEST_F(BandwidthEndToEndTest, ReportsSetEncoderRates) {
|
|||||||
// Make sure not to trigger on any default zero bitrates.
|
// Make sure not to trigger on any default zero bitrates.
|
||||||
if (parameters.bitrate.get_sum_bps() == 0)
|
if (parameters.bitrate.get_sum_bps() == 0)
|
||||||
return;
|
return;
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
bitrate_kbps_ = parameters.bitrate.get_sum_kbps();
|
bitrate_kbps_ = parameters.bitrate.get_sum_kbps();
|
||||||
observation_complete_.Set();
|
observation_complete_.Set();
|
||||||
}
|
}
|
||||||
@ -375,7 +376,7 @@ TEST_F(BandwidthEndToEndTest, ReportsSetEncoderRates) {
|
|||||||
for (int i = 0; i < kDefaultTimeoutMs; ++i) {
|
for (int i = 0; i < kDefaultTimeoutMs; ++i) {
|
||||||
VideoSendStream::Stats stats = send_stream_->GetStats();
|
VideoSendStream::Stats stats = send_stream_->GetStats();
|
||||||
{
|
{
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
if ((stats.target_media_bitrate_bps + 500) / 1000 ==
|
if ((stats.target_media_bitrate_bps + 500) / 1000 ==
|
||||||
static_cast<int>(bitrate_kbps_)) {
|
static_cast<int>(bitrate_kbps_)) {
|
||||||
return;
|
return;
|
||||||
@ -399,11 +400,11 @@ TEST_F(BandwidthEndToEndTest, ReportsSetEncoderRates) {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
TaskQueueBase* const task_queue_;
|
TaskQueueBase* const task_queue_;
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
VideoSendStream* send_stream_;
|
VideoSendStream* send_stream_;
|
||||||
test::VideoEncoderProxyFactory encoder_factory_;
|
test::VideoEncoderProxyFactory encoder_factory_;
|
||||||
std::unique_ptr<VideoBitrateAllocatorFactory> bitrate_allocator_factory_;
|
std::unique_ptr<VideoBitrateAllocatorFactory> bitrate_allocator_factory_;
|
||||||
uint32_t bitrate_kbps_ RTC_GUARDED_BY(crit_);
|
uint32_t bitrate_kbps_ RTC_GUARDED_BY(mutex_);
|
||||||
} test(task_queue());
|
} test(task_queue());
|
||||||
|
|
||||||
RunBaseTest(&test);
|
RunBaseTest(&test);
|
||||||
|
|||||||
@ -31,8 +31,8 @@
|
|||||||
#include "call/video_send_stream.h"
|
#include "call/video_send_stream.h"
|
||||||
#include "modules/rtp_rtcp/source/rtcp_packet/dlrr.h"
|
#include "modules/rtp_rtcp/source/rtcp_packet/dlrr.h"
|
||||||
#include "modules/rtp_rtcp/source/rtcp_packet/target_bitrate.h"
|
#include "modules/rtp_rtcp/source/rtcp_packet/target_bitrate.h"
|
||||||
#include "rtc_base/critical_section.h"
|
|
||||||
#include "rtc_base/event.h"
|
#include "rtc_base/event.h"
|
||||||
|
#include "rtc_base/synchronization/mutex.h"
|
||||||
#include "rtc_base/thread_annotations.h"
|
#include "rtc_base/thread_annotations.h"
|
||||||
#include "system_wrappers/include/clock.h"
|
#include "system_wrappers/include/clock.h"
|
||||||
#include "test/call_test.h"
|
#include "test/call_test.h"
|
||||||
@ -83,7 +83,7 @@ class RtcpXrObserver : public test::EndToEndTest {
|
|||||||
private:
|
private:
|
||||||
// Receive stream should send RR packets (and RRTR packets if enabled).
|
// Receive stream should send RR packets (and RRTR packets if enabled).
|
||||||
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
test::RtcpPacketParser parser;
|
test::RtcpPacketParser parser;
|
||||||
EXPECT_TRUE(parser.Parse(packet, length));
|
EXPECT_TRUE(parser.Parse(packet, length));
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ class RtcpXrObserver : public test::EndToEndTest {
|
|||||||
}
|
}
|
||||||
// Send stream should send SR packets (and DLRR packets if enabled).
|
// Send stream should send SR packets (and DLRR packets if enabled).
|
||||||
Action OnSendRtcp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtcp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
test::RtcpPacketParser parser;
|
test::RtcpPacketParser parser;
|
||||||
EXPECT_TRUE(parser.Parse(packet, length));
|
EXPECT_TRUE(parser.Parse(packet, length));
|
||||||
|
|
||||||
@ -198,16 +198,16 @@ class RtcpXrObserver : public test::EndToEndTest {
|
|||||||
|
|
||||||
static const int kNumRtcpReportPacketsToObserve = 5;
|
static const int kNumRtcpReportPacketsToObserve = 5;
|
||||||
|
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
const bool enable_rrtr_;
|
const bool enable_rrtr_;
|
||||||
const bool expect_target_bitrate_;
|
const bool expect_target_bitrate_;
|
||||||
const bool enable_zero_target_bitrate_;
|
const bool enable_zero_target_bitrate_;
|
||||||
const VideoEncoderConfig::ContentType content_type_;
|
const VideoEncoderConfig::ContentType content_type_;
|
||||||
int sent_rtcp_sr_;
|
int sent_rtcp_sr_;
|
||||||
int sent_rtcp_rr_ RTC_GUARDED_BY(&crit_);
|
int sent_rtcp_rr_ RTC_GUARDED_BY(&mutex_);
|
||||||
int sent_rtcp_rrtr_ RTC_GUARDED_BY(&crit_);
|
int sent_rtcp_rrtr_ RTC_GUARDED_BY(&mutex_);
|
||||||
bool sent_rtcp_target_bitrate_ RTC_GUARDED_BY(&crit_);
|
bool sent_rtcp_target_bitrate_ RTC_GUARDED_BY(&mutex_);
|
||||||
bool sent_zero_rtcp_target_bitrate_ RTC_GUARDED_BY(&crit_);
|
bool sent_zero_rtcp_target_bitrate_ RTC_GUARDED_BY(&mutex_);
|
||||||
int sent_rtcp_dlrr_;
|
int sent_rtcp_dlrr_;
|
||||||
BuiltInNetworkBehaviorConfig forward_transport_config_;
|
BuiltInNetworkBehaviorConfig forward_transport_config_;
|
||||||
SimulatedNetwork* send_simulated_network_;
|
SimulatedNetwork* send_simulated_network_;
|
||||||
|
|||||||
@ -20,6 +20,7 @@
|
|||||||
#include "modules/rtp_rtcp/source/byte_io.h"
|
#include "modules/rtp_rtcp/source/byte_io.h"
|
||||||
#include "modules/rtp_rtcp/source/rtp_packet.h"
|
#include "modules/rtp_rtcp/source/rtp_packet.h"
|
||||||
#include "modules/video_coding/codecs/vp8/include/vp8.h"
|
#include "modules/video_coding/codecs/vp8/include/vp8.h"
|
||||||
|
#include "rtc_base/synchronization/mutex.h"
|
||||||
#include "test/call_test.h"
|
#include "test/call_test.h"
|
||||||
#include "test/field_trial.h"
|
#include "test/field_trial.h"
|
||||||
#include "test/gmock.h"
|
#include "test/gmock.h"
|
||||||
@ -59,7 +60,7 @@ TEST_F(FecEndToEndTest, ReceivesUlpfec) {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
RtpPacket rtp_packet;
|
RtpPacket rtp_packet;
|
||||||
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
||||||
|
|
||||||
@ -98,7 +99,7 @@ TEST_F(FecEndToEndTest, ReceivesUlpfec) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OnFrame(const VideoFrame& video_frame) override {
|
void OnFrame(const VideoFrame& video_frame) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
// Rendering frame with timestamp of packet that was dropped -> FEC
|
// Rendering frame with timestamp of packet that was dropped -> FEC
|
||||||
// protection worked.
|
// protection worked.
|
||||||
auto it = dropped_timestamps_.find(video_frame.timestamp());
|
auto it = dropped_timestamps_.find(video_frame.timestamp());
|
||||||
@ -137,15 +138,15 @@ TEST_F(FecEndToEndTest, ReceivesUlpfec) {
|
|||||||
<< "Timed out waiting for dropped frames to be rendered.";
|
<< "Timed out waiting for dropped frames to be rendered.";
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
std::unique_ptr<VideoEncoder> encoder_;
|
std::unique_ptr<VideoEncoder> encoder_;
|
||||||
test::FunctionVideoEncoderFactory encoder_factory_;
|
test::FunctionVideoEncoderFactory encoder_factory_;
|
||||||
InternalDecoderFactory decoder_factory_;
|
InternalDecoderFactory decoder_factory_;
|
||||||
std::set<uint32_t> dropped_sequence_numbers_ RTC_GUARDED_BY(crit_);
|
std::set<uint32_t> dropped_sequence_numbers_ RTC_GUARDED_BY(mutex_);
|
||||||
// Several packets can have the same timestamp.
|
// Several packets can have the same timestamp.
|
||||||
std::multiset<uint32_t> dropped_timestamps_ RTC_GUARDED_BY(crit_);
|
std::multiset<uint32_t> dropped_timestamps_ RTC_GUARDED_BY(mutex_);
|
||||||
Random random_;
|
Random random_;
|
||||||
int num_packets_sent_ RTC_GUARDED_BY(crit_);
|
int num_packets_sent_ RTC_GUARDED_BY(mutex_);
|
||||||
} test;
|
} test;
|
||||||
|
|
||||||
RunBaseTest(&test);
|
RunBaseTest(&test);
|
||||||
@ -169,7 +170,7 @@ class FlexfecRenderObserver : public test::EndToEndTest,
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
RtpPacket rtp_packet;
|
RtpPacket rtp_packet;
|
||||||
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
||||||
|
|
||||||
@ -247,7 +248,7 @@ class FlexfecRenderObserver : public test::EndToEndTest,
|
|||||||
EXPECT_EQ(1U, report_blocks.size());
|
EXPECT_EQ(1U, report_blocks.size());
|
||||||
EXPECT_EQ(test::CallTest::kFlexfecSendSsrc,
|
EXPECT_EQ(test::CallTest::kFlexfecSendSsrc,
|
||||||
report_blocks[0].source_ssrc());
|
report_blocks[0].source_ssrc());
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
received_flexfec_rtcp_ = true;
|
received_flexfec_rtcp_ = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -273,7 +274,7 @@ class FlexfecRenderObserver : public test::EndToEndTest,
|
|||||||
void OnFrame(const VideoFrame& video_frame) override {
|
void OnFrame(const VideoFrame& video_frame) override {
|
||||||
EXPECT_EQ(kVideoRotation_90, video_frame.rotation());
|
EXPECT_EQ(kVideoRotation_90, video_frame.rotation());
|
||||||
|
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
// Rendering frame with timestamp of packet that was dropped -> FEC
|
// Rendering frame with timestamp of packet that was dropped -> FEC
|
||||||
// protection worked.
|
// protection worked.
|
||||||
auto it = dropped_timestamps_.find(video_frame.timestamp());
|
auto it = dropped_timestamps_.find(video_frame.timestamp());
|
||||||
@ -321,13 +322,13 @@ class FlexfecRenderObserver : public test::EndToEndTest,
|
|||||||
<< "Timed out waiting for dropped frames to be rendered.";
|
<< "Timed out waiting for dropped frames to be rendered.";
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
std::set<uint32_t> dropped_sequence_numbers_ RTC_GUARDED_BY(crit_);
|
std::set<uint32_t> dropped_sequence_numbers_ RTC_GUARDED_BY(mutex_);
|
||||||
// Several packets can have the same timestamp.
|
// Several packets can have the same timestamp.
|
||||||
std::multiset<uint32_t> dropped_timestamps_ RTC_GUARDED_BY(crit_);
|
std::multiset<uint32_t> dropped_timestamps_ RTC_GUARDED_BY(mutex_);
|
||||||
const bool enable_nack_;
|
const bool enable_nack_;
|
||||||
const bool expect_flexfec_rtcp_;
|
const bool expect_flexfec_rtcp_;
|
||||||
bool received_flexfec_rtcp_ RTC_GUARDED_BY(crit_);
|
bool received_flexfec_rtcp_ RTC_GUARDED_BY(mutex_);
|
||||||
Random random_;
|
Random random_;
|
||||||
int num_packets_sent_;
|
int num_packets_sent_;
|
||||||
};
|
};
|
||||||
@ -360,7 +361,7 @@ TEST_F(FecEndToEndTest, ReceivedUlpfecPacketsNotNacked) {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock_(&crit_);
|
MutexLock lock_(&mutex_);
|
||||||
RtpPacket rtp_packet;
|
RtpPacket rtp_packet;
|
||||||
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
||||||
|
|
||||||
@ -424,7 +425,7 @@ TEST_F(FecEndToEndTest, ReceivedUlpfecPacketsNotNacked) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock_(&crit_);
|
MutexLock lock_(&mutex_);
|
||||||
if (state_ == kVerifyUlpfecPacketNotInNackList) {
|
if (state_ == kVerifyUlpfecPacketNotInNackList) {
|
||||||
test::RtcpPacketParser rtcp_parser;
|
test::RtcpPacketParser rtcp_parser;
|
||||||
rtcp_parser.Parse(packet, length);
|
rtcp_parser.Parse(packet, length);
|
||||||
@ -503,8 +504,8 @@ TEST_F(FecEndToEndTest, ReceivedUlpfecPacketsNotNacked) {
|
|||||||
kVerifyUlpfecPacketNotInNackList,
|
kVerifyUlpfecPacketNotInNackList,
|
||||||
} state_;
|
} state_;
|
||||||
|
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
uint16_t ulpfec_sequence_number_ RTC_GUARDED_BY(&crit_);
|
uint16_t ulpfec_sequence_number_ RTC_GUARDED_BY(&mutex_);
|
||||||
bool has_last_sequence_number_;
|
bool has_last_sequence_number_;
|
||||||
uint16_t last_sequence_number_;
|
uint16_t last_sequence_number_;
|
||||||
test::FunctionVideoEncoderFactory encoder_factory_;
|
test::FunctionVideoEncoderFactory encoder_factory_;
|
||||||
|
|||||||
@ -11,6 +11,7 @@
|
|||||||
#include "absl/types/optional.h"
|
#include "absl/types/optional.h"
|
||||||
#include "api/test/video/function_video_encoder_factory.h"
|
#include "api/test/video/function_video_encoder_factory.h"
|
||||||
#include "modules/video_coding/codecs/vp8/include/vp8.h"
|
#include "modules/video_coding/codecs/vp8/include/vp8.h"
|
||||||
|
#include "rtc_base/synchronization/mutex.h"
|
||||||
#include "system_wrappers/include/metrics.h"
|
#include "system_wrappers/include/metrics.h"
|
||||||
#include "test/call_test.h"
|
#include "test/call_test.h"
|
||||||
#include "test/gtest.h"
|
#include "test/gtest.h"
|
||||||
@ -59,7 +60,7 @@ void HistogramTest::VerifyHistogramStats(bool use_rtx,
|
|||||||
if (video_frame.ntp_time_ms() > 0 &&
|
if (video_frame.ntp_time_ms() > 0 &&
|
||||||
Clock::GetRealTimeClock()->CurrentNtpInMilliseconds() >=
|
Clock::GetRealTimeClock()->CurrentNtpInMilliseconds() >=
|
||||||
video_frame.ntp_time_ms()) {
|
video_frame.ntp_time_ms()) {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
++num_frames_received_;
|
++num_frames_received_;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -82,7 +83,7 @@ void HistogramTest::VerifyHistogramStats(bool use_rtx,
|
|||||||
|
|
||||||
bool MinNumberOfFramesReceived() const {
|
bool MinNumberOfFramesReceived() const {
|
||||||
const int kMinRequiredHistogramSamples = 200;
|
const int kMinRequiredHistogramSamples = 200;
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
return num_frames_received_ > kMinRequiredHistogramSamples;
|
return num_frames_received_ > kMinRequiredHistogramSamples;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,13 +132,13 @@ void HistogramTest::VerifyHistogramStats(bool use_rtx,
|
|||||||
EXPECT_TRUE(Wait()) << "Timed out waiting for min frames to be received.";
|
EXPECT_TRUE(Wait()) << "Timed out waiting for min frames to be received.";
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc::CriticalSection crit_;
|
mutable Mutex mutex_;
|
||||||
const bool use_rtx_;
|
const bool use_rtx_;
|
||||||
const bool use_fec_;
|
const bool use_fec_;
|
||||||
const bool screenshare_;
|
const bool screenshare_;
|
||||||
test::FunctionVideoEncoderFactory encoder_factory_;
|
test::FunctionVideoEncoderFactory encoder_factory_;
|
||||||
absl::optional<int64_t> start_runtime_ms_;
|
absl::optional<int64_t> start_runtime_ms_;
|
||||||
int num_frames_received_ RTC_GUARDED_BY(&crit_);
|
int num_frames_received_ RTC_GUARDED_BY(&mutex_);
|
||||||
} test(use_rtx, use_fec, screenshare);
|
} test(use_rtx, use_fec, screenshare);
|
||||||
|
|
||||||
metrics::Reset();
|
metrics::Reset();
|
||||||
|
|||||||
@ -19,6 +19,7 @@
|
|||||||
#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 "rtc_base/synchronization/mutex.h"
|
||||||
#include "rtc_base/task_queue_for_test.h"
|
#include "rtc_base/task_queue_for_test.h"
|
||||||
#include "test/call_test.h"
|
#include "test/call_test.h"
|
||||||
#include "test/gmock.h"
|
#include "test/gmock.h"
|
||||||
@ -65,7 +66,7 @@ class FrameObserver : public test::RtpRtcpObserver,
|
|||||||
FrameObserver() : test::RtpRtcpObserver(test::CallTest::kDefaultTimeoutMs) {}
|
FrameObserver() : test::RtpRtcpObserver(test::CallTest::kDefaultTimeoutMs) {}
|
||||||
|
|
||||||
void Reset(uint8_t expected_payload_type) {
|
void Reset(uint8_t expected_payload_type) {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
num_sent_frames_ = 0;
|
num_sent_frames_ = 0;
|
||||||
num_rendered_frames_ = 0;
|
num_rendered_frames_ = 0;
|
||||||
expected_payload_type_ = expected_payload_type;
|
expected_payload_type_ = expected_payload_type;
|
||||||
@ -74,7 +75,7 @@ class FrameObserver : public test::RtpRtcpObserver,
|
|||||||
private:
|
private:
|
||||||
// Sends kFramesToObserve.
|
// Sends kFramesToObserve.
|
||||||
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
|
|
||||||
RtpPacket rtp_packet;
|
RtpPacket rtp_packet;
|
||||||
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
||||||
@ -103,7 +104,7 @@ class FrameObserver : public test::RtpRtcpObserver,
|
|||||||
|
|
||||||
// Verifies that all sent frames are decoded and rendered.
|
// Verifies that all sent frames are decoded and rendered.
|
||||||
void OnFrame(const VideoFrame& rendered_frame) override {
|
void OnFrame(const VideoFrame& rendered_frame) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
EXPECT_THAT(sent_timestamps_, Contains(rendered_frame.timestamp()));
|
EXPECT_THAT(sent_timestamps_, Contains(rendered_frame.timestamp()));
|
||||||
|
|
||||||
// Remove old timestamps too, only the newest decoded frame is rendered.
|
// Remove old timestamps too, only the newest decoded frame is rendered.
|
||||||
@ -116,12 +117,12 @@ class FrameObserver : public test::RtpRtcpObserver,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
absl::optional<uint32_t> last_timestamp_; // Only accessed from pacer thread.
|
absl::optional<uint32_t> last_timestamp_; // Only accessed from pacer thread.
|
||||||
absl::optional<uint8_t> expected_payload_type_ RTC_GUARDED_BY(crit_);
|
absl::optional<uint8_t> expected_payload_type_ RTC_GUARDED_BY(mutex_);
|
||||||
int num_sent_frames_ RTC_GUARDED_BY(crit_) = 0;
|
int num_sent_frames_ RTC_GUARDED_BY(mutex_) = 0;
|
||||||
int num_rendered_frames_ RTC_GUARDED_BY(crit_) = 0;
|
int num_rendered_frames_ RTC_GUARDED_BY(mutex_) = 0;
|
||||||
std::vector<uint32_t> sent_timestamps_ RTC_GUARDED_BY(crit_);
|
std::vector<uint32_t> sent_timestamps_ RTC_GUARDED_BY(mutex_);
|
||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
#include "call/fake_network_pipe.h"
|
#include "call/fake_network_pipe.h"
|
||||||
#include "call/simulated_network.h"
|
#include "call/simulated_network.h"
|
||||||
#include "modules/rtp_rtcp/source/rtp_packet.h"
|
#include "modules/rtp_rtcp/source/rtp_packet.h"
|
||||||
|
#include "rtc_base/synchronization/mutex.h"
|
||||||
#include "rtc_base/task_queue_for_test.h"
|
#include "rtc_base/task_queue_for_test.h"
|
||||||
#include "system_wrappers/include/sleep.h"
|
#include "system_wrappers/include/sleep.h"
|
||||||
#include "test/call_test.h"
|
#include "test/call_test.h"
|
||||||
@ -60,19 +61,19 @@ class NetworkStateEndToEndTest : public test::CallTest {
|
|||||||
bool SendRtp(const uint8_t* packet,
|
bool SendRtp(const uint8_t* packet,
|
||||||
size_t length,
|
size_t length,
|
||||||
const PacketOptions& options) override {
|
const PacketOptions& options) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
need_rtp_ = false;
|
need_rtp_ = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SendRtcp(const uint8_t* packet, size_t length) override {
|
bool SendRtcp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
need_rtcp_ = false;
|
need_rtcp_ = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool need_rtp_;
|
bool need_rtp_;
|
||||||
bool need_rtcp_;
|
bool need_rtcp_;
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
};
|
};
|
||||||
void VerifyNewVideoSendStreamsRespectNetworkState(
|
void VerifyNewVideoSendStreamsRespectNetworkState(
|
||||||
MediaType network_to_bring_up,
|
MediaType network_to_bring_up,
|
||||||
@ -177,7 +178,7 @@ TEST_F(NetworkStateEndToEndTest, RespectsNetworkState) {
|
|||||||
down_frames_(0) {}
|
down_frames_(0) {}
|
||||||
|
|
||||||
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&test_crit_);
|
MutexLock lock(&test_mutex_);
|
||||||
RtpPacket rtp_packet;
|
RtpPacket rtp_packet;
|
||||||
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
||||||
if (rtp_packet.payload_size() == 0)
|
if (rtp_packet.payload_size() == 0)
|
||||||
@ -188,7 +189,7 @@ TEST_F(NetworkStateEndToEndTest, RespectsNetworkState) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Action OnSendRtcp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtcp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&test_crit_);
|
MutexLock lock(&test_mutex_);
|
||||||
++sender_rtcp_;
|
++sender_rtcp_;
|
||||||
packet_event_.Set();
|
packet_event_.Set();
|
||||||
return SEND_PACKET;
|
return SEND_PACKET;
|
||||||
@ -200,7 +201,7 @@ TEST_F(NetworkStateEndToEndTest, RespectsNetworkState) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&test_crit_);
|
MutexLock lock(&test_mutex_);
|
||||||
++receiver_rtcp_;
|
++receiver_rtcp_;
|
||||||
packet_event_.Set();
|
packet_event_.Set();
|
||||||
return SEND_PACKET;
|
return SEND_PACKET;
|
||||||
@ -239,7 +240,7 @@ TEST_F(NetworkStateEndToEndTest, RespectsNetworkState) {
|
|||||||
// Sender-side network down.
|
// Sender-side network down.
|
||||||
sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkDown);
|
sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkDown);
|
||||||
{
|
{
|
||||||
rtc::CritScope lock(&test_crit_);
|
MutexLock lock(&test_mutex_);
|
||||||
// After network goes down we shouldn't be encoding more frames.
|
// After network goes down we shouldn't be encoding more frames.
|
||||||
sender_state_ = kNetworkDown;
|
sender_state_ = kNetworkDown;
|
||||||
}
|
}
|
||||||
@ -259,7 +260,7 @@ TEST_F(NetworkStateEndToEndTest, RespectsNetworkState) {
|
|||||||
|
|
||||||
// Network back up again for both.
|
// Network back up again for both.
|
||||||
{
|
{
|
||||||
rtc::CritScope lock(&test_crit_);
|
MutexLock lock(&test_mutex_);
|
||||||
// It's OK to encode frames again, as we're about to bring up the
|
// It's OK to encode frames again, as we're about to bring up the
|
||||||
// network.
|
// network.
|
||||||
sender_state_ = kNetworkUp;
|
sender_state_ = kNetworkUp;
|
||||||
@ -277,7 +278,7 @@ TEST_F(NetworkStateEndToEndTest, RespectsNetworkState) {
|
|||||||
int32_t Encode(const VideoFrame& input_image,
|
int32_t Encode(const VideoFrame& input_image,
|
||||||
const std::vector<VideoFrameType>* frame_types) override {
|
const std::vector<VideoFrameType>* frame_types) override {
|
||||||
{
|
{
|
||||||
rtc::CritScope lock(&test_crit_);
|
MutexLock lock(&test_mutex_);
|
||||||
if (sender_state_ == kNetworkDown) {
|
if (sender_state_ == kNetworkDown) {
|
||||||
++down_frames_;
|
++down_frames_;
|
||||||
EXPECT_LE(down_frames_, 1)
|
EXPECT_LE(down_frames_, 1)
|
||||||
@ -298,7 +299,7 @@ TEST_F(NetworkStateEndToEndTest, RespectsNetworkState) {
|
|||||||
int initial_sender_rtcp;
|
int initial_sender_rtcp;
|
||||||
int initial_receiver_rtcp;
|
int initial_receiver_rtcp;
|
||||||
{
|
{
|
||||||
rtc::CritScope lock(&test_crit_);
|
MutexLock lock(&test_mutex_);
|
||||||
initial_sender_rtp = sender_rtp_;
|
initial_sender_rtp = sender_rtp_;
|
||||||
initial_sender_rtcp = sender_rtcp_;
|
initial_sender_rtcp = sender_rtcp_;
|
||||||
initial_receiver_rtcp = receiver_rtcp_;
|
initial_receiver_rtcp = receiver_rtcp_;
|
||||||
@ -308,7 +309,7 @@ TEST_F(NetworkStateEndToEndTest, RespectsNetworkState) {
|
|||||||
while (!sender_done || !receiver_done) {
|
while (!sender_done || !receiver_done) {
|
||||||
packet_event_.Wait(kSilenceTimeoutMs);
|
packet_event_.Wait(kSilenceTimeoutMs);
|
||||||
int64_t time_now_ms = clock_->TimeInMilliseconds();
|
int64_t time_now_ms = clock_->TimeInMilliseconds();
|
||||||
rtc::CritScope lock(&test_crit_);
|
MutexLock lock(&test_mutex_);
|
||||||
if (sender_down) {
|
if (sender_down) {
|
||||||
ASSERT_LE(sender_rtp_ - initial_sender_rtp - sender_padding_,
|
ASSERT_LE(sender_rtp_ - initial_sender_rtp - sender_padding_,
|
||||||
kNumAcceptedDowntimeRtp)
|
kNumAcceptedDowntimeRtp)
|
||||||
@ -340,18 +341,18 @@ TEST_F(NetworkStateEndToEndTest, RespectsNetworkState) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TaskQueueBase* const task_queue_;
|
TaskQueueBase* const task_queue_;
|
||||||
rtc::CriticalSection test_crit_;
|
Mutex test_mutex_;
|
||||||
rtc::Event encoded_frames_;
|
rtc::Event encoded_frames_;
|
||||||
rtc::Event packet_event_;
|
rtc::Event packet_event_;
|
||||||
Call* sender_call_;
|
Call* sender_call_;
|
||||||
Call* receiver_call_;
|
Call* receiver_call_;
|
||||||
test::VideoEncoderProxyFactory encoder_factory_;
|
test::VideoEncoderProxyFactory encoder_factory_;
|
||||||
NetworkState sender_state_ RTC_GUARDED_BY(test_crit_);
|
NetworkState sender_state_ RTC_GUARDED_BY(test_mutex_);
|
||||||
int sender_rtp_ RTC_GUARDED_BY(test_crit_);
|
int sender_rtp_ RTC_GUARDED_BY(test_mutex_);
|
||||||
int sender_padding_ RTC_GUARDED_BY(test_crit_);
|
int sender_padding_ RTC_GUARDED_BY(test_mutex_);
|
||||||
int sender_rtcp_ RTC_GUARDED_BY(test_crit_);
|
int sender_rtcp_ RTC_GUARDED_BY(test_mutex_);
|
||||||
int receiver_rtcp_ RTC_GUARDED_BY(test_crit_);
|
int receiver_rtcp_ RTC_GUARDED_BY(test_mutex_);
|
||||||
int down_frames_ RTC_GUARDED_BY(test_crit_);
|
int down_frames_ RTC_GUARDED_BY(test_mutex_);
|
||||||
} test(task_queue());
|
} test(task_queue());
|
||||||
|
|
||||||
RunBaseTest(&test);
|
RunBaseTest(&test);
|
||||||
|
|||||||
@ -19,6 +19,7 @@
|
|||||||
#include "modules/rtp_rtcp/source/rtp_packet.h"
|
#include "modules/rtp_rtcp/source/rtp_packet.h"
|
||||||
#include "modules/video_coding/codecs/vp8/include/vp8.h"
|
#include "modules/video_coding/codecs/vp8/include/vp8.h"
|
||||||
#include "rtc_base/event.h"
|
#include "rtc_base/event.h"
|
||||||
|
#include "rtc_base/synchronization/mutex.h"
|
||||||
#include "rtc_base/task_queue_for_test.h"
|
#include "rtc_base/task_queue_for_test.h"
|
||||||
#include "test/call_test.h"
|
#include "test/call_test.h"
|
||||||
#include "test/field_trial.h"
|
#include "test/field_trial.h"
|
||||||
@ -58,7 +59,7 @@ TEST_F(RetransmissionEndToEndTest, ReceivesAndRetransmitsNack) {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
RtpPacket rtp_packet;
|
RtpPacket rtp_packet;
|
||||||
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
||||||
|
|
||||||
@ -95,7 +96,7 @@ TEST_F(RetransmissionEndToEndTest, ReceivesAndRetransmitsNack) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
test::RtcpPacketParser parser;
|
test::RtcpPacketParser parser;
|
||||||
EXPECT_TRUE(parser.Parse(packet, length));
|
EXPECT_TRUE(parser.Parse(packet, length));
|
||||||
nacks_left_ -= parser.nack()->num_packets();
|
nacks_left_ -= parser.nack()->num_packets();
|
||||||
@ -116,12 +117,12 @@ TEST_F(RetransmissionEndToEndTest, ReceivesAndRetransmitsNack) {
|
|||||||
"rendered.";
|
"rendered.";
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
std::set<uint16_t> dropped_packets_;
|
std::set<uint16_t> dropped_packets_;
|
||||||
std::set<uint16_t> retransmitted_packets_;
|
std::set<uint16_t> retransmitted_packets_;
|
||||||
uint64_t sent_rtp_packets_;
|
uint64_t sent_rtp_packets_;
|
||||||
int packets_left_to_drop_;
|
int packets_left_to_drop_;
|
||||||
int nacks_left_ RTC_GUARDED_BY(&crit_);
|
int nacks_left_ RTC_GUARDED_BY(&mutex_);
|
||||||
} test;
|
} test;
|
||||||
|
|
||||||
RunBaseTest(&test);
|
RunBaseTest(&test);
|
||||||
@ -290,7 +291,7 @@ void RetransmissionEndToEndTest::ReceivesPliAndRecovers(int rtp_history_ms) {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
RtpPacket rtp_packet;
|
RtpPacket rtp_packet;
|
||||||
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
||||||
|
|
||||||
@ -308,7 +309,7 @@ void RetransmissionEndToEndTest::ReceivesPliAndRecovers(int rtp_history_ms) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
test::RtcpPacketParser parser;
|
test::RtcpPacketParser parser;
|
||||||
EXPECT_TRUE(parser.Parse(packet, length));
|
EXPECT_TRUE(parser.Parse(packet, length));
|
||||||
if (!nack_enabled_)
|
if (!nack_enabled_)
|
||||||
@ -319,7 +320,7 @@ void RetransmissionEndToEndTest::ReceivesPliAndRecovers(int rtp_history_ms) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OnFrame(const VideoFrame& video_frame) override {
|
void OnFrame(const VideoFrame& video_frame) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
if (received_pli_ &&
|
if (received_pli_ &&
|
||||||
video_frame.timestamp() > highest_dropped_timestamp_) {
|
video_frame.timestamp() > highest_dropped_timestamp_) {
|
||||||
observation_complete_.Set();
|
observation_complete_.Set();
|
||||||
@ -343,12 +344,12 @@ void RetransmissionEndToEndTest::ReceivesPliAndRecovers(int rtp_history_ms) {
|
|||||||
"rendered afterwards.";
|
"rendered afterwards.";
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
int rtp_history_ms_;
|
int rtp_history_ms_;
|
||||||
bool nack_enabled_;
|
bool nack_enabled_;
|
||||||
uint32_t highest_dropped_timestamp_ RTC_GUARDED_BY(&crit_);
|
uint32_t highest_dropped_timestamp_ RTC_GUARDED_BY(&mutex_);
|
||||||
int frames_to_drop_ RTC_GUARDED_BY(&crit_);
|
int frames_to_drop_ RTC_GUARDED_BY(&mutex_);
|
||||||
bool received_pli_ RTC_GUARDED_BY(&crit_);
|
bool received_pli_ RTC_GUARDED_BY(&mutex_);
|
||||||
} test(rtp_history_ms);
|
} test(rtp_history_ms);
|
||||||
|
|
||||||
RunBaseTest(&test);
|
RunBaseTest(&test);
|
||||||
@ -382,7 +383,7 @@ void RetransmissionEndToEndTest::DecodesRetransmittedFrame(bool enable_rtx,
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
RtpPacket rtp_packet;
|
RtpPacket rtp_packet;
|
||||||
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
||||||
|
|
||||||
@ -427,7 +428,7 @@ void RetransmissionEndToEndTest::DecodesRetransmittedFrame(bool enable_rtx,
|
|||||||
void OnFrame(const VideoFrame& frame) override {
|
void OnFrame(const VideoFrame& frame) override {
|
||||||
EXPECT_EQ(kVideoRotation_90, frame.rotation());
|
EXPECT_EQ(kVideoRotation_90, frame.rotation());
|
||||||
{
|
{
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
if (frame.timestamp() == retransmitted_timestamp_)
|
if (frame.timestamp() == retransmitted_timestamp_)
|
||||||
observation_complete_.Set();
|
observation_complete_.Set();
|
||||||
rendered_timestamps_.push_back(frame.timestamp());
|
rendered_timestamps_.push_back(frame.timestamp());
|
||||||
@ -502,7 +503,7 @@ void RetransmissionEndToEndTest::DecodesRetransmittedFrame(bool enable_rtx,
|
|||||||
return kFakeVideoSendPayloadType;
|
return kFakeVideoSendPayloadType;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
rtc::VideoSinkInterface<VideoFrame>* orig_renderer_ = nullptr;
|
rtc::VideoSinkInterface<VideoFrame>* orig_renderer_ = nullptr;
|
||||||
const int payload_type_;
|
const int payload_type_;
|
||||||
const uint32_t retransmission_ssrc_;
|
const uint32_t retransmission_ssrc_;
|
||||||
@ -510,8 +511,8 @@ void RetransmissionEndToEndTest::DecodesRetransmittedFrame(bool enable_rtx,
|
|||||||
test::FunctionVideoEncoderFactory encoder_factory_;
|
test::FunctionVideoEncoderFactory encoder_factory_;
|
||||||
const std::string payload_name_;
|
const std::string payload_name_;
|
||||||
int marker_bits_observed_;
|
int marker_bits_observed_;
|
||||||
uint32_t retransmitted_timestamp_ RTC_GUARDED_BY(&crit_);
|
uint32_t retransmitted_timestamp_ RTC_GUARDED_BY(&mutex_);
|
||||||
std::vector<uint32_t> rendered_timestamps_ RTC_GUARDED_BY(&crit_);
|
std::vector<uint32_t> rendered_timestamps_ RTC_GUARDED_BY(&mutex_);
|
||||||
} test(enable_rtx, enable_red);
|
} test(enable_rtx, enable_red);
|
||||||
|
|
||||||
RunBaseTest(&test);
|
RunBaseTest(&test);
|
||||||
|
|||||||
@ -16,6 +16,7 @@
|
|||||||
#include "modules/include/module_common_types_public.h"
|
#include "modules/include/module_common_types_public.h"
|
||||||
#include "modules/rtp_rtcp/source/rtp_packet.h"
|
#include "modules/rtp_rtcp/source/rtp_packet.h"
|
||||||
#include "modules/video_coding/codecs/vp8/include/vp8.h"
|
#include "modules/video_coding/codecs/vp8/include/vp8.h"
|
||||||
|
#include "rtc_base/synchronization/mutex.h"
|
||||||
#include "rtc_base/task_queue_for_test.h"
|
#include "rtc_base/task_queue_for_test.h"
|
||||||
#include "test/call_test.h"
|
#include "test/call_test.h"
|
||||||
#include "test/gtest.h"
|
#include "test/gtest.h"
|
||||||
@ -46,7 +47,7 @@ void RtpRtcpEndToEndTest::RespectsRtcpMode(RtcpMode rtcp_mode) {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
if (++sent_rtp_ % 3 == 0)
|
if (++sent_rtp_ % 3 == 0)
|
||||||
return DROP_PACKET;
|
return DROP_PACKET;
|
||||||
|
|
||||||
@ -54,7 +55,7 @@ void RtpRtcpEndToEndTest::RespectsRtcpMode(RtcpMode rtcp_mode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
++sent_rtcp_;
|
++sent_rtcp_;
|
||||||
test::RtcpPacketParser parser;
|
test::RtcpPacketParser parser;
|
||||||
EXPECT_TRUE(parser.Parse(packet, length));
|
EXPECT_TRUE(parser.Parse(packet, length));
|
||||||
@ -105,11 +106,11 @@ void RtpRtcpEndToEndTest::RespectsRtcpMode(RtcpMode rtcp_mode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RtcpMode rtcp_mode_;
|
RtcpMode rtcp_mode_;
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
// Must be protected since RTCP can be sent by both the process thread
|
// Must be protected since RTCP can be sent by both the process thread
|
||||||
// and the pacer thread.
|
// and the pacer thread.
|
||||||
int sent_rtp_ RTC_GUARDED_BY(&crit_);
|
int sent_rtp_ RTC_GUARDED_BY(&mutex_);
|
||||||
int sent_rtcp_ RTC_GUARDED_BY(&crit_);
|
int sent_rtcp_ RTC_GUARDED_BY(&mutex_);
|
||||||
} test(rtcp_mode);
|
} test(rtcp_mode);
|
||||||
|
|
||||||
RunBaseTest(&test);
|
RunBaseTest(&test);
|
||||||
@ -176,7 +177,7 @@ void RtpRtcpEndToEndTest::TestRtpStatePreservation(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ResetExpectedSsrcs(size_t num_expected_ssrcs) {
|
void ResetExpectedSsrcs(size_t num_expected_ssrcs) {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
ssrc_observed_.clear();
|
ssrc_observed_.clear();
|
||||||
ssrcs_to_observe_ = num_expected_ssrcs;
|
ssrcs_to_observe_ = num_expected_ssrcs;
|
||||||
}
|
}
|
||||||
@ -185,7 +186,7 @@ void RtpRtcpEndToEndTest::TestRtpStatePreservation(
|
|||||||
void ValidateTimestampGap(uint32_t ssrc,
|
void ValidateTimestampGap(uint32_t ssrc,
|
||||||
uint32_t timestamp,
|
uint32_t timestamp,
|
||||||
bool only_padding)
|
bool only_padding)
|
||||||
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_) {
|
RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_) {
|
||||||
static const int32_t kMaxTimestampGap = kDefaultTimeoutMs * 90;
|
static const int32_t kMaxTimestampGap = kDefaultTimeoutMs * 90;
|
||||||
auto timestamp_it = last_observed_timestamp_.find(ssrc);
|
auto timestamp_it = last_observed_timestamp_.find(ssrc);
|
||||||
if (timestamp_it == last_observed_timestamp_.end()) {
|
if (timestamp_it == last_observed_timestamp_.end()) {
|
||||||
@ -240,7 +241,7 @@ void RtpRtcpEndToEndTest::TestRtpStatePreservation(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!ssrc_is_rtx_[ssrc]) {
|
if (!ssrc_is_rtx_[ssrc]) {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
ValidateTimestampGap(ssrc, timestamp, only_padding);
|
ValidateTimestampGap(ssrc, timestamp, only_padding);
|
||||||
|
|
||||||
// Wait for media packets on all ssrcs.
|
// Wait for media packets on all ssrcs.
|
||||||
@ -261,7 +262,7 @@ void RtpRtcpEndToEndTest::TestRtpStatePreservation(
|
|||||||
uint32_t ssrc = rtcp_parser.sender_report()->sender_ssrc();
|
uint32_t ssrc = rtcp_parser.sender_report()->sender_ssrc();
|
||||||
uint32_t rtcp_timestamp = rtcp_parser.sender_report()->rtp_timestamp();
|
uint32_t rtcp_timestamp = rtcp_parser.sender_report()->rtp_timestamp();
|
||||||
|
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
ValidateTimestampGap(ssrc, rtcp_timestamp, false);
|
ValidateTimestampGap(ssrc, rtcp_timestamp, false);
|
||||||
}
|
}
|
||||||
return SEND_PACKET;
|
return SEND_PACKET;
|
||||||
@ -272,9 +273,9 @@ void RtpRtcpEndToEndTest::TestRtpStatePreservation(
|
|||||||
std::map<uint32_t, uint32_t> last_observed_timestamp_;
|
std::map<uint32_t, uint32_t> last_observed_timestamp_;
|
||||||
std::map<uint32_t, bool> ssrc_is_rtx_;
|
std::map<uint32_t, bool> ssrc_is_rtx_;
|
||||||
|
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
size_t ssrcs_to_observe_ RTC_GUARDED_BY(crit_);
|
size_t ssrcs_to_observe_ RTC_GUARDED_BY(mutex_);
|
||||||
std::map<uint32_t, bool> ssrc_observed_ RTC_GUARDED_BY(crit_);
|
std::map<uint32_t, bool> ssrc_observed_ RTC_GUARDED_BY(mutex_);
|
||||||
} observer(use_rtx);
|
} observer(use_rtx);
|
||||||
|
|
||||||
std::unique_ptr<test::PacketTransport> send_transport;
|
std::unique_ptr<test::PacketTransport> send_transport;
|
||||||
@ -414,13 +415,13 @@ TEST_F(RtpRtcpEndToEndTest, DISABLED_TestFlexfecRtpStatePreservation) {
|
|||||||
num_flexfec_packets_sent_(0) {}
|
num_flexfec_packets_sent_(0) {}
|
||||||
|
|
||||||
void ResetPacketCount() {
|
void ResetPacketCount() {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
num_flexfec_packets_sent_ = 0;
|
num_flexfec_packets_sent_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
|
|
||||||
RtpPacket rtp_packet;
|
RtpPacket rtp_packet;
|
||||||
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
||||||
@ -468,10 +469,10 @@ TEST_F(RtpRtcpEndToEndTest, DISABLED_TestFlexfecRtpStatePreservation) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
absl::optional<uint16_t> last_observed_sequence_number_
|
absl::optional<uint16_t> last_observed_sequence_number_
|
||||||
RTC_GUARDED_BY(crit_);
|
RTC_GUARDED_BY(mutex_);
|
||||||
absl::optional<uint32_t> last_observed_timestamp_ RTC_GUARDED_BY(crit_);
|
absl::optional<uint32_t> last_observed_timestamp_ RTC_GUARDED_BY(mutex_);
|
||||||
size_t num_flexfec_packets_sent_ RTC_GUARDED_BY(crit_);
|
size_t num_flexfec_packets_sent_ RTC_GUARDED_BY(mutex_);
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
} observer;
|
} observer;
|
||||||
|
|
||||||
static constexpr int kFrameMaxWidth = 320;
|
static constexpr int kFrameMaxWidth = 320;
|
||||||
|
|||||||
@ -20,6 +20,7 @@
|
|||||||
#include "modules/rtp_rtcp/source/rtp_utility.h"
|
#include "modules/rtp_rtcp/source/rtp_utility.h"
|
||||||
#include "modules/video_coding/include/video_coding_defines.h"
|
#include "modules/video_coding/include/video_coding_defines.h"
|
||||||
#include "rtc_base/strings/string_builder.h"
|
#include "rtc_base/strings/string_builder.h"
|
||||||
|
#include "rtc_base/synchronization/mutex.h"
|
||||||
#include "rtc_base/task_queue_for_test.h"
|
#include "rtc_base/task_queue_for_test.h"
|
||||||
#include "system_wrappers/include/metrics.h"
|
#include "system_wrappers/include/metrics.h"
|
||||||
#include "system_wrappers/include/sleep.h"
|
#include "system_wrappers/include/sleep.h"
|
||||||
@ -479,7 +480,7 @@ TEST_F(StatsEndToEndTest, MAYBE_ContentTypeSwitches) {
|
|||||||
if (video_frame.ntp_time_ms() > 0 &&
|
if (video_frame.ntp_time_ms() > 0 &&
|
||||||
Clock::GetRealTimeClock()->CurrentNtpInMilliseconds() >=
|
Clock::GetRealTimeClock()->CurrentNtpInMilliseconds() >=
|
||||||
video_frame.ntp_time_ms()) {
|
video_frame.ntp_time_ms()) {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
++num_frames_received_;
|
++num_frames_received_;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -493,7 +494,7 @@ TEST_F(StatsEndToEndTest, MAYBE_ContentTypeSwitches) {
|
|||||||
bool MinNumberOfFramesReceived() const {
|
bool MinNumberOfFramesReceived() const {
|
||||||
// Have some room for frames with wrong content type during switch.
|
// Have some room for frames with wrong content type during switch.
|
||||||
const int kMinRequiredHistogramSamples = 200 + 50;
|
const int kMinRequiredHistogramSamples = 200 + 50;
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
return num_frames_received_ > kMinRequiredHistogramSamples;
|
return num_frames_received_ > kMinRequiredHistogramSamples;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -502,13 +503,13 @@ TEST_F(StatsEndToEndTest, MAYBE_ContentTypeSwitches) {
|
|||||||
EXPECT_TRUE(Wait()) << "Timed out waiting for enough packets.";
|
EXPECT_TRUE(Wait()) << "Timed out waiting for enough packets.";
|
||||||
// Reset frame counter so next PerformTest() call will do something.
|
// Reset frame counter so next PerformTest() call will do something.
|
||||||
{
|
{
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
num_frames_received_ = 0;
|
num_frames_received_ = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc::CriticalSection crit_;
|
mutable Mutex mutex_;
|
||||||
int num_frames_received_ RTC_GUARDED_BY(&crit_);
|
int num_frames_received_ RTC_GUARDED_BY(&mutex_);
|
||||||
} test;
|
} test;
|
||||||
|
|
||||||
metrics::Reset();
|
metrics::Reset();
|
||||||
@ -609,7 +610,7 @@ TEST_F(StatsEndToEndTest, VerifyNackStats) {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
if (++sent_rtp_packets_ == kPacketNumberToDrop) {
|
if (++sent_rtp_packets_ == kPacketNumberToDrop) {
|
||||||
std::unique_ptr<RtpHeaderParser> parser(
|
std::unique_ptr<RtpHeaderParser> parser(
|
||||||
RtpHeaderParser::CreateForTest());
|
RtpHeaderParser::CreateForTest());
|
||||||
@ -623,7 +624,7 @@ TEST_F(StatsEndToEndTest, VerifyNackStats) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
test::RtcpPacketParser rtcp_parser;
|
test::RtcpPacketParser rtcp_parser;
|
||||||
rtcp_parser.Parse(packet, length);
|
rtcp_parser.Parse(packet, length);
|
||||||
const std::vector<uint16_t>& nacks = rtcp_parser.nack()->packet_ids();
|
const std::vector<uint16_t>& nacks = rtcp_parser.nack()->packet_ids();
|
||||||
@ -633,7 +634,7 @@ TEST_F(StatsEndToEndTest, VerifyNackStats) {
|
|||||||
return SEND_PACKET;
|
return SEND_PACKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VerifyStats() RTC_EXCLUSIVE_LOCKS_REQUIRED(&crit_) {
|
void VerifyStats() RTC_EXCLUSIVE_LOCKS_REQUIRED(&mutex_) {
|
||||||
if (!dropped_rtp_packet_requested_)
|
if (!dropped_rtp_packet_requested_)
|
||||||
return;
|
return;
|
||||||
int send_stream_nack_packets = 0;
|
int send_stream_nack_packets = 0;
|
||||||
@ -684,7 +685,7 @@ TEST_F(StatsEndToEndTest, VerifyNackStats) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Run() override {
|
bool Run() override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
VerifyStats();
|
VerifyStats();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -694,10 +695,10 @@ TEST_F(StatsEndToEndTest, VerifyNackStats) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
test::FakeVideoRenderer fake_renderer_;
|
test::FakeVideoRenderer fake_renderer_;
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
uint64_t sent_rtp_packets_;
|
uint64_t sent_rtp_packets_;
|
||||||
uint16_t dropped_rtp_packet_ RTC_GUARDED_BY(&crit_);
|
uint16_t dropped_rtp_packet_ RTC_GUARDED_BY(&mutex_);
|
||||||
bool dropped_rtp_packet_requested_ RTC_GUARDED_BY(&crit_);
|
bool dropped_rtp_packet_requested_ RTC_GUARDED_BY(&mutex_);
|
||||||
std::vector<VideoReceiveStream*> receive_streams_;
|
std::vector<VideoReceiveStream*> receive_streams_;
|
||||||
VideoSendStream* send_stream_;
|
VideoSendStream* send_stream_;
|
||||||
absl::optional<int64_t> start_runtime_ms_;
|
absl::optional<int64_t> start_runtime_ms_;
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
#include "modules/rtp_rtcp/source/byte_io.h"
|
#include "modules/rtp_rtcp/source/byte_io.h"
|
||||||
#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
|
#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
|
||||||
#include "modules/rtp_rtcp/source/rtp_packet.h"
|
#include "modules/rtp_rtcp/source/rtp_packet.h"
|
||||||
|
#include "rtc_base/synchronization/mutex.h"
|
||||||
#include "test/call_test.h"
|
#include "test/call_test.h"
|
||||||
#include "test/field_trial.h"
|
#include "test/field_trial.h"
|
||||||
#include "test/gtest.h"
|
#include "test/gtest.h"
|
||||||
@ -65,7 +66,7 @@ TEST(TransportFeedbackMultiStreamTest, AssignsTransportSequenceNumbers) {
|
|||||||
size_t length,
|
size_t length,
|
||||||
const PacketOptions& options) override {
|
const PacketOptions& options) override {
|
||||||
{
|
{
|
||||||
rtc::CritScope cs(&lock_);
|
MutexLock lock(&lock_);
|
||||||
|
|
||||||
if (IsDone())
|
if (IsDone())
|
||||||
return false;
|
return false;
|
||||||
@ -141,14 +142,14 @@ TEST(TransportFeedbackMultiStreamTest, AssignsTransportSequenceNumbers) {
|
|||||||
{
|
{
|
||||||
// Can't be sure until this point that rtx_to_media_ssrcs_ etc have
|
// Can't be sure until this point that rtx_to_media_ssrcs_ etc have
|
||||||
// been initialized and are OK to read.
|
// been initialized and are OK to read.
|
||||||
rtc::CritScope cs(&lock_);
|
MutexLock lock(&lock_);
|
||||||
started_ = true;
|
started_ = true;
|
||||||
}
|
}
|
||||||
return done_.Wait(kDefaultTimeoutMs);
|
return done_.Wait(kDefaultTimeoutMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
rtc::CriticalSection lock_;
|
Mutex lock_;
|
||||||
rtc::Event done_;
|
rtc::Event done_;
|
||||||
RtpHeaderExtensionMap extensions_;
|
RtpHeaderExtensionMap extensions_;
|
||||||
SequenceNumberUnwrapper unwrapper_;
|
SequenceNumberUnwrapper unwrapper_;
|
||||||
@ -366,7 +367,7 @@ TEST_F(TransportFeedbackEndToEndTest,
|
|||||||
RtpPacket rtp_packet;
|
RtpPacket rtp_packet;
|
||||||
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
EXPECT_TRUE(rtp_packet.Parse(packet, length));
|
||||||
const bool only_padding = rtp_packet.payload_size() == 0;
|
const bool only_padding = rtp_packet.payload_size() == 0;
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
// Padding is expected in congested state to probe for connectivity when
|
// Padding is expected in congested state to probe for connectivity when
|
||||||
// packets has been dropped.
|
// packets has been dropped.
|
||||||
if (only_padding) {
|
if (only_padding) {
|
||||||
@ -386,7 +387,7 @@ TEST_F(TransportFeedbackEndToEndTest,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Action OnReceiveRtcp(const uint8_t* data, size_t length) override {
|
Action OnReceiveRtcp(const uint8_t* data, size_t length) override {
|
||||||
rtc::CritScope lock(&crit_);
|
MutexLock lock(&mutex_);
|
||||||
// To fill up the congestion window we drop feedback on packets after 20
|
// To fill up the congestion window we drop feedback on packets after 20
|
||||||
// packets have been sent. This means that any packets that has not yet
|
// packets have been sent. This means that any packets that has not yet
|
||||||
// received feedback after that will be considered as oustanding data and
|
// received feedback after that will be considered as oustanding data and
|
||||||
@ -425,10 +426,10 @@ TEST_F(TransportFeedbackEndToEndTest,
|
|||||||
private:
|
private:
|
||||||
const size_t num_video_streams_;
|
const size_t num_video_streams_;
|
||||||
const size_t num_audio_streams_;
|
const size_t num_audio_streams_;
|
||||||
rtc::CriticalSection crit_;
|
Mutex mutex_;
|
||||||
int media_sent_ RTC_GUARDED_BY(crit_);
|
int media_sent_ RTC_GUARDED_BY(mutex_);
|
||||||
int media_sent_before_ RTC_GUARDED_BY(crit_);
|
int media_sent_before_ RTC_GUARDED_BY(mutex_);
|
||||||
int padding_sent_ RTC_GUARDED_BY(crit_);
|
int padding_sent_ RTC_GUARDED_BY(mutex_);
|
||||||
} test(1, 0);
|
} test(1, 0);
|
||||||
RunBaseTest(&test);
|
RunBaseTest(&test);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user