Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / media / cast / net / rtcp / rtcp_receiver.h
1 // Copyright 2014 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_RTCP_RTCP_RECEIVER_H_
6 #define MEDIA_CAST_RTCP_RTCP_RECEIVER_H_
7
8 #include <queue>
9
10 #include "base/containers/hash_tables.h"
11 #include "media/cast/net/cast_transport_defines.h"
12 #include "media/cast/net/rtcp/rtcp.h"
13 #include "media/cast/net/rtcp/rtcp_defines.h"
14 #include "media/cast/net/rtcp/rtcp_utility.h"
15
16 namespace media {
17 namespace cast {
18
19 // Interface for receiving RTCP messages.
20 class RtcpMessageHandler {
21  public:
22   virtual void OnReceivedSenderReport(
23       const RtcpSenderInfo& remote_sender_info) = 0;
24
25   virtual void OnReceiverReferenceTimeReport(
26       const RtcpReceiverReferenceTimeReport& remote_time_report) = 0;
27
28   virtual void OnReceivedReceiverLog(
29       const RtcpReceiverLogMessage& receiver_log) = 0;
30
31   virtual void OnReceivedDelaySinceLastReport(
32       uint32 last_report,
33       uint32 delay_since_last_report) = 0;
34
35   virtual void OnReceivedCastFeedback(
36       const RtcpCastMessage& cast_message) = 0;
37
38   virtual ~RtcpMessageHandler() {}
39 };
40
41 class RtcpReceiver {
42  public:
43   RtcpReceiver(RtcpMessageHandler* handler, uint32 local_ssrc);
44   virtual ~RtcpReceiver();
45
46   static bool IsRtcpPacket(const uint8* rtcp_buffer, size_t length);
47
48   static uint32 GetSsrcOfSender(const uint8* rtcp_buffer, size_t length);
49
50   void SetRemoteSSRC(uint32 ssrc);
51
52   // Set the history size to record Cast receiver events. Event history is
53   // used to remove duplicates. The history has no more than |size| events.
54   void SetCastReceiverEventHistorySize(size_t size);
55
56   void IncomingRtcpPacket(RtcpParser* rtcp_parser);
57
58  private:
59   void HandleSenderReport(RtcpParser* rtcp_parser);
60
61   void HandleReceiverReport(RtcpParser* rtcp_parser);
62
63   void HandleReportBlock(const RtcpField* rtcp_field, uint32 remote_ssrc);
64
65   void HandleXr(RtcpParser* rtcp_parser);
66   void HandleRrtr(RtcpParser* rtcp_parser, uint32 remote_ssrc);
67   void HandleDlrr(RtcpParser* rtcp_parser);
68
69   void HandlePayloadSpecificApp(RtcpParser* rtcp_parser);
70   void HandlePayloadSpecificCastItem(RtcpParser* rtcp_parser);
71   void HandlePayloadSpecificCastNackItem(
72       const RtcpField* rtcp_field,
73       MissingFramesAndPacketsMap* missing_frames_and_packets);
74
75   void HandleApplicationSpecificCastReceiverLog(RtcpParser* rtcp_parser);
76   void HandleApplicationSpecificCastReceiverEventLog(
77       uint32 frame_rtp_timestamp,
78       RtcpParser* rtcp_parser,
79       RtcpReceiverEventLogMessages* event_log_messages);
80
81   const uint32 ssrc_;
82   uint32 remote_ssrc_;
83
84   // Not owned by this class.
85   RtcpMessageHandler* const handler_;
86
87   FrameIdWrapHelper ack_frame_id_wrap_helper_;
88
89   // Maintains a history of receiver events.
90   size_t receiver_event_history_size_;
91   typedef std::pair<uint64, uint64> ReceiverEventKey;
92   base::hash_set<ReceiverEventKey> receiver_event_key_set_;
93   std::queue<ReceiverEventKey> receiver_event_key_queue_;
94
95   DISALLOW_COPY_AND_ASSIGN(RtcpReceiver);
96 };
97
98 }  // namespace cast
99 }  // namespace media
100
101 #endif  // MEDIA_CAST_RTCP_RTCP_RECEIVER_H_