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

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

Issue 2709723003: Initial implementation of RtpTransportControllerReceive and related interfaces.
Patch Set: Fix audio. 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
23 : public RtpTransportControllerReceiveInterface {
24 public:
25 explicit RtpTransportControllerReceive(
26 ReceiveSideCongestionController* receive_side_cc,
27 bool enable_receive_side_bwe);
28
29 // ImplementRtpTransportControllerReceiveInterface
30 bool AddReceiver(uint32_t ssrc,
31 const Config& config,
32 RtpPacketReceiverInterface* receiver) override;
33 bool RemoveReceiver(const RtpPacketReceiverInterface* receiver) override;
34
35 bool AddSink(uint32_t ssrc, RtpPacketSinkInterface* sink) override;
36 bool RemoveSink(const RtpPacketSinkInterface* sink) override;
37
38 #if 0
39 bool 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;
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);
79 return (it != streams_.end()) ? &it->second : nullptr;
80 }
81
82 bool RtpTransportControllerReceive::AddReceiver(
83 uint32_t ssrc,
84 const Config& config,
85 RtpPacketReceiverInterface* receiver) {
86 if (LookupStream(ssrc)) {
87 return false;
88 }
89 streams_.insert(std::pair<uint32_t, Stream>(ssrc, Stream(config, receiver)));
90 return true;
91 }
92
93 bool RtpTransportControllerReceive::RemoveReceiver(
94 const RtpPacketReceiverInterface* receiver) {
95 bool found = false;
96 for (auto it = streams_.begin(); it != streams_.end();) {
97 if (it->second.receiver == receiver) {
98 receive_side_cc_
99 ->GetRemoteBitrateEstimator(it->second.config.use_send_side_bwe)
100 ->RemoveStream(it->first);
101 it = streams_.erase(it);
102 found = true;
103 } else {
104 ++it;
105 }
106 }
107 return found;
108 }
109
110 bool RtpTransportControllerReceive::AddSink(uint32_t ssrc,
111 RtpPacketSinkInterface* sink) {
112 Stream* stream = LookupStream(ssrc);
113 if (stream) {
114 stream->auxillary_sinks.push_back(sink);
115 return true;
116 }
117 return false;
118 }
119
120 bool RtpTransportControllerReceive::RemoveSink(
121 const RtpPacketSinkInterface* sink) {
122 bool found = false;
123 for (auto it : streams_) {
124 auto sinks_end = it.second.auxillary_sinks.end();
125 auto sinks_it =
126 std::remove(it.second.auxillary_sinks.begin(), sinks_end, sink);
127 if (sinks_it != sinks_end) {
128 it.second.auxillary_sinks.erase(sinks_it, sinks_end);
129 found = true;
130 }
131 }
132 return found;
133 }
134
135 PacketReceiver::DeliveryStatus RtpTransportControllerReceive::OnRtpPacket(
136 int64_t arrival_time_ms,
137 rtc::ArrayView<const uint8_t> raw_packet) {
138 RtpPacketReceived parsed_packet;
139 if (!parsed_packet.Parse(raw_packet.data(), raw_packet.size()))
140 return PacketReceiver::DELIVERY_PACKET_ERROR;
141 parsed_packet.set_arrival_time_ms(arrival_time_ms);
142
143 Stream* stream = LookupStream(parsed_packet.Ssrc());
144 if (!stream) {
145 // TODO(nisse): Lookup payload, for unsignalled streams.
146 return PacketReceiver::DELIVERY_UNKNOWN_SSRC;
147 }
148 if (!stream->receiver->OnRtpPacketReceive(&parsed_packet))
149 return PacketReceiver::DELIVERY_PACKET_ERROR;
150 for (auto it : stream->auxillary_sinks) {
151 it->OnRtpPacket(parsed_packet);
152 }
153 if (receive_side_cc_) {
154 if (!stream->config.use_send_side_bwe &&
155 parsed_packet.HasExtension<TransportSequenceNumber>()) {
156 // Inconsistent configuration of send side BWE. Do nothing.
157 // TODO(nisse): Without this check, we may produce RTCP feedback
158 // packets even when not negotiated. But it would be cleaner to
159 // move the check down to RTCPSender::SendFeedbackPacket, which
160 // would also help the PacketRouter to select an appropriate rtp
161 // module in the case that some, but not all, have RTCP feedback
162 // enabled.
163 return PacketReceiver::DELIVERY_OK;
164 }
165 // Receive side bwe is not used for audio.
166 if (enable_receive_side_bwe_ ||
167 (stream->config.use_send_side_bwe &&
168 parsed_packet.HasExtension<TransportSequenceNumber>())) {
169 RTPHeader header;
170 parsed_packet.GetHeader(&header);
171
172 receive_side_cc_->OnReceivedPacket(
173 parsed_packet.arrival_time_ms(),
174 parsed_packet.payload_size() + parsed_packet.padding_size(), header);
175 }
176 }
177 return PacketReceiver::DELIVERY_OK;
178 }
179
180 // static
181 std::unique_ptr<RtpTransportControllerReceiveInterface>
182 RtpTransportControllerReceiveInterface::Create(
183 ReceiveSideCongestionController* receive_side_cc,
184 bool enable_receive_side_bwe) {
185 return std::unique_ptr<RtpTransportControllerReceiveInterface>(
186 new RtpTransportControllerReceive(receive_side_cc,
187 enable_receive_side_bwe));
188 }
189
190 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698