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_NET_RTCP_RTCP_BUILDER_H_ 6 #define MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_ 7 8 #include <deque> 9 #include <list> 10 #include <string> 11 12 #include "base/big_endian.h" 13 #include "media/cast/cast_config.h" 14 #include "media/cast/cast_defines.h" 15 #include "media/cast/net/cast_transport_defines.h" 16 #include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" 17 #include "media/cast/net/rtcp/rtcp_defines.h" 18 19 namespace media { 20 namespace cast { 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 { 44 public: 45 explicit RtcpBuilder(uint32 sending_ssrc); 46 ~RtcpBuilder(); 47 48 PacketRef BuildRtcpFromReceiver( 49 const RtcpReportBlock* report_block, 50 const RtcpReceiverReferenceTimeReport* rrtr, 51 const RtcpCastMessage* cast_message, 52 const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events, 53 base::TimeDelta target_delay); 54 55 PacketRef BuildRtcpFromSender(const RtcpSenderInfo& sender_info); 56 57 private: 58 void AddRtcpHeader(RtcpPacketFields payload, int format_or_count); 59 void PatchLengthField(); 60 void AddRR(const RtcpReportBlock* report_block); 61 void AddReportBlocks(const RtcpReportBlock& report_block); 62 void AddRrtr(const RtcpReceiverReferenceTimeReport* rrtr); 63 void AddCast(const RtcpCastMessage* cast_message, 64 base::TimeDelta target_delay); 65 void AddSR(const RtcpSenderInfo& sender_info); 66 void AddDlrrRb(const RtcpDlrrReportBlock& dlrr); 67 void AddReceiverLog( 68 const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events); 69 70 bool GetRtcpReceiverLogMessage( 71 const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events, 72 RtcpReceiverLogMessage* receiver_log_message, 73 size_t* total_number_of_messages_to_send); 74 75 void Start(); 76 PacketRef Finish(); 77 78 base::BigEndianWriter writer_; 79 const uint32 ssrc_; 80 char* ptr_of_length_; 81 PacketRef packet_; 82 std::deque<RtcpReceiverLogMessage> rtcp_events_history_; 83 84 DISALLOW_COPY_AND_ASSIGN(RtcpBuilder); 85 }; 86 87 } // namespace cast 88 } // namespace media 89 90 #endif // MEDIA_CAST_NET_RTCP_RTCP_SENDER_H_ 91