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 17namespace media { 18namespace cast { 19 20class 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 49typedef std::map<uint32, linked_ptr<FrameInfo> > FrameMap; 50 51class 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