#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(int indentation) const
{
MS_TRACE();
MS_DUMP_CLEAN(indentation, "<ReceiverReferenceTime>");
MS_DUMP_CLEAN(indentation, " block type: %" PRIu8, static_cast<uint8_t>(this->type));
MS_DUMP_CLEAN(indentation, " reserved: 0");
MS_DUMP_CLEAN(indentation, " length: 2");
MS_DUMP_CLEAN(indentation, " ntp sec: %" PRIu32, GetNtpSec());
MS_DUMP_CLEAN(indentation, " ntp frac: %" PRIu32, GetNtpFrac());
MS_DUMP_CLEAN(indentation, "</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;
}
} }