Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / media / cast / framer / frame_id_map.h
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 NextAudioFrameAllowingMissingFrames(uint32* frame_id) const;
68   bool NextVideoFrameAllowingSkippingFrames(uint32* frame_id) 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 DecodableVideoFrame(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_