libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
timecodeuserbits.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <cstdint>
14#include <promeki/array.h>
15#include <promeki/datatype.h>
16#include <promeki/datetime.h>
17#include <promeki/error.h>
18#include <promeki/json.h>
19#include <promeki/namespace.h>
20#include <promeki/result.h>
21#include <promeki/string.h>
22
23PROMEKI_NAMESPACE_BEGIN
24
25class DataStream;
26
74class TimecodeUserbits {
75 public:
76 PROMEKI_DATATYPE(TimecodeUserbits, DataTypeTimecodeUserbits, 1)
77
78
79 static constexpr size_t NibbleCount = 8;
80
84 using Nibbles = ::promeki::Array<uint8_t, NibbleCount>;
85
94 enum Mode : uint8_t {
95 Unspecified = 0b000,
96 EightBitChars = 0b001,
97 ClockTime = 0b010,
98 Reserved = 0b011,
99 DateTimeZone = 0b100,
100 PageLine = 0b101,
101 DateTimeZoneClock = 0b110,
102 PageLineClock = 0b111,
103 };
104
106 TimecodeUserbits() = default;
107
112 static TimecodeUserbits fromRawBits(uint32_t bits, Mode m = Unspecified);
113
117 static TimecodeUserbits fromNibbles(const Nibbles &n, Mode m = Unspecified);
118
129 static TimecodeUserbits fromAsciiChars(const String &s);
130
142 static Result<TimecodeUserbits> fromDateTimeZone(const DateTime &dt);
143
145 const Nibbles &nibbles() const { return _nibbles; }
146
148 uint32_t toUint32() const;
149
151 Mode mode() const { return _mode; }
152
158 TimecodeUserbits reinterpret(Mode m) const {
159 TimecodeUserbits out = *this;
160 out._mode = m;
161 return out;
162 }
163
170 Result<String> asAsciiChars() const;
171
182 Result<DateTime> asDateTimeZone() const;
183
187 bool hasClockTimeReference() const {
188 return _mode == ClockTime || _mode == DateTimeZoneClock || _mode == PageLineClock;
189 }
190
192 bool operator==(const TimecodeUserbits &other) const {
193 return _mode == other._mode && _nibbles == other._nibbles;
194 }
195
197 bool operator!=(const TimecodeUserbits &other) const { return !(*this == other); }
198
200 String toString() const;
201
203 JsonObject toJson() const;
204
206 Error writeToStream(DataStream &s) const;
207
209 template <uint32_t V> static Result<TimecodeUserbits> readFromStream(DataStream &s);
210
211 private:
212 Nibbles _nibbles{};
213 Mode _mode = Unspecified;
214};
215
216PROMEKI_NAMESPACE_END
217
226template <> struct std::formatter<promeki::TimecodeUserbits> {
227 std::formatter<std::string_view> _base;
228
229 constexpr auto parse(std::format_parse_context &ctx) {
230 return _base.parse(ctx);
231 }
232
233 template <typename FormatContext>
234 auto format(const promeki::TimecodeUserbits &ub, FormatContext &ctx) const {
235 promeki::String s = ub.toString();
236 return _base.format(std::string_view(s.cstr(), s.byteCount()), ctx);
237 }
238};
239
240#endif // PROMEKI_ENABLE_CORE