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
157 virtual bool isFallback() const { return false; }
158
159 // ---- Configuration ----
160
168 virtual Config::SpecMap configSpecs() const { return Config::SpecMap(); }
169
176 virtual Metadata defaultMetadata() const { return Metadata(); }
177
188 virtual Error urlToConfig(const Url &url, Config *outConfig) const {
189 (void)url;
190 (void)outConfig;
191 return Error::NotSupported;
192 }
193
204 virtual bool bridge(const MediaDesc &from, const MediaDesc &to, Config *outConfig,
205 int *outCost) const {
206 (void)from;
207 (void)to;
208 (void)outConfig;
209 (void)outCost;
210 return false;
211 }
212
213 // ---- Device introspection ----
214
224 virtual List<MediaDesc> queryDevice(const Config &config) const {
225 (void)config;
226 return List<MediaDesc>();
227 }
228
235 virtual void printDeviceInfo(const Config &config) const { (void)config; }
236
237 // ---- Construction ----
238
255 virtual MediaIO *create(const Config &config, ObjectBase *parent = nullptr) const = 0;
256
257 // ---- Static registry ----
258
267 static int registerFactory(MediaIOFactory *factory);
268
270 static const List<MediaIOFactory *> &registeredFactories();
271
276 static const MediaIOFactory *findByName(const String &name);
277
286 static const MediaIOFactory *findByExtension(const String &extension);
287
295 static const MediaIOFactory *findByScheme(const String &scheme);
296
303 static const MediaIOFactory *findForPath(const String &path);
304
305 // ---- Registry-introspection convenience statics ----
306 //
307 // Each of the following is a thin wrapper around
308 // findByName(typeName)->...; they exist so callers can
309 // query backend metadata by string name without first
310 // resolving the factory pointer themselves. All return
311 // an empty / default value when the named backend is
312 // not registered.
313
327 static Config defaultConfig(const String &typeName);
328
336 static Config::SpecMap configSpecs(const String &typeName);
337
345 static Metadata defaultMetadata(const String &typeName);
346
360 static StringList enumerate(const String &typeName);
361
371 static List<MediaDesc> queryDevice(const String &typeName, const Config &config);
372
379 static void printDeviceInfo(const String &typeName, const Config &config);
380
391 enum class ConfigValidation {
392 Lenient,
393 Strict
394 };
395
417 static StringList unknownConfigKeys(const String &typeName, const Config &cfg);
418
443 static Error validateConfigKeys(const String &typeName, const Config &cfg, ConfigValidation mode,
444 const String &contextLabel = String());
445};
446
447PROMEKI_NAMESPACE_END
448
449#endif // PROMEKI_ENABLE_PROAV