(Un/)Subscribe RtpVideoSender for feedback on the transport queue.
* RtpVideoSender now registers/unregisters for feedback callback inside of SetActive(), which runs on the transport queue. * Transport feedback is given on the transport queue * Registration/unregistration for feedback is done on the same * Removed the last mutex from TransportFeedbackDemuxer. Ultimately, this work is related to moving state from the Call class, that's related to network configuration, but due to the code is currently written is attached to the worker thread, over to the Transport, where it's used (e.g. suspended_video_send_ssrcs_). Bug: webrtc:13517, webrtc:11993 Change-Id: I057d0e2597e6cb746b335e0308599cd547350e56 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/248165 Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org> Cr-Commit-Position: refs/heads/main@{#35777}
This commit is contained in:
@ -44,11 +44,7 @@ void TransportFeedbackDemuxer::DeRegisterStreamFeedbackObserver(
|
||||
}
|
||||
|
||||
void TransportFeedbackDemuxer::AddPacket(const RtpPacketSendInfo& packet_info) {
|
||||
// Currently called on the send transport queue.
|
||||
// TODO(tommi): When registration/unregistration as well as
|
||||
// OnTransportFeedback callbacks occur on the transport queue, we can remove
|
||||
// this lock.
|
||||
MutexLock lock(&lock_);
|
||||
RTC_DCHECK_RUN_ON(&observer_checker_);
|
||||
|
||||
StreamFeedbackObserver::StreamPacketInfo info;
|
||||
info.ssrc = packet_info.media_ssrc;
|
||||
@ -66,24 +62,22 @@ void TransportFeedbackDemuxer::AddPacket(const RtpPacketSendInfo& packet_info) {
|
||||
|
||||
void TransportFeedbackDemuxer::OnTransportFeedback(
|
||||
const rtcp::TransportFeedback& feedback) {
|
||||
RTC_DCHECK_RUN_ON(&observer_checker_);
|
||||
|
||||
std::vector<StreamFeedbackObserver::StreamPacketInfo> stream_feedbacks;
|
||||
{
|
||||
MutexLock lock(&lock_);
|
||||
for (const auto& packet : feedback.GetAllPackets()) {
|
||||
int64_t seq_num =
|
||||
seq_num_unwrapper_.UnwrapWithoutUpdate(packet.sequence_number());
|
||||
auto it = history_.find(seq_num);
|
||||
if (it != history_.end()) {
|
||||
auto packet_info = it->second;
|
||||
packet_info.received = packet.received();
|
||||
stream_feedbacks.push_back(std::move(packet_info));
|
||||
if (packet.received())
|
||||
history_.erase(it);
|
||||
}
|
||||
for (const auto& packet : feedback.GetAllPackets()) {
|
||||
int64_t seq_num =
|
||||
seq_num_unwrapper_.UnwrapWithoutUpdate(packet.sequence_number());
|
||||
auto it = history_.find(seq_num);
|
||||
if (it != history_.end()) {
|
||||
auto packet_info = it->second;
|
||||
packet_info.received = packet.received();
|
||||
stream_feedbacks.push_back(std::move(packet_info));
|
||||
if (packet.received())
|
||||
history_.erase(it);
|
||||
}
|
||||
}
|
||||
|
||||
RTC_DCHECK_RUN_ON(&observer_checker_);
|
||||
for (auto& observer : observers_) {
|
||||
std::vector<StreamFeedbackObserver::StreamPacketInfo> selected_feedback;
|
||||
for (const auto& packet_info : stream_feedbacks) {
|
||||
|
||||
@ -17,7 +17,6 @@
|
||||
#include "api/sequence_checker.h"
|
||||
#include "modules/include/module_common_types_public.h"
|
||||
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
|
||||
#include "rtc_base/synchronization/mutex.h"
|
||||
#include "rtc_base/system/no_unique_address.h"
|
||||
|
||||
namespace webrtc {
|
||||
@ -45,15 +44,14 @@ class TransportFeedbackDemuxer final : public StreamFeedbackProvider {
|
||||
void OnTransportFeedback(const rtcp::TransportFeedback& feedback);
|
||||
|
||||
private:
|
||||
Mutex lock_;
|
||||
SequenceNumberUnwrapper seq_num_unwrapper_ RTC_GUARDED_BY(&lock_);
|
||||
RTC_NO_UNIQUE_ADDRESS SequenceChecker observer_checker_;
|
||||
SequenceNumberUnwrapper seq_num_unwrapper_ RTC_GUARDED_BY(&observer_checker_);
|
||||
std::map<int64_t, StreamFeedbackObserver::StreamPacketInfo> history_
|
||||
RTC_GUARDED_BY(&lock_);
|
||||
RTC_GUARDED_BY(&observer_checker_);
|
||||
|
||||
// Maps a set of ssrcs to corresponding observer. Vectors are used rather than
|
||||
// set/map to ensure that the processing order is consistent independently of
|
||||
// the randomized ssrcs.
|
||||
RTC_NO_UNIQUE_ADDRESS SequenceChecker observer_checker_;
|
||||
std::vector<std::pair<std::vector<uint32_t>, StreamFeedbackObserver*>>
|
||||
observers_ RTC_GUARDED_BY(&observer_checker_);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user