OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/media/base/rtpdataengine.h" | 11 #include "webrtc/media/base/rtpdataengine.h" |
12 | 12 |
13 #include "webrtc/base/copyonwritebuffer.h" | 13 #include "webrtc/base/copyonwritebuffer.h" |
14 #include "webrtc/base/helpers.h" | 14 #include "webrtc/base/helpers.h" |
15 #include "webrtc/base/logging.h" | 15 #include "webrtc/base/logging.h" |
16 #include "webrtc/base/ratelimiter.h" | 16 #include "webrtc/base/ratelimiter.h" |
| 17 #include "webrtc/base/stringutils.h" |
17 #include "webrtc/media/base/codec.h" | 18 #include "webrtc/media/base/codec.h" |
18 #include "webrtc/media/base/mediaconstants.h" | 19 #include "webrtc/media/base/mediaconstants.h" |
19 #include "webrtc/media/base/rtputils.h" | 20 #include "webrtc/media/base/rtputils.h" |
20 #include "webrtc/media/base/streamparams.h" | 21 #include "webrtc/media/base/streamparams.h" |
21 | 22 |
22 namespace cricket { | 23 namespace cricket { |
23 | 24 |
24 // We want to avoid IP fragmentation. | 25 // We want to avoid IP fragmentation. |
25 static const size_t kDataMaxRtpPacketLen = 1200U; | 26 static const size_t kDataMaxRtpPacketLen = 1200U; |
26 // We reserve space after the RTP header for future wiggle room. | 27 // We reserve space after the RTP header for future wiggle room. |
(...skipping 12 matching lines...) Expand all Loading... |
39 } | 40 } |
40 | 41 |
41 DataMediaChannel* RtpDataEngine::CreateChannel( | 42 DataMediaChannel* RtpDataEngine::CreateChannel( |
42 DataChannelType data_channel_type) { | 43 DataChannelType data_channel_type) { |
43 if (data_channel_type != DCT_RTP) { | 44 if (data_channel_type != DCT_RTP) { |
44 return NULL; | 45 return NULL; |
45 } | 46 } |
46 return new RtpDataMediaChannel(); | 47 return new RtpDataMediaChannel(); |
47 } | 48 } |
48 | 49 |
49 bool FindCodecByName(const std::vector<DataCodec>& codecs, | 50 static const DataCodec* FindCodecByName(const std::vector<DataCodec>& codecs, |
50 const std::string& name, DataCodec* codec_out) { | 51 const std::string& name) { |
51 std::vector<DataCodec>::const_iterator iter; | 52 for (const DataCodec& codec : codecs) { |
52 for (iter = codecs.begin(); iter != codecs.end(); ++iter) { | 53 if (_stricmp(name.c_str(), codec.name.c_str()) == 0) |
53 if (iter->name == name) { | 54 return &codec; |
54 *codec_out = *iter; | |
55 return true; | |
56 } | |
57 } | 55 } |
58 return false; | 56 return nullptr; |
59 } | 57 } |
60 | 58 |
61 RtpDataMediaChannel::RtpDataMediaChannel() { | 59 RtpDataMediaChannel::RtpDataMediaChannel() { |
62 Construct(); | 60 Construct(); |
63 } | 61 } |
64 | 62 |
65 void RtpDataMediaChannel::Construct() { | 63 void RtpDataMediaChannel::Construct() { |
66 sending_ = false; | 64 sending_ = false; |
67 receiving_ = false; | 65 receiving_ = false; |
68 send_limiter_.reset(new rtc::RateLimiter(kDataMaxBandwidth / 8, 1.0)); | 66 send_limiter_.reset(new rtc::RateLimiter(kDataMaxBandwidth / 8, 1.0)); |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 } | 283 } |
286 | 284 |
287 const StreamParams* found_stream = | 285 const StreamParams* found_stream = |
288 GetStreamBySsrc(send_streams_, params.ssrc); | 286 GetStreamBySsrc(send_streams_, params.ssrc); |
289 if (!found_stream) { | 287 if (!found_stream) { |
290 LOG(LS_WARNING) << "Not sending data because ssrc is unknown: " | 288 LOG(LS_WARNING) << "Not sending data because ssrc is unknown: " |
291 << params.ssrc; | 289 << params.ssrc; |
292 return false; | 290 return false; |
293 } | 291 } |
294 | 292 |
295 DataCodec found_codec; | 293 const DataCodec* found_codec = |
296 if (!FindCodecByName(send_codecs_, kGoogleRtpDataCodecName, &found_codec)) { | 294 FindCodecByName(send_codecs_, kGoogleRtpDataCodecName); |
| 295 if (!found_codec) { |
297 LOG(LS_WARNING) << "Not sending data because codec is unknown: " | 296 LOG(LS_WARNING) << "Not sending data because codec is unknown: " |
298 << kGoogleRtpDataCodecName; | 297 << kGoogleRtpDataCodecName; |
299 return false; | 298 return false; |
300 } | 299 } |
301 | 300 |
302 size_t packet_len = (kMinRtpPacketLen + sizeof(kReservedSpace) + | 301 size_t packet_len = (kMinRtpPacketLen + sizeof(kReservedSpace) + |
303 payload.size() + kMaxSrtpHmacOverhead); | 302 payload.size() + kMaxSrtpHmacOverhead); |
304 if (packet_len > kDataMaxRtpPacketLen) { | 303 if (packet_len > kDataMaxRtpPacketLen) { |
305 return false; | 304 return false; |
306 } | 305 } |
307 | 306 |
308 double now = | 307 double now = |
309 rtc::TimeMicros() / static_cast<double>(rtc::kNumMicrosecsPerSec); | 308 rtc::TimeMicros() / static_cast<double>(rtc::kNumMicrosecsPerSec); |
310 | 309 |
311 if (!send_limiter_->CanUse(packet_len, now)) { | 310 if (!send_limiter_->CanUse(packet_len, now)) { |
312 LOG(LS_VERBOSE) << "Dropped data packet of len=" << packet_len | 311 LOG(LS_VERBOSE) << "Dropped data packet of len=" << packet_len |
313 << "; already sent " << send_limiter_->used_in_period() | 312 << "; already sent " << send_limiter_->used_in_period() |
314 << "/" << send_limiter_->max_per_period(); | 313 << "/" << send_limiter_->max_per_period(); |
315 return false; | 314 return false; |
316 } | 315 } |
317 | 316 |
318 RtpHeader header; | 317 RtpHeader header; |
319 header.payload_type = found_codec.id; | 318 header.payload_type = found_codec->id; |
320 header.ssrc = params.ssrc; | 319 header.ssrc = params.ssrc; |
321 rtp_clock_by_send_ssrc_[header.ssrc]->Tick( | 320 rtp_clock_by_send_ssrc_[header.ssrc]->Tick( |
322 now, &header.seq_num, &header.timestamp); | 321 now, &header.seq_num, &header.timestamp); |
323 | 322 |
324 rtc::CopyOnWriteBuffer packet(kMinRtpPacketLen, packet_len); | 323 rtc::CopyOnWriteBuffer packet(kMinRtpPacketLen, packet_len); |
325 if (!SetRtpHeader(packet.data(), packet.size(), header)) { | 324 if (!SetRtpHeader(packet.data(), packet.size(), header)) { |
326 return false; | 325 return false; |
327 } | 326 } |
328 packet.AppendData(kReservedSpace); | 327 packet.AppendData(kReservedSpace); |
329 packet.AppendData(payload); | 328 packet.AppendData(payload); |
330 | 329 |
331 LOG(LS_VERBOSE) << "Sent RTP data packet: " | 330 LOG(LS_VERBOSE) << "Sent RTP data packet: " |
332 << " stream=" << found_stream->id << " ssrc=" << header.ssrc | 331 << " stream=" << found_stream->id << " ssrc=" << header.ssrc |
333 << ", seqnum=" << header.seq_num | 332 << ", seqnum=" << header.seq_num |
334 << ", timestamp=" << header.timestamp | 333 << ", timestamp=" << header.timestamp |
335 << ", len=" << payload.size(); | 334 << ", len=" << payload.size(); |
336 | 335 |
337 MediaChannel::SendPacket(&packet, rtc::PacketOptions()); | 336 MediaChannel::SendPacket(&packet, rtc::PacketOptions()); |
338 send_limiter_->Use(packet_len, now); | 337 send_limiter_->Use(packet_len, now); |
339 if (result) { | 338 if (result) { |
340 *result = SDR_SUCCESS; | 339 *result = SDR_SUCCESS; |
341 } | 340 } |
342 return true; | 341 return true; |
343 } | 342 } |
344 | 343 |
345 } // namespace cricket | 344 } // namespace cricket |
OLD | NEW |