[vlc-devel] [PATCH 1/9] input: change input_Read arguments
Thomas Guillem
thomas at gllm.fr
Wed Jun 1 13:24:44 CEST 2016
Users will have more control when they need to read an input synchronously.
They'll be able to interrupt it from an other thread for example.
---
include/vlc_input.h | 3 +-
lib/media_list.c | 9 ++++-
modules/services_discovery/mediadirs.c | 7 +++-
src/input/input.c | 72 ++++++++++++++++++++--------------
src/playlist/loadsave.c | 15 ++++++-
5 files changed, 70 insertions(+), 36 deletions(-)
diff --git a/include/vlc_input.h b/include/vlc_input.h
index 7633e9d..f72f8d2 100644
--- a/include/vlc_input.h
+++ b/include/vlc_input.h
@@ -509,8 +509,7 @@ VLC_API int input_Start( input_thread_t * );
VLC_API void input_Stop( input_thread_t * );
-VLC_API int input_Read( vlc_object_t *, input_item_t * );
-#define input_Read(a,b) input_Read(VLC_OBJECT(a),b)
+VLC_API int input_Read( input_thread_t *, bool );
VLC_API int input_vaControl( input_thread_t *, int i_query, va_list );
diff --git a/lib/media_list.c b/lib/media_list.c
index 82fee60..7d8737c 100644
--- a/lib/media_list.c
+++ b/lib/media_list.c
@@ -267,7 +267,14 @@ libvlc_media_list_add_file_content( libvlc_media_list_t * p_mlist,
return -1;
}
- input_Read( p_mlist->p_libvlc_instance->p_libvlc_int, p_input_item );
+ input_thread_t *p_input =
+ input_Create( p_mlist->p_libvlc_instance->p_libvlc_int, p_input_item,
+ NULL, NULL );
+ if( p_input != NULL )
+ {
+ input_Read( p_input, false );
+ input_Close( p_input );
+ }
return 0;
}
diff --git a/modules/services_discovery/mediadirs.c b/modules/services_discovery/mediadirs.c
index 0d1c262..957daa5 100644
--- a/modules/services_discovery/mediadirs.c
+++ b/modules/services_discovery/mediadirs.c
@@ -205,7 +205,12 @@ static void *Run( void *data )
vlc_event_attach( p_em, vlc_InputItemSubItemAdded,
input_item_subitem_added, p_sd );
- input_Read( p_sd, p_root );
+ input_thread_t *p_input = input_Create( p_sd, p_root, NULL, NULL );
+ if( p_input != NULL )
+ {
+ input_Read( p_input, false );
+ input_Close( p_input );
+ }
vlc_event_detach( p_em, vlc_InputItemSubItemAdded,
input_item_subitem_added, p_sd );
diff --git a/src/input/input.c b/src/input/input.c
index 5307203..effca97 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -55,8 +55,8 @@
/*****************************************************************************
* Local prototypes
*****************************************************************************/
-static void *Run( void * );
-static void *Preparse( void * );
+static void Run( input_thread_t * );
+static void Preparse( input_thread_t * );
static input_thread_t * Create ( vlc_object_t *, input_item_t *,
const char *, bool, input_resource_t * );
@@ -126,27 +126,29 @@ input_thread_t *input_Create( vlc_object_t *p_parent,
return Create( p_parent, p_item, psz_log, false, p_resource );
}
-#undef input_Read
/**
- * Initialize an input thread and run it until it stops by itself.
+ * Read a input_thread_t created by input_Create() or input_CreatePreparser().
*
- * \param p_parent a vlc_object
- * \param p_item an input item
+ * The read is executed in the current thread and is blockling. This function
+ * can be interrupted with input_Stop()
+ *
+ * \param the input thread to read
+ * \param true if the interrupt context is handled by the input_thead_t
* \return an error code, VLC_SUCCESS on success
*/
-int input_Read( vlc_object_t *p_parent, input_item_t *p_item )
+int input_Read( input_thread_t *p_input, bool b_interrupt )
{
- input_thread_t *p_input = Create( p_parent, p_item, NULL, false, NULL );
- if( !p_input )
- return VLC_EGENERIC;
+ if( b_interrupt )
+ vlc_interrupt_set(&p_input->p->interrupt);
- if( !Init( p_input ) )
- {
- MainLoop( p_input, false );
- End( p_input );
- }
+ if( p_input->b_preparsing )
+ Preparse( p_input );
+ else
+ Run( p_input );
+
+ if( b_interrupt )
+ vlc_interrupt_set( NULL );
- vlc_object_release( p_input );
return VLC_SUCCESS;
}
@@ -156,6 +158,26 @@ input_thread_t *input_CreatePreparser( vlc_object_t *parent,
return Create( parent, item, NULL, true, NULL );
}
+static void *ThreadRun( void *obj )
+{
+ input_thread_t *p_input = (input_thread_t *)obj;
+
+ vlc_interrupt_set(&p_input->p->interrupt);
+
+ Run( p_input );
+ return NULL;
+}
+
+static void *ThreadPreparse( void *obj )
+{
+ input_thread_t *p_input = (input_thread_t *)obj;
+
+ vlc_interrupt_set(&p_input->p->interrupt);
+
+ Preparse( p_input );
+ return NULL;
+}
+
/**
* Start a input_thread_t created by input_Create.
*
@@ -165,10 +187,10 @@ input_thread_t *input_CreatePreparser( vlc_object_t *parent,
*/
int input_Start( input_thread_t *p_input )
{
- void *(*func)(void *) = Run;
+ void *(*func)(void *) = ThreadRun;
if( p_input->b_preparsing )
- func = Preparse;
+ func = ThreadPreparse;
assert( !p_input->p->is_running );
/* Create thread and wait for its readiness. */
@@ -471,12 +493,8 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
* This is the "normal" thread that spawns the input processing chain,
* reads the stream, cleans up and waits
*****************************************************************************/
-static void *Run( void *obj )
+static void Run( input_thread_t *p_input )
{
- input_thread_t *p_input = (input_thread_t *)obj;
-
- vlc_interrupt_set(&p_input->p->interrupt);
-
if( !Init( p_input ) )
{
if( p_input->p->b_can_pace_control && p_input->p->b_out_pace_control )
@@ -493,15 +511,10 @@ static void *Run( void *obj )
}
input_SendEventDead( p_input );
- return NULL;
}
-static void *Preparse( void *obj )
+static void Preparse( input_thread_t *p_input )
{
- input_thread_t *p_input = (input_thread_t *)obj;
-
- vlc_interrupt_set(&p_input->p->interrupt);
-
if( !Init( p_input ) )
{ /* if the demux is a playlist, call Mainloop that will call
* demux_Demux in order to fetch sub items */
@@ -518,7 +531,6 @@ static void *Preparse( void *obj )
}
input_SendEventDead( p_input );
- return NULL;
}
bool input_Stopped( input_thread_t *input )
diff --git a/src/playlist/loadsave.c b/src/playlist/loadsave.c
index adbc92d..e5754a3 100644
--- a/src/playlist/loadsave.c
+++ b/src/playlist/loadsave.c
@@ -88,6 +88,17 @@ out:
return ret;
}
+static int item_Read( vlc_object_t *p_parent, input_item_t *p_item )
+{
+ input_thread_t *p_input = input_Create( p_parent, p_item, NULL, NULL );
+ if( p_input == NULL )
+ return VLC_EGENERIC;
+
+ input_Read( p_input, false );
+ input_Close( p_input );
+ return VLC_SUCCESS;
+}
+
int playlist_Import( playlist_t *p_playlist, const char *psz_file )
{
input_item_t *p_input;
@@ -105,7 +116,7 @@ int playlist_Import( playlist_t *p_playlist, const char *psz_file )
vlc_object_t *dummy = vlc_object_create( p_playlist, sizeof (*dummy) );
var_Create( dummy, "meta-file", VLC_VAR_VOID );
- int ret = input_Read( dummy, p_input );
+ int ret = item_Read( dummy, p_input );
vlc_object_release( dummy );
return ret;
@@ -175,7 +186,7 @@ int playlist_MLLoad( playlist_t *p_playlist )
vlc_object_t *dummy = vlc_object_create( p_playlist, sizeof (*dummy) );
var_Create( dummy, "meta-file", VLC_VAR_VOID );
- input_Read( dummy, p_input );
+ item_Read( dummy, p_input );
vlc_object_release( dummy );
vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemTreeAdded,
--
2.8.1
More information about the vlc-devel
mailing list