| 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/timing.h" | |
| 18 #include "webrtc/media/base/codec.h" | 17 #include "webrtc/media/base/codec.h" |
| 19 #include "webrtc/media/base/mediaconstants.h" | 18 #include "webrtc/media/base/mediaconstants.h" |
| 20 #include "webrtc/media/base/rtputils.h" | 19 #include "webrtc/media/base/rtputils.h" |
| 21 #include "webrtc/media/base/streamparams.h" | 20 #include "webrtc/media/base/streamparams.h" |
| 22 | 21 |
| 23 namespace cricket { | 22 namespace cricket { |
| 24 | 23 |
| 25 // We want to avoid IP fragmentation. | 24 // We want to avoid IP fragmentation. |
| 26 static const size_t kDataMaxRtpPacketLen = 1200U; | 25 static const size_t kDataMaxRtpPacketLen = 1200U; |
| 27 // We reserve space after the RTP header for future wiggle room. | 26 // We reserve space after the RTP header for future wiggle room. |
| 28 static const unsigned char kReservedSpace[] = { | 27 static const unsigned char kReservedSpace[] = { |
| 29 0x00, 0x00, 0x00, 0x00 | 28 0x00, 0x00, 0x00, 0x00 |
| 30 }; | 29 }; |
| 31 | 30 |
| 32 // Amount of overhead SRTP may take. We need to leave room in the | 31 // Amount of overhead SRTP may take. We need to leave room in the |
| 33 // buffer for it, otherwise SRTP will fail later. If SRTP ever uses | 32 // buffer for it, otherwise SRTP will fail later. If SRTP ever uses |
| 34 // more than this, we need to increase this number. | 33 // more than this, we need to increase this number. |
| 35 static const size_t kMaxSrtpHmacOverhead = 16; | 34 static const size_t kMaxSrtpHmacOverhead = 16; |
| 36 | 35 |
| 37 RtpDataEngine::RtpDataEngine() { | 36 RtpDataEngine::RtpDataEngine() { |
| 38 data_codecs_.push_back( | 37 data_codecs_.push_back( |
| 39 DataCodec(kGoogleRtpDataCodecId, kGoogleRtpDataCodecName)); | 38 DataCodec(kGoogleRtpDataCodecId, kGoogleRtpDataCodecName)); |
| 40 SetTiming(new rtc::Timing()); | |
| 41 } | 39 } |
| 42 | 40 |
| 43 DataMediaChannel* RtpDataEngine::CreateChannel( | 41 DataMediaChannel* RtpDataEngine::CreateChannel( |
| 44 DataChannelType data_channel_type) { | 42 DataChannelType data_channel_type) { |
| 45 if (data_channel_type != DCT_RTP) { | 43 if (data_channel_type != DCT_RTP) { |
| 46 return NULL; | 44 return NULL; |
| 47 } | 45 } |
| 48 return new RtpDataMediaChannel(timing_.get()); | 46 return new RtpDataMediaChannel(); |
| 49 } | 47 } |
| 50 | 48 |
| 51 bool FindCodecByName(const std::vector<DataCodec>& codecs, | 49 bool FindCodecByName(const std::vector<DataCodec>& codecs, |
| 52 const std::string& name, DataCodec* codec_out) { | 50 const std::string& name, DataCodec* codec_out) { |
| 53 std::vector<DataCodec>::const_iterator iter; | 51 std::vector<DataCodec>::const_iterator iter; |
| 54 for (iter = codecs.begin(); iter != codecs.end(); ++iter) { | 52 for (iter = codecs.begin(); iter != codecs.end(); ++iter) { |
| 55 if (iter->name == name) { | 53 if (iter->name == name) { |
| 56 *codec_out = *iter; | 54 *codec_out = *iter; |
| 57 return true; | 55 return true; |
| 58 } | 56 } |
| 59 } | 57 } |
| 60 return false; | 58 return false; |
| 61 } | 59 } |
| 62 | 60 |
| 63 RtpDataMediaChannel::RtpDataMediaChannel(rtc::Timing* timing) { | 61 RtpDataMediaChannel::RtpDataMediaChannel() { |
| 64 Construct(timing); | 62 Construct(); |
| 65 } | 63 } |
| 66 | 64 |
| 67 RtpDataMediaChannel::RtpDataMediaChannel() { | 65 void RtpDataMediaChannel::Construct() { |
| 68 Construct(NULL); | |
| 69 } | |
| 70 | |
| 71 void RtpDataMediaChannel::Construct(rtc::Timing* timing) { | |
| 72 sending_ = false; | 66 sending_ = false; |
| 73 receiving_ = false; | 67 receiving_ = false; |
| 74 timing_ = timing; | |
| 75 send_limiter_.reset(new rtc::RateLimiter(kDataMaxBandwidth / 8, 1.0)); | 68 send_limiter_.reset(new rtc::RateLimiter(kDataMaxBandwidth / 8, 1.0)); |
| 76 } | 69 } |
| 77 | 70 |
| 78 | 71 |
| 79 RtpDataMediaChannel::~RtpDataMediaChannel() { | 72 RtpDataMediaChannel::~RtpDataMediaChannel() { |
| 80 std::map<uint32_t, RtpClock*>::const_iterator iter; | 73 std::map<uint32_t, RtpClock*>::const_iterator iter; |
| 81 for (iter = rtp_clock_by_send_ssrc_.begin(); | 74 for (iter = rtp_clock_by_send_ssrc_.begin(); |
| 82 iter != rtp_clock_by_send_ssrc_.end(); | 75 iter != rtp_clock_by_send_ssrc_.end(); |
| 83 ++iter) { | 76 ++iter) { |
| 84 delete iter->second; | 77 delete iter->second; |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 << kGoogleRtpDataCodecName; | 299 << kGoogleRtpDataCodecName; |
| 307 return false; | 300 return false; |
| 308 } | 301 } |
| 309 | 302 |
| 310 size_t packet_len = (kMinRtpPacketLen + sizeof(kReservedSpace) + | 303 size_t packet_len = (kMinRtpPacketLen + sizeof(kReservedSpace) + |
| 311 payload.size() + kMaxSrtpHmacOverhead); | 304 payload.size() + kMaxSrtpHmacOverhead); |
| 312 if (packet_len > kDataMaxRtpPacketLen) { | 305 if (packet_len > kDataMaxRtpPacketLen) { |
| 313 return false; | 306 return false; |
| 314 } | 307 } |
| 315 | 308 |
| 316 double now = timing_->TimerNow(); | 309 double now = |
| 310 rtc::TimeMicros() / static_cast<double>(rtc::kNumMicrosecsPerSec); |
| 317 | 311 |
| 318 if (!send_limiter_->CanUse(packet_len, now)) { | 312 if (!send_limiter_->CanUse(packet_len, now)) { |
| 319 LOG(LS_VERBOSE) << "Dropped data packet of len=" << packet_len | 313 LOG(LS_VERBOSE) << "Dropped data packet of len=" << packet_len |
| 320 << "; already sent " << send_limiter_->used_in_period() | 314 << "; already sent " << send_limiter_->used_in_period() |
| 321 << "/" << send_limiter_->max_per_period(); | 315 << "/" << send_limiter_->max_per_period(); |
| 322 return false; | 316 return false; |
| 323 } | 317 } |
| 324 | 318 |
| 325 RtpHeader header; | 319 RtpHeader header; |
| 326 header.payload_type = found_codec.id; | 320 header.payload_type = found_codec.id; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 343 | 337 |
| 344 MediaChannel::SendPacket(&packet, rtc::PacketOptions()); | 338 MediaChannel::SendPacket(&packet, rtc::PacketOptions()); |
| 345 send_limiter_->Use(packet_len, now); | 339 send_limiter_->Use(packet_len, now); |
| 346 if (result) { | 340 if (result) { |
| 347 *result = SDR_SUCCESS; | 341 *result = SDR_SUCCESS; |
| 348 } | 342 } |
| 349 return true; | 343 return true; |
| 350 } | 344 } |
| 351 | 345 |
| 352 } // namespace cricket | 346 } // namespace cricket |
| OLD | NEW |