diff options
Diffstat (limited to 'chromium/media/cast/rtcp/rtcp_sender.h')
-rw-r--r-- | chromium/media/cast/rtcp/rtcp_sender.h | 111 |
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_ |