[vlc-devel] [PATCH 03/26] decoder: get the decoder device from the vout

Thomas Guillem thomas at gllm.fr
Mon Sep 23 15:25:31 CEST 2019


On Sat, Sep 21, 2019, at 09:26, Rémi Denis-Courmont wrote:
> Le perjantaina 20. syyskuuta 2019, 17.28.33 EEST Steve Lhomme a écrit :
> > ---
> >  src/audio_output/filters.c       |  2 +-
> >  src/input/decoder.c              | 12 ++++++++++--
> >  src/input/resource.c             |  7 ++++---
> >  src/input/resource.h             |  5 +++--
> >  src/video_output/video_output.c  | 14 +++++++++++++-
> >  src/video_output/vout_internal.h |  4 +++-
> >  6 files changed, 34 insertions(+), 10 deletions(-)
> > 
> > diff --git a/src/audio_output/filters.c b/src/audio_output/filters.c
> > index 6a37c8e8ab7..dad467b44f0 100644
> > --- a/src/audio_output/filters.c
> > +++ b/src/audio_output/filters.c
> > @@ -395,7 +395,7 @@ vout_thread_t *aout_filter_GetVout(filter_t *filter,
> > const video_format_t *fmt)
> > 
> >      video_format_AdjustColorSpace(&adj_fmt);
> > 
> > -    if (vout_Request(&cfg, NULL)) {
> > +    if (vout_Request(&cfg, NULL, NULL)) {
> >          vout_Close(vout);
> >          vout = NULL;
> >      }
> > diff --git a/src/input/decoder.c b/src/input/decoder.c
> > index 57c9de6a1ee..f2f69a05fd1 100644
> > --- a/src/input/decoder.c
> > +++ b/src/input/decoder.c
> > @@ -122,6 +122,7 @@ struct decoder_owner
> >      audio_output_t *p_aout;
> > 
> >      vout_thread_t   *p_vout;
> > +    vlc_decoder_device *p_dec_dev;
> > 
> >      /* -- Theses variables need locking on read *and* write -- */
> >      /* Preroll */
> > @@ -560,17 +561,21 @@ static int ModuleThread_UpdateVideoFormat( decoder_t
> > *p_dec ) break;
> >          }
> >          enum vlc_vout_order order;
> > -        p_vout = input_resource_GetVout( p_owner->p_resource,
> > +        vlc_decoder_device *dec_dev = NULL;
> > +        p_vout = input_resource_GetVoutHoldDevice( p_owner->p_resource,
> >              &(vout_configuration_t) {
> >                  .vout = p_vout, .clock = p_owner->p_clock, .fmt = &fmt,
> >                  .dpb_size = dpb_size + p_dec->i_extra_picture_buffers + 1,
> >                  .mouse_event = MouseEvent, .mouse_opaque = p_dec
> > -            }, &order );
> > +            }, &order, &dec_dev );
> >          if (p_vout)
> >              decoder_Notify(p_owner, on_vout_added, p_vout, order);
> > 
> >          vlc_mutex_lock( &p_owner->lock );
> >          p_owner->p_vout = p_vout;
> > +        if ( p_owner->p_dec_dev != NULL )
> > +            vlc_decoder_device_Release( p_owner->p_dec_dev );
> > +        p_owner->p_dec_dev = dec_dev;
> > 
> >          DecoderUpdateFormatLocked( p_owner );
> >          p_owner->fmt.video.i_chroma = p_dec->fmt_out.i_codec;
> > @@ -1906,6 +1911,9 @@ static void DeleteDecoder( decoder_t * p_dec )
> >      const enum es_format_category_e i_cat =p_dec->fmt_in.i_cat;
> >      decoder_Clean( p_dec );
> > 
> > +    if ( p_owner->p_dec_dev )
> > +        vlc_decoder_device_Release( p_owner->p_dec_dev );
> > +
> >      /* Free all packets still in the decoder fifo. */
> >      block_FifoRelease( p_owner->p_fifo );
> > 
> > diff --git a/src/input/resource.c b/src/input/resource.c
> > index b4ffbd68ce3..39d1a87a464 100644
> > --- a/src/input/resource.c
> > +++ b/src/input/resource.c
> > @@ -368,9 +368,10 @@ void input_resource_PutVout(input_resource_t
> > *p_resource, vlc_mutex_unlock( &p_resource->lock );
> >  }
> > 
> > -vout_thread_t *input_resource_GetVout(input_resource_t *p_resource,
> > +vout_thread_t *input_resource_GetVoutHoldDevice(input_resource_t
> > *p_resource, const vout_configuration_t *cfg, -                            
> >          enum vlc_vout_order *order) +                                     
> > enum vlc_vout_order *order, +                                     
> > vlc_decoder_device **dec_dev) {
> >      vout_configuration_t cfg_buf;
> >      vout_thread_t *vout;
> > @@ -425,7 +426,7 @@ vout_thread_t *input_resource_GetVout(input_resource_t
> > *p_resource, }
> >  #endif
> > 
> > -    if (vout_Request(cfg, p_resource->p_input)) {
> > +    if (vout_Request(cfg, dec_dev, p_resource->p_input)) {
> >          input_resource_PutVoutLocked(p_resource, cfg->vout, false);
> >          vlc_mutex_unlock(&p_resource->lock);
> >          return NULL;
> > diff --git a/src/input/resource.h b/src/input/resource.h
> > index a13ca0dc85c..ab456d7ce5d 100644
> > --- a/src/input/resource.h
> > +++ b/src/input/resource.h
> > @@ -37,9 +37,10 @@ void input_resource_SetInput( input_resource_t *,
> > input_thread_t * ); */
> >  sout_instance_t *input_resource_RequestSout( input_resource_t *,
> > sout_instance_t *, const char *psz_sout );
> > 
> > -vout_thread_t *input_resource_GetVout(input_resource_t *,
> > +vout_thread_t *input_resource_GetVoutHoldDevice(input_resource_t *,
> >                                        const vout_configuration_t *,
> > -                                      enum vlc_vout_order *order);
> > +                                      enum vlc_vout_order *order,
> > +                                      vlc_decoder_device **);
> >  void input_resource_PutVout(input_resource_t *, vout_thread_t *);
> > 
> >  /**
> > diff --git a/src/video_output/video_output.c
> > b/src/video_output/video_output.c index cf2132a089c..2a38bd677c4 100644
> > --- a/src/video_output/video_output.c
> > +++ b/src/video_output/video_output.c
> > @@ -1860,7 +1860,8 @@ vout_thread_t *vout_Hold(vout_thread_t *vout)
> >      return vout;
> >  }
> > 
> > -int vout_Request(const vout_configuration_t *cfg, input_thread_t *input)
> > +int vout_Request(const vout_configuration_t *cfg, vlc_decoder_device
> > **dec_dev, +                 input_thread_t *input)
> >  {
> >      vout_thread_t *vout = cfg->vout;
> >      vout_thread_sys_t *sys = vout->p;
> > @@ -1870,6 +1871,10 @@ int vout_Request(const vout_configuration_t *cfg,
> > input_thread_t *input) assert(cfg->fmt != NULL);
> >      assert(cfg->clock != NULL);
> > 
> > +    if (dec_dev)
> > +        // don't return a decoder device by default, we need a proper
> > reference +        *dec_dev = NULL;
> > +
> >      if (!VoutCheckFormat(cfg->fmt))
> >          return -1;
> > 
> > @@ -1949,6 +1954,13 @@ error:
> >          return -1;
> >      }
> > 
> > +    if (dec_dev)
> > +    {
> > +        vlc_mutex_lock(&sys->window_lock);
> > +        *dec_dev = sys->dec_device ? vlc_decoder_device_Hold(
> > sys->dec_device ) : NULL;
> > +        vlc_mutex_unlock(&sys->window_lock);
> 
> Locking seems dubious here. What does it protect against?

+1

The window is enabled from this same thread. Therefore, the dec_device is created from this same thread (cf. previous patch) so this lock should not be needed at all.

> 
> > +    }
> > +
> >      if (input != NULL && sys->spu)
> >          spu_Attach(sys->spu, input);
> >      vout_IntfReinit(vout);
> > diff --git a/src/video_output/vout_internal.h
> > b/src/video_output/vout_internal.h index ee24cd9153f..1f88997779c 100644
> > --- a/src/video_output/vout_internal.h
> > +++ b/src/video_output/vout_internal.h
> > @@ -207,11 +207,13 @@ vout_thread_t *vout_CreateDummy(vlc_object_t *obj)
> > VLC_USED; * You can release the returned value either by vout_Request() or
> > vout_Close(). *
> >   * \param cfg the video configuration requested.
> > + * \param dec_dev pointer to receive the decoder device reference to use
> > with the vout or NULL * \param input used to get attachments for spu
> > filters
> >   * \retval 0 on success
> >   * \retval -1 on error
> >   */
> > -int vout_Request(const vout_configuration_t *cfg, input_thread_t *input);
> > +int vout_Request(const vout_configuration_t *cfg, vlc_decoder_device
> > **dec_dev, +                 input_thread_t *input);
> > 
> >  /**
> >   * Disables a vout.
> 
> 
> -- 
> Rémi Denis-Courmont
> http://www.remlab.net/
> 
> 
> 
> _______________________________________________
> 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