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; }
148 virtual Config::SpecMap configSpecs()
const {
return Config::SpecMap(); }
156 virtual Metadata defaultMetadata()
const {
return Metadata(); }
168 virtual Error urlToConfig(
const Url &url, Config *outConfig)
const {
171 return Error::NotSupported;
184 virtual bool bridge(
const MediaDesc &from,
const MediaDesc &to, Config *outConfig,
185 int *outCost)
const {
204 virtual List<MediaDesc> queryDevice(
const Config &config)
const {
206 return List<MediaDesc>();
215 virtual void printDeviceInfo(
const Config &config)
const { (void)config; }
235 virtual MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr)
const = 0;
247 static int registerFactory(MediaIOFactory *factory);
250 static const List<MediaIOFactory *> ®isteredFactories();
256 static const MediaIOFactory *findByName(
const String &name);
266 static const MediaIOFactory *findByExtension(
const String &extension);
275 static const MediaIOFactory *findByScheme(
const String &scheme);
283 static const MediaIOFactory *findForPath(
const String &path);
307 static Config defaultConfig(
const String &typeName);
316 static Config::SpecMap configSpecs(
const String &typeName);
325 static Metadata defaultMetadata(
const String &typeName);
340 static StringList enumerate(
const String &typeName);
351 static List<MediaDesc> queryDevice(
const String &typeName,
const Config &config);
359 static void printDeviceInfo(
const String &typeName,
const Config &config);
371 enum class ConfigValidation {
397 static StringList unknownConfigKeys(
const String &typeName,
const Config &cfg);
423 static Error validateConfigKeys(
const String &typeName,
const Config &cfg, ConfigValidation mode,
424 const String &contextLabel = String());