text: // Copyright 2014 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef MEDIA_CAST_NET_RTP_PACKET_STORAGE_H_
  #define MEDIA_CAST_NET_RTP_PACKET_STORAGE_H_
  
  #include <stddef.h>
  #include <stdint.h>
  
  #include "base/containers/circular_deque.h"
  #include "base/macros.h"
  #include "media/cast/net/pacing/paced_sender.h"
  
  namespace media {
  namespace cast {
  
  class PacketStorage {
   public:
    PacketStorage();
  
    PacketStorage(const PacketStorage&) = delete;
    PacketStorage& operator=(const PacketStorage&) = delete;
  
    virtual ~PacketStorage();
  
    // Store all of the packets for a frame.
    void StoreFrame(FrameId frame_id, const SendPacketVector& packets);
  
    // Release all of the packets for a frame.
    void ReleaseFrame(FrameId frame_id);
  
    // Returns a list of packets for a frame, or nullptr if not found.
    SendPacketVector* GetFramePackets(FrameId frame_id);
  
    // Get the number of stored frames.
    size_t GetNumberOfStoredFrames() const;
  
   private:
    base::circular_deque<SendPacketVector> frames_;
    FrameId first_frame_id_in_list_;
  
    // The number of frames whose packets have been released, but the entry in the
    // |frames_| queue has not yet been popped.
    size_t zombie_count_;
  };
  
  }  // namespace cast
  }  // namespace media
  
  #endif  // MEDIA_CAST_NET_RTP_PACKET_STORAGE_H_
  