tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

transport_feedback_demuxer.cc (2819B)


      1 /*
      2 *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
      3 *
      4 *  Use of this source code is governed by a BSD-style license
      5 *  that can be found in the LICENSE file in the root of the source
      6 *  tree. An additional intellectual property rights grant can be found
      7 *  in the file PATENTS.  All contributing project authors may
      8 *  be found in the AUTHORS file in the root of the source tree.
      9 */
     10 #include "modules/congestion_controller/rtp/transport_feedback_demuxer.h"
     11 
     12 #include <cstdint>
     13 #include <utility>
     14 #include <vector>
     15 
     16 #include "absl/algorithm/container.h"
     17 #include "api/sequence_checker.h"
     18 #include "api/transport/network_types.h"
     19 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
     20 #include "rtc_base/checks.h"
     21 
     22 namespace webrtc {
     23 
     24 TransportFeedbackDemuxer::TransportFeedbackDemuxer() {
     25  // In case the construction thread is different from where the registration
     26  // and callbacks occur, detach from the construction thread.
     27  observer_checker_.Detach();
     28 }
     29 
     30 void TransportFeedbackDemuxer::RegisterStreamFeedbackObserver(
     31    std::vector<uint32_t> ssrcs,
     32    StreamFeedbackObserver* observer) {
     33  RTC_DCHECK_RUN_ON(&observer_checker_);
     34  RTC_DCHECK(observer);
     35  RTC_DCHECK(absl::c_find_if(observers_, [=](const auto& pair) {
     36               return pair.second == observer;
     37             }) == observers_.end());
     38  observers_.push_back({ssrcs, observer});
     39 }
     40 
     41 void TransportFeedbackDemuxer::DeRegisterStreamFeedbackObserver(
     42    StreamFeedbackObserver* observer) {
     43  RTC_DCHECK_RUN_ON(&observer_checker_);
     44  RTC_DCHECK(observer);
     45  const auto it = absl::c_find_if(
     46      observers_, [=](const auto& pair) { return pair.second == observer; });
     47  RTC_DCHECK(it != observers_.end());
     48  observers_.erase(it);
     49 }
     50 
     51 void TransportFeedbackDemuxer::OnTransportFeedback(
     52    const TransportPacketsFeedback& feedback) {
     53  RTC_DCHECK_RUN_ON(&observer_checker_);
     54 
     55  std::vector<StreamFeedbackObserver::StreamPacketInfo> stream_feedbacks;
     56  for (const PacketResult& packet : feedback.packet_feedbacks) {
     57    if (packet.rtp_packet_info.has_value()) {
     58      stream_feedbacks.push_back(
     59          {.received = packet.receive_time.IsFinite(),
     60           .ssrc = packet.rtp_packet_info->ssrc,
     61           .rtp_sequence_number = packet.rtp_packet_info->rtp_sequence_number,
     62           .is_retransmission = packet.rtp_packet_info->is_retransmission});
     63    }
     64  }
     65 
     66  for (auto& observer : observers_) {
     67    std::vector<StreamFeedbackObserver::StreamPacketInfo> selected_feedback;
     68    for (const auto& packet_info : stream_feedbacks) {
     69      if (absl::c_count(observer.first, packet_info.ssrc) > 0) {
     70        selected_feedback.push_back(packet_info);
     71      }
     72    }
     73    if (!selected_feedback.empty()) {
     74      observer.second->OnPacketFeedbackVector(std::move(selected_feedback));
     75    }
     76  }
     77 }
     78 
     79 }  // namespace webrtc