Home | History | Annotate | Download | only in framer
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef MEDIA_CAST_FRAMER_FRAME_ID_MAP_H_
      6 #define MEDIA_CAST_FRAMER_FRAME_ID_MAP_H_
      7 
      8 #include <map>
      9 #include <set>
     10 
     11 #include "base/memory/linked_ptr.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "media/cast/cast_config.h"
     14 #include "media/cast/rtcp/rtcp_defines.h"
     15 #include "media/cast/rtp_receiver/rtp_receiver_defines.h"
     16 
     17 namespace media {
     18 namespace cast {
     19 
     20 class FrameInfo {
     21  public:
     22   FrameInfo(uint32 frame_id,
     23             uint32 referenced_frame_id,
     24             uint16 max_packet_id,
     25             bool key_frame);
     26   ~FrameInfo();
     27 
     28   PacketType InsertPacket(uint16 packet_id);
     29   bool Complete() const;
     30   void GetMissingPackets(bool newest_frame, PacketIdSet* missing_packets) const;
     31 
     32   bool is_key_frame() const { return is_key_frame_; }
     33   uint32 frame_id() const { return frame_id_; }
     34   uint32 referenced_frame_id() const { return referenced_frame_id_; }
     35 
     36  private:
     37   const bool is_key_frame_;
     38   const uint32 frame_id_;
     39   const uint32 referenced_frame_id_;
     40 
     41   uint16 max_received_packet_id_;
     42   PacketIdSet missing_packets_;
     43 
     44   DISALLOW_COPY_AND_ASSIGN(FrameInfo);
     45 };
     46 
     47 typedef std::map<uint32, linked_ptr<FrameInfo> > FrameMap;
     48 
     49 class FrameIdMap {
     50  public:
     51   FrameIdMap();
     52   ~FrameIdMap();
     53 
     54   PacketType InsertPacket(const RtpCastHeader& rtp_header);
     55 
     56   bool Empty() const;
     57   bool FrameExists(uint32 frame_id) const;
     58   uint32 NewestFrameId() const;
     59 
     60   void RemoveOldFrames(uint32 frame_id);
     61   void Clear();
     62 
     63   // Identifies the next frame to be released (rendered).
     64   bool NextContinuousFrame(uint32* frame_id) const;
     65   uint32 LastContinuousFrame() const;
     66 
     67   bool NextFrameAllowingSkippingFrames(uint32* frame_id) const;
     68   bool HaveMultipleDecodableFrames() const;
     69 
     70   int NumberOfCompleteFrames() const;
     71   void GetMissingPackets(uint32 frame_id,
     72                          bool last_frame,
     73                          PacketIdSet* missing_packets) const;
     74 
     75  private:
     76   bool ContinuousFrame(FrameInfo* frame) const;
     77   bool DecodableFrame(FrameInfo* frame) const;
     78 
     79   FrameMap frame_map_;
     80   bool waiting_for_key_;
     81   uint32 last_released_frame_;
     82   uint32 newest_frame_id_;
     83 
     84   DISALLOW_COPY_AND_ASSIGN(FrameIdMap);
     85 };
     86 
     87 }  //  namespace cast
     88 }  //  namespace media
     89 
     90 #endif  // MEDIA_CAST_FRAMER_FRAME_ID_MAP_H_
     91