libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
compressedvideopayload.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <cstdint>
14#include <promeki/namespace.h>
15#include <promeki/uniqueptr.h>
17#include <promeki/buffer.h>
18#include <promeki/videocodec.h>
19#include <promeki/enums.h>
21
22PROMEKI_NAMESPACE_BEGIN
23
71class CompressedVideoPayload : public VideoPayload {
72 public:
73 PROMEKI_MEDIAPAYLOAD_LOOKUP_DISPATCH(CompressedVideoPayload)
74
75 virtual CompressedVideoPayload *_promeki_clone() const override {
76 return new CompressedVideoPayload(*this);
77 }
78
80 using Ptr = SharedPtr<CompressedVideoPayload, /*CopyOnWrite=*/true, CompressedVideoPayload>;
81
83 using PtrList = ::promeki::List<Ptr>;
84
86 using UPtr = UniquePtr<CompressedVideoPayload>;
87
98 enum VideoFlag : uint64_t {
99 ParameterSet = 1ull << 16,
100 };
101
103 CompressedVideoPayload() = default;
104
109 explicit CompressedVideoPayload(const ImageDesc &desc) : VideoPayload(desc) {}
110
119 CompressedVideoPayload(const ImageDesc &desc, const BufferView &data) : VideoPayload(desc, data) {}
120
125 CompressedVideoPayload(const ImageDesc &desc, Buffer buffer)
126 : VideoPayload(desc, buffer ? BufferView(buffer, 0, buffer.size()) : BufferView()) {}
127
132 bool isCompressed() const override { return true; }
133
138 bool isValid() const override {
139 return MediaPayload::isValid() && desc().pixelFormat().isValid() &&
140 desc().pixelFormat().isCompressed();
141 }
142
154 virtual const FrameType &frameType() const {
155 if (_frameType.isValid() && _frameType != FrameType::Unknown) {
156 return _frameType;
157 }
158 return hasFlag(Keyframe) ? FrameType::IDR : FrameType::Unknown;
159 }
160
162 void setFrameType(const FrameType &t) { _frameType = t; }
163
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;
183 return isKeyframe();
184 }
185
187 bool isParameterSet() const { return (flags() & ParameterSet) != 0; }
188
190 void markParameterSet(bool v = true) {
191 if (v)
192 setFlags(flags() | ParameterSet);
193 else
194 setFlags(flags() & ~ParameterSet);
195 }
196
206 const Buffer &inBandCodecData() const { return _inBandCodecData; }
207
209 void setInBandCodecData(Buffer b) { _inBandCodecData = std::move(b); }
210
211 protected:
222 bool isExclusiveExtras() const override {
223 return !_inBandCodecData.isValid() || _inBandCodecData.impl().referenceCount() <= 1;
224 }
225
230 void ensureExclusiveExtras() override {
231 if (_inBandCodecData.isValid() && _inBandCodecData.impl().referenceCount() > 1) {
232 _inBandCodecData.ensureExclusive();
233 }
234 }
235
236 public:
238 static constexpr FourCC kSubclassFourCC{'C', 'V', 'd', 'p'};
239
240 uint32_t subclassFourCC() const override { return kSubclassFourCC.value(); }
241
243 void serialisePayload(DataStream &s) const override;
244
246 void deserialisePayload(DataStream &s) override;
247
248 CompressedVideoPayload(const CompressedVideoPayload &) = default;
249 CompressedVideoPayload(CompressedVideoPayload &&) = default;
250 CompressedVideoPayload &operator=(const CompressedVideoPayload &) = default;
251 CompressedVideoPayload &operator=(CompressedVideoPayload &&) = default;
252
253 private:
254 FrameType _frameType;
255 Buffer _inBandCodecData;
256};
257
258PROMEKI_NAMESPACE_END
259
260#endif // PROMEKI_ENABLE_PROAV