vlc | branch: master | Thomas Guillem <[email protected]> | Fri May 31 14:18:59 2019 +0200| [7b939a6d39b1030affaf0f806fd564d053f032bf] | committer: Thomas Guillem
fingerprinter: use vlc_player And remove now useless processing.lock. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7b939a6d39b1030affaf0f806fd564d053f032bf --- modules/misc/fingerprinter.c | 99 ++++++++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 40 deletions(-) diff --git a/modules/misc/fingerprinter.c b/modules/misc/fingerprinter.c index 9bdd06b91b..0481afb9ce 100644 --- a/modules/misc/fingerprinter.c +++ b/modules/misc/fingerprinter.c @@ -30,7 +30,7 @@ #include <vlc_meta.h> #include <vlc_url.h> -#include <vlc_input.h> +#include <vlc_player.h> #include <vlc_fingerprinter.h> #include "webservices/acoustid.h" #include "../stream_out/chromaprint_data.h" @@ -42,6 +42,8 @@ struct fingerprinter_sys_t { vlc_thread_t thread; + vlc_player_t *player; + vlc_player_listener_id *listener_id; struct { @@ -128,20 +130,16 @@ static void ApplyResult( fingerprint_request_t *p_r, size_t i_resultid ) vlc_mutex_unlock( &p_item->lock ); } -static void InputEvent( input_thread_t *p_input, - const struct vlc_input_event *p_event, void *p_user_data ) +static void player_on_state_changed(vlc_player_t *player, + enum vlc_player_state new_state, + void *p_user_data) { - VLC_UNUSED( p_input ); + VLC_UNUSED(player); fingerprinter_sys_t *p_sys = p_user_data; - if( p_event->type == INPUT_EVENT_STATE ) + if (new_state == VLC_PLAYER_STATE_STOPPED) { - if( p_event->state >= PAUSE_S ) - { - vlc_mutex_lock( &p_sys->processing.lock ); - p_sys->processing.b_working = false; - vlc_cond_signal( &p_sys->processing.cond ); - vlc_mutex_unlock( &p_sys->processing.lock ); - } + p_sys->processing.b_working = false; + vlc_cond_signal( &p_sys->processing.cond ); } } @@ -167,8 +165,6 @@ static void DoFingerprint( fingerprinter_thread_t *p_fingerprinter, input_item_AddOption( p_item, psz_sout_option, VLC_INPUT_OPTION_TRUSTED ); free( psz_sout_option ); - input_item_AddOption( p_item, "vout=dummy", VLC_INPUT_OPTION_TRUSTED ); - input_item_AddOption( p_item, "aout=dummy", VLC_INPUT_OPTION_TRUSTED ); if ( fp->i_duration ) { if ( asprintf( &psz_sout_option, "stop-time=%u", fp->i_duration ) == -1 ) @@ -181,39 +177,36 @@ static void DoFingerprint( fingerprinter_thread_t *p_fingerprinter, } input_item_SetURI( p_item, psz_uri ) ; - input_thread_t *p_input = input_Create( p_fingerprinter, InputEvent, - p_fingerprinter->p_sys, - p_item, NULL, NULL ); - input_item_Release( p_item ); - - if( p_input == NULL ) - return; - chromaprint_fingerprint_t chroma_fingerprint; chroma_fingerprint.psz_fingerprint = NULL; chroma_fingerprint.i_duration = fp->i_duration; - var_Create( p_input, "fingerprint-data", VLC_VAR_ADDRESS ); - var_SetAddress( p_input, "fingerprint-data", &chroma_fingerprint ); + var_Create( p_fingerprinter, "fingerprint-data", VLC_VAR_ADDRESS ); + var_SetAddress( p_fingerprinter, "fingerprint-data", &chroma_fingerprint ); + + vlc_player_t *player = p_fingerprinter->p_sys->player; + vlc_player_Lock(player); - if( input_Start( p_input ) != VLC_SUCCESS ) - input_Close( p_input ); - else + p_fingerprinter->p_sys->processing.b_working = true; + + int ret = vlc_player_SetCurrentMedia(player, p_item); + if (ret == VLC_SUCCESS) + ret = vlc_player_Start(player); + input_item_Release(p_item); + + if (ret == VLC_SUCCESS) { - p_fingerprinter->p_sys->processing.b_working = true; while( p_fingerprinter->p_sys->processing.b_working ) - { - vlc_cond_wait( &p_fingerprinter->p_sys->processing.cond, - &p_fingerprinter->p_sys->processing.lock ); - } - input_Stop( p_input ); - input_Close( p_input ); + vlc_player_CondWait(player, + &p_fingerprinter->p_sys->processing.cond); fp->psz_fingerprint = chroma_fingerprint.psz_fingerprint; if( !fp->i_duration ) /* had not given hint */ fp->i_duration = chroma_fingerprint.i_duration; } + + vlc_player_Unlock(player); } /***************************************************************************** @@ -229,11 +222,37 @@ static int Open(vlc_object_t *p_this) p_fingerprinter->p_sys = p_sys; + var_Create(p_fingerprinter, "vout", VLC_VAR_STRING); + var_SetString(p_fingerprinter, "vout", "dummy"); + var_Create(p_fingerprinter, "aout", VLC_VAR_STRING); + var_SetString(p_fingerprinter, "aout", "dummy"); + p_sys->player = vlc_player_New(VLC_OBJECT(p_fingerprinter), + VLC_PLAYER_LOCK_NORMAL, NULL, NULL ); + if (!p_sys->player) + { + free(p_sys); + return VLC_ENOMEM; + } + + static const struct vlc_player_cbs cbs = { + .on_state_changed = player_on_state_changed, + }; + + vlc_player_Lock(p_sys->player); + p_sys->listener_id = + vlc_player_AddListener(p_sys->player, &cbs, p_fingerprinter->p_sys); + vlc_player_Unlock(p_sys->player); + if (!p_sys->listener_id) + { + vlc_player_Delete(p_sys->player); + free(p_sys); + return VLC_ENOMEM; + } + vlc_array_init( &p_sys->incoming.queue ); vlc_mutex_init( &p_sys->incoming.lock ); vlc_array_init( &p_sys->processing.queue ); - vlc_mutex_init( &p_sys->processing.lock ); vlc_cond_init( &p_sys->processing.cond ); vlc_array_init( &p_sys->results.queue ); @@ -284,13 +303,17 @@ static void CleanSys( fingerprinter_sys_t *p_sys ) for ( size_t i = 0; i < vlc_array_count( &p_sys->processing.queue ); i++ ) fingerprint_request_Delete( vlc_array_item_at_index( &p_sys->processing.queue, i ) ); vlc_array_clear( &p_sys->processing.queue ); - vlc_mutex_destroy( &p_sys->processing.lock ); vlc_cond_destroy( &p_sys->processing.cond ); for ( size_t i = 0; i < vlc_array_count( &p_sys->results.queue ); i++ ) fingerprint_request_Delete( vlc_array_item_at_index( &p_sys->results.queue, i ) ); vlc_array_clear( &p_sys->results.queue ); vlc_mutex_destroy( &p_sys->results.lock ); + + vlc_player_Lock(p_sys->player); + vlc_player_RemoveListener(p_sys->player, p_sys->listener_id); + vlc_player_Unlock(p_sys->player); + vlc_player_Delete(p_sys->player); } static void fill_metas_with_results( fingerprint_request_t *p_r, acoustid_fingerprint_t *p_f ) @@ -322,9 +345,6 @@ static void *Run( void *opaque ) fingerprinter_thread_t *p_fingerprinter = opaque; fingerprinter_sys_t *p_sys = p_fingerprinter->p_sys; - vlc_mutex_lock( &p_sys->processing.lock ); - mutex_cleanup_push( &p_sys->processing.lock ); - /* main loop */ for (;;) { @@ -388,6 +408,5 @@ static void *Run( void *opaque ) } } - vlc_cleanup_pop(); vlc_assert_unreachable(); } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
