libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
compressedaudiopayload.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 <promeki/namespace.h>
14#include <promeki/uniqueptr.h>
16#include <promeki/buffer.h>
17#include <promeki/audiocodec.h>
19
20PROMEKI_NAMESPACE_BEGIN
21
67class CompressedAudioPayload : public AudioPayload {
68 public:
69 PROMEKI_MEDIAPAYLOAD_LOOKUP_DISPATCH(CompressedAudioPayload)
70
71 virtual CompressedAudioPayload *_promeki_clone() const override {
72 return new CompressedAudioPayload(*this);
73 }
74
76 using Ptr = SharedPtr<CompressedAudioPayload, /*CopyOnWrite=*/true, CompressedAudioPayload>;
77
79 using PtrList = ::promeki::List<Ptr>;
80
82 using UPtr = UniquePtr<CompressedAudioPayload>;
83
85 CompressedAudioPayload() = default;
86
97 explicit CompressedAudioPayload(const AudioDesc &desc, size_t sampleCount = 0)
98 : AudioPayload(desc, sampleCount) {}
99
109 CompressedAudioPayload(const AudioDesc &desc, const BufferView &data, size_t sampleCount = 0)
110 : AudioPayload(desc, sampleCount, data) {}
111
116 CompressedAudioPayload(const AudioDesc &desc, Buffer buffer, size_t sampleCount = 0)
117 : AudioPayload(desc, sampleCount, buffer ? BufferView(buffer, 0, buffer.size()) : BufferView()) {}
118
123 bool isCompressed() const override { return true; }
124
129 bool isValid() const override {
130 return MediaPayload::isValid() && desc().format().isValid() && desc().format().isCompressed();
131 }
132
152 bool isSafeCutPoint() const override {
153 if (!isValid()) return false;
154 const AudioCodec &codec = desc().format().audioCodec();
155 if (!codec.isValid()) return false;
156 switch (codec.packetIndependence()) {
157 case AudioCodec::PacketIndependenceEvery: return true;
158 case AudioCodec::PacketIndependenceKeyframe: return isKeyframe();
159 case AudioCodec::PacketIndependenceInter:
160 case AudioCodec::PacketIndependenceInvalid: return false;
161 }
162 return false;
163 }
164
169 const Buffer &inBandCodecData() const { return _inBandCodecData; }
170
172 void setInBandCodecData(Buffer b) { _inBandCodecData = std::move(b); }
173
174 protected:
179 bool isExclusiveExtras() const override {
180 return !_inBandCodecData.isValid() || _inBandCodecData.impl().referenceCount() <= 1;
181 }
182
187 void ensureExclusiveExtras() override {
188 if (_inBandCodecData.isValid() && _inBandCodecData.impl().referenceCount() > 1) {
189 _inBandCodecData.ensureExclusive();
190 }
191 }
192
193 public:
195 static constexpr FourCC kSubclassFourCC{'C', 'A', 'd', 'p'};
196
197 uint32_t subclassFourCC() const override { return kSubclassFourCC.value(); }
198
200 void serialisePayload(DataStream &s) const override;
201
203 void deserialisePayload(DataStream &s) override;
204
205 CompressedAudioPayload(const CompressedAudioPayload &) = default;
206 CompressedAudioPayload(CompressedAudioPayload &&) = default;
207 CompressedAudioPayload &operator=(const CompressedAudioPayload &) = default;
208 CompressedAudioPayload &operator=(CompressedAudioPayload &&) = default;
209
210 private:
211 Buffer _inBandCodecData;
212};
213
214PROMEKI_NAMESPACE_END
215
216#endif // PROMEKI_ENABLE_PROAV