[vlc-commits] [Git][videolan/vlc][master] 7 commits: decoder: add hw_dec configuration
Steve Lhomme (@robUx4)
gitlab at videolan.org
Thu Nov 21 13:59:02 UTC 2024
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
fc672fd5 by Thomas Guillem at 2024-11-21T13:28:21+00:00
decoder: add hw_dec configuration
- - - - -
8002ec20 by Thomas Guillem at 2024-11-21T13:28:21+00:00
input: add hw_dec enum configuration
Use an enum on the input_thread side to keep compatibility with the
"hw-dec" option that is used via command line and libvlc options.
- - - - -
6e971be7 by Thomas Guillem at 2024-11-21T13:28:21+00:00
input: disable hw-dec when parsing
Extra protection, since decoders are not created from es_out.c when
preparsing.
- - - - -
7821aaaf by Thomas Guillem at 2024-11-21T13:28:21+00:00
preparser: remove extra lines in doc
- - - - -
22ea9da7 by Thomas Guillem at 2024-11-21T13:28:21+00:00
preparser: rename/rework vlc_preparser_seek_arg
So that we can add more thumbnailer arguments in the future.
- - - - -
d1e483cc by Thomas Guillem at 2024-11-21T13:28:21+00:00
preparser: thumbnailer: add hw_dec configuration
Disabled by default, but can be forced with the new configuration
option.
- - - - -
20343e3b by Thomas Guillem at 2024-11-21T13:28:21+00:00
medialibrary: don't set "no-hw-dec" option on the item
It is now using a specific boolean.
- - - - -
12 changed files:
- include/vlc_preparser.h
- lib/media.c
- modules/misc/medialibrary/Thumbnailer.cpp
- src/input/decoder.c
- src/input/decoder.h
- src/input/es_out.c
- src/input/input.c
- src/input/input_internal.h
- src/input/parse.c
- src/player/input.c
- src/preparser/preparser.c
- test/src/preparser/thumbnail.c
Changes:
=====================================
include/vlc_preparser.h
=====================================
@@ -75,13 +75,10 @@ struct vlc_thumbnailer_cbs
* scope.
*
* @param item item used for the thumbnailer
- *
* @param status VLC_SUCCESS in case of success, VLC_ETIMEOUT in case of
* timeout, -EINTR if cancelled, an error otherwise
- *
* @param thumbnail The generated thumbnail, or NULL in case of failure or
* timeout
- *
* @param data opaque pointer passed by
* vlc_preparser_GenerateThumbnail()
*
@@ -91,33 +88,40 @@ struct vlc_thumbnailer_cbs
};
/**
- * Preparser seek argument
+ * Thumbnailer argument
*/
-struct vlc_preparser_seek_arg
+struct vlc_thumbnailer_arg
{
- enum
- {
- /** Don't seek */
- VLC_PREPARSER_SEEK_NONE,
- /** Seek by time */
- VLC_PREPARSER_SEEK_TIME,
- /** Seek by position */
- VLC_PREPARSER_SEEK_POS,
- } type;
- union
- {
- /** Seek time if type == VLC_PREPARSER_SEEK_TIME */
- vlc_tick_t time;
- /** Seek position if type == VLC_PREPARSER_SEEK_POS */
- double pos;
- };
- enum
+ /** Seek argument */
+ struct seek
{
- /** Precise, but potentially slow */
- VLC_PREPARSER_SEEK_PRECISE,
- /** Fast, but potentially imprecise */
- VLC_PREPARSER_SEEK_FAST,
- } speed;
+ enum
+ {
+ /** Don't seek */
+ VLC_THUMBNAILER_SEEK_NONE,
+ /** Seek by time */
+ VLC_THUMBNAILER_SEEK_TIME,
+ /** Seek by position */
+ VLC_THUMBNAILER_SEEK_POS,
+ } type;
+ union
+ {
+ /** Seek time if type == VLC_THUMBNAILER_SEEK_TIME */
+ vlc_tick_t time;
+ /** Seek position if type == VLC_THUMBNAILER_SEEK_POS */
+ double pos;
+ };
+ enum
+ {
+ /** Precise, but potentially slow */
+ VLC_THUMBNAILER_SEEK_PRECISE,
+ /** Fast, but potentially imprecise */
+ VLC_THUMBNAILER_SEEK_FAST,
+ } speed;
+ } seek;
+
+ /** True to enable hardware decoder */
+ bool hw_dec;
};
/**
@@ -188,7 +192,7 @@ vlc_preparser_Push( vlc_preparser_t *preparser, input_item_t *item, int type_opt
*
* @param preparser the preparser object
* @param item a valid item to generate the thumbnail for
- * @param seek_arg pointer to a seek struct, that tell at which time the
+ * @param arg pointer to a seek struct, that tell at which time the
* thumbnail should be taken, NULL to disable seek
* @param timeout A timeout value, or VLC_TICK_INVALID to disable timeout
* @param cbs callback to listen to events (can't be NULL)
@@ -202,7 +206,7 @@ vlc_preparser_Push( vlc_preparser_t *preparser, input_item_t *item, int type_opt
*/
VLC_API vlc_preparser_req_id
vlc_preparser_GenerateThumbnail( vlc_preparser_t *preparser, input_item_t *item,
- const struct vlc_preparser_seek_arg *seek_arg,
+ const struct vlc_thumbnailer_arg *arg,
const struct vlc_thumbnailer_cbs *cbs,
void *cbs_userdata );
=====================================
lib/media.c
=====================================
@@ -954,7 +954,7 @@ static void media_on_thumbnail_ready( input_item_t *item, int status,
static libvlc_media_thumbnail_request_t*
libvlc_media_thumbnail_request( libvlc_instance_t *inst,
libvlc_media_t *md,
- const struct vlc_preparser_seek_arg *seek_arg,
+ const struct vlc_thumbnailer_arg *thumb_arg,
unsigned int width, unsigned int height,
bool crop, libvlc_picture_type_t picture_type,
libvlc_time_t timeout )
@@ -981,7 +981,7 @@ libvlc_media_thumbnail_request( libvlc_instance_t *inst,
static const struct vlc_thumbnailer_cbs cbs = {
.on_ended = media_on_thumbnail_ready,
};
- req->id = vlc_preparser_GenerateThumbnail( thumb, md->p_input_item, seek_arg,
+ req->id = vlc_preparser_GenerateThumbnail( thumb, md->p_input_item, thumb_arg,
&cbs, req );
if ( req->id == VLC_PREPARSER_REQ_ID_INVALID )
{
@@ -1001,13 +1001,16 @@ libvlc_media_thumbnail_request_by_time( libvlc_instance_t *inst,
bool crop, libvlc_picture_type_t picture_type,
libvlc_time_t timeout )
{
- const struct vlc_preparser_seek_arg seek_arg = {
- .type = VLC_PREPARSER_SEEK_TIME,
- .time = vlc_tick_from_libvlc_time( time ),
- .speed = speed == libvlc_media_thumbnail_seek_fast ?
- VLC_PREPARSER_SEEK_FAST : VLC_PREPARSER_SEEK_PRECISE,
+ const struct vlc_thumbnailer_arg thumb_arg = {
+ .seek = {
+ .type = VLC_THUMBNAILER_SEEK_TIME,
+ .time = vlc_tick_from_libvlc_time( time ),
+ .speed = speed == libvlc_media_thumbnail_seek_fast ?
+ VLC_THUMBNAILER_SEEK_FAST : VLC_THUMBNAILER_SEEK_PRECISE,
+ },
+ .hw_dec = false,
};
- return libvlc_media_thumbnail_request( inst, md, &seek_arg, width, height,
+ return libvlc_media_thumbnail_request( inst, md, &thumb_arg, width, height,
crop, picture_type, timeout );
}
@@ -1020,13 +1023,16 @@ libvlc_media_thumbnail_request_by_pos( libvlc_instance_t *inst,
bool crop, libvlc_picture_type_t picture_type,
libvlc_time_t timeout )
{
- const struct vlc_preparser_seek_arg seek_arg = {
- .type = VLC_PREPARSER_SEEK_POS,
- .pos = pos,
- .speed = speed == libvlc_media_thumbnail_seek_fast ?
- VLC_PREPARSER_SEEK_FAST : VLC_PREPARSER_SEEK_PRECISE,
+ const struct vlc_thumbnailer_arg thumb_arg = {
+ .seek = {
+ .type = VLC_THUMBNAILER_SEEK_POS,
+ .pos = pos,
+ .speed = speed == libvlc_media_thumbnail_seek_fast ?
+ VLC_THUMBNAILER_SEEK_FAST : VLC_THUMBNAILER_SEEK_PRECISE,
+ },
+ .hw_dec = false,
};
- return libvlc_media_thumbnail_request( inst, md, &seek_arg, width, height,
+ return libvlc_media_thumbnail_request( inst, md, &thumb_arg, width, height,
crop, picture_type, timeout );
}
=====================================
modules/misc/medialibrary/Thumbnailer.cpp
=====================================
@@ -70,16 +70,18 @@ bool Thumbnailer::generate( const medialibrary::IMedia&, const std::string& mrl,
if ( unlikely( item == nullptr ) )
return false;
- input_item_AddOption( item.get(), "no-hwdec", VLC_INPUT_OPTION_TRUSTED );
ctx.done = false;
ctx.thumbnailer = this;
{
vlc::threads::mutex_locker lock( m_mutex );
m_currentContext = &ctx;
- struct vlc_preparser_seek_arg seek_arg = {
- .type = vlc_preparser_seek_arg::VLC_PREPARSER_SEEK_POS,
- .pos = position,
- .speed = vlc_preparser_seek_arg::VLC_PREPARSER_SEEK_FAST,
+ struct vlc_thumbnailer_arg thumb_arg = {
+ .seek = {
+ .type = vlc_thumbnailer_arg::seek::VLC_THUMBNAILER_SEEK_POS,
+ .pos = position,
+ .speed = vlc_thumbnailer_arg::seek::VLC_THUMBNAILER_SEEK_FAST,
+ },
+ .hw_dec = false,
};
static const struct vlc_thumbnailer_cbs cbs = {
@@ -87,7 +89,7 @@ bool Thumbnailer::generate( const medialibrary::IMedia&, const std::string& mrl,
};
vlc_preparser_req_id requestId =
vlc_preparser_GenerateThumbnail( m_thumbnailer.get(), item.get(),
- &seek_arg, &cbs, &ctx );
+ &thumb_arg, &cbs, &ctx );
if (requestId == VLC_PREPARSER_REQ_ID_INVALID)
{
=====================================
src/input/decoder.c
=====================================
@@ -121,6 +121,8 @@ struct vlc_input_decoder_t
vlc_clock_t *p_clock;
const char *psz_id;
+ bool hw_dec;
+
const struct vlc_input_decoder_callbacks *cbs;
void *cbs_userdata;
@@ -816,7 +818,7 @@ static vlc_decoder_device * ModuleThread_GetDecoderDevice( decoder_t *p_dec )
vlc_input_decoder_t *p_owner = dec_get_owner( p_dec );
/* Requesting a decoder device will automatically enable hw decoding */
- if( !var_InheritBool( p_dec, "hw-dec" ) )
+ if (!p_owner->hw_dec)
return NULL;
int created_vout = CreateVoutIfNeeded(p_owner);
@@ -1951,6 +1953,7 @@ CreateDecoder( vlc_object_t *p_parent, const struct vlc_input_decoder_cfg *cfg )
p_owner->p_clock = cfg->clock;
p_owner->i_preroll_end = PREROLL_NONE;
p_owner->p_resource = cfg->resource;
+ p_owner->hw_dec = cfg->hw_dec;
p_owner->cbs = cfg->cbs;
p_owner->cbs_userdata = cfg->cbs_data;
p_owner->p_aout = NULL;
@@ -2277,6 +2280,7 @@ vlc_input_decoder_Create( vlc_object_t *p_parent, const es_format_t *fmt, const
.resource = p_resource,
.sout = NULL,
.input_type = INPUT_TYPE_PLAYBACK,
+ .hw_dec = var_InheritBool( p_parent, "hw-dec" ),
.cbs = NULL, .cbs_data = NULL,
};
return decoder_New( p_parent, &cfg );
=====================================
src/input/decoder.h
=====================================
@@ -60,6 +60,7 @@ struct vlc_input_decoder_cfg
input_resource_t *resource;
sout_stream_t *sout;
enum input_type input_type;
+ bool hw_dec;
unsigned cc_decoder;
const struct vlc_input_decoder_callbacks *cbs;
void *cbs_data;
=====================================
src/input/es_out.c
=====================================
@@ -804,6 +804,7 @@ static int EsOutSetRecord(es_out_sys_t *p_sys, bool b_record, const char *dir_pa
.resource = input_priv(p_input)->p_resource,
.sout = p_sys->p_sout_record,
.input_type = INPUT_TYPE_PLAYBACK,
+ .hw_dec = input_priv(p_input)->hw_dec,
.cc_decoder = p_sys->cc_decoder,
.cbs = &decoder_cbs,
.cbs_data = p_es,
@@ -2300,6 +2301,7 @@ static void EsOutCreateDecoder(es_out_sys_t *p_sys, es_out_id_t *p_es)
.resource = priv->p_resource,
.sout = priv->p_sout,
.input_type = p_sys->input_type,
+ .hw_dec = priv->hw_dec,
.cc_decoder = p_sys->cc_decoder,
.cbs = &decoder_cbs,
.cbs_data = p_es,
@@ -2332,6 +2334,7 @@ static void EsOutCreateDecoder(es_out_sys_t *p_sys, es_out_id_t *p_es)
.resource = priv->p_resource,
.sout = p_sys->p_sout_record,
.input_type = INPUT_TYPE_PLAYBACK,
+ .hw_dec = priv->hw_dec,
.cc_decoder = p_sys->cc_decoder,
.cbs = &decoder_cbs,
.cbs_data = p_es,
=====================================
src/input/input.c
=====================================
@@ -249,6 +249,21 @@ input_thread_t * input_Create( vlc_object_t *p_parent, input_item_t *p_item,
input_item_ApplyOptions( VLC_OBJECT(p_input), p_item );
/* Init Common fields */
+
+ switch (cfg->hw_dec)
+ {
+ case INPUT_CFG_HW_DEC_DEFAULT:
+ priv->hw_dec = var_InheritBool(p_input, "hw-dec");
+ break;
+ case INPUT_CFG_HW_DEC_DISABLED:
+ priv->hw_dec = false;
+ break;
+ case INPUT_CFG_HW_DEC_ENABLED:
+ priv->hw_dec = true;
+ break;
+ default: vlc_assert_unreachable();
+ }
+
priv->cbs = cfg->cbs;
priv->cbs_data = cfg->cbs_data;
priv->type = cfg->type;
=====================================
src/input/input_internal.h
=====================================
@@ -330,6 +330,12 @@ struct vlc_input_thread_callbacks
struct vlc_input_thread_cfg
{
enum input_type type;
+ enum
+ {
+ INPUT_CFG_HW_DEC_DEFAULT,
+ INPUT_CFG_HW_DEC_DISABLED,
+ INPUT_CFG_HW_DEC_ENABLED,
+ } hw_dec;
input_resource_t *resource;
vlc_renderer_item_t *renderer;
const struct vlc_input_thread_callbacks *cbs;
@@ -446,6 +452,7 @@ typedef struct input_thread_private_t
void *cbs_data;
enum input_type type;
+ bool hw_dec;
bool preparse_subitems;
/* Current state */
=====================================
src/input/parse.c
=====================================
@@ -106,6 +106,7 @@ input_item_Parse(vlc_object_t *obj, input_item_t *item,
const struct vlc_input_thread_cfg input_cfg = {
.type = INPUT_TYPE_PREPARSING,
+ .hw_dec = INPUT_CFG_HW_DEC_DISABLED,
.cbs = &input_cbs,
.cbs_data = parser,
.preparsing.subitems = cfg->subitems,
=====================================
src/player/input.c
=====================================
@@ -1142,6 +1142,7 @@ vlc_player_input_New(vlc_player_t *player, input_item_t *item)
const struct vlc_input_thread_cfg cfg = {
.type = INPUT_TYPE_PLAYBACK,
+ .hw_dec = INPUT_CFG_HW_DEC_DEFAULT,
.resource = player->resource,
.renderer = player->renderer,
.cbs = &cbs,
=====================================
src/preparser/preparser.c
=====================================
@@ -55,7 +55,7 @@ struct task
vlc_preparser_t *preparser;
input_item_t *item;
int options;
- struct vlc_preparser_seek_arg seek_arg;
+ struct vlc_thumbnailer_arg thumb_arg;
union vlc_preparser_cbs cbs;
void *userdata;
vlc_preparser_req_id id;
@@ -73,7 +73,7 @@ struct task
static struct task *
TaskNew(vlc_preparser_t *preparser, void (*run)(void *), input_item_t *item,
- int options, const struct vlc_preparser_seek_arg *seek_arg,
+ int options, const struct vlc_thumbnailer_arg *thumb_arg,
union vlc_preparser_cbs cbs, void *userdata)
{
struct task *task = malloc(sizeof(*task));
@@ -87,12 +87,13 @@ TaskNew(vlc_preparser_t *preparser, void (*run)(void *), input_item_t *item,
task->userdata = userdata;
task->pic = NULL;
- if (seek_arg == NULL)
- task->seek_arg = (struct vlc_preparser_seek_arg) {
- .type = VLC_PREPARSER_SEEK_NONE,
+ if (thumb_arg == NULL)
+ task->thumb_arg = (struct vlc_thumbnailer_arg) {
+ .seek.type = VLC_THUMBNAILER_SEEK_NONE,
+ .hw_dec = false,
};
else
- task->seek_arg = *seek_arg;
+ task->thumb_arg = *thumb_arg;
input_item_Hold(item);
@@ -331,6 +332,8 @@ ThumbnailerRun(void *userdata)
const struct vlc_input_thread_cfg cfg = {
.type = INPUT_TYPE_THUMBNAILING,
+ .hw_dec = task->thumb_arg.hw_dec ? INPUT_CFG_HW_DEC_ENABLED
+ : INPUT_CFG_HW_DEC_DISABLED,
.cbs = &cbs,
.cbs_data = task,
};
@@ -344,19 +347,19 @@ ThumbnailerRun(void *userdata)
if (!input)
goto error;
- assert(task->seek_arg.speed == VLC_PREPARSER_SEEK_PRECISE
- || task->seek_arg.speed == VLC_PREPARSER_SEEK_FAST);
- bool fast_seek = task->seek_arg.speed == VLC_PREPARSER_SEEK_FAST;
+ assert(task->thumb_arg.seek.speed == VLC_THUMBNAILER_SEEK_PRECISE
+ || task->thumb_arg.seek.speed == VLC_THUMBNAILER_SEEK_FAST);
+ bool fast_seek = task->thumb_arg.seek.speed == VLC_THUMBNAILER_SEEK_FAST;
- switch (task->seek_arg.type)
+ switch (task->thumb_arg.seek.type)
{
- case VLC_PREPARSER_SEEK_NONE:
+ case VLC_THUMBNAILER_SEEK_NONE:
break;
- case VLC_PREPARSER_SEEK_TIME:
- input_SetTime(input, task->seek_arg.time, fast_seek);
+ case VLC_THUMBNAILER_SEEK_TIME:
+ input_SetTime(input, task->thumb_arg.seek.time, fast_seek);
break;
- case VLC_PREPARSER_SEEK_POS:
- input_SetPosition(input, task->seek_arg.pos, fast_seek);
+ case VLC_THUMBNAILER_SEEK_POS:
+ input_SetPosition(input, task->thumb_arg.seek.pos, fast_seek);
break;
default:
vlc_assert_unreachable();
@@ -524,7 +527,7 @@ vlc_preparser_req_id vlc_preparser_Push( vlc_preparser_t *preparser, input_item_
vlc_preparser_req_id
vlc_preparser_GenerateThumbnail( vlc_preparser_t *preparser, input_item_t *item,
- const struct vlc_preparser_seek_arg *seek_arg,
+ const struct vlc_thumbnailer_arg *thumb_arg,
const struct vlc_thumbnailer_cbs *cbs,
void *cbs_userdata )
{
@@ -537,7 +540,7 @@ vlc_preparser_GenerateThumbnail( vlc_preparser_t *preparser, input_item_t *item,
struct task *task =
TaskNew(preparser, ThumbnailerRun, item, VLC_PREPARSER_TYPE_THUMBNAIL,
- seek_arg, task_cbs, cbs_userdata);
+ thumb_arg, task_cbs, cbs_userdata);
if (task == NULL)
return VLC_PREPARSER_REQ_ID_INVALID;
=====================================
test/src/preparser/thumbnail.c
=====================================
@@ -151,25 +151,26 @@ static void test_thumbnails( libvlc_instance_t* p_vlc )
vlc_mutex_lock( &ctx.lock );
vlc_preparser_req_id id;
- struct vlc_preparser_seek_arg seek_arg;
+ struct vlc_thumbnailer_arg thumb_arg;
if ( test_params[i].b_use_pos )
{
- seek_arg.type = VLC_PREPARSER_SEEK_POS;
- seek_arg.pos = test_params[i].f_pos;
- seek_arg.speed = test_params[i].b_fast_seek ?
- VLC_PREPARSER_SEEK_FAST : VLC_PREPARSER_SEEK_PRECISE;
+ thumb_arg.seek.type = VLC_THUMBNAILER_SEEK_POS;
+ thumb_arg.seek.pos = test_params[i].f_pos;
+ thumb_arg.seek.speed = test_params[i].b_fast_seek ?
+ VLC_THUMBNAILER_SEEK_FAST : VLC_THUMBNAILER_SEEK_PRECISE;
}
else
{
- seek_arg.type = VLC_PREPARSER_SEEK_TIME;
- seek_arg.time = test_params[i].i_time;
- seek_arg.speed = test_params[i].b_fast_seek ?
- VLC_PREPARSER_SEEK_FAST : VLC_PREPARSER_SEEK_PRECISE;
+ thumb_arg.seek.type = VLC_THUMBNAILER_SEEK_TIME;
+ thumb_arg.seek.time = test_params[i].i_time;
+ thumb_arg.seek.speed = test_params[i].b_fast_seek ?
+ VLC_THUMBNAILER_SEEK_FAST : VLC_THUMBNAILER_SEEK_PRECISE;
}
+ thumb_arg.hw_dec = false;
static const struct vlc_thumbnailer_cbs cbs = {
.on_ended = thumbnailer_callback,
};
- id = vlc_preparser_GenerateThumbnail( p_thumbnailer, p_item, &seek_arg,
+ id = vlc_preparser_GenerateThumbnail( p_thumbnailer, p_item, &thumb_arg,
&cbs, &ctx );
assert( id != VLC_PREPARSER_REQ_ID_INVALID );
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/996b3ce125fe411a4b4ce6f743e1e59148f81494...20343e3b7d34b285ef59077d813e7602896a7392
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/996b3ce125fe411a4b4ce6f743e1e59148f81494...20343e3b7d34b285ef59077d813e7602896a7392
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
More information about the vlc-commits
mailing list