[vlc-devel] [PATCH 19/38] decoder: allow multiple calls to HoldDecoderDevice before calling UpdateFormat

Thomas Guillem thomas at gllm.fr
Wed Oct 2 09:13:22 CEST 2019



On Tue, Oct 1, 2019, at 13:12, Steve Lhomme wrote:
> This is how the VA's will be probed when multiple outputs are possible.
> ---
>  src/input/decoder.c | 29 +++++++++++++++++++++--------
>  1 file changed, 21 insertions(+), 8 deletions(-)
> 
> diff --git a/src/input/decoder.c b/src/input/decoder.c
> index c30f14c3aa8..9ed967cdb5d 100644
> --- a/src/input/decoder.c
> +++ b/src/input/decoder.c
> @@ -460,17 +460,19 @@ static void FixDisplayFormat(decoder_t *p_dec, 
> video_format_t *fmt)
>      video_format_AdjustColorSpace( fmt );
>  }
>  
> +static int CreateVoutIfNeeded(struct decoder_owner *, vout_thread_t 
> **, vlc_decoder_device **);
> +
> +

Nitpick: extra \n

>  static int ModuleThread_UpdateVideoFormat( decoder_t *p_dec )
>  {
>      struct decoder_owner *p_owner = dec_get_owner( p_dec );
>  
> -    vlc_mutex_lock( &p_owner->lock );
> -
> -    vout_thread_t *p_vout = p_owner->p_vout;
> -    vlc_mutex_unlock( &p_owner->lock );
> +    vout_thread_t *p_vout = NULL;
> +    int created_vout = CreateVoutIfNeeded(p_owner, &p_vout, NULL);
> +    if (created_vout == -1)
> +        return -1; // error
>  
> -    if (!p_vout)
> -        return -1;
> +    // configure the new vout
>  
>      video_format_t fmt;
>      FixDisplayFormat( p_dec, &fmt );
> @@ -504,7 +506,7 @@ static int ModuleThread_UpdateVideoFormat( 
> decoder_t *p_dec )
>      return input_resource_GetDisplay( p_owner->p_resource, 
> p_owner->p_dec_dev, &cfg);
>  }
>  
> -static int CreateVoutIfNeeded(struct decoder_owner *p_owner, 
> vlc_decoder_device **pp_dec_dev)
> +static int CreateVoutIfNeeded(struct decoder_owner *p_owner, 
> vout_thread_t **pp_vout, vlc_decoder_device **pp_dec_dev)
>  {
>      decoder_t *p_dec = &p_owner->dec;
>      bool need_vout = false;
> @@ -551,7 +553,15 @@ static int CreateVoutIfNeeded(struct decoder_owner 
> *p_owner, vlc_decoder_device
>      }
>  
>      if( !need_vout )
> +    {
> +        if (pp_vout)
> +        {
> +            vlc_mutex_lock( &p_owner->lock );
> +            *pp_vout = p_owner->p_vout;
> +            vlc_mutex_unlock( &p_owner->lock );
> +        }
>          return 0; // vout unchanged
> +    }
>  
>      if( !p_dec->fmt_out.video.i_width ||
>          !p_dec->fmt_out.video.i_height ||
> @@ -582,6 +592,9 @@ static int CreateVoutIfNeeded(struct decoder_owner 
> *p_owner, vlc_decoder_device
>      if (p_vout)
>          decoder_Notify(p_owner, on_vout_added, p_vout, order);
>  
> +    if (pp_vout)
> +        *pp_vout = p_vout;
> +
>      vlc_mutex_lock( &p_owner->lock );
>      p_owner->p_vout = p_vout;
>      if ( pp_dec_dev )
> @@ -618,7 +631,7 @@ static vlc_decoder_device * 
> ModuleThread_GetDecoderDevice( decoder_t *p_dec )
>      struct decoder_owner *p_owner = dec_get_owner( p_dec );
>  
>      vlc_decoder_device *dec_device = NULL;
> -    int created_vout = CreateVoutIfNeeded(p_owner, &dec_device);
> +    int created_vout = CreateVoutIfNeeded(p_owner, NULL, &dec_device);
>      if (created_vout == -1)
>      {
>          if ( dec_device )
> -- 
> 2.17.1
> 
> _______________________________________________
> 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