X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvisualization%2Fgoom.c;h=044dea7a9c2f6a1218a49aa4e3bc7129f49207a0;hb=a45ba22ee6feca5d32662bf433584911b928e7d1;hp=3d7070c906cf5f8fb2931b726b8a9f704e2326d3;hpb=d3fe7f28797d4dba65ffcdd60bf932e758a48a9e;p=vlc diff --git a/modules/visualization/goom.c b/modules/visualization/goom.c index 3d7070c906..044dea7a9c 100644 --- a/modules/visualization/goom.c +++ b/modules/visualization/goom.c @@ -25,11 +25,14 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* malloc(), free() */ -#include /* strdup() */ #include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include #include #include #include @@ -67,17 +70,17 @@ static void Close ( vlc_object_t * ); #define MAX_SPEED 10 vlc_module_begin(); - set_shortname( _("Goom")); - set_description( _("Goom effect") ); + set_shortname( N_("Goom")); + set_description( N_("Goom effect") ); set_category( CAT_AUDIO ); set_subcategory( SUBCAT_AUDIO_VISUAL ); set_capability( "visualization", 0 ); add_integer( "goom-width", 320, NULL, - WIDTH_TEXT, RES_LONGTEXT, VLC_FALSE ); + WIDTH_TEXT, RES_LONGTEXT, false ); add_integer( "goom-height", 240, NULL, - HEIGHT_TEXT, RES_LONGTEXT, VLC_FALSE ); + HEIGHT_TEXT, RES_LONGTEXT, false ); add_integer( "goom-speed", 6, NULL, - SPEED_TEXT, SPEED_LONGTEXT, VLC_FALSE ); + SPEED_TEXT, SPEED_LONGTEXT, false ); set_callbacks( Open, Close ); add_shortcut( "goom" ); vlc_module_end(); @@ -118,7 +121,7 @@ typedef struct aout_filter_sys_t static void DoWork ( aout_instance_t *, aout_filter_t *, aout_buffer_t *, aout_buffer_t * ); -static void Thread ( vlc_object_t * ); +static void* Thread ( vlc_object_t * ); static char *TitleGet( vlc_object_t * ); @@ -131,7 +134,8 @@ static int Open( vlc_object_t *p_this ) aout_filter_sys_t *p_sys; goom_thread_t *p_thread; vlc_value_t width, height; - video_format_t fmt = {0}; + video_format_t fmt; + if ( p_filter->input.i_format != VLC_FOURCC('f','l','3','2' ) || p_filter->output.i_format != VLC_FOURCC('f','l','3','2') ) @@ -161,6 +165,8 @@ static int Open( vlc_object_t *p_this ) var_Create( p_thread, "goom-height", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT ); var_Get( p_thread, "goom-height", &height ); + memset( &fmt, 0, sizeof(video_format_t) ); + fmt.i_width = fmt.i_visible_width = width.i_int; fmt.i_height = fmt.i_visible_height = height.i_int; fmt.i_chroma = VLC_FOURCC('R','V','3','2'); @@ -172,12 +178,12 @@ static int Open( vlc_object_t *p_this ) { msg_Err( p_filter, "no suitable vout module" ); vlc_object_detach( p_thread ); - vlc_object_destroy( p_thread ); + vlc_object_release( p_thread ); free( p_sys ); return VLC_EGENERIC; } - vlc_mutex_init( p_filter, &p_thread->lock ); - vlc_cond_init( p_filter, &p_thread->wait ); + vlc_mutex_init( &p_thread->lock ); + vlc_cond_init( &p_thread->wait ); p_thread->i_blocks = 0; aout_DateInit( &p_thread->date, p_filter->output.i_rate ); @@ -187,15 +193,15 @@ static int Open( vlc_object_t *p_this ) p_thread->psz_title = TitleGet( VLC_OBJECT( p_filter ) ); if( vlc_thread_create( p_thread, "Goom Update Thread", Thread, - VLC_THREAD_PRIORITY_LOW, VLC_FALSE ) ) + VLC_THREAD_PRIORITY_LOW, false ) ) { msg_Err( p_filter, "cannot lauch goom thread" ); - vout_Destroy( p_thread->p_vout ); + vlc_object_release( p_thread->p_vout ); vlc_mutex_destroy( &p_thread->lock ); vlc_cond_destroy( &p_thread->wait ); - if( p_thread->psz_title ) free( p_thread->psz_title ); + free( p_thread->psz_title ); vlc_object_detach( p_thread ); - vlc_object_destroy( p_thread ); + vlc_object_release( p_thread ); free( p_sys ); return VLC_EGENERIC; } @@ -211,6 +217,8 @@ static int Open( vlc_object_t *p_this ) static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter, aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED( p_aout ); + aout_filter_sys_t *p_sys = p_filter->p_sys; block_t *p_block; @@ -309,7 +317,7 @@ static int FillBuffer( int16_t *p_data, int *pi_data, /***************************************************************************** * Thread: *****************************************************************************/ -static void Thread( vlc_object_t *p_this ) +static void* Thread( vlc_object_t *p_this ) { goom_thread_t *p_thread = (goom_thread_t*)p_this; vlc_value_t width, height, speed; @@ -317,6 +325,7 @@ static void Thread( vlc_object_t *p_this ) int16_t p_data[2][512]; int i_data = 0, i_count = 0; PluginInfo *p_plugin_info; + int canc = vlc_savecancel (); var_Get( p_this, "goom-width", &width ); var_Get( p_this, "goom-height", &height ); @@ -328,7 +337,7 @@ static void Thread( vlc_object_t *p_this ) p_plugin_info = goom_init( width.i_int, height.i_int ); - while( !p_thread->b_die ) + while( vlc_object_alive (p_thread) ) { uint32_t *plane; picture_t *p_pic; @@ -349,14 +358,11 @@ static void Thread( vlc_object_t *p_this ) plane = goom_update( p_plugin_info, p_data, 0, 0.0, p_thread->psz_title, NULL ); - if( p_thread->psz_title ) - { - free( p_thread->psz_title ); - p_thread->psz_title = NULL; - } + free( p_thread->psz_title ); + p_thread->psz_title = NULL; while( !( p_pic = vout_CreatePicture( p_thread->p_vout, 0, 0, 0 ) ) && - !p_thread->b_die ) + vlc_object_alive (p_thread) ) { msleep( VOUT_OUTMEM_SLEEP ); } @@ -370,6 +376,8 @@ static void Thread( vlc_object_t *p_this ) } goom_close( p_plugin_info ); + vlc_restorecancel (canc); + return NULL; } /***************************************************************************** @@ -381,7 +389,7 @@ static void Close( vlc_object_t *p_this ) aout_filter_sys_t *p_sys = p_filter->p_sys; /* Stop Goom Thread */ - p_sys->p_thread->b_die = VLC_TRUE; + vlc_object_kill( p_sys->p_thread ); vlc_mutex_lock( &p_sys->p_thread->lock ); vlc_cond_signal( &p_sys->p_thread->wait ); @@ -400,7 +408,7 @@ static void Close( vlc_object_t *p_this ) block_Release( p_sys->p_thread->pp_blocks[p_sys->p_thread->i_blocks] ); } - vlc_object_destroy( p_sys->p_thread ); + vlc_object_release( p_sys->p_thread ); free( p_sys ); } @@ -413,14 +421,12 @@ static char *TitleGet( vlc_object_t *p_this ) if( p_input ) { - if( input_GetItem(p_input)->p_meta->psz_title && - *input_GetItem(p_input)->p_meta->psz_title ) - { - psz_title = strdup( input_GetItem(p_input)->p_meta->psz_title ); - } - else + psz_title = input_item_GetTitle( input_GetItem( p_input ) ); + if( EMPTY_STR( psz_title ) ) { - char *psz = strrchr( input_GetItem(p_input)->psz_uri, '/' ); + free( psz_title ); + char *psz_orig = input_item_GetURI( input_GetItem( p_input ) ); + char *psz = strrchr( psz_orig, '/' ); if( psz ) { @@ -428,12 +434,13 @@ static char *TitleGet( vlc_object_t *p_this ) } else { - psz = input_GetItem(p_input)->psz_uri; + psz = psz_orig; } if( psz && *psz ) { psz_title = strdup( psz ); } + free( psz_orig ); } vlc_object_release( p_input ); }