[vlc-devel] [PATCH 3/5] lib: media: refactor input_item creation
Thomas Guillem
thomas at gllm.fr
Mon Sep 21 14:53:57 CEST 2020
In order to create the input_item_t after the libvlc_media_t instance.
Cf. next commits.
---
lib/media.c | 92 +++++++++++++++++++++++++++++------------------------
1 file changed, 50 insertions(+), 42 deletions(-)
diff --git a/lib/media.c b/lib/media.c
index e4c0909c165..0c1a58be8cd 100644
--- a/lib/media.c
+++ b/lib/media.c
@@ -441,24 +441,10 @@ static void uninstall_input_item_observer( libvlc_media_t *p_md )
p_md );
}
-/**
- * \internal
- * Create a new media descriptor object from an input_item (Private)
- *
- * That's the generic constructor
- */
-libvlc_media_t * libvlc_media_new_from_input_item(
- libvlc_instance_t *p_instance,
- input_item_t *p_input_item )
+static libvlc_media_t * libvlc_media_new( libvlc_instance_t *p_instance )
{
libvlc_media_t * p_md;
- if (!p_input_item)
- {
- libvlc_printerr( "No input item given" );
- return NULL;
- }
-
p_md = calloc( 1, sizeof(libvlc_media_t) );
if( !p_md )
{
@@ -467,7 +453,6 @@ libvlc_media_t * libvlc_media_new_from_input_item(
}
p_md->p_libvlc_instance = p_instance;
- p_md->p_input_item = p_input_item;
p_md->i_refcount = 1;
vlc_cond_init(&p_md->parsed_cond);
@@ -482,35 +467,62 @@ libvlc_media_t * libvlc_media_new_from_input_item(
libvlc_event_manager_init( &p_md->event_manager, p_md );
- input_item_Hold( p_md->p_input_item );
+ libvlc_retain( p_instance );
+ return p_md;
+}
+static libvlc_media_t *
+libvlc_media_attach_input_item( libvlc_media_t *p_md, input_item_t *p_input_item )
+{
+ if( p_input_item == NULL )
+ {
+ libvlc_event_manager_destroy( &p_md->event_manager );
+ libvlc_release( p_md->p_libvlc_instance );
+ free( p_md );
+ return NULL;
+ }
+
+ p_md->p_input_item = p_input_item;
install_input_item_observer( p_md );
- libvlc_retain( p_instance );
return p_md;
}
-// Create a media with a certain given media resource location
-libvlc_media_t *libvlc_media_new_location( libvlc_instance_t *p_instance,
- const char * psz_mrl )
+static libvlc_media_t *
+libvlc_media_create_input_item( libvlc_media_t *p_md, const char *uri, const char *name )
{
- input_item_t * p_input_item;
- libvlc_media_t * p_md;
-
- p_input_item = input_item_New( psz_mrl, NULL );
+ input_item_t *p_input_item =
+ input_item_NewExt( uri, name, INPUT_DURATION_UNSET,
+ ITEM_TYPE_UNKNOWN, ITEM_NET_UNKNOWN, NULL );
+ return libvlc_media_attach_input_item( p_md, p_input_item );
+}
- if (!p_input_item)
- {
- libvlc_printerr( "Not enough memory" );
+/**
+ * \internal
+ * Create a new media descriptor object from an input_item (Private)
+ *
+ * That's the generic constructor
+ */
+libvlc_media_t * libvlc_media_new_from_input_item(
+ libvlc_instance_t *p_instance,
+ input_item_t *p_input_item )
+{
+ libvlc_media_t *p_md = libvlc_media_new( p_instance );
+ if( p_md == NULL )
return NULL;
- }
- p_md = libvlc_media_new_from_input_item( p_instance, p_input_item );
+ return libvlc_media_attach_input_item( p_md, p_input_item );
+}
- /* The p_input_item is retained in libvlc_media_new_from_input_item */
- input_item_Release( p_input_item );
+// Create a media with a certain given media resource location
+libvlc_media_t *libvlc_media_new_location( libvlc_instance_t *p_instance,
+ const char * psz_mrl )
+{
+ libvlc_media_t * p_md = libvlc_media_new( p_instance );
- return p_md;
+ if( p_md != NULL )
+ return libvlc_media_create_input_item( p_md, psz_mrl, NULL );
+ return NULL;
}
// Create a media for a certain file path
@@ -563,20 +575,16 @@ libvlc_media_t *libvlc_media_new_callbacks(libvlc_instance_t *p_instance,
libvlc_media_t * libvlc_media_new_as_node( libvlc_instance_t *p_instance,
const char * psz_name )
{
- input_item_t * p_input_item;
libvlc_media_t * p_md;
libvlc_media_list_t * p_subitems;
- p_input_item = input_item_New( INPUT_ITEM_URI_NOP, psz_name );
-
- if (!p_input_item)
- {
- libvlc_printerr( "Not enough memory" );
+ p_md = libvlc_media_new( p_instance );
+ if( p_md == NULL )
return NULL;
- }
- p_md = libvlc_media_new_from_input_item( p_instance, p_input_item );
- input_item_Release( p_input_item );
+ p_md = libvlc_media_create_input_item( p_md, INPUT_ITEM_URI_NOP, psz_name );
+ if( p_md == NULL )
+ return NULL;
p_subitems = media_get_subitems( p_md, true );
if( p_subitems == NULL) {
--
2.28.0
More information about the vlc-devel
mailing list