[vlc-devel] [PATCH 10/11] decoder: add the possibility to have a custom fmt_out setup to load a decoder

Steve Lhomme robux4 at gmail.com
Thu Jul 13 16:53:07 CEST 2017


On Thu, Jul 13, 2017 at 4:18 PM, Rémi Denis-Courmont <remi at remlab.net> wrote:
> On jeudi 13 juillet 2017 15:44:43 EEST Steve Lhomme wrote:
>> By default it is a blank fmt_out with just the category set.
>> ---
>>  include/vlc_codec.h |  7 ++++++-
>>  src/input/decoder.c | 21 +++++++++++++++++----
>>  src/misc/image.c    |  3 +--
>>  3 files changed, 24 insertions(+), 7 deletions(-)
>>
>> diff --git a/include/vlc_codec.h b/include/vlc_codec.h
>> index 76a86767f1..eacb57f5e0 100644
>> --- a/include/vlc_codec.h
>> +++ b/include/vlc_codec.h
>> @@ -30,6 +30,7 @@
>>  #include <vlc_es.h>
>>  #include <vlc_picture.h>
>>  #include <vlc_subpicture.h>
>> +#include <vlc_modules.h>
>>
>>  /**
>>   * \defgroup codec Codec
>> @@ -411,8 +412,12 @@ VLC_API int decoder_GetDisplayRate( decoder_t * )
>> VLC_USED;
>>
>>  /**
>>   * This function loads a decoder module matching the fmt_in of the decoder
>> object. + *
>> + * The probe is responsible for setting up the decoder fmt_out before/after
>> + * loading a module. By default it initializes a blank fmt_out with just +
>> * the category and cleans it up on module loading error.
>>   */
>> -VLC_API module_t *decoder_LoadModule( decoder_t * ) VLC_USED;
>> +VLC_API module_t *decoder_LoadModule( decoder_t *, vlc_activate_t probe )
>> VLC_USED;
>>
>>  /** @} */
>>  /** @} */
>> diff --git a/src/input/decoder.c b/src/input/decoder.c
>> index f2bb533a23..5d751157b6 100644
>> --- a/src/input/decoder.c
>> +++ b/src/input/decoder.c
>> @@ -151,7 +151,18 @@ struct decoder_owner_sys_t
>>  #define DECODER_SPU_VOUT_WAIT_DURATION ((int)(0.200*CLOCK_FREQ))
>>  #define BLOCK_FLAG_CORE_PRIVATE_RELOADED (1 <<
>> BLOCK_FLAG_CORE_PRIVATE_SHIFT)
>>
>> -module_t *decoder_LoadModule( decoder_t *p_dec )
>> +static int DecoderStart(void *func, va_list ap)
>> +{
>> +    decoder_t *p_dec = va_arg(ap, decoder_t *);
>> +    int (*activate)(vlc_object_t *) = func;
>> +
>> +    int res = activate( VLC_OBJECT(p_dec) );
>> +    if ( res != VLC_SUCCESS )
>> +        es_format_Change( &p_dec->fmt_out, p_dec->fmt_out.i_cat, 0 );
>
> IMO, it's far more logical and straightforward to init before activate() and
> clean after failed activate.

Yes. Except you're supposed to only init once. Then you clean+init or replace.

If the first matching decoder is the one loaded it will be one less
call that way. But after that I don't really mind.

>> +    return res;
>> +}
>> +
>> +module_t *decoder_LoadModule( decoder_t *p_dec, vlc_activate_t probe )
>>  {
>>      const char caps[ES_CATEGORY_COUNT][16] = {
>>          [VIDEO_ES] = "video decoder",
>> @@ -169,7 +180,10 @@ module_t *decoder_LoadModule( decoder_t *p_dec )
>>          return NULL; /* no decoder for this type */
>>      }
>>
>> -    return module_need( p_dec, caps[p_dec->fmt_in.i_cat], "$codec", false
>> ); +    if ( probe == NULL )
>> +        es_format_Init( &p_dec->fmt_out, p_dec->fmt_in.i_cat, 0 );
>> +    return vlc_module_load( p_dec, caps[p_dec->fmt_in.i_cat], "$codec",
>> +                     false, probe ? probe : DecoderStart, p_dec );
>>  }
>>
>>  /**
>> @@ -191,8 +205,7 @@ static int LoadDecoder( decoder_t *p_dec, bool
>> b_packetizer, /* Find a suitable decoder/packetizer module */
>>      if( !b_packetizer )
>>      {
>> -        es_format_Init( &p_dec->fmt_out, p_fmt->i_cat, 0 );
>> -        p_dec->p_module = decoder_LoadModule( p_dec );
>> +        p_dec->p_module = decoder_LoadModule( p_dec, NULL );
>>      }
>>      else
>>      {
>> diff --git a/src/misc/image.c b/src/misc/image.c
>> index 19aa95cfe2..f2dbde3d2d 100644
>> --- a/src/misc/image.c
>> +++ b/src/misc/image.c
>> @@ -647,14 +647,13 @@ static decoder_t *CreateDecoder( vlc_object_t *p_this,
>> const video_format_t *fmt
>>
>>      p_dec->p_module = NULL;
>>      es_format_InitFromVideo( &p_dec->fmt_in, fmt );
>> -    es_format_Init( &p_dec->fmt_out, VIDEO_ES, 0 );
>>      p_dec->b_frame_drop_allowed = false;
>>
>>      p_dec->pf_vout_format_update = video_update_format;
>>      p_dec->pf_vout_buffer_new = video_new_buffer;
>>
>>      /* Find a suitable decoder module */
>> -    p_dec->p_module = decoder_LoadModule( p_dec );
>> +    p_dec->p_module = decoder_LoadModule( p_dec, NULL );
>>      if( !p_dec->p_module )
>>      {
>>          msg_Err( p_dec, "no suitable decoder module for fourcc `%4.4s'. "
>
> --
> Rémi Denis-Courmont
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list