Reminder of the current behavior: the meta fetcher is either always triggered
after the preparser is finished or manually.
This commit aims to give more controls so that the meta fetcher is not
necessarily triggered after a preparsng.
The current behavior of macOS/playlist/mediatree is unchanged (the components
touching the preparser).
Here are the API changes for
libvlc_MetadataRequest():
- Can't be called without a valid META_REQUEST_OPTION_SCOPE_* flag
- The flag META_REQUEST_OPTION_SCOPE_* is not fetching meta anymore. Use
(META_REQUEST_OPTION_SCOPE_*|META_REQUEST_OPTION_FETCH_*) to fetch meta when
the preparsing ends.
libvlc_ArtRequest():
- Can't be called without a valid META_REQUEST_OPTION_FETCH_* flag.
- The META_REQUEST_OPTION_FETCH_NETWORK flag will now only fetch meta via
network.
libvlc_media_parse_with_options():
- The flag libvlc_media_parse_* is not fetching meta anymore. Use
libvlc_media_fetch_* to fetch meta when the preparsing ends.
- The libvlc_media_fetch_network flag will now only fetch meta via network.
The intf parent change from playlist to libvlc.
For the transition, pl_Get() is still functional but will return a different
playlist than the main one. Interfaces relying on pl_Get() won't be able to
interact with other interfaces, control or medias added by command line. This
call will soon be removed.
Signed-off-by: Thomas Guillem <thomas@gllm.fr>
Objects have one strong reference held by their "owner", and zero or
more weak references generated by vlc_object_hold() et al. This
provides a separate function to remove the strong reference than
vlc_object_release() to remove weak ones.
With this sole change, this is really only an annotation though.
In the final deinitialization, there is no thread safety and
logger replacement. The existing logger is simply deleted.
Also rename it to vlc_LogDestroy() and take a logger pointer rather
than the VLC instance.
Add an API to manage "services discovery" easily from UI clients.
A "media source provider" allows to retrieve media sources (each
associated to a services discovery module).
A media source holds a media tree, containing both the media detected by
the services discovery module and the media detected by preparsing.
Clients may listen to the tree to be notified of changes.
A client may retrieve a media source at any time and listen to its
media tree, even if it is already populated, without race condition.
Signed-off-by: Thomas Guillem <thomas@gllm.fr>
Notify "fetch ended" in callbacks.
This will allow to move the "preparse ended" trigger from the fetcher to
the preparser, and make the fetcher more independant.
This function is to be used by entities within the core that would
like to spawn a metadata request. Such request will not have the
implicit recursiveness of libvlc_MetadataRequest (which is to be
called by users of libvlc).
Signed-off-by: Thomas Guillem <thomas@gllm.fr>
The preparser was implemented in playlist code, but it was (already)
independant of the playlist.
Therefore, move the implementation to a separate folder and rename the
functions.
Signed-off-by: Thomas Guillem <thomas@gllm.fr>
As we can have incoming requests to the preparser while we are
destroying libvlc, we can end up in a deadlock while we are removing
all playlist_item_t from the playlist, while an item being preparsed
tries to add additional items to the list.
These changes fixes the issue by introducing a preparser-deactivation
function, that will make sure that we:
1) clear out any pending preparsing requests
2) cancel the current item preparsing (blocking)
3) prevent further requests to the preparser
fixes: #18151
Signed-off-by: Hugo Beauzée-Luyssen <hugo@beauzee.fr>
The vlc_custom_create() macro assumes that the first parameter is a
valid pointer by way of the VLC_OBJECT() macro. So call the
vlc_custom_create() function instead.
This reverts commit 9e9b227443.
The preparser must obviously outlive the playlist (and thus interfaces).
This fixes use after free:
ERROR: AddressSanitizer: heap-use-after-free on address 0x611000005548 at pc 0x7fad5e11bffa bp 0x7fad50daac10 sp 0x7fad50daac08
READ of size 8 at 0x611000005548 thread T1
#0 0x7fad5e11bff9 in playlist_preparser_fetcher_Push ../../src/playlist/preparser.c:128
#1 0x7fad5e0e7640 in libvlc_ArtRequest ../../src/libvlc.c:648
#2 0x7fad5e10ad37 in PlayItem ../../src/playlist/thread.c:232
#3 0x7fad5e10d167 in Next ../../src/playlist/thread.c:478
#4 0x7fad5e10d448 in Thread ../../src/playlist/thread.c:501
#5 0x7fad5fba3463 in start_thread (/lib/x86_64-linux-gnu/libpthread.so.0+0x7463)
#6 0x7fad5f6dce5c in clone (/lib/x86_64-linux-gnu/libc.so.6+0xe8e5c)
0x611000005548 is located 8 bytes inside of 208-byte region [0x611000005540,0x611000005610)
freed by thread T0 here:
#0 0x7fad60ea69d0 in free (/usr/lib/x86_64-linux-gnu/libasan.so.3+0xc19d0)
#1 0x7fad5e11cf8f in playlist_preparser_Delete ../../src/playlist/preparser.c:184
#2 0x7fad5e0e6b53 in libvlc_InternalCleanup ../../src/libvlc.c:512
#3 0x7fad60b2ed14 in libvlc_release ../../lib/core.c:105
#4 0x4024da in main ../../bin/vlc.c:275
#5 0x7fad5f6145ef in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x205ef)
previously allocated by thread T0 here:
#0 0x7fad60ea6ce8 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.3+0xc1ce8)
#1 0x7fad5e11b3cd in playlist_preparser_New ../../src/playlist/preparser.c:74
#2 0x7fad5e0e62a2 in libvlc_InternalInit ../../src/libvlc.c:374
#3 0x7fad60b2e6d3 in libvlc_new ../../lib/core.c:59
#4 0x4022dd in main ../../bin/vlc.c:228
#5 0x7fad5f6145ef in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x205ef)
Thread T1 created by T0 here:
#0 0x7fad60e15f19 in pthread_create (/usr/lib/x86_64-linux-gnu/libasan.so.3+0x30f19)
#1 0x7fad5e30d9f6 in vlc_clone_attr ../../src/posix/thread.c:484
#2 0x7fad5e30dbd8 in vlc_clone ../../src/posix/thread.c:496
#3 0x7fad5e1091a9 in playlist_Activate ../../src/playlist/thread.c:54
#4 0x7fad5e1117a0 in playlist_Create ../../src/playlist/engine.c:299
#5 0x7fad5e106139 in intf_GetPlaylist ../../src/interface/interface.c:149
#6 0x7fad5e1061d9 in intf_InsertItem ../../src/interface/interface.c:165
#7 0x7fad5e0e72f7 in GetFilenames ../../src/libvlc.c:605
#8 0x7fad5e0e6979 in libvlc_InternalInit ../../src/libvlc.c:488
#9 0x7fad60b2e6d3 in libvlc_new ../../lib/core.c:59
#10 0x4022dd in main ../../bin/vlc.c:228
#11 0x7fad5f6145ef in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x205ef)
SUMMARY: AddressSanitizer: heap-use-after-free ../../src/playlist/preparser.c:128 in playlist_preparser_fetcher_Push