OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_ | 5 #ifndef MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_ |
6 #define MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_ | 6 #define MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_ |
7 | 7 |
8 #include <deque> | 8 #include <deque> |
9 #include <list> | 9 #include <list> |
10 #include <string> | 10 #include <string> |
11 | 11 |
12 #include "base/big_endian.h" | 12 #include "base/big_endian.h" |
13 #include "media/cast/cast_config.h" | 13 #include "media/cast/cast_config.h" |
14 #include "media/cast/cast_defines.h" | 14 #include "media/cast/cast_defines.h" |
15 #include "media/cast/net/cast_transport_defines.h" | 15 #include "media/cast/net/cast_transport_defines.h" |
16 #include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" | 16 #include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" |
17 #include "media/cast/net/rtcp/rtcp_defines.h" | 17 #include "media/cast/net/rtcp/rtcp_defines.h" |
18 | 18 |
19 namespace media { | 19 namespace media { |
20 namespace cast { | 20 namespace cast { |
21 | 21 |
22 // We limit the size of receiver logs to avoid queuing up packets. | |
23 const size_t kMaxReceiverLogBytes = 200; | |
24 | |
25 // The determines how long to hold receiver log events, based on how | |
26 // many "receiver log message reports" ago the events were sent. | |
27 const size_t kReceiveLogMessageHistorySize = 20; | |
28 | |
29 // This determines when to send events the second time. | |
30 const size_t kFirstRedundancyOffset = 10; | |
31 COMPILE_ASSERT(kFirstRedundancyOffset > 0 && | |
32 kFirstRedundancyOffset <= kReceiveLogMessageHistorySize, | |
33 redundancy_offset_out_of_range); | |
34 | |
35 // When to send events the third time. | |
36 const size_t kSecondRedundancyOffset = 20; | |
37 COMPILE_ASSERT(kSecondRedundancyOffset > | |
38 kFirstRedundancyOffset && kSecondRedundancyOffset <= | |
39 kReceiveLogMessageHistorySize, | |
40 redundancy_offset_out_of_range); | |
41 | |
42 | |
43 class RtcpBuilder { | 22 class RtcpBuilder { |
44 public: | 23 public: |
45 explicit RtcpBuilder(uint32 sending_ssrc); | 24 explicit RtcpBuilder(uint32 sending_ssrc); |
46 ~RtcpBuilder(); | 25 ~RtcpBuilder(); |
47 | 26 |
48 PacketRef BuildRtcpFromReceiver( | 27 PacketRef BuildRtcpFromReceiver( |
49 const RtcpReportBlock* report_block, | 28 const RtcpReportBlock* report_block, |
50 const RtcpReceiverReferenceTimeReport* rrtr, | 29 const RtcpReceiverReferenceTimeReport* rrtr, |
51 const RtcpCastMessage* cast_message, | 30 const RtcpCastMessage* cast_message, |
52 const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events, | 31 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, |
53 base::TimeDelta target_delay); | 32 base::TimeDelta target_delay); |
54 | 33 |
55 PacketRef BuildRtcpFromSender(const RtcpSenderInfo& sender_info); | 34 PacketRef BuildRtcpFromSender(const RtcpSenderInfo& sender_info); |
56 | 35 |
57 private: | 36 private: |
58 void AddRtcpHeader(RtcpPacketFields payload, int format_or_count); | 37 void AddRtcpHeader(RtcpPacketFields payload, int format_or_count); |
59 void PatchLengthField(); | 38 void PatchLengthField(); |
60 void AddRR(const RtcpReportBlock* report_block); | 39 void AddRR(const RtcpReportBlock* report_block); |
61 void AddReportBlocks(const RtcpReportBlock& report_block); | 40 void AddReportBlocks(const RtcpReportBlock& report_block); |
62 void AddRrtr(const RtcpReceiverReferenceTimeReport* rrtr); | 41 void AddRrtr(const RtcpReceiverReferenceTimeReport* rrtr); |
63 void AddCast(const RtcpCastMessage* cast_message, | 42 void AddCast(const RtcpCastMessage* cast_message, |
64 base::TimeDelta target_delay); | 43 base::TimeDelta target_delay); |
65 void AddSR(const RtcpSenderInfo& sender_info); | 44 void AddSR(const RtcpSenderInfo& sender_info); |
66 void AddDlrrRb(const RtcpDlrrReportBlock& dlrr); | 45 void AddDlrrRb(const RtcpDlrrReportBlock& dlrr); |
67 void AddReceiverLog( | 46 void AddReceiverLog( |
68 const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events); | 47 const ReceiverRtcpEventSubscriber::RtcpEvents& rtcp_events); |
69 | 48 |
70 bool GetRtcpReceiverLogMessage( | 49 bool GetRtcpReceiverLogMessage( |
71 const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events, | 50 const ReceiverRtcpEventSubscriber::RtcpEvents& rtcp_events, |
72 RtcpReceiverLogMessage* receiver_log_message, | 51 RtcpReceiverLogMessage* receiver_log_message, |
73 size_t* total_number_of_messages_to_send); | 52 size_t* total_number_of_messages_to_send); |
74 | 53 |
75 void Start(); | 54 void Start(); |
76 PacketRef Finish(); | 55 PacketRef Finish(); |
77 | 56 |
78 base::BigEndianWriter writer_; | 57 base::BigEndianWriter writer_; |
79 const uint32 ssrc_; | 58 const uint32 ssrc_; |
80 char* ptr_of_length_; | 59 char* ptr_of_length_; |
81 PacketRef packet_; | 60 PacketRef packet_; |
82 std::deque<RtcpReceiverLogMessage> rtcp_events_history_; | |
83 | 61 |
84 DISALLOW_COPY_AND_ASSIGN(RtcpBuilder); | 62 DISALLOW_COPY_AND_ASSIGN(RtcpBuilder); |
85 }; | 63 }; |
86 | 64 |
87 } // namespace cast | 65 } // namespace cast |
88 } // namespace media | 66 } // namespace media |
89 | 67 |
90 #endif // MEDIA_CAST_NET_RTCP_RTCP_SENDER_H_ | 68 #endif // MEDIA_CAST_NET_RTCP_RTCP_SENDER_H_ |
OLD | NEW |