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