#include "common.hpp"
#include "RTC/RTP/Codecs/DependencyDescriptor.hpp"
#include <catch2/catch_test_macros.hpp>
SCENARIO("Dependency Descriptor", "[rtp][codecs][dependency-descriptor]")
{
class Listener : public RTC::RTP::Codecs::DependencyDescriptor::Listener
{
public:
void OnDependencyDescriptorUpdated(const uint8_t* data, size_t len) override
{
}
};
SECTION("parse")
{
uint8_t data[] =
{
0x80, 0x01, 0x2F, 0x80, 0x02, 0x14, 0xEA, 0xA8,
0x60, 0x41, 0x4D, 0x14, 0x10, 0x20, 0x84, 0x26
};
Listener listener;
std::unique_ptr<RTC::RTP::Codecs::DependencyDescriptor::TemplateDependencyStructure>
templateDependencyStructure;
auto dependencyDescriptor = std::unique_ptr<RTC::RTP::Codecs::DependencyDescriptor>(
RTC::RTP::Codecs::DependencyDescriptor::Parse(
data, sizeof(data), std::addressof(listener), templateDependencyStructure));
REQUIRE(dependencyDescriptor);
REQUIRE(dependencyDescriptor->startOfFrame == true);
REQUIRE(dependencyDescriptor->endOfFrame == false);
REQUIRE(dependencyDescriptor->frameDependencyTemplateId == 0);
REQUIRE(dependencyDescriptor->frameNumber == 303);
auto* templateStructure = dependencyDescriptor->templateDependencyStructure;
std::vector<RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication> dtis{};
std::vector<uint8_t> fdiffs{};
std::vector<uint8_t> fdiffChains{};
REQUIRE(templateStructure->templateLayers.size() == 5);
REQUIRE(templateStructure->templateLayers[0].spatialLayer == 0);
REQUIRE(templateStructure->templateLayers[0].temporalLayer == 0);
dtis = {
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::SWITCH,
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::SWITCH,
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::SWITCH,
};
REQUIRE(templateStructure->templateLayers[0].decodeTargetIndications == dtis);
fdiffs = {};
REQUIRE(templateStructure->templateLayers[0].frameDiffs == fdiffs);
fdiffChains = { 0 };
REQUIRE(templateStructure->templateLayers[0].frameDiffChains == fdiffChains);
REQUIRE(templateStructure->templateLayers[1].spatialLayer == 0);
REQUIRE(templateStructure->templateLayers[1].temporalLayer == 0);
dtis = {
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::SWITCH,
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::SWITCH,
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::SWITCH,
};
REQUIRE(templateStructure->templateLayers[1].decodeTargetIndications == dtis);
fdiffs = { 4 };
REQUIRE(templateStructure->templateLayers[1].frameDiffs == fdiffs);
fdiffChains = { 4 };
REQUIRE(templateStructure->templateLayers[1].frameDiffChains == fdiffChains);
REQUIRE(templateStructure->templateLayers[2].spatialLayer == 0);
REQUIRE(templateStructure->templateLayers[2].temporalLayer == 1);
dtis = {
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::NOT_PRESENT,
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::DISCARDABLE,
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::SWITCH,
};
REQUIRE(templateStructure->templateLayers[2].decodeTargetIndications == dtis);
fdiffs = { 2 };
REQUIRE(templateStructure->templateLayers[2].frameDiffs == fdiffs);
fdiffChains = { 2 };
REQUIRE(templateStructure->templateLayers[2].frameDiffChains == fdiffChains);
REQUIRE(templateStructure->templateLayers[3].spatialLayer == 0);
REQUIRE(templateStructure->templateLayers[3].temporalLayer == 2);
dtis = {
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::NOT_PRESENT,
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::NOT_PRESENT,
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::DISCARDABLE,
};
REQUIRE(templateStructure->templateLayers[3].decodeTargetIndications == dtis);
fdiffs = { 1 };
REQUIRE(templateStructure->templateLayers[3].frameDiffs == fdiffs);
fdiffChains = { 1 };
REQUIRE(templateStructure->templateLayers[3].frameDiffChains == fdiffChains);
REQUIRE(templateStructure->templateLayers[4].spatialLayer == 0);
REQUIRE(templateStructure->templateLayers[4].temporalLayer == 2);
dtis = {
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::NOT_PRESENT,
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::NOT_PRESENT,
RTC::RTP::Codecs::DependencyDescriptor::DecodeTargetIndication::DISCARDABLE,
};
REQUIRE(templateStructure->templateLayers[4].decodeTargetIndications == dtis);
fdiffs = { 1 };
REQUIRE(templateStructure->templateLayers[4].frameDiffs == fdiffs);
fdiffChains = { 3 };
REQUIRE(templateStructure->templateLayers[4].frameDiffChains == fdiffChains);
}
SECTION("serialize")
{
uint8_t data1[] =
{
0x80, 0x00, 0xE8, 0x80,
0x01, 0x1E, 0xA8, 0x51,
0x41, 0x01, 0x0C, 0x13,
0xFC, 0x0B, 0x3C,
};
Listener listener;
std::unique_ptr<RTC::RTP::Codecs::DependencyDescriptor::TemplateDependencyStructure>
templateDependencyStructure;
auto dependencyDescriptor = std::unique_ptr<RTC::RTP::Codecs::DependencyDescriptor>(
RTC::RTP::Codecs::DependencyDescriptor::Parse(
data1, sizeof(data1), std::addressof(listener), templateDependencyStructure));
REQUIRE(dependencyDescriptor);
REQUIRE(dependencyDescriptor->frameNumber == 232);
uint8_t data2[] =
{
0x00, 0x00, 0xE8,
};
dependencyDescriptor = std::unique_ptr<RTC::RTP::Codecs::DependencyDescriptor>(
RTC::RTP::Codecs::DependencyDescriptor::Parse(
data2, sizeof(data2), std::addressof(listener), templateDependencyStructure));
REQUIRE(dependencyDescriptor);
REQUIRE(dependencyDescriptor->frameNumber == 232);
uint8_t len;
const auto* data = dependencyDescriptor->Serialize(len);
dependencyDescriptor = std::unique_ptr<RTC::RTP::Codecs::DependencyDescriptor>(
RTC::RTP::Codecs::DependencyDescriptor::Parse(
data, sizeof(data), std::addressof(listener), templateDependencyStructure));
REQUIRE(dependencyDescriptor);
REQUIRE(dependencyDescriptor->frameNumber == 232);
dependencyDescriptor->UpdateActiveDecodeTargets(0, 1);
data = dependencyDescriptor->Serialize(len);
dependencyDescriptor = std::unique_ptr<RTC::RTP::Codecs::DependencyDescriptor>(
RTC::RTP::Codecs::DependencyDescriptor::Parse(
data, sizeof(data), std::addressof(listener), templateDependencyStructure));
REQUIRE(dependencyDescriptor);
REQUIRE(dependencyDescriptor->frameNumber == 232);
REQUIRE(dependencyDescriptor->activeDecodeTargetsBitmask == 3);
}
}