#define MS_CLASS "RTC::RtpCodecParameters"
#include "Logger.hpp"
#include "MediaSoupErrors.hpp"
#include "RTC/RtpDictionaries.hpp"
namespace RTC
{
RtpCodecParameters::RtpCodecParameters(const FBS::RtpParameters::RtpCodecParameters* data)
{
MS_TRACE();
this->mimeType.SetMimeType(data->mimeType()->str());
this->payloadType = data->payloadType();
this->clockRate = data->clockRate();
if (auto channels = data->channels(); channels.has_value())
{
this->channels = channels.value();
}
if (flatbuffers::IsFieldPresent(data, FBS::RtpParameters::RtpCodecParameters::VT_PARAMETERS))
{
this->parameters.Set(data->parameters());
}
if (flatbuffers::IsFieldPresent(data, FBS::RtpParameters::RtpCodecParameters::VT_RTCPFEEDBACK))
{
this->rtcpFeedback.reserve(data->rtcpFeedback()->size());
for (const auto* entry : *data->rtcpFeedback())
{
this->rtcpFeedback.emplace_back(entry);
}
}
CheckCodec();
}
flatbuffers::Offset<FBS::RtpParameters::RtpCodecParameters> RtpCodecParameters::FillBuffer(
flatbuffers::FlatBufferBuilder& builder) const
{
MS_TRACE();
auto parameters = this->parameters.FillBuffer(builder);
std::vector<flatbuffers::Offset<FBS::RtpParameters::RtcpFeedback>> rtcpFeedback;
rtcpFeedback.reserve(this->rtcpFeedback.size());
for (const auto& fb : this->rtcpFeedback)
{
rtcpFeedback.emplace_back(fb.FillBuffer(builder));
}
return FBS::RtpParameters::CreateRtpCodecParametersDirect(
builder,
this->mimeType.ToString().c_str(),
this->payloadType,
this->clockRate,
this->channels > 1 ? flatbuffers::Optional<uint8_t>(this->channels) : flatbuffers::nullopt,
¶meters,
&rtcpFeedback);
}
inline void RtpCodecParameters::CheckCodec() const
{
MS_TRACE();
static const std::string AptString{ "apt" };
switch (this->mimeType.subtype)
{
case RTC::RtpCodecMimeType::Subtype::RTX:
{
if (!this->parameters.HasPositiveInteger(AptString))
{
MS_THROW_TYPE_ERROR("missing apt parameter in RTX codec");
}
break;
}
default:;
}
}
}