[vlc-devel] [PATCH 01/14] media_tree: allow preparse tasks to be canceled

Pierre Lamot pierre at videolabs.io
Thu Feb 6 13:56:38 CET 2020


  If we need to release the media tree before the preparse ends
  the preparse callback will likely crash.

  This allows to pass an optional task id to vlc_media_tree_Preparse and to
  cancel it afterwards
---
 include/vlc_media_source.h                      | 13 ++++++++++++-
 .../gui/macosx/media-source/VLCMediaSource.m    |  2 +-
 modules/gui/qt/network/networkmediamodel.cpp    |  3 +--
 src/libvlccore.sym                              |  1 +
 src/media_source/media_tree.c                   | 17 +++++++++++++++--
 5 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/include/vlc_media_source.h b/include/vlc_media_source.h
index 36e1f9a0b8..9a26ddb39a 100644
--- a/include/vlc_media_source.h
+++ b/include/vlc_media_source.h
@@ -191,10 +191,21 @@ vlc_media_tree_Find(vlc_media_tree_t *tree, const input_item_t *media,
  * \param tree   the media tree (not necessarily locked)
  * \param libvlc the libvlc instance
  * \param media  the media to preparse
+ * \param id     a task identifier
  */
 VLC_API void
 vlc_media_tree_Preparse(vlc_media_tree_t *tree, libvlc_int_t *libvlc,
-                        input_item_t *media);
+                        input_item_t *media, void *id);
+
+
+/**
+ * Cancel a media tree preparse request
+ *
+ * \param libvlc the libvlc instance
+ * \param id the preparse task id
+ */
+VLC_API void
+vlc_media_tree_PreparseCancel(libvlc_int_t *libvlc, void* id);
 
 /**
  * Media source.
diff --git a/modules/gui/macosx/media-source/VLCMediaSource.m b/modules/gui/macosx/media-source/VLCMediaSource.m
index eb187fd1ea..4c01af0749 100644
--- a/modules/gui/macosx/media-source/VLCMediaSource.m
+++ b/modules/gui/macosx/media-source/VLCMediaSource.m
@@ -128,7 +128,7 @@ static const struct vlc_media_tree_callbacks treeCallbacks = {
     if (inputItem == nil) {
         return;
     }
-    vlc_media_tree_Preparse(_p_mediaSource->tree, _p_libvlcInstance, inputItem.vlcInputItem);
+    vlc_media_tree_Preparse(_p_mediaSource->tree, _p_libvlcInstance, inputItem.vlcInputItem, NULL);
 }
 
 - (NSString *)mediaSourceDescription
diff --git a/modules/gui/qt/network/networkmediamodel.cpp b/modules/gui/qt/network/networkmediamodel.cpp
index c2561e1620..1a24f3de91 100644
--- a/modules/gui/qt/network/networkmediamodel.cpp
+++ b/modules/gui/qt/network/networkmediamodel.cpp
@@ -255,8 +255,7 @@ bool NetworkMediaModel::initializeMediaSources()
         emit isIndexedChanged();
     }
 
-
-    vlc_media_tree_Preparse( tree, libvlc, m_treeItem.media.get() );
+    vlc_media_tree_Preparse( tree, libvlc, m_treeItem.media.get(), this );
     m_parsingPending = true;
     emit parsingPendingChanged(m_parsingPending);
 
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index cf0f2230a1..befaab5151 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -947,6 +947,7 @@ vlc_media_tree_Lock
 vlc_media_tree_Unlock
 vlc_media_tree_Find
 vlc_media_tree_Preparse
+vlc_media_tree_PreparseCancel
 vlc_viewpoint_to_4x4
 vlc_video_context_Create
 vlc_video_context_Release
diff --git a/src/media_source/media_tree.c b/src/media_source/media_tree.c
index ed2df3be42..017325719f 100644
--- a/src/media_source/media_tree.c
+++ b/src/media_source/media_tree.c
@@ -342,17 +342,30 @@ static const input_preparser_callbacks_t input_preparser_callbacks = {
 
 void
 vlc_media_tree_Preparse(vlc_media_tree_t *tree, libvlc_int_t *libvlc,
-                        input_item_t *media)
+                        input_item_t *media, void* id)
 {
 #ifdef TEST_MEDIA_SOURCE
     VLC_UNUSED(tree);
     VLC_UNUSED(libvlc);
     VLC_UNUSED(media);
+    VLC_UNUSED(id);
     VLC_UNUSED(input_preparser_callbacks);
 #else
     media->i_preparse_depth = 1;
     vlc_MetadataRequest(libvlc, media, META_REQUEST_OPTION_SCOPE_ANY |
                         META_REQUEST_OPTION_DO_INTERACT,
-                        &input_preparser_callbacks, tree, 0, NULL);
+                        &input_preparser_callbacks, tree, 0, id);
+#endif
+}
+
+
+void
+vlc_media_tree_PreparseCancel(libvlc_int_t *libvlc, void* id)
+{
+#ifdef TEST_MEDIA_SOURCE
+    VLC_UNUSED(libvlc);
+    VLC_UNUSED(id);
+#else
+    libvlc_MetadataCancel(libvlc, id);
 #endif
 }
-- 
2.17.1



More information about the vlc-devel mailing list