blob: 95c746d0599a55ab8bbdf06d08ec78c822cccfdf [file] [log] [blame]
// Copyright 2014 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_NET_RTCP_RTCP_BUILDER_H_
#define MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_
#include <stddef.h>
#include <stdint.h>
#include "base/big_endian.h"
#include "base/macros.h"
#include "media/cast/net/cast_transport_config.h"
#include "media/cast/net/cast_transport_defines.h"
#include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h"
#include "media/cast/net/rtcp/rtcp_defines.h"
namespace media {
namespace cast {
class RtcpBuilder {
public:
explicit RtcpBuilder(uint32_t sending_ssrc);
RtcpBuilder(const RtcpBuilder&) = delete;
RtcpBuilder& operator=(const RtcpBuilder&) = delete;
~RtcpBuilder();
PacketRef BuildRtcpFromSender(const RtcpSenderInfo& sender_info);
uint32_t local_ssrc() const { return local_ssrc_; }
void AddRR(const RtcpReportBlock* report_block);
void AddRrtr(const RtcpReceiverReferenceTimeReport& rrtr);
void AddCast(const RtcpCastMessage& cast_message,
base::TimeDelta target_delay);
void AddPli(const RtcpPliMessage& pli_message);
void AddReceiverLog(
const ReceiverRtcpEventSubscriber::RtcpEvents& rtcp_events);
void Start();
PacketRef Finish();
private:
void AddRtcpHeader(RtcpPacketFields payload, int format_or_count);
void PatchLengthField();
void AddSR(const RtcpSenderInfo& sender_info);
void AddDlrrRb(const RtcpDlrrReportBlock& dlrr);
void AddReportBlocks(const RtcpReportBlock& report_block);
bool GetRtcpReceiverLogMessage(
const ReceiverRtcpEventSubscriber::RtcpEvents& rtcp_events,
RtcpReceiverLogMessage* receiver_log_message,
size_t* total_number_of_messages_to_send);
base::BigEndianWriter writer_;
const uint32_t local_ssrc_;
char* ptr_of_length_;
PacketRef packet_;
};
} // namespace cast
} // namespace media
#endif // MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_