summaryrefslogtreecommitdiff
path: root/chromium/media/cast/rtcp/rtcp_sender.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/cast/rtcp/rtcp_sender.h')
-rw-r--r--chromium/media/cast/rtcp/rtcp_sender.h111
1 files changed, 111 insertions, 0 deletions
diff --git a/chromium/media/cast/rtcp/rtcp_sender.h b/chromium/media/cast/rtcp/rtcp_sender.h
new file mode 100644
index 00000000000..7dbbc0f95b5
--- /dev/null
+++ b/chromium/media/cast/rtcp/rtcp_sender.h
@@ -0,0 +1,111 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_CAST_RTCP_RTCP_SENDER_H_
+#define MEDIA_CAST_RTCP_RTCP_SENDER_H_
+
+#include <list>
+#include <string>
+
+#include "media/cast/cast_config.h"
+#include "media/cast/cast_defines.h"
+#include "media/cast/rtcp/rtcp.h"
+#include "media/cast/rtcp/rtcp_defines.h"
+
+namespace media {
+namespace cast {
+
+class RtcpSender {
+ public:
+ RtcpSender(PacedPacketSender* const paced_packet_sender,
+ uint32 sending_ssrc,
+ const std::string& c_name);
+
+ virtual ~RtcpSender();
+
+ void SendRtcp(uint32 packet_type_flags,
+ const RtcpSenderInfo* sender_info,
+ const RtcpReportBlock* report_block,
+ uint32 pli_remote_ssrc,
+ const RtcpDlrrReportBlock* dlrr,
+ const RtcpReceiverReferenceTimeReport* rrtr,
+ const RtcpCastMessage* cast_message);
+
+ enum RtcpPacketType {
+ kRtcpSr = 0x0002,
+ kRtcpRr = 0x0004,
+ kRtcpBye = 0x0008,
+ kRtcpPli = 0x0010,
+ kRtcpNack = 0x0020,
+ kRtcpFir = 0x0040,
+ kRtcpSrReq = 0x0200,
+ kRtcpDlrr = 0x0400,
+ kRtcpRrtr = 0x0800,
+ kRtcpRpsi = 0x8000,
+ kRtcpRemb = 0x10000,
+ kRtcpCast = 0x20000,
+ };
+
+ private:
+ void BuildSR(const RtcpSenderInfo& sender_info,
+ const RtcpReportBlock* report_block,
+ std::vector<uint8>* packet) const;
+
+ void BuildRR(const RtcpReportBlock* report_block,
+ std::vector<uint8>* packet) const;
+
+ void AddReportBlocks(const RtcpReportBlock& report_block,
+ std::vector<uint8>* packet) const;
+
+ void BuildSdec(std::vector<uint8>* packet) const;
+
+ void BuildPli(uint32 remote_ssrc,
+ std::vector<uint8>* packet) const;
+
+ void BuildRemb(const RtcpRembMessage* remb,
+ std::vector<uint8>* packet) const;
+
+ void BuildRpsi(const RtcpRpsiMessage* rpsi,
+ std::vector<uint8>* packet) const;
+
+ void BuildNack(const RtcpNackMessage* nack,
+ std::vector<uint8>* packet) const;
+
+ void BuildBye(std::vector<uint8>* packet) const;
+
+ void BuildDlrrRb(const RtcpDlrrReportBlock* dlrr,
+ std::vector<uint8>* packet) const;
+
+ void BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr,
+ std::vector<uint8>* packet) const;
+
+ void BuildCast(const RtcpCastMessage* cast_message,
+ std::vector<uint8>* packet) const;
+
+ inline void BitrateToRembExponentBitrate(uint32 bitrate,
+ uint8* exponent,
+ uint32* mantissa) const {
+ // 6 bit exponent and a 18 bit mantissa.
+ *exponent = 0;
+ for (int i = 0; i < 64; ++i) {
+ if (bitrate <= (262143u << i)) {
+ *exponent = i;
+ break;
+ }
+ }
+ *mantissa = (bitrate >> *exponent);
+ }
+
+ const uint32 ssrc_;
+ const std::string c_name_;
+
+ // Not owned by this class.
+ PacedPacketSender* transport_;
+
+ DISALLOW_COPY_AND_ASSIGN(RtcpSender);
+};
+
+} // namespace cast
+} // namespace media
+#endif // MEDIA_CAST_RTCP_RTCP_SENDER_H_