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.
5 #ifndef MEDIA_CAST_RTCP_RTCP_SENDER_H_
6 #define MEDIA_CAST_RTCP_RTCP_SENDER_H_
12 #include "media/cast/cast_config.h"
13 #include "media/cast/cast_defines.h"
14 #include "media/cast/rtcp/receiver_rtcp_event_subscriber.h"
15 #include "media/cast/rtcp/rtcp.h"
16 #include "media/cast/rtcp/rtcp_defines.h"
17 #include "media/cast/transport/cast_transport_defines.h"
18 #include "media/cast/transport/rtcp/rtcp_builder.h"
23 // We limit the size of receiver logs to avoid queuing up packets.
24 const size_t kMaxReceiverLogBytes = 200;
26 // The determines how long to hold receiver log events, based on how
27 // many "receiver log message reports" ago the events were sent.
28 const size_t kReceiveLogMessageHistorySize = 20;
30 // This determines when to send events the second time.
31 const size_t kFirstRedundancyOffset = 10;
32 COMPILE_ASSERT(kFirstRedundancyOffset > 0 &&
33 kFirstRedundancyOffset <= kReceiveLogMessageHistorySize,
34 redundancy_offset_out_of_range);
36 // When to send events the third time.
37 const size_t kSecondRedundancyOffset = 20;
38 COMPILE_ASSERT(kSecondRedundancyOffset >
39 kFirstRedundancyOffset && kSecondRedundancyOffset <=
40 kReceiveLogMessageHistorySize,
41 redundancy_offset_out_of_range);
43 // TODO(mikhal): Resolve duplication between this and RtcpBuilder.
46 RtcpSender(scoped_refptr<CastEnvironment> cast_environment,
47 transport::PacedPacketSender* outgoing_transport,
49 const std::string& c_name);
51 virtual ~RtcpSender();
53 void SendRtcpFromRtpReceiver(
54 uint32 packet_type_flags,
55 const transport::RtcpReportBlock* report_block,
56 const RtcpReceiverReferenceTimeReport* rrtr,
57 const RtcpCastMessage* cast_message,
58 const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events,
59 uint16 target_delay_ms);
62 void BuildRR(const transport::RtcpReportBlock* report_block,
63 Packet* packet) const;
65 void AddReportBlocks(const transport::RtcpReportBlock& report_block,
66 Packet* packet) const;
68 void BuildSdec(Packet* packet) const;
70 void BuildPli(uint32 remote_ssrc, Packet* packet) const;
72 void BuildRemb(const RtcpRembMessage* remb, Packet* packet) const;
74 void BuildRpsi(const RtcpRpsiMessage* rpsi, Packet* packet) const;
76 void BuildNack(const RtcpNackMessage* nack, Packet* packet) const;
78 void BuildBye(Packet* packet) const;
80 void BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr,
81 Packet* packet) const;
83 void BuildCast(const RtcpCastMessage* cast_message,
84 uint16 target_delay_ms,
85 Packet* packet) const;
87 void BuildReceiverLog(
88 const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events,
91 bool BuildRtcpReceiverLogMessage(
92 const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events,
94 RtcpReceiverLogMessage* receiver_log_message,
95 size_t* number_of_frames,
96 size_t* total_number_of_messages_to_send,
97 size_t* rtcp_log_size);
99 inline void BitrateToRembExponentBitrate(uint32 bitrate,
101 uint32* mantissa) const {
102 // 6 bit exponent and a 18 bit mantissa.
104 for (int i = 0; i < 64; ++i) {
105 if (bitrate <= (262143u << i)) {
110 *mantissa = (bitrate >> *exponent);
114 const std::string c_name_;
116 // Not owned by this class.
117 transport::PacedPacketSender* const transport_;
118 scoped_refptr<CastEnvironment> cast_environment_;
120 std::deque<RtcpReceiverLogMessage> rtcp_events_history_;
122 DISALLOW_COPY_AND_ASSIGN(RtcpSender);
127 #endif // MEDIA_CAST_RTCP_RTCP_SENDER_H_