aboutsummaryrefslogtreecommitdiffstats
path: root/mediaplugin/src/media/UMediaPlugin.pas
diff options
context:
space:
mode:
authortobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c>2010-10-30 07:34:30 +0000
committertobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c>2010-10-30 07:34:30 +0000
commite5f7b9f18641141354f03e6a8281a347a2555927 (patch)
tree1cf682a0a2d7fd1fb6415977aadb9e72d725f48a /mediaplugin/src/media/UMediaPlugin.pas
parentf8f21b447558c911bcd4bbaaf45e9d7ba52e8fe1 (diff)
downloadusdx-e5f7b9f18641141354f03e6a8281a347a2555927.tar.gz
usdx-e5f7b9f18641141354f03e6a8281a347a2555927.tar.xz
usdx-e5f7b9f18641141354f03e6a8281a347a2555927.zip
dynamic loading of video- and audio-decoder
git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/branches/experimental@2695 b956fd51-792f-4845-bead-9b4dfca2ff2c
Diffstat (limited to 'mediaplugin/src/media/UMediaPlugin.pas')
-rw-r--r--mediaplugin/src/media/UMediaPlugin.pas90
1 files changed, 71 insertions, 19 deletions
diff --git a/mediaplugin/src/media/UMediaPlugin.pas b/mediaplugin/src/media/UMediaPlugin.pas
index 2eb0772e..0c0f7fb9 100644
--- a/mediaplugin/src/media/UMediaPlugin.pas
+++ b/mediaplugin/src/media/UMediaPlugin.pas
@@ -47,9 +47,9 @@ type
PMediaPluginCore = ^TMediaPluginCore;
TMediaPluginCore = record
- version: cint;
+ version: cint;
- log: procedure(level: cint; msg: PChar; context: PChar); cdecl;
+ log: procedure(level: cint; msg: PChar; context: PChar); cdecl;
ticksMillis: function(): cuint32; cdecl;
fileOpen: function(utf8Filename: PAnsiChar; mode: cint): PFileStream; cdecl;
@@ -138,23 +138,9 @@ type
videoDecoder: PVideoDecoderInfo;
end;
- Plugin_registerFunc = function(core: PMediaPluginCore): PMediaPluginInfo; cdecl;
-
-const
-{$IFDEF MSWINDOWS}
- ffmpegPlugin = 'ffmpeg_playback.dll';
-{$ENDIF}
-{$IFDEF LINUX}
- ffmpegPlugin = 'ffmpeg_playback';
-{$ENDIF}
-{$IFDEF DARWIN}
- ffmpegPlugin = 'ffmpeg_playback.dylib';
- {$linklib ffmpegPlugin}
-{$ENDIF}
-
-function Plugin_register(core: PMediaPluginCore): PMediaPluginInfo;
- cdecl; external ffmpegPlugin;
+ TPluginRegisterFunc = function(core: PMediaPluginCore): PMediaPluginInfo; cdecl;
+procedure LoadMediaPlugins();
function MediaPluginCore: PMediaPluginCore;
@@ -164,8 +150,15 @@ procedure AudioFormatInfoToCStruct(
implementation
uses
+ SysUtils,
SDL,
- ULog;
+ moduleloader,
+ UFilesystem,
+ UPath,
+ UPathUtils,
+ ULog,
+ UAudioDecoder_FFmpeg,
+ UVideoDecoder_FFmpeg;
var
MediaPluginCore_Instance: TMediaPluginCore;
@@ -349,6 +342,65 @@ begin
end;
end;
+procedure LoadMediaPlugins();
+var
+ LibPath: IPath;
+ Iter: IFileIterator;
+ FileInfo: TFileInfo;
+ ModuleFile: IPath;
+ Module: TModuleHandle;
+ RegisterFunc: TPluginRegisterFunc;
+ PluginInfo: PMediaPluginInfo;
+begin
+ LibPath := MediaPluginPath.Append('*.dll');
+ Iter := FileSystem.FileFind(LibPath, faAnyFile);
+ while (Iter.HasNext) do
+ begin
+ FileInfo := Iter.Next();
+ ModuleFile := MediaPluginPath.Append(FileInfo.Name);
+ if (not LoadModule(Module, PChar(ModuleFile.ToNative))) then
+ begin
+ Log.LogInfo('Failed to load media plugin: "' + FileInfo.Name.ToNative + '"',
+ 'LoadMediaPlugins');
+ Continue;
+ end;
+ RegisterFunc := GetModuleSymbol(Module, 'Plugin_register');
+ if (@RegisterFunc = nil) then
+ begin
+ Log.LogError('Invalid media plugin: "' + FileInfo.Name.ToNative + '"',
+ 'LoadMediaPlugins');
+ UnloadModule(Module);
+ Continue;
+ end;
+ PluginInfo := RegisterFunc(MediaPluginCore);
+ if (PluginInfo = nil) then
+ begin
+ Log.LogError('Invalid media plugin info: "' + FileInfo.Name.ToNative + '"',
+ 'LoadMediaPlugins');
+ UnloadModule(Module);
+ Continue;
+ end;
+ if (not PluginInfo.initialize()) then
+ begin
+ Log.LogError('Failed to initialize media plugin: "' + PluginInfo.name + '"',
+ 'LoadMediaPlugins');
+ UnloadModule(Module);
+ Continue;
+ end;
+
+ Log.LogStatus('Loaded media plugin: "' + PluginInfo.name + '"',
+ 'LoadMediaPlugins');
+
+ // register modules
+ if (PluginInfo.audioDecoder <> nil) then
+ MediaManager.Add(TAudioDecoder_FFmpeg.Create(PluginInfo));
+ if (PluginInfo.videoDecoder <> nil) then
+ MediaManager.Add(TVideoDecoder_FFmpeg.Create(PluginInfo));
+ //if (PluginInfo.audioConverter <> nil) then
+ // MediaManager.Add();
+ end;
+end;
+
initialization
InitializeMediaPluginCore;