[vlc-devel] [PATCHv3 5/7] lib: media: refactor input_item creation

Thomas Guillem thomas at gllm.fr
Tue Sep 22 14:09:56 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