#ifndef MS_RTC_CODECS_VP8_HPP
#define MS_RTC_CODECS_VP8_HPP
#include "common.hpp"
#include "RTC/Codecs/PayloadDescriptorHandler.hpp"
#include "RTC/RtpPacket.hpp"
#include "RTC/SeqManager.hpp"
namespace RTC
{
namespace Codecs
{
class VP8
{
public:
struct PayloadDescriptor : public RTC::Codecs::PayloadDescriptor
{
~PayloadDescriptor() = default;
void Dump() const override;
void Encode(uint8_t* data, uint16_t pictureId, uint8_t tl0PictureIndex) const;
void Restore(uint8_t* data) const;
uint8_t extended : 1;
uint8_t nonReference : 1;
uint8_t start : 1;
uint8_t partitionIndex : 4;
uint8_t i : 1; uint8_t l : 1; uint8_t t : 1; uint8_t k : 1; uint16_t pictureId;
uint8_t tl0PictureIndex;
uint8_t tlIndex : 2;
uint8_t y : 1;
uint8_t keyIndex : 5;
bool isKeyFrame{ false };
bool hasPictureId{ false };
bool hasOneBytePictureId{ false };
bool hasTwoBytesPictureId{ false };
bool hasTl0PictureIndex{ false };
bool hasTlIndex{ false };
};
public:
static VP8::PayloadDescriptor* Parse(
const uint8_t* data,
size_t len,
RTC::RtpPacket::FrameMarking* frameMarking = nullptr,
uint8_t frameMarkingLen = 0);
static void ProcessRtpPacket(RTC::RtpPacket* packet);
public:
class EncodingContext : public RTC::Codecs::EncodingContext
{
public:
explicit EncodingContext(RTC::Codecs::EncodingContext::Params& params)
: RTC::Codecs::EncodingContext(params)
{
}
~EncodingContext() = default;
public:
void SyncRequired() override
{
this->syncRequired = true;
}
public:
RTC::SeqManager<uint16_t> pictureIdManager;
RTC::SeqManager<uint8_t> tl0PictureIndexManager;
bool syncRequired{ false };
};
public:
class PayloadDescriptorHandler : public RTC::Codecs::PayloadDescriptorHandler
{
public:
explicit PayloadDescriptorHandler(PayloadDescriptor* payloadDescriptor);
~PayloadDescriptorHandler() = default;
public:
void Dump() const override
{
this->payloadDescriptor->Dump();
}
bool Process(RTC::Codecs::EncodingContext* encodingContext, uint8_t* data, bool& marker) override;
void Restore(uint8_t* data) override;
uint8_t GetSpatialLayer() const override
{
return 0u;
}
uint8_t GetTemporalLayer() const override
{
return this->payloadDescriptor->hasTlIndex ? this->payloadDescriptor->tlIndex : 0u;
}
bool IsKeyFrame() const override
{
return this->payloadDescriptor->isKeyFrame;
}
private:
std::unique_ptr<PayloadDescriptor> payloadDescriptor;
};
};
} }
#endif