| 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 | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 61 // Flush the buffer. All packets in the buffer will be destroyed. | 61 // Flush the buffer. All packets in the buffer will be destroyed. | 
| 62 void PacketBuffer::Flush() { | 62 void PacketBuffer::Flush() { | 
| 63   DeleteAllPackets(&buffer_); | 63   DeleteAllPackets(&buffer_); | 
| 64 } | 64 } | 
| 65 | 65 | 
| 66 bool PacketBuffer::Empty() const { | 66 bool PacketBuffer::Empty() const { | 
| 67   return buffer_.empty(); | 67   return buffer_.empty(); | 
| 68 } | 68 } | 
| 69 | 69 | 
| 70 int PacketBuffer::InsertPacket(Packet* packet) { | 70 int PacketBuffer::InsertPacket(Packet* packet) { | 
| 71   if (!packet || packet->payload.empty()) { | 71   if (!packet || packet->empty()) { | 
| 72     if (packet) { | 72     if (packet) { | 
| 73       delete packet; | 73       delete packet; | 
| 74     } | 74     } | 
| 75     LOG(LS_WARNING) << "InsertPacket invalid packet"; | 75     LOG(LS_WARNING) << "InsertPacket invalid packet"; | 
| 76     return kInvalidPacket; | 76     return kInvalidPacket; | 
| 77   } | 77   } | 
| 78 | 78 | 
| 79   int return_val = kOK; | 79   int return_val = kOK; | 
| 80 | 80 | 
| 81   packet->waiting_time = tick_timer_->GetNewStopwatch(); | 81   packet->waiting_time = tick_timer_->GetNewStopwatch(); | 
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 202 } | 202 } | 
| 203 | 203 | 
| 204 Packet* PacketBuffer::GetNextPacket(size_t* discard_count) { | 204 Packet* PacketBuffer::GetNextPacket(size_t* discard_count) { | 
| 205   if (Empty()) { | 205   if (Empty()) { | 
| 206     // Buffer is empty. | 206     // Buffer is empty. | 
| 207     return NULL; | 207     return NULL; | 
| 208   } | 208   } | 
| 209 | 209 | 
| 210   Packet* packet = buffer_.front(); | 210   Packet* packet = buffer_.front(); | 
| 211   // Assert that the packet sanity checks in InsertPacket method works. | 211   // Assert that the packet sanity checks in InsertPacket method works. | 
| 212   assert(packet && !packet->payload.empty()); | 212   RTC_DCHECK(packet && !packet->empty()); | 
| 213   buffer_.pop_front(); | 213   buffer_.pop_front(); | 
| 214 | 214 | 
| 215   // Discard other packets with the same timestamp. These are duplicates or | 215   // Discard other packets with the same timestamp. These are duplicates or | 
| 216   // redundant payloads that should not be used. | 216   // redundant payloads that should not be used. | 
| 217   size_t discards = 0; | 217   size_t discards = 0; | 
| 218 | 218 | 
| 219   while (!Empty() && | 219   while (!Empty() && | 
| 220       buffer_.front()->header.timestamp == packet->header.timestamp) { | 220       buffer_.front()->header.timestamp == packet->header.timestamp) { | 
| 221     if (DiscardNextPacket() != kOK) { | 221     if (DiscardNextPacket() != kOK) { | 
| 222       assert(false);  // Must be ok by design. | 222       assert(false);  // Must be ok by design. | 
| 223     } | 223     } | 
| 224     ++discards; | 224     ++discards; | 
| 225   } | 225   } | 
| 226   // The way of inserting packet should not cause any packet discarding here. | 226   // The way of inserting packet should not cause any packet discarding here. | 
| 227   // TODO(minyue): remove |discard_count|. | 227   // TODO(minyue): remove |discard_count|. | 
| 228   assert(discards == 0); | 228   assert(discards == 0); | 
| 229   if (discard_count) | 229   if (discard_count) | 
| 230     *discard_count = discards; | 230     *discard_count = discards; | 
| 231 | 231 | 
| 232   return packet; | 232   return packet; | 
| 233 } | 233 } | 
| 234 | 234 | 
| 235 int PacketBuffer::DiscardNextPacket() { | 235 int PacketBuffer::DiscardNextPacket() { | 
| 236   if (Empty()) { | 236   if (Empty()) { | 
| 237     return kBufferEmpty; | 237     return kBufferEmpty; | 
| 238   } | 238   } | 
| 239   // Assert that the packet sanity checks in InsertPacket method works. | 239   // Assert that the packet sanity checks in InsertPacket method works. | 
| 240   assert(buffer_.front()); | 240   RTC_DCHECK(buffer_.front()); | 
| 241   assert(!buffer_.front()->payload.empty()); | 241   RTC_DCHECK(!buffer_.front()->empty()); | 
| 242   DeleteFirstPacket(&buffer_); | 242   DeleteFirstPacket(&buffer_); | 
| 243   return kOK; | 243   return kOK; | 
| 244 } | 244 } | 
| 245 | 245 | 
| 246 int PacketBuffer::DiscardOldPackets(uint32_t timestamp_limit, | 246 int PacketBuffer::DiscardOldPackets(uint32_t timestamp_limit, | 
| 247                                     uint32_t horizon_samples) { | 247                                     uint32_t horizon_samples) { | 
| 248   while (!Empty() && timestamp_limit != buffer_.front()->header.timestamp && | 248   while (!Empty() && timestamp_limit != buffer_.front()->header.timestamp && | 
| 249          IsObsoleteTimestamp(buffer_.front()->header.timestamp, | 249          IsObsoleteTimestamp(buffer_.front()->header.timestamp, | 
| 250                              timestamp_limit, | 250                              timestamp_limit, | 
| 251                              horizon_samples)) { | 251                              horizon_samples)) { | 
| 252     if (DiscardNextPacket() != kOK) { | 252     if (DiscardNextPacket() != kOK) { | 
| 253       assert(false);  // Must be ok by design. | 253       assert(false);  // Must be ok by design. | 
| 254     } | 254     } | 
| 255   } | 255   } | 
| 256   return 0; | 256   return 0; | 
| 257 } | 257 } | 
| 258 | 258 | 
| 259 int PacketBuffer::DiscardAllOldPackets(uint32_t timestamp_limit) { | 259 int PacketBuffer::DiscardAllOldPackets(uint32_t timestamp_limit) { | 
| 260   return DiscardOldPackets(timestamp_limit, 0); | 260   return DiscardOldPackets(timestamp_limit, 0); | 
| 261 } | 261 } | 
| 262 | 262 | 
| 263 size_t PacketBuffer::NumPacketsInBuffer() const { | 263 size_t PacketBuffer::NumPacketsInBuffer() const { | 
| 264   return buffer_.size(); | 264   return buffer_.size(); | 
| 265 } | 265 } | 
| 266 | 266 | 
| 267 size_t PacketBuffer::NumSamplesInBuffer(DecoderDatabase* decoder_database, | 267 size_t PacketBuffer::NumSamplesInBuffer(size_t last_decoded_length) const { | 
| 268                                         size_t last_decoded_length) const { |  | 
| 269   PacketList::const_iterator it; |  | 
| 270   size_t num_samples = 0; | 268   size_t num_samples = 0; | 
| 271   size_t last_duration = last_decoded_length; | 269   size_t last_duration = last_decoded_length; | 
| 272   for (it = buffer_.begin(); it != buffer_.end(); ++it) { | 270   for (Packet* packet : buffer_) { | 
| 273     Packet* packet = (*it); | 271     if (packet->frame) { | 
| 274     AudioDecoder* decoder = |  | 
| 275         decoder_database->GetDecoder(packet->header.payloadType); |  | 
| 276     if (decoder) { |  | 
| 277       if (!packet->primary) { | 272       if (!packet->primary) { | 
| 278         continue; | 273         continue; | 
| 279       } | 274       } | 
| 280       int duration = decoder->PacketDuration(packet->payload.data(), | 275       size_t duration = packet->frame->Duration(); | 
| 281                                              packet->payload.size()); | 276       if (duration > 0) { | 
| 282       if (duration >= 0) { |  | 
| 283         last_duration = duration;  // Save the most up-to-date (valid) duration. | 277         last_duration = duration;  // Save the most up-to-date (valid) duration. | 
| 284       } | 278       } | 
| 285     } | 279     } | 
| 286     num_samples += last_duration; | 280     num_samples += last_duration; | 
| 287   } | 281   } | 
| 288   return num_samples; | 282   return num_samples; | 
| 289 } | 283 } | 
| 290 | 284 | 
| 291 bool PacketBuffer::DeleteFirstPacket(PacketList* packet_list) { | 285 bool PacketBuffer::DeleteFirstPacket(PacketList* packet_list) { | 
| 292   if (packet_list->empty()) { | 286   if (packet_list->empty()) { | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 303     // Continue while the list is not empty. | 297     // Continue while the list is not empty. | 
| 304   } | 298   } | 
| 305 } | 299 } | 
| 306 | 300 | 
| 307 void PacketBuffer::BufferStat(int* num_packets, int* max_num_packets) const { | 301 void PacketBuffer::BufferStat(int* num_packets, int* max_num_packets) const { | 
| 308   *num_packets = static_cast<int>(buffer_.size()); | 302   *num_packets = static_cast<int>(buffer_.size()); | 
| 309   *max_num_packets = static_cast<int>(max_number_of_packets_); | 303   *max_num_packets = static_cast<int>(max_number_of_packets_); | 
| 310 } | 304 } | 
| 311 | 305 | 
| 312 }  // namespace webrtc | 306 }  // namespace webrtc | 
| OLD | NEW | 
|---|