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