11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
23PROMEKI_NAMESPACE_BEGIN
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());
69 using Config = MediaConfig;
72 virtual ~MediaIOFactory() =
default;
77 virtual String name()
const = 0;
80 virtual String displayName()
const {
return name(); }
83 virtual String description()
const {
return String(); }
88 virtual StringList extensions()
const {
return StringList(); }
91 virtual StringList schemes()
const {
return StringList(); }
101 virtual bool canHandlePath(
const String &path)
const {
114 virtual bool canHandleDevice(IODevice *device)
const {
126 virtual StringList enumerate()
const {
return StringList(); }
131 virtual bool canBeSource()
const {
return false; }
134 virtual bool canBeSink()
const {
return false; }
137 virtual bool canBeTransform()
const {
return false; }
157 virtual bool isFallback()
const {
return false; }
168 virtual Config::SpecMap configSpecs()
const {
return Config::SpecMap(); }
176 virtual Metadata defaultMetadata()
const {
return Metadata(); }
188 virtual Error urlToConfig(
const Url &url, Config *outConfig)
const {
191 return Error::NotSupported;
204 virtual bool bridge(
const MediaDesc &from,
const MediaDesc &to, Config *outConfig,
205 int *outCost)
const {
224 virtual List<MediaDesc> queryDevice(
const Config &config)
const {
226 return List<MediaDesc>();
235 virtual void printDeviceInfo(
const Config &config)
const { (void)config; }
255 virtual MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr)
const = 0;
267 static int registerFactory(MediaIOFactory *factory);
270 static const List<MediaIOFactory *> ®isteredFactories();
276 static const MediaIOFactory *findByName(
const String &name);
286 static const MediaIOFactory *findByExtension(
const String &extension);
295 static const MediaIOFactory *findByScheme(
const String &scheme);
303 static const MediaIOFactory *findForPath(
const String &path);
327 static Config defaultConfig(
const String &typeName);
336 static Config::SpecMap configSpecs(
const String &typeName);
345 static Metadata defaultMetadata(
const String &typeName);
360 static StringList enumerate(
const String &typeName);
371 static List<MediaDesc> queryDevice(
const String &typeName,
const Config &config);
379 static void printDeviceInfo(
const String &typeName,
const Config &config);
391 enum class ConfigValidation {
417 static StringList unknownConfigKeys(
const String &typeName,
const Config &cfg);
443 static Error validateConfigKeys(
const String &typeName,
const Config &cfg, ConfigValidation mode,
444 const String &contextLabel = String());