[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