UpdateActiveSimulcastLayers has been blocking WebRtcVideoChannel::SetSend which may be called quite frequently during negotiations. This CL changes UpdateActiveSimulcastLayers to not synchronize with the transport's task queue to wait for the changes to get applied. This synchronization is quite costly, but so too are other remaining things in VideoSendStream, so we should aim to get rid of the `thread_sync_event_` in VideoSendStream. Bug: webrtc:12840, webrtc:12854 Change-Id: Idb48d29b6b8382881c7c1e6f1d0f5e708dbca30f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/221203 Commit-Queue: Tommi <tommi@webrtc.org> Reviewed-by: Markus Handell <handellm@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34228}
124 lines
4.0 KiB
C++
124 lines
4.0 KiB
C++
/*
|
|
* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef VIDEO_VIDEO_SEND_STREAM_H_
|
|
#define VIDEO_VIDEO_SEND_STREAM_H_
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "api/fec_controller.h"
|
|
#include "api/sequence_checker.h"
|
|
#include "api/video/video_stream_encoder_interface.h"
|
|
#include "call/bitrate_allocator.h"
|
|
#include "call/video_receive_stream.h"
|
|
#include "call/video_send_stream.h"
|
|
#include "rtc_base/event.h"
|
|
#include "rtc_base/system/no_unique_address.h"
|
|
#include "rtc_base/task_queue.h"
|
|
#include "rtc_base/task_utils/pending_task_safety_flag.h"
|
|
#include "video/encoder_rtcp_feedback.h"
|
|
#include "video/send_delay_stats.h"
|
|
#include "video/send_statistics_proxy.h"
|
|
#include "video/video_send_stream_impl.h"
|
|
|
|
namespace webrtc {
|
|
namespace test {
|
|
class VideoSendStreamPeer;
|
|
} // namespace test
|
|
|
|
class CallStats;
|
|
class IvfFileWriter;
|
|
class ProcessThread;
|
|
class RateLimiter;
|
|
class RtpRtcp;
|
|
class RtpTransportControllerSendInterface;
|
|
class RtcEventLog;
|
|
|
|
namespace internal {
|
|
|
|
class VideoSendStreamImpl;
|
|
|
|
// VideoSendStream implements webrtc::VideoSendStream.
|
|
// Internally, it delegates all public methods to VideoSendStreamImpl and / or
|
|
// VideoStreamEncoder.
|
|
class VideoSendStream : public webrtc::VideoSendStream {
|
|
public:
|
|
using RtpStateMap = std::map<uint32_t, RtpState>;
|
|
using RtpPayloadStateMap = std::map<uint32_t, RtpPayloadState>;
|
|
|
|
VideoSendStream(
|
|
Clock* clock,
|
|
int num_cpu_cores,
|
|
ProcessThread* module_process_thread,
|
|
TaskQueueFactory* task_queue_factory,
|
|
RtcpRttStats* call_stats,
|
|
RtpTransportControllerSendInterface* transport,
|
|
BitrateAllocatorInterface* bitrate_allocator,
|
|
SendDelayStats* send_delay_stats,
|
|
RtcEventLog* event_log,
|
|
VideoSendStream::Config config,
|
|
VideoEncoderConfig encoder_config,
|
|
const std::map<uint32_t, RtpState>& suspended_ssrcs,
|
|
const std::map<uint32_t, RtpPayloadState>& suspended_payload_states,
|
|
std::unique_ptr<FecController> fec_controller);
|
|
|
|
~VideoSendStream() override;
|
|
|
|
void DeliverRtcp(const uint8_t* packet, size_t length);
|
|
|
|
// webrtc::VideoSendStream implementation.
|
|
void UpdateActiveSimulcastLayers(
|
|
const std::vector<bool> active_layers) override;
|
|
void Start() override;
|
|
void Stop() override;
|
|
|
|
void AddAdaptationResource(rtc::scoped_refptr<Resource> resource) override;
|
|
std::vector<rtc::scoped_refptr<Resource>> GetAdaptationResources() override;
|
|
|
|
void SetSource(rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
|
|
const DegradationPreference& degradation_preference) override;
|
|
|
|
void ReconfigureVideoEncoder(VideoEncoderConfig) override;
|
|
Stats GetStats() override;
|
|
|
|
void StopPermanentlyAndGetRtpStates(RtpStateMap* rtp_state_map,
|
|
RtpPayloadStateMap* payload_state_map);
|
|
|
|
private:
|
|
friend class test::VideoSendStreamPeer;
|
|
|
|
class ConstructionTask;
|
|
|
|
absl::optional<float> GetPacingFactorOverride() const;
|
|
|
|
RTC_NO_UNIQUE_ADDRESS SequenceChecker thread_checker_;
|
|
rtc::TaskQueue* const rtp_transport_queue_;
|
|
RtpTransportControllerSendInterface* const transport_;
|
|
rtc::Event thread_sync_event_;
|
|
rtc::scoped_refptr<PendingTaskSafetyFlag> transport_queue_safety_ =
|
|
PendingTaskSafetyFlag::CreateDetached();
|
|
|
|
SendStatisticsProxy stats_proxy_;
|
|
const VideoSendStream::Config config_;
|
|
const VideoEncoderConfig::ContentType content_type_;
|
|
std::unique_ptr<VideoStreamEncoderInterface> video_stream_encoder_;
|
|
EncoderRtcpFeedback encoder_feedback_;
|
|
RtpVideoSenderInterface* const rtp_video_sender_ = nullptr;
|
|
VideoSendStreamImpl send_stream_;
|
|
bool running_ RTC_GUARDED_BY(thread_checker_) = false;
|
|
};
|
|
|
|
} // namespace internal
|
|
} // namespace webrtc
|
|
|
|
#endif // VIDEO_VIDEO_SEND_STREAM_H_
|