xref: /aosp_15_r20/external/webrtc/modules/congestion_controller/rtp/transport_feedback_demuxer.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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 #ifndef MODULES_CONGESTION_CONTROLLER_RTP_TRANSPORT_FEEDBACK_DEMUXER_H_
11 #define MODULES_CONGESTION_CONTROLLER_RTP_TRANSPORT_FEEDBACK_DEMUXER_H_
12 
13 #include <map>
14 #include <utility>
15 #include <vector>
16 
17 #include "api/sequence_checker.h"
18 #include "modules/include/module_common_types_public.h"
19 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
20 #include "rtc_base/system/no_unique_address.h"
21 
22 namespace webrtc {
23 
24 // Implementation of StreamFeedbackProvider that provides a way for
25 // implementations of StreamFeedbackObserver to register for feedback callbacks
26 // for a given set of SSRCs.
27 // Registration methods need to be called from the same execution context
28 // (thread or task queue) and callbacks to
29 // StreamFeedbackObserver::OnPacketFeedbackVector will be made in that same
30 // context.
31 // TODO(tommi): This appears to be the only implementation of this interface.
32 // Do we need the interface?
33 class TransportFeedbackDemuxer final : public StreamFeedbackProvider {
34  public:
35   TransportFeedbackDemuxer();
36 
37   // Implements StreamFeedbackProvider interface
38   void RegisterStreamFeedbackObserver(
39       std::vector<uint32_t> ssrcs,
40       StreamFeedbackObserver* observer) override;
41   void DeRegisterStreamFeedbackObserver(
42       StreamFeedbackObserver* observer) override;
43   void AddPacket(const RtpPacketSendInfo& packet_info);
44   void OnTransportFeedback(const rtcp::TransportFeedback& feedback);
45 
46  private:
47   RTC_NO_UNIQUE_ADDRESS SequenceChecker observer_checker_;
48   SequenceNumberUnwrapper seq_num_unwrapper_ RTC_GUARDED_BY(&observer_checker_);
49   std::map<int64_t, StreamFeedbackObserver::StreamPacketInfo> history_
50       RTC_GUARDED_BY(&observer_checker_);
51 
52   // Maps a set of ssrcs to corresponding observer. Vectors are used rather than
53   // set/map to ensure that the processing order is consistent independently of
54   // the randomized ssrcs.
55   std::vector<std::pair<std::vector<uint32_t>, StreamFeedbackObserver*>>
56       observers_ RTC_GUARDED_BY(&observer_checker_);
57 };
58 }  // namespace webrtc
59 
60 #endif  // MODULES_CONGESTION_CONTROLLER_RTP_TRANSPORT_FEEDBACK_DEMUXER_H_
61