1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef MODULES_AUDIO_CODING_NETEQ_PACKET_BUFFER_H_ 12 #define MODULES_AUDIO_CODING_NETEQ_PACKET_BUFFER_H_ 13 14 #include "absl/types/optional.h" 15 #include "modules/audio_coding/neteq/decoder_database.h" 16 #include "modules/audio_coding/neteq/packet.h" 17 #include "modules/include/module_common_types_public.h" // IsNewerTimestamp 18 #include "rtc_base/constructor_magic.h" 19 20 namespace webrtc { 21 22 class DecoderDatabase; 23 class StatisticsCalculator; 24 class TickTimer; 25 26 // This is the actual buffer holding the packets before decoding. 27 class PacketBuffer { 28 public: 29 enum BufferReturnCodes { 30 kOK = 0, 31 kFlushed, 32 kNotFound, 33 kBufferEmpty, 34 kInvalidPacket, 35 kInvalidPointer 36 }; 37 38 // Constructor creates a buffer which can hold a maximum of 39 // |max_number_of_packets| packets. 40 PacketBuffer(size_t max_number_of_packets, const TickTimer* tick_timer); 41 42 // Deletes all packets in the buffer before destroying the buffer. 43 virtual ~PacketBuffer(); 44 45 // Flushes the buffer and deletes all packets in it. 46 virtual void Flush(); 47 48 // Returns true for an empty buffer. 49 virtual bool Empty() const; 50 51 // Inserts |packet| into the buffer. The buffer will take over ownership of 52 // the packet object. 53 // Returns PacketBuffer::kOK on success, PacketBuffer::kFlushed if the buffer 54 // was flushed due to overfilling. 55 virtual int InsertPacket(Packet&& packet, StatisticsCalculator* stats); 56 57 // Inserts a list of packets into the buffer. The buffer will take over 58 // ownership of the packet objects. 59 // Returns PacketBuffer::kOK if all packets were inserted successfully. 60 // If the buffer was flushed due to overfilling, only a subset of the list is 61 // inserted, and PacketBuffer::kFlushed is returned. 62 // The last three parameters are included for legacy compatibility. 63 // TODO(hlundin): Redesign to not use current_*_payload_type and 64 // decoder_database. 65 virtual int InsertPacketList( 66 PacketList* packet_list, 67 const DecoderDatabase& decoder_database, 68 absl::optional<uint8_t>* current_rtp_payload_type, 69 absl::optional<uint8_t>* current_cng_rtp_payload_type, 70 StatisticsCalculator* stats); 71 72 // Gets the timestamp for the first packet in the buffer and writes it to the 73 // output variable |next_timestamp|. 74 // Returns PacketBuffer::kBufferEmpty if the buffer is empty, 75 // PacketBuffer::kOK otherwise. 76 virtual int NextTimestamp(uint32_t* next_timestamp) const; 77 78 // Gets the timestamp for the first packet in the buffer with a timestamp no 79 // lower than the input limit |timestamp|. The result is written to the output 80 // variable |next_timestamp|. 81 // Returns PacketBuffer::kBufferEmpty if the buffer is empty, 82 // PacketBuffer::kOK otherwise. 83 virtual int NextHigherTimestamp(uint32_t timestamp, 84 uint32_t* next_timestamp) const; 85 86 // Returns a (constant) pointer to the first packet in the buffer. Returns 87 // NULL if the buffer is empty. 88 virtual const Packet* PeekNextPacket() const; 89 90 // Extracts the first packet in the buffer and returns it. 91 // Returns an empty optional if the buffer is empty. 92 virtual absl::optional<Packet> GetNextPacket(); 93 94 // Discards the first packet in the buffer. The packet is deleted. 95 // Returns PacketBuffer::kBufferEmpty if the buffer is empty, 96 // PacketBuffer::kOK otherwise. 97 virtual int DiscardNextPacket(StatisticsCalculator* stats); 98 99 // Discards all packets that are (strictly) older than timestamp_limit, 100 // but newer than timestamp_limit - horizon_samples. Setting horizon_samples 101 // to zero implies that the horizon is set to half the timestamp range. That 102 // is, if a packet is more than 2^31 timestamps into the future compared with 103 // timestamp_limit (including wrap-around), it is considered old. 104 virtual void DiscardOldPackets(uint32_t timestamp_limit, 105 uint32_t horizon_samples, 106 StatisticsCalculator* stats); 107 108 // Discards all packets that are (strictly) older than timestamp_limit. 109 virtual void DiscardAllOldPackets(uint32_t timestamp_limit, 110 StatisticsCalculator* stats); 111 112 // Removes all packets with a specific payload type from the buffer. 113 virtual void DiscardPacketsWithPayloadType(uint8_t payload_type, 114 StatisticsCalculator* stats); 115 116 // Returns the number of packets in the buffer, including duplicates and 117 // redundant packets. 118 virtual size_t NumPacketsInBuffer() const; 119 120 // Returns the number of samples in the buffer, including samples carried in 121 // duplicate and redundant packets. 122 virtual size_t NumSamplesInBuffer(size_t last_decoded_length) const; 123 124 // Returns the total duration in samples that the packets in the buffer spans 125 // across. 126 virtual size_t GetSpanSamples(size_t last_decoded_length, 127 size_t sample_rate, 128 bool count_dtx_waiting_time) const; 129 130 // Returns true if the packet buffer contains any DTX or CNG packets. 131 virtual bool ContainsDtxOrCngPacket( 132 const DecoderDatabase* decoder_database) const; 133 134 // Static method returning true if |timestamp| is older than |timestamp_limit| 135 // but less than |horizon_samples| behind |timestamp_limit|. For instance, 136 // with timestamp_limit = 100 and horizon_samples = 10, a timestamp in the 137 // range (90, 100) is considered obsolete, and will yield true. 138 // Setting |horizon_samples| to 0 is the same as setting it to 2^31, i.e., 139 // half the 32-bit timestamp range. IsObsoleteTimestamp(uint32_t timestamp,uint32_t timestamp_limit,uint32_t horizon_samples)140 static bool IsObsoleteTimestamp(uint32_t timestamp, 141 uint32_t timestamp_limit, 142 uint32_t horizon_samples) { 143 return IsNewerTimestamp(timestamp_limit, timestamp) && 144 (horizon_samples == 0 || 145 IsNewerTimestamp(timestamp, timestamp_limit - horizon_samples)); 146 } 147 148 private: 149 size_t max_number_of_packets_; 150 PacketList buffer_; 151 const TickTimer* tick_timer_; 152 RTC_DISALLOW_COPY_AND_ASSIGN(PacketBuffer); 153 }; 154 155 } // namespace webrtc 156 #endif // MODULES_AUDIO_CODING_NETEQ_PACKET_BUFFER_H_ 157