libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
anctranslator.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/ancformat.h>
15#include <promeki/ancpacket.h>
17#include <promeki/enums.h>
19#include <promeki/list.h>
20#include <promeki/result.h>
21#include <promeki/variant.h>
22#include <promeki/util.h>
23
24PROMEKI_NAMESPACE_BEGIN
25
105class AncTranslator {
106 public:
107 // -- Return-type aliases --------------------------------------
108
114 using ParseResult = Result<Variant>;
115
127 using PacketsResult = Result<AncPacket::List>;
128
129 // -- Handler signatures ---------------------------------------
130
132 using ParserFn = ParseResult (*)(const AncPacket &, const AncTranslateConfig &);
133
152 using MultiParserFn = ParseResult (*)(const AncPacket::List &,
153 const AncTranslateConfig &);
154
167 using BuilderFn = PacketsResult (*)(const Variant &, const AncTranslateConfig &);
168
181 using TranslatorFn = PacketsResult (*)(const AncPacket &, AncTransport,
182 const AncTranslateConfig &);
183
214 using SyncPolicyFn = PacketsResult (*)(const AncPacket &,
215 FrameSyncDisposition,
216 uint8_t repeatIndex,
217 const AncTranslateConfig &);
218
219 // -- Construction --------------------------------------------
220
222 AncTranslator() = default;
223
225 explicit AncTranslator(AncTranslateConfig cfg) : _cfg(std::move(cfg)) {}
226
228 const AncTranslateConfig &config() const { return _cfg; }
229
231 void setConfig(AncTranslateConfig cfg) { _cfg = std::move(cfg); }
232
233 // -- Dispatch -------------------------------------------------
234
247 ParseResult parse(const AncPacket &pkt) const;
248
269 ParseResult parseGroup(const AncPacket::List &pkts) const;
270
289 PacketsResult build(const Variant &v, const AncFormat &fmt,
290 const AncTransport &target) const;
291
309 PacketsResult translate(const AncPacket &pkt, const AncTransport &target) const;
310
330 PacketsResult applySyncPolicy(const AncPacket &pkt,
331 FrameSyncDisposition disposition,
332 uint8_t repeatIndex) const;
333
334 // -- Static registration -------------------------------------
335
347 static void registerParser(AncFormat::ID format, const AncTransport &src, ParserFn fn);
348
360 static void registerMultiParser(AncFormat::ID format, const AncTransport &src,
361 MultiParserFn fn);
362
372 static void registerBuilder(AncFormat::ID format, const AncTransport &dst, BuilderFn fn);
373
384 static void registerTranslator(AncFormat::ID format, const AncTransport &src,
385 const AncTransport &dst, TranslatorFn fn);
386
397 static void registerSyncPolicy(AncFormat::ID format, SyncPolicyFn fn);
398
399 // -- Static capability queries -------------------------------
400
407 static bool hasParser(const AncFormat &format, const AncTransport &src);
408
410 static bool hasMultiParser(const AncFormat &format, const AncTransport &src);
411
413 static bool hasBuilder(const AncFormat &format, const AncTransport &dst);
414
416 static bool hasDirectTranslator(const AncFormat &format, const AncTransport &src,
417 const AncTransport &dst);
418
420 static bool hasSyncPolicy(const AncFormat &format);
421
431 static bool canTranslate(const AncFormat &format, const AncTransport &src,
432 const AncTransport &dst);
433
435 static List<AncTransport> registeredParserTransports(const AncFormat &format);
436
438 static List<AncTransport> registeredBuilderTransports(const AncFormat &format);
439
440 private:
441 AncTranslateConfig _cfg;
442};
443
444PROMEKI_NAMESPACE_END
445
446// ============================================================================
447// Static-init registration macros
448// ============================================================================
449
464#define PROMEKI_REGISTER_ANC_PARSER(Tag, Format, Transport, Fn) \
465 namespace { \
466 struct AncParserRegistrar_##Tag { \
467 AncParserRegistrar_##Tag() { \
468 ::promeki::AncTranslator::registerParser(::promeki::AncFormat::Format, \
469 Transport, Fn); \
470 } \
471 }; \
472 static AncParserRegistrar_##Tag s_anc_parser_registrar_##Tag; \
473 }
474
485#define PROMEKI_REGISTER_ANC_MULTI_PARSER(Tag, Format, Transport, Fn) \
486 namespace { \
487 struct AncMultiParserRegistrar_##Tag { \
488 AncMultiParserRegistrar_##Tag() { \
489 ::promeki::AncTranslator::registerMultiParser( \
490 ::promeki::AncFormat::Format, Transport, Fn); \
491 } \
492 }; \
493 static AncMultiParserRegistrar_##Tag s_anc_multi_parser_registrar_##Tag; \
494 }
495
502#define PROMEKI_REGISTER_ANC_BUILDER(Tag, Format, Transport, Fn) \
503 namespace { \
504 struct AncBuilderRegistrar_##Tag { \
505 AncBuilderRegistrar_##Tag() { \
506 ::promeki::AncTranslator::registerBuilder(::promeki::AncFormat::Format, \
507 Transport, Fn); \
508 } \
509 }; \
510 static AncBuilderRegistrar_##Tag s_anc_builder_registrar_##Tag; \
511 }
512
526#define PROMEKI_REGISTER_ANC_TRANSLATOR(Tag, Format, Src, Dst, Fn) \
527 namespace { \
528 struct AncTranslatorRegistrar_##Tag { \
529 AncTranslatorRegistrar_##Tag() { \
530 ::promeki::AncTranslator::registerTranslator(::promeki::AncFormat::Format, \
531 Src, Dst, Fn); \
532 } \
533 }; \
534 static AncTranslatorRegistrar_##Tag s_anc_translator_registrar_##Tag; \
535 }
536
550#define PROMEKI_REGISTER_ANC_SYNC_POLICY(Tag, Format, Fn) \
551 namespace { \
552 struct AncSyncPolicyRegistrar_##Tag { \
553 AncSyncPolicyRegistrar_##Tag() { \
554 ::promeki::AncTranslator::registerSyncPolicy(::promeki::AncFormat::Format, \
555 Fn); \
556 } \
557 }; \
558 static AncSyncPolicyRegistrar_##Tag s_anc_sync_policy_registrar_##Tag; \
559 }
560
561#endif // PROMEKI_ENABLE_PROAV