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.
5 #ifndef MEDIA_CAST_RTCP_RTCP_RECEIVER_H_
6 #define MEDIA_CAST_RTCP_RTCP_RECEIVER_H_
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"
19 // Interface for receiving RTCP messages.
20 class RtcpMessageHandler {
22 virtual void OnReceivedSenderReport(
23 const RtcpSenderInfo& remote_sender_info) = 0;
25 virtual void OnReceiverReferenceTimeReport(
26 const RtcpReceiverReferenceTimeReport& remote_time_report) = 0;
28 virtual void OnReceivedReceiverLog(
29 const RtcpReceiverLogMessage& receiver_log) = 0;
31 virtual void OnReceivedDelaySinceLastReport(
33 uint32 delay_since_last_report) = 0;
35 virtual void OnReceivedCastFeedback(
36 const RtcpCastMessage& cast_message) = 0;
38 virtual ~RtcpMessageHandler() {}
43 RtcpReceiver(RtcpMessageHandler* handler, uint32 local_ssrc);
44 virtual ~RtcpReceiver();
46 static bool IsRtcpPacket(const uint8* rtcp_buffer, size_t length);
48 static uint32 GetSsrcOfSender(const uint8* rtcp_buffer, size_t length);
50 void SetRemoteSSRC(uint32 ssrc);
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);
56 void IncomingRtcpPacket(RtcpParser* rtcp_parser);
59 void HandleSenderReport(RtcpParser* rtcp_parser);
61 void HandleReceiverReport(RtcpParser* rtcp_parser);
63 void HandleReportBlock(const RtcpField* rtcp_field, uint32 remote_ssrc);
65 void HandleXr(RtcpParser* rtcp_parser);
66 void HandleRrtr(RtcpParser* rtcp_parser, uint32 remote_ssrc);
67 void HandleDlrr(RtcpParser* rtcp_parser);
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);
75 void HandleApplicationSpecificCastReceiverLog(RtcpParser* rtcp_parser);
76 void HandleApplicationSpecificCastReceiverEventLog(
77 uint32 frame_rtp_timestamp,
78 RtcpParser* rtcp_parser,
79 RtcpReceiverEventLogMessages* event_log_messages);
84 // Not owned by this class.
85 RtcpMessageHandler* const handler_;
87 FrameIdWrapHelper ack_frame_id_wrap_helper_;
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_;
95 DISALLOW_COPY_AND_ASSIGN(RtcpReceiver);
101 #endif // MEDIA_CAST_RTCP_RTCP_RECEIVER_H_