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   // Returns true if packet is inserted.
     29   bool InsertPacket(uint16 packet_id);
     30   bool Complete() const;
     31   void GetMissingPackets(bool newest_frame,
     32                          PacketIdSet* missing_packets) const;
     33 
     34   bool is_key_frame() const { return is_key_frame_; }
     35   uint32 frame_id() const { return frame_id_; }
     36   uint32 referenced_frame_id() const { return referenced_frame_id_; }
     37 
     38  private:
     39   const bool is_key_frame_;
     40   const uint32 frame_id_;
     41   const uint32 referenced_frame_id_;
     42 
     43   uint16 max_received_packet_id_;
     44   PacketIdSet missing_packets_;
     45 
     46   DISALLOW_COPY_AND_ASSIGN(FrameInfo);
     47 };
     48 
     49 typedef std::map<uint32, linked_ptr<FrameInfo> > FrameMap;
     50 
     51 class FrameIdMap {
     52  public:
     53   FrameIdMap();
     54   ~FrameIdMap();
     55 
     56   // Returns false if not a valid (old) packet, otherwise returns true.
     57   bool InsertPacket(const RtpCastHeader& rtp_header, bool* complete);
     58 
     59   bool Empty() const;
     60   bool FrameExists(uint32 frame_id) const;
     61   uint32 NewestFrameId() const;
     62 
     63   void RemoveOldFrames(uint32 frame_id);
     64   void Clear();
     65 
     66   // Identifies the next frame to be released (rendered).
     67   bool NextContinuousFrame(uint32* frame_id) const;
     68   uint32 LastContinuousFrame() const;
     69 
     70   bool NextAudioFrameAllowingMissingFrames(uint32* frame_id) const;
     71   bool NextVideoFrameAllowingSkippingFrames(uint32* frame_id) const;
     72 
     73   int NumberOfCompleteFrames() const;
     74   void GetMissingPackets(uint32 frame_id,
     75                          bool last_frame,
     76                          PacketIdSet* missing_packets) const;
     77 
     78  private:
     79   bool ContinuousFrame(FrameInfo* frame) const;
     80   bool DecodableVideoFrame(FrameInfo* frame) const;
     81 
     82   FrameMap frame_map_;
     83   bool waiting_for_key_;
     84   uint32 last_released_frame_;
     85   uint32 newest_frame_id_;
     86 
     87   DISALLOW_COPY_AND_ASSIGN(FrameIdMap);
     88 };
     89 
     90 }  //  namespace cast
     91 }  //  namespace media
     92 
     93 #endif  // MEDIA_CAST_FRAMER_FRAME_ID_MAP_H_
     94