libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
mediaiofactory.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/error.h>
14#include <promeki/list.h>
15#include <promeki/mediaconfig.h>
16#include <promeki/mediadesc.h>
17#include <promeki/metadata.h>
18#include <promeki/namespace.h>
19#include <promeki/string.h>
20#include <promeki/stringlist.h>
21#include <promeki/url.h>
22
23PROMEKI_NAMESPACE_BEGIN
24
25class IODevice;
26class MediaIO;
27class ObjectBase;
28
39#define PROMEKI_REGISTER_MEDIAIO_FACTORY(FactoryClass) \
40 [[maybe_unused]] static int PROMEKI_CONCAT(__promeki_mediaio_factory_, PROMEKI_UNIQUE_ID) = \
41 MediaIOFactory::registerFactory(new FactoryClass());
42
66class MediaIOFactory {
67 public:
69 using Config = MediaConfig;
70
72 virtual ~MediaIOFactory() = default;
73
74 // ---- Identity ----
75
77 virtual String name() const = 0;
78
80 virtual String displayName() const { return name(); }
81
83 virtual String description() const { return String(); }
84
85 // ---- Discovery surfaces ----
86
88 virtual StringList extensions() const { return StringList(); }
89
91 virtual StringList schemes() const { return StringList(); }
92
101 virtual bool canHandlePath(const String &path) const {
102 (void)path;
103 return false;
104 }
105
114 virtual bool canHandleDevice(IODevice *device) const {
115 (void)device;
116 return false;
117 }
118
126 virtual StringList enumerate() const { return StringList(); }
127
128 // ---- Role flags ----
129
131 virtual bool canBeSource() const { return false; }
132
134 virtual bool canBeSink() const { return false; }
135
137 virtual bool canBeTransform() const { return false; }
138
139 // ---- Configuration ----
140
148 virtual Config::SpecMap configSpecs() const { return Config::SpecMap(); }
149
156 virtual Metadata defaultMetadata() const { return Metadata(); }
157
168 virtual Error urlToConfig(const Url &url, Config *outConfig) const {
169 (void)url;
170 (void)outConfig;
171 return Error::NotSupported;
172 }
173
184 virtual bool bridge(const MediaDesc &from, const MediaDesc &to, Config *outConfig,
185 int *outCost) const {
186 (void)from;
187 (void)to;
188 (void)outConfig;
189 (void)outCost;
190 return false;
191 }
192
193 // ---- Device introspection ----
194
204 virtual List<MediaDesc> queryDevice(const Config &config) const {
205 (void)config;
206 return List<MediaDesc>();
207 }
208
215 virtual void printDeviceInfo(const Config &config) const { (void)config; }
216
217 // ---- Construction ----
218
235 virtual MediaIO *create(const Config &config, ObjectBase *parent = nullptr) const = 0;
236
237 // ---- Static registry ----
238
247 static int registerFactory(MediaIOFactory *factory);
248
250 static const List<MediaIOFactory *> &registeredFactories();
251
256 static const MediaIOFactory *findByName(const String &name);
257
266 static const MediaIOFactory *findByExtension(const String &extension);
267
275 static const MediaIOFactory *findByScheme(const String &scheme);
276
283 static const MediaIOFactory *findForPath(const String &path);
284
285 // ---- Registry-introspection convenience statics ----
286 //
287 // Each of the following is a thin wrapper around
288 // findByName(typeName)->...; they exist so callers can
289 // query backend metadata by string name without first
290 // resolving the factory pointer themselves. All return
291 // an empty / default value when the named backend is
292 // not registered.
293
307 static Config defaultConfig(const String &typeName);
308
316 static Config::SpecMap configSpecs(const String &typeName);
317
325 static Metadata defaultMetadata(const String &typeName);
326
340 static StringList enumerate(const String &typeName);
341
351 static List<MediaDesc> queryDevice(const String &typeName, const Config &config);
352
359 static void printDeviceInfo(const String &typeName, const Config &config);
360
371 enum class ConfigValidation {
372 Lenient,
373 Strict
374 };
375
397 static StringList unknownConfigKeys(const String &typeName, const Config &cfg);
398
423 static Error validateConfigKeys(const String &typeName, const Config &cfg, ConfigValidation mode,
424 const String &contextLabel = String());
425};
426
427PROMEKI_NAMESPACE_END
428
429#endif // PROMEKI_ENABLE_PROAV