[vlc-commits] [Git][videolan/vlc][master] 4 commits: event: return if the event is handled from `input_SendEvent`

Jean-Baptiste Kempf (@jbk) gitlab at videolan.org
Sun May 11 09:41:25 UTC 2025



Jean-Baptiste Kempf pushed to branch master at VideoLAN / VLC


Commits:
7d10552b by Gabriel Lafond Thenaille at 2025-05-11T09:27:17+00:00
event: return if the event is handled from `input_SendEvent`

- - - - -
43484fde by Gabriel Lafond Thenaille at 2025-05-11T09:27:17+00:00
player: change `on_media_subitems_changed` callbacks argument type

 * change `vlc_player_cbs::on_media_subitems_changed` callback argument
   type from `input_item_node_t *` to `const input_item_node_t *`.

- - - - -
2fd6b37e by Gabriel Lafond Thenaille at 2025-05-11T09:27:17+00:00
parser: transfer the ownership of the item_item_node_t to the listener

Two callbacks are triggered with the event INPUT_EVENT_SUBITEMS:

 * `input_item_parser_cbs_t::on_subtree_added`, which transfers
   ownership to its listener.

 * `vlc_player_cbs::on_media_subitems_changed`, which sends a
   `const input_item_node_t` to its listeners and then frees the node.

- - - - -
005aa763 by Gabriel Lafond Thenaille at 2025-05-11T09:27:17+00:00
media_tree: use the `input_item_node` insteed of copying it

- - - - -


20 changed files:

- include/vlc_input_item.h
- include/vlc_player.h
- lib/media.c
- lib/media_internal.h
- lib/media_player.c
- modules/gui/macosx/library/VLCInputItem.m
- modules/gui/qt/player/player_controller.cpp
- modules/misc/medialibrary/MetadataExtractor.cpp
- modules/misc/medialibrary/fs/directory.cpp
- src/input/es_out.c
- src/input/event.h
- src/input/input_internal.h
- src/input/parse.c
- src/media_source/media_tree.c
- src/player/input.c
- src/playlist/player.c
- src/playlist/preparse.c
- src/playlist/preparse.h
- src/preparser/preparser.c
- test/src/player/player.c


Changes:

=====================================
include/vlc_input_item.h
=====================================
@@ -446,7 +446,7 @@ typedef struct input_item_parser_cbs_t
      * @note This callback is optional.
      *
      * @param item the parsed item
-     * @param subtree sub items of the current item
+     * @param subtree sub items of the current item (the listener gets the ownership)
      * @param userdata user data set by input_item_Parse()
      */
     void (*on_subtree_added)(input_item_t *item, input_item_node_t *subtree, void *userdata);


=====================================
include/vlc_player.h
=====================================
@@ -3191,7 +3191,7 @@ struct vlc_player_cbs
      * @param data opaque pointer set by vlc_player_AddListener()
      */
     void (*on_media_subitems_changed)(vlc_player_t *player,
-        input_item_t *media, input_item_node_t *new_subitems, void *data);
+        input_item_t *media, const input_item_node_t *new_subitems, void *data);
 
     /**
      * Called when new attachments are added to the media


=====================================
lib/media.c
=====================================
@@ -130,12 +130,12 @@ static libvlc_media_t *input_item_add_subitem( libvlc_media_t *p_md,
 struct vlc_item_list
 {
     struct vlc_list node;
-    input_item_node_t *item;
+    const input_item_node_t *item;
     libvlc_media_t *media;
 };
 
 static struct vlc_item_list *
-wrap_item_in_list( libvlc_media_t *media, input_item_node_t *item )
+wrap_item_in_list( libvlc_media_t *media, const input_item_node_t *item )
 {
     struct vlc_item_list *node = malloc( sizeof *node );
     if( node == NULL )
@@ -146,7 +146,7 @@ wrap_item_in_list( libvlc_media_t *media, input_item_node_t *item )
 }
 
 static void input_item_add_subnode( libvlc_media_t *md,
-                                    input_item_node_t *root )
+                                    const input_item_node_t *root )
 {
     struct vlc_list list;
     vlc_list_init( &list );
@@ -225,9 +225,10 @@ static void input_item_subtree_added(input_item_t *item,
     VLC_UNUSED(item);
     libvlc_media_t * p_md = user_data;
     libvlc_media_add_subtree(p_md, node);
+    input_item_node_Delete(node);
 }
 
-void libvlc_media_add_subtree(libvlc_media_t *p_md, input_item_node_t *node)
+void libvlc_media_add_subtree(libvlc_media_t *p_md, const input_item_node_t *node)
 {
     input_item_add_subnode( p_md, node );
 


=====================================
lib/media_internal.h
=====================================
@@ -55,7 +55,7 @@ struct libvlc_media_t
 /* Media Descriptor */
 libvlc_media_t * libvlc_media_new_from_input_item( input_item_t * );
 
-void libvlc_media_add_subtree(libvlc_media_t *, input_item_node_t *);
+void libvlc_media_add_subtree(libvlc_media_t *, const input_item_node_t *);
 
 static inline enum es_format_category_e
 libvlc_track_type_to_escat( libvlc_track_type_t i_type )


=====================================
lib/media_player.c
=====================================
@@ -462,7 +462,7 @@ on_media_meta_changed(vlc_player_t *player, input_item_t *media, void *data)
 
 static void
 on_media_subitems_changed(vlc_player_t *player, input_item_t *media,
-                          input_item_node_t *new_subitems, void *data)
+                          const input_item_node_t *new_subitems, void *data)
 {
     (void) player;
 


=====================================
modules/gui/macosx/library/VLCInputItem.m
=====================================
@@ -63,6 +63,7 @@ static void cb_subtree_added(input_item_t *p_item, input_item_node_t *p_node, vo
         VLCInputItem *inputItem = (__bridge VLCInputItem *)p_data;
         [inputItem subTreeAdded:p_node];
     });
+    input_item_node_Delete(p_node);
 }
 
 static const struct input_item_parser_cbs_t parserCallbacks =


=====================================
modules/gui/qt/player/player_controller.cpp
=====================================
@@ -784,7 +784,7 @@ static void on_player_media_epg_changed(vlc_player_t *, input_item_t *, void *da
     });
 }
 
-static void on_player_subitems_changed(vlc_player_t *, input_item_t *, input_item_node_t *, void *data)
+static void on_player_subitems_changed(vlc_player_t *, input_item_t *, const input_item_node_t *, void *data)
 {
     PlayerControllerPrivate* that = static_cast<PlayerControllerPrivate*>(data);
     msg_Dbg( that->p_intf, "on_player_subitems_changed");


=====================================
modules/misc/medialibrary/MetadataExtractor.cpp
=====================================
@@ -188,6 +188,7 @@ void MetadataExtractor::onParserSubtreeAdded( input_item_t *,
 {
     auto* ctx = static_cast<ParseContext*>( data );
     ctx->mde->addSubtree( *ctx, subtree );
+    input_item_node_Delete(subtree);
 }
 
 void MetadataExtractor::onAttachmentsAdded( input_item_t *,


=====================================
modules/misc/medialibrary/fs/directory.cpp
=====================================
@@ -147,6 +147,7 @@ static void onParserSubtreeAdded( input_item_t *, input_item_node_t *subtree,
         input_item_t* media = child->p_item;
         req->children->emplace_back( media );
     }
+    input_item_node_Delete(subtree);
 }
 
 } /* extern C */


=====================================
src/input/es_out.c
=====================================
@@ -3639,8 +3639,9 @@ static int EsOutVaControlLocked(es_out_sys_t *p_sys, input_source_t *source,
     {
         input_thread_t *input = p_sys->p_input;
         input_item_node_t *node = va_arg(args, input_item_node_t *);
-        input_SendEventParsing(input, node);
-        input_item_node_Delete(node);
+        if (!input_SendEventParsing(input, node)) {
+            input_item_node_Delete(node);
+        }
 
         return VLC_SUCCESS;
     }


=====================================
src/input/event.h
=====================================
@@ -27,12 +27,17 @@
 #include <vlc_input.h>
 #include "input_internal.h"
 
-static inline void input_SendEvent(input_thread_t *p_input,
+static inline bool input_SendEvent(input_thread_t *p_input,
                                    const struct vlc_input_event *event)
 {
     input_thread_private_t *priv = input_priv(p_input);
     if (priv->cbs != NULL && priv->cbs->on_event != NULL)
-        priv->cbs->on_event(p_input, event, priv->cbs_data);
+    {
+        return priv->cbs->on_event(p_input, event, priv->cbs_data);
+    }
+    else
+        return false;
+
 }
 
 /*****************************************************************************
@@ -249,10 +254,10 @@ static inline void input_SendEventEs(input_thread_t *p_input,
     });
 }
 
-static inline void input_SendEventParsing(input_thread_t *p_input,
+static inline bool input_SendEventParsing(input_thread_t *p_input,
                                           input_item_node_t *p_root)
 {
-    input_SendEvent(p_input, &(struct vlc_input_event) {
+    return input_SendEvent(p_input, &(struct vlc_input_event) {
         .type = INPUT_EVENT_SUBITEMS,
         .subitems = p_root,
     });


=====================================
src/input/input_internal.h
=====================================
@@ -333,7 +333,7 @@ struct vlc_input_event
 
 struct vlc_input_thread_callbacks
 {
-    void (*on_event)(input_thread_t *input, const struct vlc_input_event *event,
+    bool (*on_event)(input_thread_t *input, const struct vlc_input_event *event,
                      void *userdata);
 };
 


=====================================
src/input/parse.c
=====================================
@@ -47,12 +47,13 @@ struct input_item_parser_id_t
     void *userdata;
 };
 
-static void
+static bool
 input_item_parser_InputEvent(input_thread_t *input,
                              const struct vlc_input_event *event, void *parser_)
 {
     input_item_parser_id_t *parser = parser_;
 
+    bool handled = true;
     switch (event->type)
     {
         case INPUT_EVENT_TIMES:
@@ -74,6 +75,8 @@ input_item_parser_InputEvent(input_thread_t *input,
             if (parser->cbs->on_subtree_added)
                 parser->cbs->on_subtree_added(input_GetItem(input),
                                               event->subitems, parser->userdata);
+            else
+                input_item_node_Delete(event->subitems);
             break;
         case INPUT_EVENT_ATTACHMENTS:
             if (parser->cbs->on_attachments_added != NULL)
@@ -83,8 +86,10 @@ input_item_parser_InputEvent(input_thread_t *input,
                                                   parser->userdata);
             break;
         default:
+            handled = false;
             break;
     }
+    return handled;
 }
 
 input_item_parser_id_t *


=====================================
src/media_source/media_tree.c
=====================================
@@ -118,23 +118,6 @@ vlc_media_tree_FindNodeByMedia(input_item_node_t *parent,
     return false;
 }
 
-static input_item_node_t *
-vlc_media_tree_AddChild(input_item_node_t *parent, input_item_t *media);
-
-static void
-vlc_media_tree_AddSubtree(input_item_node_t *to, input_item_node_t *from)
-{
-    for (int i = 0; i < from->i_children; ++i)
-    {
-        input_item_node_t *child = from->pp_children[i];
-        input_item_node_t *node = vlc_media_tree_AddChild(to, child->p_item);
-        if (unlikely(!node))
-            break; /* what could we do? */
-
-        vlc_media_tree_AddSubtree(node, child);
-    }
-}
-
 static void
 vlc_media_tree_ClearChildren(input_item_node_t *root)
 {
@@ -164,7 +147,13 @@ media_subtree_changed(input_item_t *media, input_item_node_t *node,
     }
 
     vlc_media_tree_ClearChildren(subtree_root);
-    vlc_media_tree_AddSubtree(subtree_root, node);
+    /* The nodes can be directly used, as the subtree callback is given
+     * ownership of the input item node. */
+    subtree_root->pp_children = node->pp_children;
+    subtree_root->i_children = node->i_children;
+    node->pp_children = NULL;
+    node->i_children = 0;
+    input_item_node_Delete(node);
     vlc_media_tree_Notify(tree, on_children_reset, subtree_root);
     vlc_media_tree_Unlock(tree);
 }


=====================================
src/player/input.c
=====================================
@@ -870,7 +870,7 @@ vlc_player_input_MouseFallback(struct vlc_player_input *input)
     vlc_player_TogglePause(player);
 }
 
-static void
+static bool
 input_thread_Events(input_thread_t *input_thread,
                     const struct vlc_input_event *event, void *user_data)
 {
@@ -904,9 +904,11 @@ input_thread_Events(input_thread_t *input_thread,
                                         VLC_PLAYER_TIMER_EVENT_DISCONTINUITY,
                                         VLC_TICK_INVALID);
         }
-        return;
+        return true;
     }
 
+    bool handled = true;
+
     vlc_mutex_lock(&player->lock);
 
     switch (event->type)
@@ -1023,6 +1025,7 @@ input_thread_Events(input_thread_t *input_thread,
         case INPUT_EVENT_SUBITEMS:
             vlc_player_SendEvent(player, on_media_subitems_changed,
                                  input_GetItem(input->thread), event->subitems);
+            input_item_node_Delete(event->subitems);
             break;
         case INPUT_EVENT_DEAD:
             if (input->started) /* Can happen with early input_thread fails */
@@ -1053,10 +1056,12 @@ input_thread_Events(input_thread_t *input_thread,
             vlc_player_input_MouseFallback(input);
             break;
         default:
+            handled = false;
             break;
     }
 
     vlc_mutex_unlock(&player->lock);
+    return handled;
 }
 
 void


=====================================
src/playlist/player.c
=====================================
@@ -121,7 +121,8 @@ on_player_media_length_changed(vlc_player_t *player, vlc_tick_t new_length,
 
 static void
 on_player_media_subitems_changed(vlc_player_t *player, input_item_t *media,
-                                 input_item_node_t *subitems, void *userdata)
+                                 const input_item_node_t *subitems,
+                                 void *userdata)
 {
     VLC_UNUSED(player);
     VLC_UNUSED(media);


=====================================
src/playlist/preparse.c
=====================================
@@ -34,7 +34,7 @@ typedef struct VLC_VECTOR(input_item_t *) media_vector_t;
 static void
 vlc_playlist_CollectChildren(vlc_playlist_t *playlist,
                              media_vector_t *dest,
-                             input_item_node_t *node)
+                             const input_item_node_t *node)
 {
     vlc_playlist_AssertLocked(playlist);
     for (int i = 0; i < node->i_children; ++i)
@@ -48,7 +48,7 @@ vlc_playlist_CollectChildren(vlc_playlist_t *playlist,
 
 int
 vlc_playlist_ExpandItem(vlc_playlist_t *playlist, size_t index,
-                        input_item_node_t *node)
+                        const input_item_node_t *node)
 {
     vlc_playlist_AssertLocked(playlist);
 
@@ -63,7 +63,7 @@ vlc_playlist_ExpandItem(vlc_playlist_t *playlist, size_t index,
 
 int
 vlc_playlist_ExpandItemFromNode(vlc_playlist_t *playlist,
-                                input_item_node_t *subitems)
+                                const input_item_node_t *subitems)
 {
     vlc_playlist_AssertLocked(playlist);
     input_item_t *media = subitems->p_item;
@@ -85,6 +85,7 @@ on_subtree_added(input_item_t *media, input_item_node_t *subtree,
     vlc_playlist_Lock(playlist);
     vlc_playlist_ExpandItemFromNode(playlist, subtree);
     vlc_playlist_Unlock(playlist);
+    input_item_node_Delete(subtree);
 }
 
 static void


=====================================
src/playlist/preparse.h
=====================================
@@ -32,10 +32,10 @@ vlc_playlist_AutoPreparse(vlc_playlist_t *playlist, input_item_t *input,
 
 int
 vlc_playlist_ExpandItem(vlc_playlist_t *playlist, size_t index,
-                        input_item_node_t *node);
+                        const input_item_node_t *node);
 
 int
 vlc_playlist_ExpandItemFromNode(vlc_playlist_t *playlist,
-                                input_item_node_t *subitems);
+                                const input_item_node_t *subitems);
 
 #endif


=====================================
src/preparser/preparser.c
=====================================
@@ -329,7 +329,7 @@ end:
     TaskDelete(task);
 }
 
-static void
+static bool
 on_thumbnailer_input_event( input_thread_t *input,
                             const struct vlc_input_event *event, void *userdata )
 {
@@ -337,7 +337,7 @@ on_thumbnailer_input_event( input_thread_t *input,
     if ( event->type != INPUT_EVENT_THUMBNAIL_READY &&
          ( event->type != INPUT_EVENT_STATE || ( event->state.value != ERROR_S &&
                                                  event->state.value != END_S ) ) )
-         return;
+         return false;
 
     struct task *task = userdata;
 
@@ -347,6 +347,7 @@ on_thumbnailer_input_event( input_thread_t *input,
         task->preparse_status = VLC_SUCCESS;
     }
     vlc_sem_post(&task->preparse_ended);
+    return true;
 }
 
 static int


=====================================
test/src/player/player.c
=====================================
@@ -591,7 +591,7 @@ player_on_media_epg_changed(vlc_player_t *player, input_item_t *media,
 
 static void
 player_on_media_subitems_changed(vlc_player_t *player, input_item_t *media,
-                           input_item_node_t *subitems, void *data)
+                           const input_item_node_t *subitems, void *data)
 {
     (void) media;
     struct ctx *ctx = get_ctx(player, data);



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/e6dde2f2164a933862d460ea09f9fe87a92a8cef...005aa763e97ee0c88a4fbf57d6a0060b17ce47bd

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/e6dde2f2164a933862d460ea09f9fe87a92a8cef...005aa763e97ee0c88a4fbf57d6a0060b17ce47bd
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list