11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
22PROMEKI_NAMESPACE_BEGIN
71class CompressedVideoPayload :
public VideoPayload {
73 PROMEKI_MEDIAPAYLOAD_LOOKUP_DISPATCH(CompressedVideoPayload)
75 virtual CompressedVideoPayload *_promeki_clone()
const override {
76 return new CompressedVideoPayload(*
this);
80 using Ptr = SharedPtr<CompressedVideoPayload,
true, CompressedVideoPayload>;
83 using PtrList = ::promeki::List<Ptr>;
86 using UPtr = UniquePtr<CompressedVideoPayload>;
98 enum VideoFlag : uint64_t {
99 ParameterSet = 1ull << 16,
103 CompressedVideoPayload() =
default;
109 explicit CompressedVideoPayload(
const ImageDesc &desc) : VideoPayload(desc) {}
119 CompressedVideoPayload(
const ImageDesc &desc,
const BufferView &data) : VideoPayload(desc, data) {}
125 CompressedVideoPayload(
const ImageDesc &desc, Buffer buffer)
126 : VideoPayload(desc, buffer ? BufferView(buffer, 0, buffer.size()) : BufferView()) {}
132 bool isCompressed()
const override {
return true; }
138 bool isValid()
const override {
139 return MediaPayload::isValid() && desc().pixelFormat().isValid() &&
140 desc().pixelFormat().isCompressed();
154 virtual const FrameType &frameType()
const {
155 if (_frameType.isValid() && _frameType != FrameType::Unknown) {
158 return hasFlag(Keyframe) ? FrameType::IDR : FrameType::Unknown;
162 void setFrameType(
const FrameType &t) { _frameType = t; }
178 bool isSafeCutPoint()
const override {
179 if (!isValid())
return false;
180 const VideoCodec &codec = desc().pixelFormat().videoCodec();
181 if (!codec.isValid())
return false;
182 if (codec.codingType() != VideoCodec::CodingTemporal)
return true;
187 bool isParameterSet()
const {
return (flags() & ParameterSet) != 0; }
190 void markParameterSet(
bool v =
true) {
192 setFlags(flags() | ParameterSet);
194 setFlags(flags() & ~ParameterSet);
206 const Buffer &inBandCodecData()
const {
return _inBandCodecData; }
209 void setInBandCodecData(Buffer b) { _inBandCodecData = std::move(b); }
222 bool isExclusiveExtras()
const override {
223 return !_inBandCodecData.isValid() || _inBandCodecData.impl().referenceCount() <= 1;
230 void ensureExclusiveExtras()
override {
231 if (_inBandCodecData.isValid() && _inBandCodecData.impl().referenceCount() > 1) {
232 _inBandCodecData.ensureExclusive();
238 static constexpr FourCC kSubclassFourCC{
'C',
'V',
'd',
'p'};
240 uint32_t subclassFourCC()
const override {
return kSubclassFourCC.value(); }
243 void serialisePayload(DataStream &s)
const override;
246 void deserialisePayload(DataStream &s)
override;
248 CompressedVideoPayload(
const CompressedVideoPayload &) =
default;
249 CompressedVideoPayload(CompressedVideoPayload &&) =
default;
250 CompressedVideoPayload &operator=(
const CompressedVideoPayload &) =
default;
251 CompressedVideoPayload &operator=(CompressedVideoPayload &&) =
default;
254 FrameType _frameType;
255 Buffer _inBandCodecData;