| Index: webrtc/modules/rtp_rtcp/source/rtp_packet_history.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_packet_history.cc b/webrtc/modules/rtp_rtcp/source/rtp_packet_history.cc
|
| index e1d6d4852c923ab1ca118297af5650c7e2efdfcd..0b1de6d5889cee1659b0e74c6531840f33f7454b 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/rtp_packet_history.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_packet_history.cc
|
| @@ -16,6 +16,7 @@
|
| #include <limits>
|
| #include <set>
|
|
|
| +#include "webrtc/base/checks.h"
|
| #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
|
| #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
|
| #include "webrtc/system_wrappers/interface/logging.h"
|
| @@ -118,6 +119,7 @@ int32_t RTPPacketHistory::PutRTPPacket(const uint8_t* packet,
|
| (capture_time_ms > 0) ? capture_time_ms : clock_->TimeInMilliseconds();
|
| stored_packets_[prev_index_].send_time = 0; // Packet not sent.
|
| stored_packets_[prev_index_].storage_type = type;
|
| + stored_packets_[prev_index_].has_been_retransmitted = false;
|
|
|
| ++prev_index_;
|
| if (prev_index_ >= stored_packets_.size()) {
|
| @@ -173,10 +175,9 @@ bool RTPPacketHistory::GetPacketAndSetSendTime(uint16_t sequence_number,
|
| size_t* packet_length,
|
| int64_t* stored_time_ms) {
|
| CriticalSectionScoped cs(critsect_.get());
|
| - assert(*packet_length >= IP_PACKET_SIZE);
|
| - if (!store_) {
|
| + RTC_CHECK_GE(*packet_length, static_cast<size_t>(IP_PACKET_SIZE));
|
| + if (!store_)
|
| return false;
|
| - }
|
|
|
| int32_t index = 0;
|
| bool found = FindSeqNum(sequence_number, &index);
|
| @@ -193,17 +194,22 @@ bool RTPPacketHistory::GetPacketAndSetSendTime(uint16_t sequence_number,
|
| return false;
|
| }
|
|
|
| - // Verify elapsed time since last retrieve.
|
| + // Verify elapsed time since last retrieve, but only for retransmissions and
|
| + // always send packet upon first retransmission request.
|
| int64_t now = clock_->TimeInMilliseconds();
|
| - if (min_elapsed_time_ms > 0 &&
|
| + if (min_elapsed_time_ms > 0 && retransmit &&
|
| + stored_packets_[index].has_been_retransmitted &&
|
| ((now - stored_packets_[index].send_time) < min_elapsed_time_ms)) {
|
| return false;
|
| }
|
|
|
| - if (retransmit && stored_packets_[index].storage_type == kDontRetransmit) {
|
| - // No bytes copied since this packet shouldn't be retransmitted or is
|
| - // of zero size.
|
| - return false;
|
| + if (retransmit) {
|
| + if (stored_packets_[index].storage_type == kDontRetransmit) {
|
| + // No bytes copied since this packet shouldn't be retransmitted or is
|
| + // of zero size.
|
| + return false;
|
| + }
|
| + stored_packets_[index].has_been_retransmitted = true;
|
| }
|
| stored_packets_[index].send_time = clock_->TimeInMilliseconds();
|
| GetPacket(index, packet, packet_length, stored_time_ms);
|
|
|