#define MS_CLASS "RTC::RTCP::XrReceiverReferenceTime"
#include "RTC/RTCP/XrReceiverReferenceTime.hpp"
#include "Logger.hpp"
#include <cstring>
namespace RTC
{
namespace RTCP
{
ReceiverReferenceTime* ReceiverReferenceTime::Parse(const uint8_t* data, size_t len)
{
MS_TRACE();
if (len < ExtendedReportBlock::CommonHeaderSize + ReceiverReferenceTime::BodySize)
{
MS_WARN_TAG(rtcp, "not enough space for a extended RRT block, block discarded");
return nullptr;
}
auto* header = const_cast<ExtendedReportBlock::CommonHeader*>(
reinterpret_cast<const ExtendedReportBlock::CommonHeader*>(data));
return new ReceiverReferenceTime(header);
}
void ReceiverReferenceTime::Dump() const
{
MS_TRACE();
MS_DUMP("<ReceiverReferenceTime>");
MS_DUMP(" block type : %" PRIu8, static_cast<uint8_t>(this->type));
MS_DUMP(" reserved : 0");
MS_DUMP(" length : 2");
MS_DUMP(" ntp sec : %" PRIu32, GetNtpSec());
MS_DUMP(" ntp frac : %" PRIu32, GetNtpFrac());
MS_DUMP("</ReceiverReferenceTime>");
}
size_t ReceiverReferenceTime::Serialize(uint8_t* buffer)
{
MS_TRACE();
this->header->blockType = static_cast<uint8_t>(this->type);
this->header->reserved = 0;
this->header->length = htons(2);
std::memcpy(buffer, this->header, ExtendedReportBlock::CommonHeaderSize);
size_t offset{ ExtendedReportBlock::CommonHeaderSize };
std::memcpy(buffer + offset, this->body, ReceiverReferenceTime::BodySize);
offset += ReceiverReferenceTime::BodySize;
return offset;
}
} }