[vlc-devel] [PATCH] sd: mediadirs: Discover using preparse instead of playback
Rémi Denis-Courmont
remi at remlab.net
Wed Jun 28 14:05:11 CEST 2017
Le 27 juin 2017 19:23:38 GMT+03:00, "Hugo Beauzée-Luyssen" <hugo at beauzee.fr> a écrit :
>---
>modules/services_discovery/mediadirs.c | 77
>++++++++++++++++++++++++++++++----
> 1 file changed, 70 insertions(+), 7 deletions(-)
>
>diff --git a/modules/services_discovery/mediadirs.c
>b/modules/services_discovery/mediadirs.c
>index 69ded2d63f..aaf0b2fe07 100644
>--- a/modules/services_discovery/mediadirs.c
>+++ b/modules/services_discovery/mediadirs.c
>@@ -98,19 +98,27 @@ vlc_module_end ()
> static void* Run( void* );
>
> static void input_subnode_added( const vlc_event_t*, void* );
>+static void input_preparse_ended( const vlc_event_t *p_event, void
>*user_data );
> static int onNewFileAdded( vlc_object_t*, char const *,
> vlc_value_t, vlc_value_t, void *);
>
>static enum type_e fileType( services_discovery_t *p_sd, const char*
>psz_file );
> static void formatSnapshotItem( input_item_t* );
>
>+#define NB_FOLDERS 2
>+
> struct services_discovery_sys_t
> {
> vlc_thread_t thread;
> enum type_e i_type;
>
>- char* psz_dir[2];
>+ char* psz_dir[NB_FOLDERS];
>+ input_item_t* p_items[NB_FOLDERS];
> const char* psz_var;
>+
>+ vlc_mutex_t lock;
>+ vlc_cond_t cond;
>+ unsigned int nb_folders_parsed;
> };
>
>/*****************************************************************************
>@@ -162,8 +170,13 @@ static int Open( vlc_object_t *p_this, enum type_e
>i_type )
>
>var_AddCallback( p_sd->obj.libvlc, p_sys->psz_var, onNewFileAdded, p_sd
>);
>
>+ vlc_mutex_init( &p_sys->lock );
>+ vlc_cond_init( &p_sys->cond );
>+ p_sys->nb_folders_parsed = 0;
> if( vlc_clone( &p_sys->thread, Run, p_sd, VLC_THREAD_PRIORITY_LOW ) )
> {
>+ vlc_cond_destroy( &p_sys->cond );
>+ vlc_mutex_destroy( &p_sys->lock );
>var_DelCallback( p_sd->obj.libvlc, p_sys->psz_var, onNewFileAdded, p_sd
>);
> free( p_sys->psz_dir[1] );
> free( p_sys->psz_dir[0] );
>@@ -181,9 +194,9 @@ static void *Run( void *data )
> {
> services_discovery_t *p_sd = data;
> services_discovery_sys_t *p_sys = p_sd->p_sys;
>+ unsigned int i_to_parse = 0;
>
>- int num_dir = sizeof( p_sys->psz_dir ) / sizeof( p_sys->psz_dir[0]
>);
>- for( int i = 0; i < num_dir; i++ )
>+ for( int i = 0; i < NB_FOLDERS; i++ )
> {
> char* psz_dir = p_sys->psz_dir[i];
>
>@@ -192,11 +205,14 @@ static void *Run( void *data )
> if( psz_dir == NULL ||
> vlc_stat( psz_dir, &st ) ||
> !S_ISDIR( st.st_mode ) )
>+ {
>+ p_sys->p_items[i] = NULL;
> continue;
>+ }
>
> char* psz_uri = vlc_path2uri( psz_dir, "file" );
>
>- input_item_t* p_root = input_item_New( psz_uri, NULL );
>+ input_item_t* p_root = p_sys->p_items[i] = input_item_New(
>psz_uri, NULL );
> if( p_sys->i_type == Picture )
> input_item_AddOption( p_root, "ignore-filetypes=ini,db,lnk,txt",
> VLC_INPUT_OPTION_TRUSTED );
>@@ -208,15 +224,35 @@ static void *Run( void *data )
> vlc_event_manager_t *p_em = &p_root->event_manager;
> vlc_event_attach( p_em, vlc_InputItemSubItemTreeAdded,
> input_subnode_added, p_sd );
>+ vlc_event_attach( p_em, vlc_InputItemPreparseEnded,
>+ input_preparse_ended, p_sd );
>+
>+ if ( libvlc_MetadataRequest( p_sd->obj.libvlc, p_root,
>+ META_REQUEST_OPTION_SCOPE_LOCAL |
>META_REQUEST_OPTION_DO_INTERACT,
>+ -1, p_sys->p_items[i] ) == VLC_SUCCESS )
>+ {
>+ ++i_to_parse;
>+ }
>+
>+ free( psz_uri );
>+ }
>
>- input_Read( p_sd, p_root );
>+ vlc_mutex_lock( &p_sys->lock );
>+ while ( i_to_parse > 0 && p_sys->nb_folders_parsed < i_to_parse )
>+ vlc_cond_wait( &p_sys->cond, &p_sys->lock );
>
>+ for( int i = 0; i < NB_FOLDERS; ++i )
>+ {
>+ if( p_sys->p_items[i] == NULL )
>+ continue;
>+ vlc_event_manager_t *p_em = &p_sys->p_items[i]->event_manager;
> vlc_event_detach( p_em, vlc_InputItemSubItemTreeAdded,
> input_subnode_added, p_sd );
>
>- input_item_Release( p_root );
>- free( psz_uri );
>+ input_item_Release( p_sys->p_items[i] );
>+ p_sys->p_items[i] = NULL;
> }
>+ vlc_mutex_unlock( &p_sys->lock );
>
> return NULL;
> }
>@@ -229,7 +265,23 @@ static void Close( vlc_object_t *p_this )
> services_discovery_t *p_sd = (services_discovery_t *)p_this;
> services_discovery_sys_t *p_sys = p_sd->p_sys;
>
>+ vlc_mutex_lock( &p_sys->lock );
>+ for ( int i = 0; i < NB_FOLDERS; ++i )
>+ {
>+ if( p_sys->p_items[i] != NULL )
>+ {
>+ /* This will synchronously cancel the preparse request,
>but will not
>+ * invoke the input_preparse_ended callback */
>+ libvlc_MetadataCancel( p_sd->obj.libvlc, p_sys->p_items[i]
>);
>+ p_sys->nb_folders_parsed++;
>+ }
>+ }
>+ vlc_mutex_unlock( &p_sys->lock );
>+ vlc_cond_signal( &p_sys->cond );
>+
> vlc_join( p_sys->thread, NULL );
>+ vlc_cond_destroy( &p_sys->cond );
>+ vlc_mutex_destroy( &p_sys->lock );
>
>var_DelCallback( p_sd->obj.libvlc, p_sys->psz_var, onNewFileAdded, p_sd
>);
>
>@@ -260,6 +312,17 @@ static void input_subnode_added( const vlc_event_t
>*p_event, void *user_data )
> }
> }
>
>+static void input_preparse_ended( const vlc_event_t *p_event, void
>*user_data )
>+{
>+ VLC_UNUSED( p_event );
>+ services_discovery_t* p_sd = user_data;
>+ services_discovery_sys_t *p_sys = p_sd->p_sys;
>+ vlc_mutex_lock( &p_sys->lock );
>+ ++p_sys->nb_folders_parsed;
>+ vlc_mutex_unlock( &p_sys->lock );
>+ vlc_cond_signal( &p_sys->cond );
>+}
>+
> static int onNewFileAdded( vlc_object_t *p_this, char const *psz_var,
> vlc_value_t oldval, vlc_value_t newval, void *p_data )
> {
>--
>2.11.0
>
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel
There are no reasons why the dir SD cannot look deeper than one level, at least not anymore. So this looks like a hack on top of an existing hack.
--
Rémi Denis-Courmont
Typed on an inconvenient virtual keyboard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20170628/15282a8d/attachment.html>
More information about the vlc-devel
mailing list