Here is a patch for vlc/modules/visualization/goom.c which works around the the failings of libgoom2k4 ability to free its resources.
Instead of creating a new instance of libgoom2k4 on each track start, with this patch a single instance will be used throughout.
Code: Select all
--- goom.c 2009-06-10 17:21:22.000000000 +0100
+++ mod_goom.c 2009-06-10 18:07:11.796875000 +0100
@@ -90,6 +90,10 @@
*****************************************************************************/
#define MAX_BLOCKS 100
#define GOOM_DELAY 400000
+
+#ifdef WIN32
+static PluginInfo *p_plugin_info;
+#endif
typedef struct
{
@@ -326,7 +330,9 @@
audio_date_t i_pts;
int16_t p_data[2][512];
int i_data = 0, i_count = 0;
- PluginInfo *p_plugin_info;
+#ifndef WIN32
+ PluginInfo *p_plugin_info;
+#endif
int canc = vlc_savecancel ();
width = var_GetInteger( p_this, "goom-width" );
@@ -335,8 +341,12 @@
speed = var_CreateGetInteger( p_thread, "goom-speed" );
speed = MAX_SPEED - speed;
if( speed < 0 ) speed = 0;
-
- p_plugin_info = goom_init( width, height );
+
+#ifdef WIN32
+ goom_set_resolution(p_plugin_info, width, height);
+#else
+ p_plugin_info = goom_init( width, height );
+#endif
while( vlc_object_alive (p_thread) )
{
@@ -375,8 +385,9 @@
p_pic->date = aout_DateGet( &i_pts ) + GOOM_DELAY;
vout_DisplayPicture( p_thread->p_vout, p_pic );
}
-
+#ifndef WIN32
goom_close( p_plugin_info );
+#endif
vlc_restorecancel (canc);
return NULL;
}
@@ -448,3 +459,23 @@
return psz_title;
}
+
+#ifdef WIN32
+BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);
+
+BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+ (void)hinstDLL;
+ (void)lpvReserved;
+
+ if ( fdwReason == DLL_PROCESS_ATTACH )
+ {
+ p_plugin_info = goom_init(320, 240);
+ }
+ else if ( fdwReason == DLL_PROCESS_DETACH )
+ {
+ goom_close(p_plugin_info);
+ }
+ return 1;
+}
+#endif