libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
smpte302m.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/audiodesc.h>
16#include <promeki/audioformat.h>
17#include <promeki/buffer.h>
18#include <promeki/bufferview.h>
19#include <promeki/error.h>
20
21PROMEKI_NAMESPACE_BEGIN
22
79class Smpte302M {
80 public:
82 enum BitsPerSample : uint8_t {
83 Bits16 = 0,
84 Bits20 = 1,
85 Bits24 = 2,
86 };
87
89 static constexpr size_t HeaderSize = 4;
90
92 static constexpr float RequiredSampleRate = 48000.0f;
93
95 static constexpr unsigned MaxChannels = 8;
96
98 static constexpr unsigned MinChannels = 2;
99
107 static int bitsPerSampleCode(const AudioFormat &fmt);
108
112 static bool isFormatSupported(const AudioFormat &fmt);
113
121 static size_t bytesPerAes3Frame(BitsPerSample bps, unsigned channels);
122
129 static size_t payloadSize(BitsPerSample bps, unsigned channels, size_t sampleCount);
130
140 enum VucBits : uint8_t {
141 VucNone = 0,
142 VucValidity = 1 << 0,
143 VucUser = 1 << 1,
144 VucChannelStatus = 1 << 2,
145 };
146
159 using VucSource = const uint8_t *;
160
215 static Error pack(const void *pcm, const AudioDesc &desc, size_t sampleCount,
216 uint32_t &blockPhase, uint8_t firstChannelId,
217 Buffer &outPesPayload, VucSource vuc = nullptr);
218
222 struct ParsedHeader {
223 uint16_t audioPacketSize = 0;
224 uint8_t numberChannels = 0;
225 unsigned channels = 0;
226 uint8_t channelIdentification = 0;
227 BitsPerSample bitsPerSample = Bits16;
228 };
229
240 static Error parseHeader(const BufferView &in, ParsedHeader *out);
241
267 static Error parse(const BufferView &in, Buffer &outPcm, AudioDesc &outDesc,
268 size_t &outSampleCount, uint8_t *outFirstChannelId = nullptr);
269
282 static Error parseWithVuc(const BufferView &in, Buffer &outPcm, AudioDesc &outDesc,
283 size_t &outSampleCount, Buffer *outVuc,
284 uint8_t *outFirstChannelId = nullptr);
285};
286
287PROMEKI_NAMESPACE_END
288
289#endif // PROMEKI_ENABLE_PROAV