From b429869db7ad8277c63ed63511312433e9c54bf6 Mon Sep 17 00:00:00 2001 From: Thomas Guillem Date: Fri, 4 Jul 2025 13:16:26 +0200 Subject: [PATCH] core: add decoder_LoadModule() Common helper to load decoder by type or packetizer. Will be extended to also load packetizers by type. --- include/vlc_codec.h | 12 ++++++++++++ src/input/decoder_helpers.c | 32 ++++++++++++++++++++++++++++++++ src/libvlccore.sym | 1 + 3 files changed, 45 insertions(+) diff --git a/include/vlc_codec.h b/include/vlc_codec.h index f269afb281..f66851f423 100644 --- a/include/vlc_codec.h +++ b/include/vlc_codec.h @@ -401,6 +401,18 @@ VLC_API picture_t *decoder_NewPicture( decoder_t *dec ); */ VLC_API void decoder_Init( decoder_t *dec, es_format_t *fmt_in, const es_format_t *fmt ); +/** + * Load a decoder or packetizer module + * + * To be used by decoder owners. + * @param dec a valid and initialized decoder + * @packetizer true if the decoder_t is a packetizer + * @use_varoption if true, will try to load the decoder from the corresponding + * option (if set by the user) + */ +VLC_API int decoder_LoadModule(decoder_t *dec, bool packetizer, + bool use_varoption); + /** * Destroy a decoder and reset the structure. * diff --git a/src/input/decoder_helpers.c b/src/input/decoder_helpers.c index 007c1335c4..87bb48288c 100644 --- a/src/input/decoder_helpers.c +++ b/src/input/decoder_helpers.c @@ -51,6 +51,38 @@ void decoder_Init( decoder_t *p_dec, es_format_t *restrict fmt_in, const es_form es_format_Init( &p_dec->fmt_out, p_fmt->i_cat, 0 ); } +int decoder_LoadModule(decoder_t *dec, bool packetizer, + bool use_varoption) +{ + assert(dec->fmt_in->i_cat != UNKNOWN_ES); + assert(dec->p_module == NULL); + + static const char dec_caps[ES_CATEGORY_COUNT][16] = { + [VIDEO_ES] = "video decoder", + [AUDIO_ES] = "audio decoder", + [SPU_ES] = "spu decoder", + }; + + const char *type, *option; + if (packetizer) + { + type = "packetizer"; + option = use_varoption ? "packetizer" : NULL; + } + else + { + type = dec_caps[dec->fmt_in->i_cat]; + option = use_varoption ? "codec" : NULL; + } + + if (option != NULL) + dec->p_module = module_need_var(dec, type, option); + else + dec->p_module = module_need(dec, type, NULL, false); + + return dec->p_module == NULL ? VLC_ENOENT : VLC_SUCCESS; +} + void decoder_Clean( decoder_t *p_dec ) { if ( p_dec->p_module != NULL ) diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 837b5c0866..137e15efbf 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -93,6 +93,7 @@ date_Increment date_Init decoder_NewPicture decoder_Init +decoder_LoadModule decoder_Clean decoder_Destroy decoder_NewAudioBuffer