• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2017 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 CALL_RTP_STREAM_RECEIVER_CONTROLLER_H_
11 #define CALL_RTP_STREAM_RECEIVER_CONTROLLER_H_
12 
13 #include <memory>
14 
15 #include "call/rtp_demuxer.h"
16 #include "call/rtp_stream_receiver_controller_interface.h"
17 #include "rtc_base/deprecated/recursive_critical_section.h"
18 
19 namespace webrtc {
20 
21 class RtpPacketReceived;
22 
23 // This class represents the RTP receive parsing and demuxing, for a
24 // single RTP session.
25 // TODO(nisse): Add RTCP processing, we should aim to terminate RTCP
26 // and not leave any RTCP processing to individual receive streams.
27 // TODO(nisse): Extract per-packet processing, including parsing and
28 // demuxing, into a separate class.
29 class RtpStreamReceiverController
30     : public RtpStreamReceiverControllerInterface {
31  public:
32   RtpStreamReceiverController();
33   ~RtpStreamReceiverController() override;
34 
35   // Implements RtpStreamReceiverControllerInterface.
36   std::unique_ptr<RtpStreamReceiverInterface> CreateReceiver(
37       uint32_t ssrc,
38       RtpPacketSinkInterface* sink) override;
39 
40   // Thread-safe wrappers for the corresponding RtpDemuxer methods.
41   bool AddSink(uint32_t ssrc, RtpPacketSinkInterface* sink) override;
42   size_t RemoveSink(const RtpPacketSinkInterface* sink) override;
43 
44   // TODO(nisse): Not yet responsible for parsing.
45   bool OnRtpPacket(const RtpPacketReceived& packet);
46 
47  private:
48   class Receiver : public RtpStreamReceiverInterface {
49    public:
50     Receiver(RtpStreamReceiverController* controller,
51              uint32_t ssrc,
52              RtpPacketSinkInterface* sink);
53 
54     ~Receiver() override;
55 
56    private:
57     RtpStreamReceiverController* const controller_;
58     RtpPacketSinkInterface* const sink_;
59   };
60 
61   // TODO(nisse): Move to a TaskQueue for synchronization. When used
62   // by Call, we expect construction and all methods but OnRtpPacket
63   // to be called on the same thread, and OnRtpPacket to be called
64   // by a single, but possibly distinct, thread. But applications not
65   // using Call may have use threads differently.
66   rtc::RecursiveCriticalSection lock_;
67   RtpDemuxer demuxer_ RTC_GUARDED_BY(&lock_);
68 };
69 
70 }  // namespace webrtc
71 
72 #endif  // CALL_RTP_STREAM_RECEIVER_CONTROLLER_H_
73