| 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 8fb183543a0d3c0bec8e6f88dfb396ad1824ee8b..cc0cc83bb49f4f459e22d5a5484cea64ace34322 100644
 | 
| --- a/webrtc/modules/rtp_rtcp/source/rtp_packet_history.cc
 | 
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_packet_history.cc
 | 
| @@ -25,12 +25,10 @@ namespace webrtc {
 | 
|  static const int kMinPacketRequestBytes = 50;
 | 
|  
 | 
|  RTPPacketHistory::RTPPacketHistory(Clock* clock)
 | 
| -  : clock_(clock),
 | 
| -    critsect_(CriticalSectionWrapper::CreateCriticalSection()),
 | 
| -    store_(false),
 | 
| -    prev_index_(0),
 | 
| -    max_packet_length_(0) {
 | 
| -}
 | 
| +    : clock_(clock),
 | 
| +      critsect_(CriticalSectionWrapper::CreateCriticalSection()),
 | 
| +      store_(false),
 | 
| +      prev_index_(0) {}
 | 
|  
 | 
|  RTPPacketHistory::~RTPPacketHistory() {
 | 
|  }
 | 
| @@ -55,11 +53,6 @@ void RTPPacketHistory::Allocate(size_t number_to_store) {
 | 
|    assert(number_to_store <= kMaxHistoryCapacity);
 | 
|    store_ = true;
 | 
|    stored_packets_.resize(number_to_store);
 | 
| -  stored_seq_nums_.resize(number_to_store);
 | 
| -  stored_lengths_.resize(number_to_store);
 | 
| -  stored_times_.resize(number_to_store);
 | 
| -  stored_send_times_.resize(number_to_store);
 | 
| -  stored_types_.resize(number_to_store);
 | 
|  }
 | 
|  
 | 
|  void RTPPacketHistory::Free() {
 | 
| @@ -67,21 +60,10 @@ void RTPPacketHistory::Free() {
 | 
|      return;
 | 
|    }
 | 
|  
 | 
| -  std::vector<std::vector<uint8_t> >::iterator it;
 | 
| -  for (it = stored_packets_.begin(); it != stored_packets_.end(); ++it) {
 | 
| -    it->clear();
 | 
| -  }
 | 
| -
 | 
|    stored_packets_.clear();
 | 
| -  stored_seq_nums_.clear();
 | 
| -  stored_lengths_.clear();
 | 
| -  stored_times_.clear();
 | 
| -  stored_send_times_.clear();
 | 
| -  stored_types_.clear();
 | 
|  
 | 
|    store_ = false;
 | 
|    prev_index_ = 0;
 | 
| -  max_packet_length_ = 0;
 | 
|  }
 | 
|  
 | 
|  bool RTPPacketHistory::StorePackets() const {
 | 
| @@ -89,31 +71,8 @@ bool RTPPacketHistory::StorePackets() const {
 | 
|    return store_;
 | 
|  }
 | 
|  
 | 
| -void RTPPacketHistory::VerifyAndAllocatePacketLength(size_t packet_length,
 | 
| -                                                     uint32_t start_index) {
 | 
| -  assert(packet_length > 0);
 | 
| -  if (!store_) {
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  // If start_index > 0 this is a resize and we must check any new (empty)
 | 
| -  // packets created during the resize.
 | 
| -  if (start_index == 0 && packet_length <= max_packet_length_) {
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  max_packet_length_ = std::max(packet_length, max_packet_length_);
 | 
| -
 | 
| -  std::vector<std::vector<uint8_t> >::iterator it;
 | 
| -  for (it = stored_packets_.begin() + start_index; it != stored_packets_.end();
 | 
| -       ++it) {
 | 
| -    it->resize(max_packet_length_);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
|  int32_t RTPPacketHistory::PutRTPPacket(const uint8_t* packet,
 | 
|                                         size_t packet_length,
 | 
| -                                       size_t max_packet_length,
 | 
|                                         int64_t capture_time_ms,
 | 
|                                         StorageType type) {
 | 
|    if (type == kDontStore) {
 | 
| @@ -128,9 +87,7 @@ int32_t RTPPacketHistory::PutRTPPacket(const uint8_t* packet,
 | 
|    assert(packet);
 | 
|    assert(packet_length > 3);
 | 
|  
 | 
| -  VerifyAndAllocatePacketLength(max_packet_length, 0);
 | 
| -
 | 
| -  if (packet_length > max_packet_length_) {
 | 
| +  if (packet_length > IP_PACKET_SIZE) {
 | 
|      LOG(LS_WARNING) << "Failed to store RTP packet with length: "
 | 
|                      << packet_length;
 | 
|      return -1;
 | 
| @@ -141,14 +98,13 @@ int32_t RTPPacketHistory::PutRTPPacket(const uint8_t* packet,
 | 
|    // If index we're about to overwrite contains a packet that has not
 | 
|    // yet been sent (probably pending in paced sender), we need to expand
 | 
|    // the buffer.
 | 
| -  if (stored_lengths_[prev_index_] > 0 &&
 | 
| -      stored_send_times_[prev_index_] == 0) {
 | 
| +  if (stored_packets_[prev_index_].length > 0 &&
 | 
| +      stored_packets_[prev_index_].send_time == 0) {
 | 
|      size_t current_size = static_cast<uint16_t>(stored_packets_.size());
 | 
|      if (current_size < kMaxHistoryCapacity) {
 | 
|        size_t expanded_size = std::max(current_size * 3 / 2, current_size + 1);
 | 
|        expanded_size = std::min(expanded_size, kMaxHistoryCapacity);
 | 
|        Allocate(expanded_size);
 | 
| -      VerifyAndAllocatePacketLength(max_packet_length, current_size);
 | 
|        // Causes discontinuity, but that's OK-ish. FindSeqNum() will still work,
 | 
|        // but may be slower - at least until buffer has wrapped around once.
 | 
|        prev_index_ = current_size;
 | 
| @@ -156,21 +112,19 @@ int32_t RTPPacketHistory::PutRTPPacket(const uint8_t* packet,
 | 
|    }
 | 
|  
 | 
|    // Store packet
 | 
| -  std::vector<std::vector<uint8_t> >::iterator it =
 | 
| -      stored_packets_.begin() + prev_index_;
 | 
|    // TODO(sprang): Overhaul this class and get rid of this copy step.
 | 
|    //               (Finally introduce the RtpPacket class?)
 | 
| -  std::copy(packet, packet + packet_length, it->begin());
 | 
| +  memcpy(stored_packets_[prev_index_].data, packet, packet_length);
 | 
| +  stored_packets_[prev_index_].length = packet_length;
 | 
|  
 | 
| -  stored_seq_nums_[prev_index_] = seq_num;
 | 
| -  stored_lengths_[prev_index_] = packet_length;
 | 
| -  stored_times_[prev_index_] = (capture_time_ms > 0) ? capture_time_ms :
 | 
| -      clock_->TimeInMilliseconds();
 | 
| -  stored_send_times_[prev_index_] = 0;  // Packet not sent.
 | 
| -  stored_types_[prev_index_] = type;
 | 
| +  stored_packets_[prev_index_].sequence_number = seq_num;
 | 
| +  stored_packets_[prev_index_].time_ms =
 | 
| +      (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;
 | 
|  
 | 
|    ++prev_index_;
 | 
| -  if (prev_index_ >= stored_seq_nums_.size()) {
 | 
| +  if (prev_index_ >= stored_packets_.size()) {
 | 
|      prev_index_ = 0;
 | 
|    }
 | 
|    return 0;
 | 
| @@ -188,8 +142,7 @@ bool RTPPacketHistory::HasRTPPacket(uint16_t sequence_number) const {
 | 
|      return false;
 | 
|    }
 | 
|  
 | 
| -  size_t length = stored_lengths_.at(index);
 | 
| -  if (length == 0 || length > max_packet_length_) {
 | 
| +  if (stored_packets_[index].length == 0) {
 | 
|      // Invalid length.
 | 
|      return false;
 | 
|    }
 | 
| @@ -209,11 +162,11 @@ bool RTPPacketHistory::SetSent(uint16_t sequence_number) {
 | 
|    }
 | 
|  
 | 
|    // Send time already set.
 | 
| -  if (stored_send_times_[index] != 0) {
 | 
| +  if (stored_packets_[index].send_time != 0) {
 | 
|      return false;
 | 
|    }
 | 
|  
 | 
| -  stored_send_times_[index] = clock_->TimeInMilliseconds();
 | 
| +  stored_packets_[index].send_time = clock_->TimeInMilliseconds();
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| @@ -224,7 +177,7 @@ bool RTPPacketHistory::GetPacketAndSetSendTime(uint16_t sequence_number,
 | 
|                                                 size_t* packet_length,
 | 
|                                                 int64_t* stored_time_ms) {
 | 
|    CriticalSectionScoped cs(critsect_.get());
 | 
| -  assert(*packet_length >= max_packet_length_);
 | 
| +  assert(*packet_length >= IP_PACKET_SIZE);
 | 
|    if (!store_) {
 | 
|      return false;
 | 
|    }
 | 
| @@ -236,8 +189,8 @@ bool RTPPacketHistory::GetPacketAndSetSendTime(uint16_t sequence_number,
 | 
|      return false;
 | 
|    }
 | 
|  
 | 
| -  size_t length = stored_lengths_.at(index);
 | 
| -  assert(length <= max_packet_length_);
 | 
| +  size_t length = stored_packets_[index].length;
 | 
| +  assert(length <= IP_PACKET_SIZE);
 | 
|    if (length == 0) {
 | 
|      LOG(LS_WARNING) << "No match for getting seqNum " << sequence_number
 | 
|                      << ", len " << length;
 | 
| @@ -247,16 +200,16 @@ bool RTPPacketHistory::GetPacketAndSetSendTime(uint16_t sequence_number,
 | 
|    // Verify elapsed time since last retrieve.
 | 
|    int64_t now = clock_->TimeInMilliseconds();
 | 
|    if (min_elapsed_time_ms > 0 &&
 | 
| -      ((now - stored_send_times_.at(index)) < min_elapsed_time_ms)) {
 | 
| +      ((now - stored_packets_[index].send_time) < min_elapsed_time_ms)) {
 | 
|      return false;
 | 
|    }
 | 
|  
 | 
| -  if (retransmit && stored_types_.at(index) == kDontRetransmit) {
 | 
| +  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;
 | 
|    }
 | 
| -  stored_send_times_[index] = clock_->TimeInMilliseconds();
 | 
| +  stored_packets_[index].send_time = clock_->TimeInMilliseconds();
 | 
|    GetPacket(index, packet, packet_length, stored_time_ms);
 | 
|    return true;
 | 
|  }
 | 
| @@ -266,13 +219,10 @@ void RTPPacketHistory::GetPacket(int index,
 | 
|                                   size_t* packet_length,
 | 
|                                   int64_t* stored_time_ms) const {
 | 
|    // Get packet.
 | 
| -  size_t length = stored_lengths_.at(index);
 | 
| -  std::vector<std::vector<uint8_t> >::const_iterator it_found_packet =
 | 
| -      stored_packets_.begin() + index;
 | 
| -  std::copy(it_found_packet->begin(), it_found_packet->begin() + length,
 | 
| -            packet);
 | 
| +  size_t length = stored_packets_[index].length;
 | 
| +  memcpy(packet, stored_packets_[index].data, length);
 | 
|    *packet_length = length;
 | 
| -  *stored_time_ms = stored_times_.at(index);
 | 
| +  *stored_time_ms = stored_packets_[index].time_ms;
 | 
|  }
 | 
|  
 | 
|  bool RTPPacketHistory::GetBestFittingPacket(uint8_t* packet,
 | 
| @@ -294,24 +244,24 @@ bool RTPPacketHistory::FindSeqNum(uint16_t sequence_number,
 | 
|    uint16_t temp_sequence_number = 0;
 | 
|    if (prev_index_ > 0) {
 | 
|      *index = prev_index_ - 1;
 | 
| -    temp_sequence_number = stored_seq_nums_[*index];
 | 
| +    temp_sequence_number = stored_packets_[*index].sequence_number;
 | 
|    } else {
 | 
| -    *index = stored_seq_nums_.size() - 1;
 | 
| -    temp_sequence_number = stored_seq_nums_[*index];  // wrap
 | 
| +    *index = stored_packets_.size() - 1;
 | 
| +    temp_sequence_number = stored_packets_[*index].sequence_number;  // wrap
 | 
|    }
 | 
|  
 | 
|    int32_t idx = (prev_index_ - 1) - (temp_sequence_number - sequence_number);
 | 
| -  if (idx >= 0 && idx < static_cast<int>(stored_seq_nums_.size())) {
 | 
| +  if (idx >= 0 && idx < static_cast<int>(stored_packets_.size())) {
 | 
|      *index = idx;
 | 
| -    temp_sequence_number = stored_seq_nums_[*index];
 | 
| +    temp_sequence_number = stored_packets_[*index].sequence_number;
 | 
|    }
 | 
|  
 | 
|    if (temp_sequence_number != sequence_number) {
 | 
|      // We did not found a match, search all.
 | 
| -    for (uint16_t m = 0; m < stored_seq_nums_.size(); m++) {
 | 
| -      if (stored_seq_nums_[m] == sequence_number) {
 | 
| +    for (uint16_t m = 0; m < stored_packets_.size(); m++) {
 | 
| +      if (stored_packets_[m].sequence_number == sequence_number) {
 | 
|          *index = m;
 | 
| -        temp_sequence_number = stored_seq_nums_[*index];
 | 
| +        temp_sequence_number = stored_packets_[*index].sequence_number;
 | 
|          break;
 | 
|        }
 | 
|      }
 | 
| @@ -324,15 +274,16 @@ bool RTPPacketHistory::FindSeqNum(uint16_t sequence_number,
 | 
|  }
 | 
|  
 | 
|  int RTPPacketHistory::FindBestFittingPacket(size_t size) const {
 | 
| -  if (size < kMinPacketRequestBytes || stored_lengths_.empty())
 | 
| +  if (size < kMinPacketRequestBytes || stored_packets_.empty())
 | 
|      return -1;
 | 
|    size_t min_diff = std::numeric_limits<size_t>::max();
 | 
|    int best_index = -1;  // Returned unchanged if we don't find anything.
 | 
| -  for (size_t i = 0; i < stored_lengths_.size(); ++i) {
 | 
| -    if (stored_lengths_[i] == 0)
 | 
| +  for (size_t i = 0; i < stored_packets_.size(); ++i) {
 | 
| +    if (stored_packets_[i].length == 0)
 | 
|        continue;
 | 
| -    size_t diff = (stored_lengths_[i] > size) ?
 | 
| -        (stored_lengths_[i] - size) : (size - stored_lengths_[i]);
 | 
| +    size_t diff = (stored_packets_[i].length > size)
 | 
| +                      ? (stored_packets_[i].length - size)
 | 
| +                      : (size - stored_packets_[i].length);
 | 
|      if (diff < min_diff) {
 | 
|        min_diff = diff;
 | 
|        best_index = static_cast<int>(i);
 | 
| @@ -340,4 +291,7 @@ int RTPPacketHistory::FindBestFittingPacket(size_t size) const {
 | 
|    }
 | 
|    return best_index;
 | 
|  }
 | 
| +
 | 
| +RTPPacketHistory::StoredPacket::StoredPacket() {}
 | 
| +
 | 
|  }  // namespace webrtc
 | 
| 
 |