[vlc-devel] [RFC PATCH 1/7] input: add input_item_browsable_e to input_item

Thomas Guillem thomas at gllm.fr
Fri Mar 20 17:38:32 CET 2015


Automatically set to ITEM_BROWSABLE when the file type is a directory or a
playlist or during a parse if the demux return DEMUX_IS_PLAYLIST.

Add input_item_NewWithTypeExt function that can force input_item_browsable_e.
---
 include/vlc_input_item.h | 16 ++++++++++++++++
 src/input/input.c        |  6 ++++++
 src/input/item.c         | 28 +++++++++++++++++++++++++---
 src/libvlccore.sym       |  1 +
 4 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/include/vlc_input_item.h b/include/vlc_input_item.h
index 8502dd3..2a9b13f 100644
--- a/include/vlc_input_item.h
+++ b/include/vlc_input_item.h
@@ -85,6 +85,7 @@ struct input_item_t
     vlc_mutex_t lock;                 /**< Lock for the item */
 
     uint8_t     i_type;              /**< Type (file, disc, ... see input_item_type_e) */
+    uint8_t     i_browsable;         /**< Browsable (see input_item_browsable_e) */
     bool        b_error_when_reading;/**< Error When Reading */
 };
 
@@ -106,6 +107,13 @@ enum input_item_type_e
     ITEM_TYPE_NUMBER
 };
 
+enum input_item_browsable_e
+{
+    ITEM_BROWSABLE_UNKNOWN,
+    ITEM_BROWSABLE,
+    ITEM_NOT_BROWSABLE,
+};
+
 struct input_item_node_t
 {
     input_item_t *         p_item;
@@ -258,6 +266,14 @@ VLC_API input_item_t * input_item_NewWithType( const char *psz_uri, const char *
 /**
  * This function creates a new input_item_t with the provided information.
  *
+ * XXX You may also use input_item_New, input_item_NewExt, or
+ * input_item_NewWithType as they need less arguments.
+ */
+VLC_API input_item_t * input_item_NewWithTypeExt( const char *psz_uri, const char *psz_name, int i_options, const char *const *ppsz_options, unsigned i_option_flags, mtime_t i_duration, int i_type, int i_browsable ) VLC_USED;
+
+/**
+ * This function creates a new input_item_t with the provided information.
+ *
  * Provided for convenience.
  */
 VLC_API input_item_t * input_item_NewExt( const char *psz_uri, const char *psz_name, int i_options, const char *const *ppsz_options, unsigned i_option_flags, mtime_t i_duration ) VLC_USED;
diff --git a/src/input/input.c b/src/input/input.c
index 7de30ec..98f3567 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -202,7 +202,13 @@ int input_Preparse( vlc_object_t *p_parent, input_item_t *p_item )
                             &b_is_playlist ) )
             b_is_playlist = false;
         if( b_is_playlist )
+        {
+            vlc_mutex_lock( &p_input->p->p_item->lock );
+            p_input->p->p_item->i_browsable = ITEM_BROWSABLE;
+            vlc_mutex_unlock( &p_input->p->p_item->lock );
+
             MainLoop( p_input, false );
+        }
         End( p_input );
     }
 
diff --git a/src/input/item.c b/src/input/item.c
index 76fc818..c3c3de8 100644
--- a/src/input/item.c
+++ b/src/input/item.c
@@ -831,9 +831,10 @@ input_item_t *input_item_NewExt( const char *psz_uri,
 
 
 input_item_t *
-input_item_NewWithType( const char *psz_uri, const char *psz_name,
-                        int i_options, const char *const *ppsz_options,
-                        unsigned flags, mtime_t duration, int type )
+input_item_NewWithTypeExt( const char *psz_uri, const char *psz_name,
+                           int i_options, const char *const *ppsz_options,
+                           unsigned flags, mtime_t duration, int type,
+                           int browsable )
 {
     static atomic_uint last_input_id = ATOMIC_VAR_INIT(0);
 
@@ -885,10 +886,31 @@ input_item_NewWithType( const char *psz_uri, const char *psz_name,
 
     if( type != ITEM_TYPE_UNKNOWN )
         p_input->i_type = type;
+    if( browsable == ITEM_BROWSABLE_UNKNOWN )
+    {
+        if( p_input->i_type == ITEM_TYPE_DIRECTORY
+            || p_input->i_type == ITEM_TYPE_PLAYLIST )
+            p_input->i_browsable = ITEM_BROWSABLE;
+        else if( p_input->i_type == ITEM_TYPE_FILE )
+            p_input->i_browsable = ITEM_NOT_BROWSABLE;
+        else
+            p_input->i_browsable = ITEM_BROWSABLE_UNKNOWN;
+    } else
+        p_input->i_browsable = browsable;
     p_input->b_error_when_reading = false;
     return p_input;
 }
 
+input_item_t *
+input_item_NewWithType( const char *psz_uri, const char *psz_name,
+                        int i_options, const char *const *ppsz_options,
+                        unsigned flags, mtime_t duration, int type )
+{
+    return input_item_NewWithTypeExt( psz_uri, psz_name, i_options,
+                                      ppsz_options, flags, duration, type,
+                                      ITEM_BROWSABLE_UNKNOWN );
+}
+
 input_item_t *input_item_Copy( input_item_t *p_input )
 {
     vlc_mutex_lock( &p_input->lock );
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 13427ba..c7d40fb 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -197,6 +197,7 @@ input_item_MetaMatch
 input_item_MergeInfos
 input_item_NewExt
 input_item_NewWithType
+input_item_NewWithTypeExt
 input_item_Hold
 input_item_Release
 input_item_node_AppendItem
-- 
2.1.3




More information about the vlc-devel mailing list