[vlc-devel] [PATCH 06/14] fetcher: provide events in callbacks
Romain Vimont
rom1v at videolabs.io
Thu Aug 16 16:02:03 CEST 2018
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.
---
include/vlc_input_item.h | 8 +++++++-
lib/media.c | 3 ++-
modules/gui/qt/input_manager.cpp | 3 ++-
src/libvlc.c | 6 ++++--
src/playlist/thread.c | 2 +-
src/preparser/fetcher.c | 23 ++++++++++++++++-------
src/preparser/fetcher.h | 3 ++-
src/preparser/preparser.c | 9 ++++++---
src/preparser/preparser.h | 4 +++-
9 files changed, 43 insertions(+), 18 deletions(-)
diff --git a/include/vlc_input_item.h b/include/vlc_input_item.h
index cd22b3277d..57fc16193c 100644
--- a/include/vlc_input_item.h
+++ b/include/vlc_input_item.h
@@ -394,13 +394,19 @@ typedef struct input_preparser_callbacks_t {
void (*on_subtree_added)(input_item_t *, input_item_node_t *subtree, void *userdata);
} input_preparser_callbacks_t;
+typedef struct input_fetcher_callbacks_t {
+ void (*on_art_fetch_ended)(input_item_t *, bool fetched, void *userdata);
+} input_fetcher_callbacks_t;
+
VLC_API int libvlc_MetadataRequest( libvlc_int_t *, input_item_t *,
input_item_meta_request_option_t,
const input_preparser_callbacks_t *cbs,
void *cbs_userdata,
int, void * );
VLC_API int libvlc_ArtRequest(libvlc_int_t *, input_item_t *,
- input_item_meta_request_option_t );
+ input_item_meta_request_option_t,
+ const input_fetcher_callbacks_t *cbs,
+ void *cbs_userdata );
VLC_API void libvlc_MetadataCancel( libvlc_int_t *, void * );
/******************
diff --git a/lib/media.c b/lib/media.c
index 5ed5e2eaa1..81c39436cb 100644
--- a/lib/media.c
+++ b/lib/media.c
@@ -802,7 +802,8 @@ static int media_parse(libvlc_media_t *media, bool b_async,
if (parse_flag & libvlc_media_fetch_network)
{
ret = libvlc_ArtRequest(libvlc, item,
- META_REQUEST_OPTION_SCOPE_NETWORK);
+ META_REQUEST_OPTION_SCOPE_NETWORK,
+ NULL, NULL);
if (ret != VLC_SUCCESS)
return ret;
}
diff --git a/modules/gui/qt/input_manager.cpp b/modules/gui/qt/input_manager.cpp
index e191b0dcfc..2963e6ddcf 100644
--- a/modules/gui/qt/input_manager.cpp
+++ b/modules/gui/qt/input_manager.cpp
@@ -699,7 +699,8 @@ void InputManager::requestArtUpdate( input_item_t *p_item, bool b_forced )
}
libvlc_ArtRequest( p_intf->obj.libvlc, p_item,
(b_forced) ? META_REQUEST_OPTION_SCOPE_ANY
- : META_REQUEST_OPTION_NONE );
+ : META_REQUEST_OPTION_NONE,
+ NULL, NULL );
/* No input will signal the cover art to update,
* let's do it ourself */
if ( b_current_item )
diff --git a/src/libvlc.c b/src/libvlc.c
index 55604c1b79..f12f980936 100644
--- a/src/libvlc.c
+++ b/src/libvlc.c
@@ -521,14 +521,16 @@ int libvlc_MetadataRequest(libvlc_int_t *libvlc, input_item_t *item,
* The retrieval is performed asynchronously.
*/
int libvlc_ArtRequest(libvlc_int_t *libvlc, input_item_t *item,
- input_item_meta_request_option_t i_options)
+ input_item_meta_request_option_t i_options,
+ const input_fetcher_callbacks_t *cbs,
+ void *cbs_userdata)
{
libvlc_priv_t *priv = libvlc_priv(libvlc);
if (unlikely(priv->parser == NULL))
return VLC_ENOMEM;
- input_preparser_fetcher_Push(priv->parser, item, i_options);
+ input_preparser_fetcher_Push(priv->parser, item, i_options, cbs, cbs_userdata);
return VLC_SUCCESS;
}
diff --git a/src/playlist/thread.c b/src/playlist/thread.c
index b072d72198..0823ed54a9 100644
--- a/src/playlist/thread.c
+++ b/src/playlist/thread.c
@@ -244,7 +244,7 @@ static bool PlayItem( playlist_t *p_playlist, playlist_item_t *p_item )
if( !b_has_art || strncmp( psz_arturl, "attachment://", 13 ) )
{
PL_DEBUG( "requesting art for new input thread" );
- libvlc_ArtRequest( p_playlist->obj.libvlc, p_input, META_REQUEST_OPTION_NONE );
+ libvlc_ArtRequest( p_playlist->obj.libvlc, p_input, META_REQUEST_OPTION_NONE, NULL, NULL );
}
free( psz_arturl );
diff --git a/src/preparser/fetcher.c b/src/preparser/fetcher.c
index 6d095963af..973c850186 100644
--- a/src/preparser/fetcher.c
+++ b/src/preparser/fetcher.c
@@ -55,6 +55,8 @@ struct fetcher_request {
vlc_atomic_rc_t rc;
int preparse_status;
int options;
+ const input_fetcher_callbacks_t *cbs;
+ void *userdata;
};
struct fetcher_thread {
@@ -214,13 +216,17 @@ static int SearchByScope( input_fetcher_t* fetcher,
return VLC_EGENERIC;
}
-static void SetPreparsed( struct fetcher_request* req )
+static void NotifyArtFetchEnded( struct fetcher_request* req, bool fetched )
{
if( req->preparse_status != -1 )
{
input_item_SetPreparsed( req->item, true );
+ /* TODO remove legacy input_item_SignalPreparseEnded() */
input_item_SignalPreparseEnded( req->item, req->preparse_status );
}
+
+ if (req->cbs && req->cbs->on_art_fetch_ended)
+ req->cbs->on_art_fetch_ended(req->item, fetched, req->userdata);
}
static void Downloader( input_fetcher_t* fetcher,
@@ -281,7 +287,7 @@ out:
}
free( psz_arturl );
- SetPreparsed( req );
+ NotifyArtFetchEnded(req, psz_arturl != NULL);
return;
error:
@@ -298,12 +304,12 @@ static void SearchLocal( input_fetcher_t* fetcher, struct fetcher_request* req )
req->options & META_REQUEST_OPTION_SCOPE_NETWORK )
{
if( background_worker_Push( fetcher->network, req, NULL, 0 ) )
- SetPreparsed( req );
+ NotifyArtFetchEnded(req, false);
}
else
{
input_item_SetArtNotFound( req->item, true );
- SetPreparsed( req );
+ NotifyArtFetchEnded(req, false);
}
}
@@ -312,7 +318,7 @@ static void SearchNetwork( input_fetcher_t* fetcher, struct fetcher_request* req
if( SearchByScope( fetcher, req, FETCHER_SCOPE_NETWORK ) )
{
input_item_SetArtNotFound( req->item, true );
- SetPreparsed( req );
+ NotifyArtFetchEnded(req, false);
}
}
@@ -449,7 +455,8 @@ input_fetcher_t* input_fetcher_New( vlc_object_t* owner )
}
int input_fetcher_Push( input_fetcher_t* fetcher, input_item_t* item,
- input_item_meta_request_option_t options, int preparse_status )
+ input_item_meta_request_option_t options, int preparse_status,
+ const input_fetcher_callbacks_t *cbs, void *cbs_userdata )
{
struct fetcher_request* req = malloc( sizeof *req );
@@ -459,12 +466,14 @@ int input_fetcher_Push( input_fetcher_t* fetcher, input_item_t* item,
req->item = item;
req->options = options;
req->preparse_status = preparse_status;
+ req->cbs = cbs;
+ req->userdata = cbs_userdata;
vlc_atomic_rc_init( &req->rc );
input_item_Hold( item );
if( background_worker_Push( fetcher->local, req, NULL, 0 ) )
- SetPreparsed( req );
+ NotifyArtFetchEnded(req, false);
RequestRelease( req );
return VLC_SUCCESS;
diff --git a/src/preparser/fetcher.h b/src/preparser/fetcher.h
index 1dc6336ada..73b40e18c4 100644
--- a/src/preparser/fetcher.h
+++ b/src/preparser/fetcher.h
@@ -47,7 +47,8 @@ input_fetcher_t *input_fetcher_New( vlc_object_t * );
* fetcher object is destroyed.
*/
int input_fetcher_Push( input_fetcher_t *, input_item_t *,
- input_item_meta_request_option_t, int );
+ input_item_meta_request_option_t, int,
+ const input_fetcher_callbacks_t *, void * );
/**
* This function destroys the fetcher object and thread.
diff --git a/src/preparser/preparser.c b/src/preparser/preparser.c
index e459f6e1c2..6de44ce1b1 100644
--- a/src/preparser/preparser.c
+++ b/src/preparser/preparser.c
@@ -196,7 +196,8 @@ static void PreparserCloseInput( void* preparser_, void* task_ )
if( preparser->fetcher )
{
- if( !input_fetcher_Push( preparser->fetcher, item, 0, status ) )
+ if( !input_fetcher_Push( preparser->fetcher, item, 0, status,
+ NULL, NULL ) )
return;
}
@@ -288,10 +289,12 @@ void input_preparser_Push( input_preparser_t *preparser,
}
void input_preparser_fetcher_Push( input_preparser_t *preparser,
- input_item_t *item, input_item_meta_request_option_t options )
+ input_item_t *item, input_item_meta_request_option_t options,
+ const input_fetcher_callbacks_t *cbs, void *cbs_userdata )
{
if( preparser->fetcher )
- input_fetcher_Push( preparser->fetcher, item, options, -1 );
+ input_fetcher_Push( preparser->fetcher, item, options, -1,
+ cbs, cbs_userdata );
}
void input_preparser_Cancel( input_preparser_t *preparser, void *id )
diff --git a/src/preparser/preparser.h b/src/preparser/preparser.h
index 9fe4ae8e87..d37dab1b11 100644
--- a/src/preparser/preparser.h
+++ b/src/preparser/preparser.h
@@ -59,7 +59,9 @@ void input_preparser_Push( input_preparser_t *, input_item_t *,
int timeout, void *id );
void input_preparser_fetcher_Push( input_preparser_t *, input_item_t *,
- input_item_meta_request_option_t );
+ input_item_meta_request_option_t,
+ const input_fetcher_callbacks_t *cbs,
+ void *cbs_userdata );
/**
* This function cancel all preparsing requests for a given id
--
2.18.0
More information about the vlc-devel
mailing list