11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
20PROMEKI_NAMESPACE_BEGIN
67class CompressedAudioPayload :
public AudioPayload {
69 PROMEKI_MEDIAPAYLOAD_LOOKUP_DISPATCH(CompressedAudioPayload)
71 virtual CompressedAudioPayload *_promeki_clone()
const override {
72 return new CompressedAudioPayload(*
this);
76 using Ptr = SharedPtr<CompressedAudioPayload,
true, CompressedAudioPayload>;
79 using PtrList = ::promeki::List<Ptr>;
82 using UPtr = UniquePtr<CompressedAudioPayload>;
85 CompressedAudioPayload() =
default;
97 explicit CompressedAudioPayload(
const AudioDesc &desc,
size_t sampleCount = 0)
98 : AudioPayload(desc, sampleCount) {}
109 CompressedAudioPayload(
const AudioDesc &desc,
const BufferView &data,
size_t sampleCount = 0)
110 : AudioPayload(desc, sampleCount, data) {}
116 CompressedAudioPayload(
const AudioDesc &desc, Buffer buffer,
size_t sampleCount = 0)
117 : AudioPayload(desc, sampleCount, buffer ? BufferView(buffer, 0, buffer.size()) : BufferView()) {}
123 bool isCompressed()
const override {
return true; }
129 bool isValid()
const override {
130 return MediaPayload::isValid() && desc().format().isValid() && desc().format().isCompressed();
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;
169 const Buffer &inBandCodecData()
const {
return _inBandCodecData; }
172 void setInBandCodecData(Buffer b) { _inBandCodecData = std::move(b); }
179 bool isExclusiveExtras()
const override {
180 return !_inBandCodecData.isValid() || _inBandCodecData.impl().referenceCount() <= 1;
187 void ensureExclusiveExtras()
override {
188 if (_inBandCodecData.isValid() && _inBandCodecData.impl().referenceCount() > 1) {
189 _inBandCodecData.ensureExclusive();
195 static constexpr FourCC kSubclassFourCC{
'C',
'A',
'd',
'p'};
197 uint32_t subclassFourCC()
const override {
return kSubclassFourCC.value(); }
200 void serialisePayload(DataStream &s)
const override;
203 void deserialisePayload(DataStream &s)
override;
205 CompressedAudioPayload(
const CompressedAudioPayload &) =
default;
206 CompressedAudioPayload(CompressedAudioPayload &&) =
default;
207 CompressedAudioPayload &operator=(
const CompressedAudioPayload &) =
default;
208 CompressedAudioPayload &operator=(CompressedAudioPayload &&) =
default;
211 Buffer _inBandCodecData;