[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