text: // Copyright 2013 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_FRAMER_FRAME_ID_MAP_H_
  #define MEDIA_CAST_FRAMER_FRAME_ID_MAP_H_
  
  #include <map>
  #include <set>
  
  #include "base/memory/linked_ptr.h"
  #include "base/memory/scoped_ptr.h"
  #include "media/cast/cast_config.h"
  #include "media/cast/rtcp/rtcp_defines.h"
  #include "media/cast/rtp_receiver/rtp_receiver_defines.h"
  
  namespace media {
  namespace cast {
  
  class FrameInfo {
   public:
    FrameInfo(uint32 frame_id,
              uint32 referenced_frame_id,
              uint16 max_packet_id,
              bool key_frame);
    ~FrameInfo();
  
    PacketType InsertPacket(uint16 packet_id);
    bool Complete() const;
    void GetMissingPackets(bool newest_frame, PacketIdSet* missing_packets) const;
  
    bool is_key_frame() const { return is_key_frame_; }
    uint32 frame_id() const { return frame_id_; }
    uint32 referenced_frame_id() const { return referenced_frame_id_; }
  
   private:
    const bool is_key_frame_;
    const uint32 frame_id_;
    const uint32 referenced_frame_id_;
  
    uint16 max_received_packet_id_;
    PacketIdSet missing_packets_;
  
    DISALLOW_COPY_AND_ASSIGN(FrameInfo);
  };
  
  typedef std::map<uint32, linked_ptr<FrameInfo> > FrameMap;
  
  class FrameIdMap {
   public:
    FrameIdMap();
    ~FrameIdMap();
  
    PacketType InsertPacket(const RtpCastHeader& rtp_header);
  
    bool Empty() const;
    bool FrameExists(uint32 frame_id) const;
    uint32 NewestFrameId() const;
  
    void RemoveOldFrames(uint32 frame_id);
    void Clear();
  
    // Identifies the next frame to be released (rendered).
    bool NextContinuousFrame(uint32* frame_id) const;
    uint32 LastContinuousFrame() const;
  
    bool NextFrameAllowingSkippingFrames(uint32* frame_id) const;
    bool HaveMultipleDecodableFrames() const;
  
    int NumberOfCompleteFrames() const;
    void GetMissingPackets(uint32 frame_id,
                           bool last_frame,
                           PacketIdSet* missing_packets) const;
  
   private:
    bool ContinuousFrame(FrameInfo* frame) const;
    bool DecodableFrame(FrameInfo* frame) const;
  
    FrameMap frame_map_;
    bool waiting_for_key_;
    uint32 last_released_frame_;
    uint32 newest_frame_id_;
  
    DISALLOW_COPY_AND_ASSIGN(FrameIdMap);
  };
  
  }  //  namespace cast
  }  //  namespace media
  
  #endif  // MEDIA_CAST_FRAMER_FRAME_ID_MAP_H_
  