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

Alexandre Janniaux ajanni at videolabs.io
Thu Feb 6 16:16:43 CET 2020


Hi,

LGTM for the whole set, except a few nits which are not
really important.

Regards,
--
Alexandre Janniaux
Videolabs

On Thu, Feb 06, 2020 at 01:56:38PM +0100, Pierre Lamot wrote:
>   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
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list