From c3346925c8e18305abb6a7fed8557bdb61be7998 Mon Sep 17 00:00:00 2001 From: Thomas Guillem Date: Fri, 4 Oct 2024 14:39:09 +0200 Subject: [PATCH] preparser: configure threads and timeout externally --- include/vlc_preparser.h | 6 +++++- src/libvlc.c | 12 +++++++++++- src/preparser/preparser.c | 15 ++++++--------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/include/vlc_preparser.h b/include/vlc_preparser.h index f29a4db8d6..aa7319c23e 100644 --- a/include/vlc_preparser.h +++ b/include/vlc_preparser.h @@ -81,9 +81,13 @@ struct vlc_metadata_cbs { * This function creates the preparser object and thread. * * @param obj the parent object + * @param max_threads the maximum number of threads used to parse, must be >= 1 + * @param default_timeout default timeout of the preparser, 0 for no limits. * @return a valid preparser object or NULL in case of error */ -VLC_API vlc_preparser_t *vlc_preparser_New( vlc_object_t *obj ); +VLC_API vlc_preparser_t *vlc_preparser_New( vlc_object_t *obj, + unsigned max_threads, + vlc_tick_t default_timeout ); /** * This function enqueues the provided item to be preparsed or fetched. diff --git a/src/libvlc.c b/src/libvlc.c index 8b58d8b062..503a466fd7 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -235,7 +235,17 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* * Meta data handling */ - priv->parser = vlc_preparser_New(VLC_OBJECT(p_libvlc)); + + int max_threads = var_InheritInteger(p_libvlc, "preparse-threads"); + if (max_threads < 1) + max_threads = 1; + + vlc_tick_t default_timeout = + VLC_TICK_FROM_MS(var_InheritInteger(p_libvlc, "preparse-timeout")); + if (default_timeout < 0) + default_timeout = 0; + priv->parser = vlc_preparser_New(VLC_OBJECT(p_libvlc), max_threads, + default_timeout); if( !priv->parser ) goto error; diff --git a/src/preparser/preparser.c b/src/preparser/preparser.c index 86db70d4f2..3fac9eb582 100644 --- a/src/preparser/preparser.c +++ b/src/preparser/preparser.c @@ -314,16 +314,16 @@ Interrupt(struct task *task) vlc_sem_post(&task->preparse_ended); } -vlc_preparser_t* vlc_preparser_New( vlc_object_t *parent ) +vlc_preparser_t* vlc_preparser_New( vlc_object_t *parent, unsigned max_threads, + vlc_tick_t default_timeout ) { + assert(max_threads >= 1); + assert(default_timeout >= 0); + vlc_preparser_t* preparser = malloc( sizeof *preparser ); if (!preparser) return NULL; - int max_threads = var_InheritInteger(parent, "preparse-threads"); - if (max_threads < 1) - max_threads = 1; - preparser->executor = vlc_executor_New(max_threads); if (!preparser->executor) { @@ -331,10 +331,7 @@ vlc_preparser_t* vlc_preparser_New( vlc_object_t *parent ) return NULL; } - preparser->default_timeout = - VLC_TICK_FROM_MS(var_InheritInteger(parent, "preparse-timeout")); - if (preparser->default_timeout < 0) - preparser->default_timeout = 0; + preparser->default_timeout = default_timeout; preparser->owner = parent; preparser->fetcher = input_fetcher_New( parent );