Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(972)

Side by Side Diff: webrtc/call/rtp_transport_controller_receive.cc

Issue 2709723003: Initial implementation of RtpTransportControllerReceive and related interfaces.
Patch Set: Add return statement, to please windows compiler. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
11 #include <map>
12 #include <utility>
13 #include <vector>
14
15 #include "webrtc/call/rtp_transport_controller_receive.h"
16 #include "webrtc/modules/congestion_controller/include/receive_side_congestion_c ontroller.h"
17 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
18 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
19
20 namespace webrtc {
21
22 class RtpTransportControllerReceive
danilchap 2017/04/19 15:45:25 may be hide the class inside unnamed namespace to
nisse-webrtc 2017/04/20 10:53:38 Done.
23 : public RtpTransportControllerReceiveInterface {
24 public:
25 explicit RtpTransportControllerReceive(
danilchap 2017/04/19 15:45:25 remove explicit: there are 2 parameters
nisse-webrtc 2017/04/20 10:53:38 Done.
26 ReceiveSideCongestionController* receive_side_cc,
27 bool enable_receive_side_bwe);
28
29 // ImplementRtpTransportControllerReceiveInterface
30 void AddReceiver(uint32_t ssrc,
31 const Config& config,
32 RtpPacketReceiverInterface* receiver) override;
33 void RemoveReceiver(const RtpPacketReceiverInterface* receiver) override;
34
35 void AddSink(uint32_t ssrc, RtpPacketSinkInterface* sink) override;
36 void RemoveSink(const RtpPacketSinkInterface* sink) override;
37
38 #if 0
39 void RegisterPayload(uint8_t payload_type, MediaType media_type,
40 RtpPacketReceiverInterface *receiver) override;
41 #endif
42 PacketReceiver::DeliveryStatus OnRtpPacket(
43 int64_t arrival_time_ms,
44 rtc::ArrayView<const uint8_t> packet) override;
45
46 ~RtpTransportControllerReceive() override;
danilchap 2017/04/19 15:45:25 declare destructor before other methods, just afte
nisse-webrtc 2017/04/20 10:53:37 Done.
47
48 private:
49 struct Stream {
50 Config config;
51 RtpPacketReceiverInterface* receiver;
52 std::vector<RtpPacketSinkInterface*> auxillary_sinks;
53
54 Stream(Config config, RtpPacketReceiverInterface* receiver)
55 : config(config), receiver(receiver) {}
56 };
57
58 Stream* LookupStream(uint32_t ssrc);
59
60 // Indexed by ssrc.
61 std::map<uint32_t, Stream> streams_;
62 ReceiveSideCongestionController* const receive_side_cc_;
63 const bool enable_receive_side_bwe_;
64 };
65
66 RtpTransportControllerReceive::RtpTransportControllerReceive(
67 ReceiveSideCongestionController* receive_side_cc,
68 bool enable_receive_side_bwe)
69 : receive_side_cc_(receive_side_cc),
70 enable_receive_side_bwe_(enable_receive_side_bwe) {}
71
72 RtpTransportControllerReceive::~RtpTransportControllerReceive() {
73 RTC_DCHECK(streams_.empty());
74 }
75
76 RtpTransportControllerReceive::Stream*
77 RtpTransportControllerReceive::LookupStream(uint32_t ssrc) {
78 const auto& it = streams_.find(ssrc);
danilchap 2017/04/19 15:45:25 iterators usually ok to copy, i.e. auto it = strea
nisse-webrtc 2017/04/20 10:53:38 Ok. Keeping const, though, to make it clearer that
79 return (it != streams_.end()) ? &it->second : nullptr;
80 }
81
82 void RtpTransportControllerReceive::AddReceiver(
83 uint32_t ssrc,
84 const Config& config,
85 RtpPacketReceiverInterface* receiver) {
86 RTC_DCHECK(!LookupStream(ssrc));
87
88 streams_.insert(std::pair<uint32_t, Stream>(ssrc, Stream(config, receiver)));
danilchap 2017/04/19 15:45:25 may be streams_.emplace(ssrc, Stream(config, recei
nisse-webrtc 2017/04/20 10:53:38 Done.
89 }
90
91 void RtpTransportControllerReceive::RemoveReceiver(
92 const RtpPacketReceiverInterface* receiver) {
93 for (auto it = streams_.begin(); it != streams_.end();) {
94 if (it->second.receiver == receiver) {
95 receive_side_cc_
96 ->GetRemoteBitrateEstimator(it->second.config.use_send_side_bwe)
97 ->RemoveStream(it->first);
98 it = streams_.erase(it);
99 } else {
100 ++it;
101 }
102 }
103 }
104
105 void RtpTransportControllerReceive::AddSink(uint32_t ssrc,
106 RtpPacketSinkInterface* sink) {
107 Stream* stream = LookupStream(ssrc);
108 // Can't DCHECK this, since flexfec tests create flexfec streams
109 // without creating the streams they are protecting.
110 if (!stream)
111 return;
112
113 stream->auxillary_sinks.push_back(sink);
114 }
115
116 void RtpTransportControllerReceive::RemoveSink(
117 const RtpPacketSinkInterface* sink) {
118 for (auto it : streams_) {
danilchap 2017/04/19 15:45:25 auto&
nisse-webrtc 2017/04/20 10:53:37 Done.
119 auto sinks_end = it.second.auxillary_sinks.end();
120 auto sinks_it =
121 std::remove(it.second.auxillary_sinks.begin(), sinks_end, sink);
122 it.second.auxillary_sinks.erase(sinks_it, sinks_end);
danilchap 2017/04/19 15:45:25 what does this line do?
nisse-webrtc 2017/04/20 10:53:37 It's one half of the somewhat strange erase-remove
123 }
124 }
125
126 PacketReceiver::DeliveryStatus RtpTransportControllerReceive::OnRtpPacket(
127 int64_t arrival_time_ms,
128 rtc::ArrayView<const uint8_t> raw_packet) {
129 RtpPacketReceived parsed_packet;
130 if (!parsed_packet.Parse(raw_packet.data(), raw_packet.size()))
danilchap 2017/04/19 15:45:25 Parse(raw_packet) (there is Parse version that tak
nisse-webrtc 2017/04/20 10:53:37 Nice, I wasn't aware of that.
131 return PacketReceiver::DELIVERY_PACKET_ERROR;
132 parsed_packet.set_arrival_time_ms(arrival_time_ms);
133
134 Stream* stream = LookupStream(parsed_packet.Ssrc());
135 if (!stream) {
136 // TODO(nisse): Lookup payload, for unsignalled streams.
danilchap 2017/04/19 15:45:25 this todo about adding a brand new feature. May be
nisse-webrtc 2017/04/20 10:53:38 I'm removing this TODO and related #if:ed out code
137 return PacketReceiver::DELIVERY_UNKNOWN_SSRC;
138 }
139 if (!stream->receiver->OnRtpPacketReceive(&parsed_packet))
140 return PacketReceiver::DELIVERY_PACKET_ERROR;
141 for (auto it : stream->auxillary_sinks) {
danilchap 2017/04/19 15:45:25 may be auto* to show values are pointers and thus
nisse-webrtc 2017/04/20 10:53:37 Done. I'm not that familiar with all the conventio
142 it->OnRtpPacket(parsed_packet);
143 }
144 if (receive_side_cc_) {
145 if (!stream->config.use_send_side_bwe &&
146 parsed_packet.HasExtension<TransportSequenceNumber>()) {
147 // Inconsistent configuration of send side BWE. Do nothing.
148 // TODO(nisse): Without this check, we may produce RTCP feedback
149 // packets even when not negotiated. But it would be cleaner to
150 // move the check down to RTCPSender::SendFeedbackPacket, which
151 // would also help the PacketRouter to select an appropriate rtp
152 // module in the case that some, but not all, have RTCP feedback
153 // enabled.
154 return PacketReceiver::DELIVERY_OK;
155 }
156 // Receive side bwe is not used for audio.
157 if (enable_receive_side_bwe_ ||
158 (stream->config.use_send_side_bwe &&
159 parsed_packet.HasExtension<TransportSequenceNumber>())) {
160 RTPHeader header;
161 parsed_packet.GetHeader(&header);
162
163 receive_side_cc_->OnReceivedPacket(
164 parsed_packet.arrival_time_ms(),
165 parsed_packet.payload_size() + parsed_packet.padding_size(), header);
166 }
167 }
168 return PacketReceiver::DELIVERY_OK;
169 }
170
171 // static
danilchap 2017/04/19 15:45:25 remove this comment
nisse-webrtc 2017/04/20 10:53:38 I think it's a common convention in the rest of th
172 std::unique_ptr<RtpTransportControllerReceiveInterface>
173 RtpTransportControllerReceiveInterface::Create(
174 ReceiveSideCongestionController* receive_side_cc,
175 bool enable_receive_side_bwe) {
176 return std::unique_ptr<RtpTransportControllerReceiveInterface>(
177 new RtpTransportControllerReceive(receive_side_cc,
178 enable_receive_side_bwe));
179 }
180
181 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698