| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 | 
							- /*
 
-  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 
-  *
 
-  *  Use of this source code is governed by a BSD-style license
 
-  *  that can be found in the LICENSE file in the root of the source
 
-  *  tree. An additional intellectual property rights grant can be found
 
-  *  in the file PATENTS.  All contributing project authors may
 
-  *  be found in the AUTHORS file in the root of the source tree.
 
-  */
 
- #ifndef MODULES_AUDIO_CODING_NETEQ_PACKET_BUFFER_H_
 
- #define MODULES_AUDIO_CODING_NETEQ_PACKET_BUFFER_H_
 
- #include "absl/types/optional.h"
 
- #include "modules/audio_coding/neteq/decoder_database.h"
 
- #include "modules/audio_coding/neteq/packet.h"
 
- #include "modules/include/module_common_types_public.h"  // IsNewerTimestamp
 
- #include "rtc_base/constructor_magic.h"
 
- namespace webrtc {
 
- class DecoderDatabase;
 
- class StatisticsCalculator;
 
- class TickTimer;
 
- // This is the actual buffer holding the packets before decoding.
 
- class PacketBuffer {
 
-  public:
 
-   enum BufferReturnCodes {
 
-     kOK = 0,
 
-     kFlushed,
 
-     kNotFound,
 
-     kBufferEmpty,
 
-     kInvalidPacket,
 
-     kInvalidPointer
 
-   };
 
-   // Constructor creates a buffer which can hold a maximum of
 
-   // |max_number_of_packets| packets.
 
-   PacketBuffer(size_t max_number_of_packets, const TickTimer* tick_timer);
 
-   // Deletes all packets in the buffer before destroying the buffer.
 
-   virtual ~PacketBuffer();
 
-   // Flushes the buffer and deletes all packets in it.
 
-   virtual void Flush();
 
-   // Returns true for an empty buffer.
 
-   virtual bool Empty() const;
 
-   // Inserts |packet| into the buffer. The buffer will take over ownership of
 
-   // the packet object.
 
-   // Returns PacketBuffer::kOK on success, PacketBuffer::kFlushed if the buffer
 
-   // was flushed due to overfilling.
 
-   virtual int InsertPacket(Packet&& packet, StatisticsCalculator* stats);
 
-   // Inserts a list of packets into the buffer. The buffer will take over
 
-   // ownership of the packet objects.
 
-   // Returns PacketBuffer::kOK if all packets were inserted successfully.
 
-   // If the buffer was flushed due to overfilling, only a subset of the list is
 
-   // inserted, and PacketBuffer::kFlushed is returned.
 
-   // The last three parameters are included for legacy compatibility.
 
-   // TODO(hlundin): Redesign to not use current_*_payload_type and
 
-   // decoder_database.
 
-   virtual int InsertPacketList(
 
-       PacketList* packet_list,
 
-       const DecoderDatabase& decoder_database,
 
-       absl::optional<uint8_t>* current_rtp_payload_type,
 
-       absl::optional<uint8_t>* current_cng_rtp_payload_type,
 
-       StatisticsCalculator* stats);
 
-   // Gets the timestamp for the first packet in the buffer and writes it to the
 
-   // output variable |next_timestamp|.
 
-   // Returns PacketBuffer::kBufferEmpty if the buffer is empty,
 
-   // PacketBuffer::kOK otherwise.
 
-   virtual int NextTimestamp(uint32_t* next_timestamp) const;
 
-   // Gets the timestamp for the first packet in the buffer with a timestamp no
 
-   // lower than the input limit |timestamp|. The result is written to the output
 
-   // variable |next_timestamp|.
 
-   // Returns PacketBuffer::kBufferEmpty if the buffer is empty,
 
-   // PacketBuffer::kOK otherwise.
 
-   virtual int NextHigherTimestamp(uint32_t timestamp,
 
-                                   uint32_t* next_timestamp) const;
 
-   // Returns a (constant) pointer to the first packet in the buffer. Returns
 
-   // NULL if the buffer is empty.
 
-   virtual const Packet* PeekNextPacket() const;
 
-   // Extracts the first packet in the buffer and returns it.
 
-   // Returns an empty optional if the buffer is empty.
 
-   virtual absl::optional<Packet> GetNextPacket();
 
-   // Discards the first packet in the buffer. The packet is deleted.
 
-   // Returns PacketBuffer::kBufferEmpty if the buffer is empty,
 
-   // PacketBuffer::kOK otherwise.
 
-   virtual int DiscardNextPacket(StatisticsCalculator* stats);
 
-   // Discards all packets that are (strictly) older than timestamp_limit,
 
-   // but newer than timestamp_limit - horizon_samples. Setting horizon_samples
 
-   // to zero implies that the horizon is set to half the timestamp range. That
 
-   // is, if a packet is more than 2^31 timestamps into the future compared with
 
-   // timestamp_limit (including wrap-around), it is considered old.
 
-   virtual void DiscardOldPackets(uint32_t timestamp_limit,
 
-                                  uint32_t horizon_samples,
 
-                                  StatisticsCalculator* stats);
 
-   // Discards all packets that are (strictly) older than timestamp_limit.
 
-   virtual void DiscardAllOldPackets(uint32_t timestamp_limit,
 
-                                     StatisticsCalculator* stats);
 
-   // Removes all packets with a specific payload type from the buffer.
 
-   virtual void DiscardPacketsWithPayloadType(uint8_t payload_type,
 
-                                              StatisticsCalculator* stats);
 
-   // Returns the number of packets in the buffer, including duplicates and
 
-   // redundant packets.
 
-   virtual size_t NumPacketsInBuffer() const;
 
-   // Returns the number of samples in the buffer, including samples carried in
 
-   // duplicate and redundant packets.
 
-   virtual size_t NumSamplesInBuffer(size_t last_decoded_length) const;
 
-   // Returns the total duration in samples that the packets in the buffer spans
 
-   // across.
 
-   virtual size_t GetSpanSamples(size_t last_decoded_length,
 
-                                 size_t sample_rate,
 
-                                 bool count_dtx_waiting_time) const;
 
-   // Returns true if the packet buffer contains any DTX or CNG packets.
 
-   virtual bool ContainsDtxOrCngPacket(
 
-       const DecoderDatabase* decoder_database) const;
 
-   // Static method returning true if |timestamp| is older than |timestamp_limit|
 
-   // but less than |horizon_samples| behind |timestamp_limit|. For instance,
 
-   // with timestamp_limit = 100 and horizon_samples = 10, a timestamp in the
 
-   // range (90, 100) is considered obsolete, and will yield true.
 
-   // Setting |horizon_samples| to 0 is the same as setting it to 2^31, i.e.,
 
-   // half the 32-bit timestamp range.
 
-   static bool IsObsoleteTimestamp(uint32_t timestamp,
 
-                                   uint32_t timestamp_limit,
 
-                                   uint32_t horizon_samples) {
 
-     return IsNewerTimestamp(timestamp_limit, timestamp) &&
 
-            (horizon_samples == 0 ||
 
-             IsNewerTimestamp(timestamp, timestamp_limit - horizon_samples));
 
-   }
 
-  private:
 
-   size_t max_number_of_packets_;
 
-   PacketList buffer_;
 
-   const TickTimer* tick_timer_;
 
-   RTC_DISALLOW_COPY_AND_ASSIGN(PacketBuffer);
 
- };
 
- }  // namespace webrtc
 
- #endif  // MODULES_AUDIO_CODING_NETEQ_PACKET_BUFFER_H_
 
 
  |