mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-25 14:25:02 +00:00
192 lines
5.6 KiB
C++
192 lines
5.6 KiB
C++
#pragma once
|
|
|
|
#include "media/types.hpp"
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
namespace media {
|
|
|
|
/**
|
|
* Plugin Interface
|
|
*
|
|
* Base class for all media processing plugins. Plugins are loaded dynamically
|
|
* and can handle various media processing tasks.
|
|
*
|
|
* To create a custom plugin:
|
|
* 1. Inherit from Plugin
|
|
* 2. Implement all pure virtual methods
|
|
* 3. Export the create_plugin() and destroy_plugin() functions
|
|
*/
|
|
class Plugin {
|
|
public:
|
|
virtual ~Plugin() = default;
|
|
|
|
// ========================================================================
|
|
// Plugin Metadata
|
|
// ========================================================================
|
|
|
|
/**
|
|
* Get plugin information
|
|
*/
|
|
virtual PluginInfo info() const = 0;
|
|
|
|
/**
|
|
* Get plugin capabilities
|
|
*/
|
|
virtual PluginCapabilities capabilities() const = 0;
|
|
|
|
// ========================================================================
|
|
// Lifecycle
|
|
// ========================================================================
|
|
|
|
/**
|
|
* Initialize the plugin
|
|
* Called once when the plugin is loaded
|
|
* @param config_path Path to plugin-specific configuration
|
|
* @return Result indicating success or failure
|
|
*/
|
|
virtual Result<void> initialize(const std::string& config_path) = 0;
|
|
|
|
/**
|
|
* Shutdown the plugin
|
|
* Called before the plugin is unloaded
|
|
*/
|
|
virtual void shutdown() = 0;
|
|
|
|
/**
|
|
* Check if the plugin is healthy
|
|
* @return true if plugin is operational
|
|
*/
|
|
virtual bool is_healthy() const = 0;
|
|
|
|
// ========================================================================
|
|
// Processing
|
|
// ========================================================================
|
|
|
|
/**
|
|
* Check if this plugin can handle a specific job
|
|
* @param type Job type
|
|
* @param params Job parameters
|
|
* @return true if plugin can process this job
|
|
*/
|
|
virtual bool can_handle(JobType type, const JobParams& params) const = 0;
|
|
|
|
/**
|
|
* Process a job
|
|
* @param request Job request with all parameters
|
|
* @param progress_callback Callback for progress updates
|
|
* @return Result with output path or error
|
|
*/
|
|
virtual Result<std::string> process(
|
|
const JobRequest& request,
|
|
JobProgressCallback progress_callback
|
|
) = 0;
|
|
|
|
/**
|
|
* Cancel an ongoing job
|
|
* @param job_id ID of job to cancel
|
|
* @return Result indicating success or failure
|
|
*/
|
|
virtual Result<void> cancel(const std::string& job_id) = 0;
|
|
|
|
// ========================================================================
|
|
// Streaming (optional - for streaming-capable plugins)
|
|
// ========================================================================
|
|
|
|
/**
|
|
* Start a stream
|
|
* @param channel_id Channel ID
|
|
* @param source Source configuration
|
|
* @param output Output configuration
|
|
* @return Result with stream URL or error
|
|
*/
|
|
virtual Result<std::string> start_stream(
|
|
const std::string& channel_id,
|
|
const std::map<std::string, std::string>& source,
|
|
const std::map<std::string, std::string>& output
|
|
) {
|
|
return Result<std::string>::error(
|
|
ErrorCode::NOT_FOUND,
|
|
"Streaming not supported by this plugin"
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Stop a stream
|
|
* @param channel_id Channel ID
|
|
* @return Result indicating success or failure
|
|
*/
|
|
virtual Result<void> stop_stream(const std::string& channel_id) {
|
|
return Result<void>::error(
|
|
ErrorCode::NOT_FOUND,
|
|
"Streaming not supported by this plugin"
|
|
);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Plugin factory function type
|
|
* Every plugin shared library must export these functions:
|
|
*
|
|
* extern "C" {
|
|
* Plugin* create_plugin();
|
|
* void destroy_plugin(Plugin* plugin);
|
|
* const char* plugin_api_version();
|
|
* }
|
|
*/
|
|
using CreatePluginFunc = Plugin* (*)();
|
|
using DestroyPluginFunc = void (*)(Plugin*);
|
|
using PluginApiVersionFunc = const char* (*)();
|
|
|
|
// Current plugin API version
|
|
constexpr const char* PLUGIN_API_VERSION = "1.0.0";
|
|
|
|
/**
|
|
* Plugin handle for managing loaded plugins
|
|
*/
|
|
struct PluginHandle {
|
|
std::string path;
|
|
void* library_handle = nullptr;
|
|
Plugin* instance = nullptr;
|
|
CreatePluginFunc create_func = nullptr;
|
|
DestroyPluginFunc destroy_func = nullptr;
|
|
PluginApiVersionFunc version_func = nullptr;
|
|
bool is_loaded = false;
|
|
};
|
|
|
|
} // namespace media
|
|
|
|
// ============================================================================
|
|
// Plugin Export Macros
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Use this macro in your plugin implementation to export required functions
|
|
*
|
|
* Example:
|
|
*
|
|
* class MyPlugin : public media::Plugin {
|
|
* // ... implementation
|
|
* };
|
|
*
|
|
* MEDIA_PLUGIN_EXPORT(MyPlugin)
|
|
*/
|
|
#ifdef _WIN32
|
|
#define MEDIA_PLUGIN_API __declspec(dllexport)
|
|
#else
|
|
#define MEDIA_PLUGIN_API __attribute__((visibility("default")))
|
|
#endif
|
|
|
|
#define MEDIA_PLUGIN_EXPORT(PluginClass) \
|
|
extern "C" { \
|
|
MEDIA_PLUGIN_API media::Plugin* create_plugin() { \
|
|
return new PluginClass(); \
|
|
} \
|
|
MEDIA_PLUGIN_API void destroy_plugin(media::Plugin* plugin) { \
|
|
delete plugin; \
|
|
} \
|
|
MEDIA_PLUGIN_API const char* plugin_api_version() { \
|
|
return media::PLUGIN_API_VERSION; \
|
|
} \
|
|
}
|