Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(520)

Side by Side Diff: webrtc/modules/audio_coding/neteq/packet_buffer.cc

Issue 1903043003: WIP: Adding a centralized NetEq Clock (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@neteq-remove-type-param
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 // This is the implementation of the PacketBuffer class. It is mostly based on 11 // This is the implementation of the PacketBuffer class. It is mostly based on
12 // an STL list. The list is kept sorted at all times so that the next packet to 12 // an STL list. The list is kept sorted at all times so that the next packet to
13 // decode is at the beginning of the list. 13 // decode is at the beginning of the list.
14 14
15 #include "webrtc/modules/audio_coding/neteq/packet_buffer.h" 15 #include "webrtc/modules/audio_coding/neteq/packet_buffer.h"
16 16
17 #include <algorithm> // find_if() 17 #include <algorithm> // find_if()
18 18
19 #include "webrtc/base/logging.h" 19 #include "webrtc/base/logging.h"
20 #include "webrtc/modules/audio_coding/codecs/audio_decoder.h" 20 #include "webrtc/modules/audio_coding/codecs/audio_decoder.h"
21 #include "webrtc/modules/audio_coding/neteq/decoder_database.h" 21 #include "webrtc/modules/audio_coding/neteq/decoder_database.h"
22 #include "webrtc/modules/audio_coding/neteq/tick_timer.h"
22 23
23 namespace webrtc { 24 namespace webrtc {
24 25
25 // Predicate used when inserting packets in the buffer list. 26 // Predicate used when inserting packets in the buffer list.
26 // Operator() returns true when |packet| goes before |new_packet|. 27 // Operator() returns true when |packet| goes before |new_packet|.
27 class NewTimestampIsLarger { 28 class NewTimestampIsLarger {
28 public: 29 public:
29 explicit NewTimestampIsLarger(const Packet* new_packet) 30 explicit NewTimestampIsLarger(const Packet* new_packet)
30 : new_packet_(new_packet) { 31 : new_packet_(new_packet) {
31 } 32 }
32 bool operator()(Packet* packet) { 33 bool operator()(Packet* packet) {
33 return (*new_packet_ >= *packet); 34 return (*new_packet_ >= *packet);
34 } 35 }
35 36
36 private: 37 private:
37 const Packet* new_packet_; 38 const Packet* new_packet_;
38 }; 39 };
39 40
40 PacketBuffer::PacketBuffer(size_t max_number_of_packets) 41 PacketBuffer::PacketBuffer(size_t max_number_of_packets,
41 : max_number_of_packets_(max_number_of_packets) {} 42 const TickTimer& tick_timer)
43 : max_number_of_packets_(max_number_of_packets), tick_timer_(tick_timer) {}
42 44
43 // Destructor. All packets in the buffer will be destroyed. 45 // Destructor. All packets in the buffer will be destroyed.
44 PacketBuffer::~PacketBuffer() { 46 PacketBuffer::~PacketBuffer() {
45 Flush(); 47 Flush();
46 } 48 }
47 49
48 // Flush the buffer. All packets in the buffer will be destroyed. 50 // Flush the buffer. All packets in the buffer will be destroyed.
49 void PacketBuffer::Flush() { 51 void PacketBuffer::Flush() {
50 DeleteAllPackets(&buffer_); 52 DeleteAllPackets(&buffer_);
51 } 53 }
52 54
53 bool PacketBuffer::Empty() const { 55 bool PacketBuffer::Empty() const {
54 return buffer_.empty(); 56 return buffer_.empty();
55 } 57 }
56 58
57 int PacketBuffer::InsertPacket(Packet* packet) { 59 int PacketBuffer::InsertPacket(Packet* packet) {
58 if (!packet || !packet->payload) { 60 if (!packet || !packet->payload) {
59 if (packet) { 61 if (packet) {
60 delete packet; 62 delete packet;
61 } 63 }
62 LOG(LS_WARNING) << "InsertPacket invalid packet"; 64 LOG(LS_WARNING) << "InsertPacket invalid packet";
63 return kInvalidPacket; 65 return kInvalidPacket;
64 } 66 }
65 67
66 int return_val = kOK; 68 int return_val = kOK;
67 69
70 packet->waiting_time = tick_timer_.GetNewStopwatch();
71
68 if (buffer_.size() >= max_number_of_packets_) { 72 if (buffer_.size() >= max_number_of_packets_) {
69 // Buffer is full. Flush it. 73 // Buffer is full. Flush it.
70 Flush(); 74 Flush();
71 LOG(LS_WARNING) << "Packet buffer flushed"; 75 LOG(LS_WARNING) << "Packet buffer flushed";
72 return_val = kFlushed; 76 return_val = kFlushed;
73 } 77 }
74 78
75 // Get an iterator pointing to the place in the buffer where the new packet 79 // Get an iterator pointing to the place in the buffer where the new packet
76 // should be inserted. The list is searched from the back, since the most 80 // should be inserted. The list is searched from the back, since the most
77 // likely case is that the new packet should be near the end of the list. 81 // likely case is that the new packet should be near the end of the list.
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 decoder->PacketDuration(packet->payload, packet->payload_length); 265 decoder->PacketDuration(packet->payload, packet->payload_length);
262 if (duration >= 0) { 266 if (duration >= 0) {
263 last_duration = duration; // Save the most up-to-date (valid) duration. 267 last_duration = duration; // Save the most up-to-date (valid) duration.
264 } 268 }
265 } 269 }
266 num_samples += last_duration; 270 num_samples += last_duration;
267 } 271 }
268 return num_samples; 272 return num_samples;
269 } 273 }
270 274
271 void PacketBuffer::IncrementWaitingTimes(int inc) {
272 PacketList::iterator it;
273 for (it = buffer_.begin(); it != buffer_.end(); ++it) {
274 (*it)->waiting_time += inc;
275 }
276 }
277
278 bool PacketBuffer::DeleteFirstPacket(PacketList* packet_list) { 275 bool PacketBuffer::DeleteFirstPacket(PacketList* packet_list) {
279 if (packet_list->empty()) { 276 if (packet_list->empty()) {
280 return false; 277 return false;
281 } 278 }
282 Packet* first_packet = packet_list->front(); 279 Packet* first_packet = packet_list->front();
283 delete [] first_packet->payload; 280 delete [] first_packet->payload;
284 delete first_packet; 281 delete first_packet;
285 packet_list->pop_front(); 282 packet_list->pop_front();
286 return true; 283 return true;
287 } 284 }
288 285
289 void PacketBuffer::DeleteAllPackets(PacketList* packet_list) { 286 void PacketBuffer::DeleteAllPackets(PacketList* packet_list) {
290 while (DeleteFirstPacket(packet_list)) { 287 while (DeleteFirstPacket(packet_list)) {
291 // Continue while the list is not empty. 288 // Continue while the list is not empty.
292 } 289 }
293 } 290 }
294 291
295 void PacketBuffer::BufferStat(int* num_packets, int* max_num_packets) const { 292 void PacketBuffer::BufferStat(int* num_packets, int* max_num_packets) const {
296 *num_packets = static_cast<int>(buffer_.size()); 293 *num_packets = static_cast<int>(buffer_.size());
297 *max_num_packets = static_cast<int>(max_number_of_packets_); 294 *max_num_packets = static_cast<int>(max_number_of_packets_);
298 } 295 }
299 296
300 } // namespace webrtc 297 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_coding/neteq/packet_buffer.h ('k') | webrtc/modules/audio_coding/neteq/packet_buffer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698