Browse Source

thumbnailer: move timeout from request to creator

In order to behave like the vlc_preparser.h API.

vlc_thumbnailer_SetTimeout Will be used by libvlc_media_t, temporarily,
waiting for the future libvlc_parser_t API.
pull/171/head
Thomas Guillem 2 years ago
committed by Steve Lhomme
parent
commit
fb47943787
  1. 14
      include/vlc_thumbnailer.h
  2. 2
      lib/core.c
  3. 6
      lib/media.c
  4. 4
      modules/misc/medialibrary/Thumbnailer.cpp
  5. 38
      src/input/thumbnailer.c
  6. 1
      src/libvlccore.sym
  7. 13
      src/preparser/preparser.c
  8. 20
      test/src/input/thumbnail.c

14
include/vlc_thumbnailer.h

@ -50,11 +50,11 @@ typedef void(*vlc_thumbnailer_cb)( void* data, picture_t* thumbnail );
/**
* \brief vlc_thumbnailer_Create Creates a thumbnailer object
* \param parent A VLC object
* @param timeout timeout of the thumbnailer, 0 for no limits.
* \return A thumbnailer object, or NULL in case of failure
*/
VLC_API vlc_thumbnailer_t*
vlc_thumbnailer_Create(vlc_object_t* parent)
VLC_USED;
vlc_thumbnailer_Create(vlc_object_t* parent, vlc_tick_t timeout) VLC_USED;
enum vlc_thumbnailer_seek_speed
{
@ -85,7 +85,7 @@ VLC_API vlc_thumbnailer_req_id
vlc_thumbnailer_RequestByTime( vlc_thumbnailer_t *thumbnailer,
vlc_tick_t time,
enum vlc_thumbnailer_seek_speed speed,
input_item_t *input_item, vlc_tick_t timeout,
input_item_t *input_item,
vlc_thumbnailer_cb cb, void* user_data );
/**
* \brief vlc_thumbnailer_RequestByTime Requests a thumbnailer at a given time
@ -108,7 +108,7 @@ VLC_API vlc_thumbnailer_req_id
vlc_thumbnailer_RequestByPos( vlc_thumbnailer_t *thumbnailer,
double pos,
enum vlc_thumbnailer_seek_speed speed,
input_item_t *input_item, vlc_tick_t timeout,
input_item_t *input_item,
vlc_thumbnailer_cb cb, void* user_data );
/**
@ -127,4 +127,10 @@ vlc_thumbnailer_Cancel( vlc_thumbnailer_t* thumbnailer, vlc_thumbnailer_req_id i
*/
VLC_API void vlc_thumbnailer_Release( vlc_thumbnailer_t* thumbnailer );
/**
* Do not use, libVLC only fonction, will be removed soon
*/
VLC_API void vlc_thumbnailer_SetTimeout( vlc_thumbnailer_t *thumbnailer,
vlc_tick_t timeout ) VLC_DEPRECATED;
#endif // VLC_THUMBNAILER_H

2
lib/core.c

@ -285,7 +285,7 @@ vlc_thumbnailer_t *libvlc_get_thumbnailer(libvlc_instance_t *instance)
if (thumb == NULL)
{
thumb = instance->thumbnailer =
vlc_thumbnailer_Create(VLC_OBJECT(instance->p_libvlc_int));
vlc_thumbnailer_Create(VLC_OBJECT(instance->p_libvlc_int), 0);
}
vlc_mutex_unlock(&instance->lazy_init_lock);

6
lib/media.c

@ -959,6 +959,8 @@ libvlc_media_thumbnail_request_by_time( libvlc_instance_t *inst,
if (unlikely(thumb == NULL))
return NULL;
vlc_thumbnailer_SetTimeout( thumb, vlc_tick_from_libvlc_time( timeout ) );
libvlc_media_thumbnail_request_t *req = malloc( sizeof( *req ) );
if ( unlikely( req == NULL ) )
return NULL;
@ -975,7 +977,6 @@ libvlc_media_thumbnail_request_by_time( libvlc_instance_t *inst,
speed == libvlc_media_thumbnail_seek_fast ?
VLC_THUMBNAILER_SEEK_FAST : VLC_THUMBNAILER_SEEK_PRECISE,
md->p_input_item,
timeout > 0 ? vlc_tick_from_libvlc_time( timeout ) : VLC_TICK_INVALID,
media_on_thumbnail_ready, req );
if ( req->id == VLC_PREPARSER_REQ_ID_INVALID )
{
@ -1002,6 +1003,8 @@ libvlc_media_thumbnail_request_by_pos( libvlc_instance_t *inst,
if (unlikely(thumb == NULL))
return NULL;
vlc_thumbnailer_SetTimeout( thumb, vlc_tick_from_libvlc_time( timeout ) );
libvlc_media_thumbnail_request_t *req = malloc( sizeof( *req ) );
if ( unlikely( req == NULL ) )
return NULL;
@ -1017,7 +1020,6 @@ libvlc_media_thumbnail_request_by_pos( libvlc_instance_t *inst,
speed == libvlc_media_thumbnail_seek_fast ?
VLC_THUMBNAILER_SEEK_FAST : VLC_THUMBNAILER_SEEK_PRECISE,
md->p_input_item,
timeout > 0 ? vlc_tick_from_libvlc_time( timeout ) : VLC_TICK_INVALID,
media_on_thumbnail_ready, req );
if ( req->id == VLC_PREPARSER_REQ_ID_INVALID )
{

4
modules/misc/medialibrary/Thumbnailer.cpp

@ -37,7 +37,8 @@ Thumbnailer::Thumbnailer( vlc_medialibrary_module_t* ml )
, m_currentContext( nullptr )
, m_thumbnailer( nullptr, &vlc_thumbnailer_Release )
{
m_thumbnailer.reset( vlc_thumbnailer_Create( VLC_OBJECT( ml ) ) );
m_thumbnailer.reset( vlc_thumbnailer_Create( VLC_OBJECT( ml ),
VLC_TICK_FROM_SEC( 3 ) ) );
if ( unlikely( m_thumbnailer == nullptr ) )
throw std::runtime_error( "Failed to instantiate a vlc_thumbnailer_t" );
}
@ -73,7 +74,6 @@ bool Thumbnailer::generate( const medialibrary::IMedia&, const std::string& mrl,
vlc_thumbnailer_req_id requestId =
vlc_thumbnailer_RequestByPos( m_thumbnailer.get(), position,
VLC_THUMBNAILER_SEEK_FAST, item.get(),
VLC_TICK_FROM_SEC( 3 ),
&onThumbnailComplete, &ctx );
if (requestId == VLC_THUMBNAILER_REQ_ID_INVALID)

38
src/input/thumbnailer.c

@ -36,6 +36,7 @@ struct vlc_thumbnailer_t
vlc_cond_t cond_ended;
vlc_thumbnailer_req_id current_id;
vlc_tick_t timeout;
struct vlc_list submitted_tasks; /**< list of struct task */
};
@ -61,11 +62,6 @@ typedef struct task
struct seek_target seek_target;
bool fast_seek;
input_item_t *item;
/**
* A positive value will be used as the timeout duration
* VLC_TICK_INVALID means no timeout
*/
vlc_tick_t timeout;
vlc_thumbnailer_cb cb;
void* userdata;
@ -88,7 +84,7 @@ static void RunnableRun(void *);
static task_t *
TaskNew(vlc_thumbnailer_t *thumbnailer, input_item_t *item,
struct seek_target seek_target, bool fast_seek,
vlc_thumbnailer_cb cb, void *userdata, vlc_tick_t timeout)
vlc_thumbnailer_cb cb, void *userdata)
{
task_t *task = malloc(sizeof(*task));
if (!task)
@ -100,7 +96,6 @@ TaskNew(vlc_thumbnailer_t *thumbnailer, input_item_t *item,
task->fast_seek = fast_seek;
task->cb = cb;
task->userdata = userdata;
task->timeout = timeout;
task->status = RUNNING;
task->pic = NULL;
@ -199,14 +194,14 @@ RunnableRun(void *userdata)
}
vlc_mutex_lock(&thumbnailer->lock);
if (task->timeout == VLC_TICK_INVALID)
if (thumbnailer->timeout == VLC_TICK_INVALID)
{
while (task->status == RUNNING)
vlc_cond_wait(&thumbnailer->cond_ended, &thumbnailer->lock);
}
else
{
vlc_tick_t deadline = now + task->timeout;
vlc_tick_t deadline = now + thumbnailer->timeout;
int timeout = 0;
while (task->status == RUNNING && timeout == 0)
timeout =
@ -236,11 +231,11 @@ error:
static vlc_thumbnailer_req_id
RequestCommon(vlc_thumbnailer_t *thumbnailer, struct seek_target seek_target,
enum vlc_thumbnailer_seek_speed speed, input_item_t *item,
vlc_tick_t timeout, vlc_thumbnailer_cb cb, void *userdata)
vlc_thumbnailer_cb cb, void *userdata)
{
bool fast_seek = speed == VLC_THUMBNAILER_SEEK_FAST;
task_t *task = TaskNew(thumbnailer, item, seek_target, fast_seek, cb,
userdata, timeout);
userdata);
if (!task)
return 0;
@ -261,29 +256,27 @@ vlc_thumbnailer_req_id
vlc_thumbnailer_RequestByTime( vlc_thumbnailer_t *thumbnailer,
vlc_tick_t time,
enum vlc_thumbnailer_seek_speed speed,
input_item_t *item, vlc_tick_t timeout,
input_item_t *item,
vlc_thumbnailer_cb cb, void* userdata )
{
struct seek_target seek_target = {
.type = VLC_THUMBNAILER_SEEK_TIME,
.time = time,
};
return RequestCommon(thumbnailer, seek_target, speed, item, timeout, cb,
userdata);
return RequestCommon(thumbnailer, seek_target, speed, item, cb, userdata);
}
vlc_thumbnailer_req_id
vlc_thumbnailer_RequestByPos( vlc_thumbnailer_t *thumbnailer,
double pos, enum vlc_thumbnailer_seek_speed speed,
input_item_t *item, vlc_tick_t timeout,
input_item_t *item,
vlc_thumbnailer_cb cb, void* userdata )
{
struct seek_target seek_target = {
.type = VLC_THUMBNAILER_SEEK_POS,
.pos = pos,
};
return RequestCommon(thumbnailer, seek_target, speed, item, timeout, cb,
userdata);
return RequestCommon(thumbnailer, seek_target, speed, item, cb, userdata);
}
size_t vlc_thumbnailer_Cancel( vlc_thumbnailer_t* thumbnailer, vlc_thumbnailer_req_id id )
@ -318,8 +311,10 @@ size_t vlc_thumbnailer_Cancel( vlc_thumbnailer_t* thumbnailer, vlc_thumbnailer_r
return count;
}
vlc_thumbnailer_t *vlc_thumbnailer_Create( vlc_object_t* parent)
vlc_thumbnailer_t *vlc_thumbnailer_Create( vlc_object_t* parent, vlc_tick_t timeout )
{
assert(timeout >= 0);
vlc_thumbnailer_t *thumbnailer = malloc( sizeof( *thumbnailer ) );
if ( unlikely( thumbnailer == NULL ) )
return NULL;
@ -333,6 +328,7 @@ vlc_thumbnailer_t *vlc_thumbnailer_Create( vlc_object_t* parent)
thumbnailer->parent = parent;
thumbnailer->current_id = 1;
thumbnailer->timeout = timeout;
vlc_mutex_init(&thumbnailer->lock);
vlc_cond_init(&thumbnailer->cond_ended);
vlc_list_init(&thumbnailer->submitted_tasks);
@ -340,6 +336,12 @@ vlc_thumbnailer_t *vlc_thumbnailer_Create( vlc_object_t* parent)
return thumbnailer;
}
void vlc_thumbnailer_SetTimeout( vlc_thumbnailer_t *thumbnailer,
vlc_tick_t timeout )
{
thumbnailer->timeout = timeout;
}
void vlc_thumbnailer_Release( vlc_thumbnailer_t *thumbnailer )
{
vlc_executor_Delete(thumbnailer->executor);

1
src/libvlccore.sym

@ -835,6 +835,7 @@ vlc_thumbnailer_RequestByTime
vlc_thumbnailer_RequestByPos
vlc_thumbnailer_Cancel
vlc_thumbnailer_Release
vlc_thumbnailer_SetTimeout
vlc_player_AddAssociatedMedia
vlc_player_AddListener
vlc_player_AddMetadataListener

13
src/preparser/preparser.c

@ -52,7 +52,6 @@ struct task
const input_item_parser_cbs_t *cbs;
void *userdata;
vlc_preparser_req_id id;
vlc_tick_t timeout;
input_item_parser_id_t *parser;
@ -70,10 +69,8 @@ static void RunnableRun(void *);
static struct task *
TaskNew(vlc_preparser_t *preparser, input_item_t *item,
input_item_meta_request_option_t options,
const input_item_parser_cbs_t *cbs, void *userdata, vlc_tick_t timeout)
const input_item_parser_cbs_t *cbs, void *userdata)
{
assert(timeout >= 0);
struct task *task = malloc(sizeof(*task));
if (!task)
return NULL;
@ -83,7 +80,6 @@ TaskNew(vlc_preparser_t *preparser, input_item_t *item,
task->options = options;
task->cbs = cbs;
task->userdata = userdata;
task->timeout = timeout;
input_item_Hold(item);
@ -275,8 +271,8 @@ RunnableRun(void *userdata)
struct task *task = userdata;
vlc_preparser_t *preparser = task->preparser;
vlc_tick_t deadline = task->timeout ? vlc_tick_now() + task->timeout
: VLC_TICK_INVALID;
vlc_tick_t deadline = preparser->timeout ? vlc_tick_now() + preparser->timeout
: VLC_TICK_INVALID;
if (task->options & META_REQUEST_OPTION_PARSE)
{
@ -385,8 +381,7 @@ vlc_preparser_req_id vlc_preparser_Push( vlc_preparser_t *preparser, input_item_
|| preparser->fetcher != NULL);
struct task *task =
TaskNew(preparser, item, i_options, cbs, cbs_userdata,
preparser->timeout);
TaskNew(preparser, item, i_options, cbs, cbs_userdata);
if( !task )
return 0;

20
test/src/input/thumbnail.c

@ -108,10 +108,6 @@ static void thumbnailer_callback( void* data, picture_t* thumbnail )
static void test_thumbnails( libvlc_instance_t* p_vlc )
{
vlc_thumbnailer_t* p_thumbnailer = vlc_thumbnailer_Create(
VLC_OBJECT( p_vlc->p_libvlc_int ) );
assert( p_thumbnailer != NULL );
struct test_ctx ctx;
vlc_cond_init( &ctx.cond );
vlc_mutex_init( &ctx.lock );
@ -123,6 +119,11 @@ static void test_thumbnails( libvlc_instance_t* p_vlc )
ctx.test_idx = i;
ctx.b_done = false;
vlc_thumbnailer_t* p_thumbnailer = vlc_thumbnailer_Create(
VLC_OBJECT( p_vlc->p_libvlc_int ), test_params[i].i_timeout );
assert( p_thumbnailer != NULL );
if ( asprintf( &psz_mrl, "mock://video_track_count=%u;audio_track_count=%u"
";length=%" PRId64 ";can_control_pace=%s;video_chroma=ARGB;video_add_track_at=%" PRId64,
test_params[i].i_nb_video_tracks,
@ -141,14 +142,14 @@ static void test_thumbnails( libvlc_instance_t* p_vlc )
id = vlc_thumbnailer_RequestByPos( p_thumbnailer, test_params[i].f_pos,
test_params[i].b_fast_seek ?
VLC_THUMBNAILER_SEEK_FAST : VLC_THUMBNAILER_SEEK_PRECISE,
p_item, test_params[i].i_timeout, thumbnailer_callback, &ctx );
p_item, thumbnailer_callback, &ctx );
}
else
{
id = vlc_thumbnailer_RequestByTime( p_thumbnailer, test_params[i].i_time,
test_params[i].b_fast_seek ?
VLC_THUMBNAILER_SEEK_FAST : VLC_THUMBNAILER_SEEK_PRECISE,
p_item, test_params[i].i_timeout, thumbnailer_callback, &ctx );
p_item, thumbnailer_callback, &ctx );
}
assert( id != VLC_THUMBNAILER_REQ_ID_INVALID );
@ -159,8 +160,9 @@ static void test_thumbnails( libvlc_instance_t* p_vlc )
input_item_Release( p_item );
free( psz_mrl );
vlc_thumbnailer_Release( p_thumbnailer );
}
vlc_thumbnailer_Release( p_thumbnailer );
}
static void thumbnailer_callback_cancel( void* data, picture_t* p_thumbnail )
@ -173,7 +175,7 @@ static void thumbnailer_callback_cancel( void* data, picture_t* p_thumbnail )
static void test_cancel_thumbnail( libvlc_instance_t* p_vlc )
{
vlc_thumbnailer_t* p_thumbnailer = vlc_thumbnailer_Create(
VLC_OBJECT( p_vlc->p_libvlc_int ) );
VLC_OBJECT( p_vlc->p_libvlc_int ), VLC_TICK_INVALID );
assert( p_thumbnailer != NULL );
const char* psz_mrl = "mock://video_track_count=0;audio_track_count=1;"
@ -185,7 +187,7 @@ static void test_cancel_thumbnail( libvlc_instance_t* p_vlc )
vlc_thumbnailer_req_id id = vlc_thumbnailer_RequestByTime( p_thumbnailer,
VLC_TICK_INVALID, VLC_THUMBNAILER_SEEK_PRECISE, p_item,
VLC_TICK_INVALID, thumbnailer_callback_cancel, NULL );
thumbnailer_callback_cancel, NULL );
vlc_thumbnailer_Cancel( p_thumbnailer, id );

Loading…
Cancel
Save