11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
31PROMEKI_NAMESPACE_BEGIN
107 RefCount _promeki_refct;
108 virtual MediaPayload *_promeki_clone()
const = 0;
111 using Ptr = SharedPtr<MediaPayload,
true, MediaPayload>;
114 using PtrList = ::promeki::List<Ptr>;
133 enum Flag : uint64_t {
143 EndOfStream = 1ull << 3,
150 MediaPayload() =
default;
160 explicit MediaPayload(
const BufferView &data) : _data(data) {}
162 MediaPayload(
const MediaPayload &) =
default;
163 MediaPayload(MediaPayload &&) =
default;
164 MediaPayload &operator=(
const MediaPayload &) =
default;
165 MediaPayload &operator=(MediaPayload &&) =
default;
168 virtual ~MediaPayload() =
default;
171 virtual const MediaPayloadKind &kind()
const = 0;
184 virtual bool isCompressed()
const = 0;
194 virtual bool isValid()
const {
195 if (_data.isEmpty())
return false;
196 for (
auto v : _data) {
197 if (v.isValid())
return true;
205 const BufferView &data()
const {
return _data; }
208 BufferView &data() {
return _data; }
211 void setData(
const BufferView &d) { _data = d; }
214 size_t planeCount()
const {
return _data.count(); }
217 BufferView::Entry plane(
size_t index)
const {
return _data[index]; }
220 size_t size()
const {
return _data.totalSize(); }
231 int streamIndex()
const {
return _streamIndex; }
234 void setStreamIndex(
int idx) { _streamIndex = idx; }
239 const MediaTimeStamp &pts()
const {
return _pts; }
242 void setPts(
const MediaTimeStamp &ts) { _pts = ts; }
252 const MediaTimeStamp &dts()
const {
return _dts; }
255 void setDts(
const MediaTimeStamp &ts) { _dts = ts; }
280 virtual Duration duration()
const {
return Duration(); }
295 virtual Error setDuration(
const Duration &val) {
297 return Error::NotSupported;
315 virtual bool hasDuration()
const {
return false; }
320 uint64_t flags()
const {
return _flags; }
323 void setFlags(uint64_t f) { _flags = f; }
326 void addFlag(Flag f) { _flags |=
static_cast<uint64_t
>(f); }
329 void removeFlag(Flag f) { _flags &= ~static_cast<uint64_t>(f); }
339 void setFlag(Flag f,
bool on) {
347 bool hasFlag(Flag f)
const {
return (_flags &
static_cast<uint64_t
>(f)) != 0; }
362 static const char *flagName(Flag f);
373 virtual bool isKeyframe()
const {
return hasFlag(Keyframe); }
395 virtual bool isSafeCutPoint()
const {
return isKeyframe(); }
398 bool isDiscardable()
const {
return hasFlag(Discardable); }
401 bool isCorrupt()
const {
return hasFlag(Corrupt); }
404 bool isEndOfStream()
const {
return hasFlag(EndOfStream); }
418 bool isIntraRefresh()
const {
return hasFlag(IntraRefresh); }
421 void markEndOfStream(
bool v =
true) {
423 addFlag(EndOfStream);
425 removeFlag(EndOfStream);
437 void markCorrupt(
const String &reason = String()) {
439 if (!reason.isEmpty()) metadata().set(Metadata::CorruptReason, reason);
443 String corruptReason()
const {
return metadata().getAs<String>(Metadata::CorruptReason); }
471 virtual const Metadata &metadata()
const = 0;
474 virtual Metadata &metadata() = 0;
485 template <
typename T>
const T *as()
const {
return dynamic_cast<const T *
>(
this); }
488 template <
typename T> T *as() {
return dynamic_cast<T *
>(
this); }
505 bool isExclusive()
const {
return _data.isExclusive() && isExclusiveExtras(); }
520 virtual uint32_t subclassFourCC()
const = 0;
531 virtual void serialisePayload(DataStream &s)
const = 0;
540 virtual void deserialisePayload(DataStream &s) = 0;
543 using Factory = Ptr (*)();
554 static void registerSubclass(uint32_t fourcc, Factory factory);
565 static Ptr createEmpty(uint32_t fourcc);
584 void ensureExclusive() {
585 _data.ensureExclusive();
586 ensureExclusiveExtras();
606 virtual Optional<Variant> variantLookupResolve(
const String &key, Error *err =
nullptr)
const = 0;
613 virtual bool variantLookupAssign(
const String &key,
const Variant &value, Error *err =
nullptr) = 0;
621 virtual const VariantSpec *variantLookupSpecFor(
const String &key, Error *err =
nullptr)
const = 0;
639 virtual StringList variantLookupScalarNames()
const = 0;
655 virtual StringList variantLookupDump(
const String &indent = String())
const = 0;
668 virtual bool isExclusiveExtras()
const {
return true; }
678 virtual void ensureExclusiveExtras() {}
685 int _streamIndex = 0;
690DataStream &operator<<(DataStream &s,
const MediaPayload::Ptr &p);
693DataStream &operator>>(DataStream &s, MediaPayload::Ptr &p);
706#define PROMEKI_REGISTER_MEDIAPAYLOAD(Cls, fourccStr) \
708 struct Cls##_MediaPayloadRegistrar { \
709 Cls##_MediaPayloadRegistrar() { \
710 ::promeki::MediaPayload::registerSubclass( \
711 ::promeki::FourCC(fourccStr).value(), \
712 []() -> ::promeki::MediaPayload::Ptr { \
713 return ::promeki::Cls::Ptr::create(); \
717 static Cls##_MediaPayloadRegistrar s_##Cls##_mediaPayloadRegistrar; \
746#define PROMEKI_MEDIAPAYLOAD_LOOKUP_DISPATCH(Self) \
747 Optional<::promeki::Variant> variantLookupResolve(const ::promeki::String &key, \
748 ::promeki::Error *err = nullptr) const override { \
749 return ::promeki::VariantLookup<Self>::resolveDirect(*this, key, err); \
751 bool variantLookupAssign(const ::promeki::String &key, const ::promeki::Variant &value, \
752 ::promeki::Error *err = nullptr) override { \
753 return ::promeki::VariantLookup<Self>::assignDirect(*this, key, value, err); \
755 const ::promeki::VariantSpec *variantLookupSpecFor(const ::promeki::String &key, \
756 ::promeki::Error *err = nullptr) const override { \
757 return ::promeki::VariantLookup<Self>::specForDirect(key, err); \
759 ::promeki::StringList variantLookupScalarNames() const override { \
760 return ::promeki::VariantLookup<Self>::registeredScalars(); \
762 ::promeki::StringList variantLookupDump(const ::promeki::String &indent = ::promeki::String()) \
764 return ::promeki::VariantLookup<Self>::dump(*this, indent); \