[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