libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
ancatc.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/datatype.h>
15#include <promeki/error.h>
16#include <promeki/json.h>
17#include <promeki/namespace.h>
18#include <promeki/result.h>
19#include <promeki/string.h>
20#include <promeki/timecode.h>
21
22PROMEKI_NAMESPACE_BEGIN
23
24class DataStream;
25
44constexpr bool ancAtcIsPairHfrRate(uint32_t frameRateFps) {
45 return frameRateFps == 48u || frameRateFps == 50u || frameRateFps == 60u;
46}
47
63constexpr bool ancAtcIsHfrtcRate(uint32_t frameRateFps) {
64 return frameRateFps == 72u || frameRateFps == 96u || frameRateFps == 100u ||
65 frameRateFps == 120u;
66}
67
77constexpr bool ancAtcIsHfrRate(uint32_t frameRateFps) {
78 return ancAtcIsPairHfrRate(frameRateFps) || ancAtcIsHfrtcRate(frameRateFps);
79}
80
117class AncAtc {
118 public:
119 PROMEKI_DATATYPE(AncAtc, DataTypeAncAtc, 2)
120
121
133 enum PayloadType : uint8_t {
134 Ltc = 0x00,
135 Vitc1 = 0x01,
136 Vitc2 = 0x02,
137 HfrtcBase = 0x80,
138 };
139
141 struct VitcDbb2 {
142 uint8_t line = 0;
143 bool duplicate = false;
144 bool valid = true;
145 bool processed = true;
146 };
147
149 struct HfrtcDbb2 {
150 uint8_t superFrameCount = 0;
151 uint8_t n = 0;
152 };
153
155 AncAtc() = default;
156
158 explicit AncAtc(const Timecode &tc) : _tc(tc) {}
159
160 // -- Timecode --------------------------------------------
161
163 const Timecode &timecode() const { return _tc; }
164
166 void setTimecode(const Timecode &tc) { _tc = tc; }
167
168 // -- Payload type (DBB1) ---------------------------------
169
177 uint8_t payloadType() const { return _payloadType; }
178
180 void setPayloadType(uint8_t v) { _payloadType = v; }
181
184 bool isHfrtcPayload() const {
185 return _payloadType >= 0x80u && _payloadType <= 0x8Fu;
186 }
187
190 uint8_t hfrtcBitstream() const {
191 return isHfrtcPayload() ? static_cast<uint8_t>(_payloadType & 0x0Fu) : uint8_t{0};
192 }
193
194 // -- DBB2 ------------------------------------------------
195
203 uint8_t dbb2() const { return _dbb2; }
204
206 void setDbb2(uint8_t v) { _dbb2 = v; }
207
216 static VitcDbb2 dbb2DecodeVitc(uint8_t b) {
217 VitcDbb2 r;
218 r.line = static_cast<uint8_t>(b & 0x1Fu);
219 r.duplicate = (b & 0x20u) != 0u;
220 r.valid = (b & 0x40u) == 0u;
221 r.processed = (b & 0x80u) == 0u;
222 return r;
223 }
224
226 static uint8_t dbb2EncodeVitc(uint8_t line, bool duplicate, bool valid, bool processed) {
227 uint8_t b = static_cast<uint8_t>(line & 0x1Fu);
228 if (duplicate) b = static_cast<uint8_t>(b | 0x20u);
229 if (!valid) b = static_cast<uint8_t>(b | 0x40u);
230 if (!processed) b = static_cast<uint8_t>(b | 0x80u);
231 return b;
232 }
233
241 static HfrtcDbb2 dbb2DecodeHfrtc(uint8_t b) {
242 HfrtcDbb2 r;
243 r.n = static_cast<uint8_t>(b & 0x1Fu);
244 r.superFrameCount = static_cast<uint8_t>((b >> 5) & 0x03u);
245 return r;
246 }
247
249 static uint8_t dbb2EncodeHfrtc(uint8_t superFrameCount, uint8_t n) {
250 return static_cast<uint8_t>(((superFrameCount & 0x03u) << 5) | (n & 0x1Fu));
251 }
252
253 // -- Comparison ------------------------------------------
254
256 bool operator==(const AncAtc &o) const {
257 return _tc == o._tc && _payloadType == o._payloadType && _dbb2 == o._dbb2;
258 }
259
261 bool operator!=(const AncAtc &o) const { return !(*this == o); }
262
263 // -- Diagnostics -----------------------------------------
264
266 String toString() const;
267
269 JsonObject toJson() const;
270
271 // -- DataStream ------------------------------------------
272
274 Error writeToStream(DataStream &s) const;
275
277 template <uint32_t V> static Result<AncAtc> readFromStream(DataStream &s);
278
306 static int atcVitcFormatForFrame(uint32_t frameRateFps, uint64_t frameIndex);
307
308 private:
309 Timecode _tc;
310 uint8_t _payloadType = Ltc;
311 uint8_t _dbb2 = 0;
312};
313
314PROMEKI_NAMESPACE_END
315
316#endif // PROMEKI_ENABLE_PROAV