| 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/modules/rtp_rtcp/source/rtp_packet_history.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_history.h" |
| 12 | 12 |
| 13 #include <assert.h> | 13 #include <assert.h> |
| 14 #include <stdlib.h> | 14 #include <stdlib.h> |
| 15 #include <string.h> // memset | 15 #include <string.h> // memset |
| 16 | 16 |
| 17 #include <algorithm> | 17 #include <algorithm> |
| 18 #include <limits> | 18 #include <limits> |
| 19 #include <set> | 19 #include <set> |
| 20 | 20 |
| 21 #include "webrtc/base/checks.h" | 21 #include "webrtc/base/checks.h" |
| 22 #include "webrtc/base/logging.h" | 22 #include "webrtc/base/logging.h" |
| 23 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 23 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
| 24 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | |
| 25 | 24 |
| 26 namespace webrtc { | 25 namespace webrtc { |
| 27 | 26 |
| 28 static const int kMinPacketRequestBytes = 50; | 27 static const int kMinPacketRequestBytes = 50; |
| 29 | 28 |
| 30 RTPPacketHistory::RTPPacketHistory(Clock* clock) | 29 RTPPacketHistory::RTPPacketHistory(Clock* clock) |
| 31 : clock_(clock), | 30 : clock_(clock), |
| 32 critsect_(CriticalSectionWrapper::CreateCriticalSection()), | |
| 33 store_(false), | 31 store_(false), |
| 34 prev_index_(0) {} | 32 prev_index_(0) {} |
| 35 | 33 |
| 36 RTPPacketHistory::~RTPPacketHistory() { | 34 RTPPacketHistory::~RTPPacketHistory() { |
| 37 } | 35 } |
| 38 | 36 |
| 39 void RTPPacketHistory::SetStorePacketsStatus(bool enable, | 37 void RTPPacketHistory::SetStorePacketsStatus(bool enable, |
| 40 uint16_t number_to_store) { | 38 uint16_t number_to_store) { |
| 41 CriticalSectionScoped cs(critsect_.get()); | 39 rtc::CritScope cs(&critsect_); |
| 42 if (enable) { | 40 if (enable) { |
| 43 if (store_) { | 41 if (store_) { |
| 44 LOG(LS_WARNING) << "Purging packet history in order to re-set status."; | 42 LOG(LS_WARNING) << "Purging packet history in order to re-set status."; |
| 45 Free(); | 43 Free(); |
| 46 } | 44 } |
| 47 assert(!store_); | 45 assert(!store_); |
| 48 Allocate(number_to_store); | 46 Allocate(number_to_store); |
| 49 } else { | 47 } else { |
| 50 Free(); | 48 Free(); |
| 51 } | 49 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 63 return; | 61 return; |
| 64 } | 62 } |
| 65 | 63 |
| 66 stored_packets_.clear(); | 64 stored_packets_.clear(); |
| 67 | 65 |
| 68 store_ = false; | 66 store_ = false; |
| 69 prev_index_ = 0; | 67 prev_index_ = 0; |
| 70 } | 68 } |
| 71 | 69 |
| 72 bool RTPPacketHistory::StorePackets() const { | 70 bool RTPPacketHistory::StorePackets() const { |
| 73 CriticalSectionScoped cs(critsect_.get()); | 71 rtc::CritScope cs(&critsect_); |
| 74 return store_; | 72 return store_; |
| 75 } | 73 } |
| 76 | 74 |
| 77 int32_t RTPPacketHistory::PutRTPPacket(const uint8_t* packet, | 75 int32_t RTPPacketHistory::PutRTPPacket(const uint8_t* packet, |
| 78 size_t packet_length, | 76 size_t packet_length, |
| 79 int64_t capture_time_ms, | 77 int64_t capture_time_ms, |
| 80 StorageType type) { | 78 StorageType type) { |
| 81 CriticalSectionScoped cs(critsect_.get()); | 79 rtc::CritScope cs(&critsect_); |
| 82 if (!store_) { | 80 if (!store_) { |
| 83 return 0; | 81 return 0; |
| 84 } | 82 } |
| 85 | 83 |
| 86 assert(packet); | 84 assert(packet); |
| 87 assert(packet_length > 3); | 85 assert(packet_length > 3); |
| 88 | 86 |
| 89 if (packet_length > IP_PACKET_SIZE) { | 87 if (packet_length > IP_PACKET_SIZE) { |
| 90 LOG(LS_WARNING) << "Failed to store RTP packet with length: " | 88 LOG(LS_WARNING) << "Failed to store RTP packet with length: " |
| 91 << packet_length; | 89 << packet_length; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 stored_packets_[prev_index_].has_been_retransmitted = false; | 122 stored_packets_[prev_index_].has_been_retransmitted = false; |
| 125 | 123 |
| 126 ++prev_index_; | 124 ++prev_index_; |
| 127 if (prev_index_ >= stored_packets_.size()) { | 125 if (prev_index_ >= stored_packets_.size()) { |
| 128 prev_index_ = 0; | 126 prev_index_ = 0; |
| 129 } | 127 } |
| 130 return 0; | 128 return 0; |
| 131 } | 129 } |
| 132 | 130 |
| 133 bool RTPPacketHistory::HasRTPPacket(uint16_t sequence_number) const { | 131 bool RTPPacketHistory::HasRTPPacket(uint16_t sequence_number) const { |
| 134 CriticalSectionScoped cs(critsect_.get()); | 132 rtc::CritScope cs(&critsect_); |
| 135 if (!store_) { | 133 if (!store_) { |
| 136 return false; | 134 return false; |
| 137 } | 135 } |
| 138 | 136 |
| 139 int32_t index = 0; | 137 int32_t index = 0; |
| 140 bool found = FindSeqNum(sequence_number, &index); | 138 bool found = FindSeqNum(sequence_number, &index); |
| 141 if (!found) { | 139 if (!found) { |
| 142 return false; | 140 return false; |
| 143 } | 141 } |
| 144 | 142 |
| 145 if (stored_packets_[index].length == 0) { | 143 if (stored_packets_[index].length == 0) { |
| 146 // Invalid length. | 144 // Invalid length. |
| 147 return false; | 145 return false; |
| 148 } | 146 } |
| 149 return true; | 147 return true; |
| 150 } | 148 } |
| 151 | 149 |
| 152 bool RTPPacketHistory::SetSent(uint16_t sequence_number) { | 150 bool RTPPacketHistory::SetSent(uint16_t sequence_number) { |
| 153 CriticalSectionScoped cs(critsect_.get()); | 151 rtc::CritScope cs(&critsect_); |
| 154 if (!store_) { | 152 if (!store_) { |
| 155 return false; | 153 return false; |
| 156 } | 154 } |
| 157 | 155 |
| 158 int32_t index = 0; | 156 int32_t index = 0; |
| 159 bool found = FindSeqNum(sequence_number, &index); | 157 bool found = FindSeqNum(sequence_number, &index); |
| 160 if (!found) { | 158 if (!found) { |
| 161 return false; | 159 return false; |
| 162 } | 160 } |
| 163 | 161 |
| 164 // Send time already set. | 162 // Send time already set. |
| 165 if (stored_packets_[index].send_time != 0) { | 163 if (stored_packets_[index].send_time != 0) { |
| 166 return false; | 164 return false; |
| 167 } | 165 } |
| 168 | 166 |
| 169 stored_packets_[index].send_time = clock_->TimeInMilliseconds(); | 167 stored_packets_[index].send_time = clock_->TimeInMilliseconds(); |
| 170 return true; | 168 return true; |
| 171 } | 169 } |
| 172 | 170 |
| 173 bool RTPPacketHistory::GetPacketAndSetSendTime(uint16_t sequence_number, | 171 bool RTPPacketHistory::GetPacketAndSetSendTime(uint16_t sequence_number, |
| 174 int64_t min_elapsed_time_ms, | 172 int64_t min_elapsed_time_ms, |
| 175 bool retransmit, | 173 bool retransmit, |
| 176 uint8_t* packet, | 174 uint8_t* packet, |
| 177 size_t* packet_length, | 175 size_t* packet_length, |
| 178 int64_t* stored_time_ms) { | 176 int64_t* stored_time_ms) { |
| 179 CriticalSectionScoped cs(critsect_.get()); | 177 rtc::CritScope cs(&critsect_); |
| 180 RTC_CHECK_GE(*packet_length, static_cast<size_t>(IP_PACKET_SIZE)); | 178 RTC_CHECK_GE(*packet_length, static_cast<size_t>(IP_PACKET_SIZE)); |
| 181 if (!store_) | 179 if (!store_) |
| 182 return false; | 180 return false; |
| 183 | 181 |
| 184 int32_t index = 0; | 182 int32_t index = 0; |
| 185 bool found = FindSeqNum(sequence_number, &index); | 183 bool found = FindSeqNum(sequence_number, &index); |
| 186 if (!found) { | 184 if (!found) { |
| 187 LOG(LS_WARNING) << "No match for getting seqNum " << sequence_number; | 185 LOG(LS_WARNING) << "No match for getting seqNum " << sequence_number; |
| 188 return false; | 186 return false; |
| 189 } | 187 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 // Get packet. | 223 // Get packet. |
| 226 size_t length = stored_packets_[index].length; | 224 size_t length = stored_packets_[index].length; |
| 227 memcpy(packet, stored_packets_[index].data, length); | 225 memcpy(packet, stored_packets_[index].data, length); |
| 228 *packet_length = length; | 226 *packet_length = length; |
| 229 *stored_time_ms = stored_packets_[index].time_ms; | 227 *stored_time_ms = stored_packets_[index].time_ms; |
| 230 } | 228 } |
| 231 | 229 |
| 232 bool RTPPacketHistory::GetBestFittingPacket(uint8_t* packet, | 230 bool RTPPacketHistory::GetBestFittingPacket(uint8_t* packet, |
| 233 size_t* packet_length, | 231 size_t* packet_length, |
| 234 int64_t* stored_time_ms) { | 232 int64_t* stored_time_ms) { |
| 235 CriticalSectionScoped cs(critsect_.get()); | 233 rtc::CritScope cs(&critsect_); |
| 236 if (!store_) | 234 if (!store_) |
| 237 return false; | 235 return false; |
| 238 int index = FindBestFittingPacket(*packet_length); | 236 int index = FindBestFittingPacket(*packet_length); |
| 239 if (index < 0) | 237 if (index < 0) |
| 240 return false; | 238 return false; |
| 241 GetPacket(index, packet, packet_length, stored_time_ms); | 239 GetPacket(index, packet, packet_length, stored_time_ms); |
| 242 return true; | 240 return true; |
| 243 } | 241 } |
| 244 | 242 |
| 245 // private, lock should already be taken | 243 // private, lock should already be taken |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 min_diff = diff; | 290 min_diff = diff; |
| 293 best_index = static_cast<int>(i); | 291 best_index = static_cast<int>(i); |
| 294 } | 292 } |
| 295 } | 293 } |
| 296 return best_index; | 294 return best_index; |
| 297 } | 295 } |
| 298 | 296 |
| 299 RTPPacketHistory::StoredPacket::StoredPacket() {} | 297 RTPPacketHistory::StoredPacket::StoredPacket() {} |
| 300 | 298 |
| 301 } // namespace webrtc | 299 } // namespace webrtc |
| OLD | NEW |