[vlc-devel] [PATCH 10/39] decoder: request decoder device when getting the vout
Rémi Denis-Courmont
remi at remlab.net
Mon Oct 7 20:04:19 CEST 2019
Le maanantaina 7. lokakuuta 2019, 17.28.49 EEST Steve Lhomme a écrit :
> The decoder device is kept in the decoder for now (in further patches it
> will come with the video context).
> ---
> src/input/decoder.c | 12 ++++++++++--
> src/input/resource.c | 5 +++--
> src/input/resource.h | 5 +++--
> 3 files changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/src/input/decoder.c b/src/input/decoder.c
> index df2efd7717a..b22f4c66362 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; // TEMPORARY
>
> /* -- Theses variables need locking on read *and* write -- */
> /* Preroll */
> @@ -553,13 +554,17 @@ static int CreateVoutIfNeeded(struct decoder_owner
> *p_owner) .dpb_size = dpb_size + p_dec->i_extra_picture_buffers + 1,
> .mouse_event = MouseEvent, .mouse_opaque = p_dec
> };
> - p_vout = input_resource_GetVout( p_owner->p_resource,
> - &cfg, &order );
> + vlc_decoder_device *dec_dev = NULL;
> + p_vout = input_resource_GetVoutDecoderDevice( p_owner->p_resource,
> + &cfg, &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;
Again, AFAIK, the plan was to PUSH the decoder device from the decoder to the
video output, not the other way around to PULL. Otherwis, this is pull model
all over again. Specifically, the decoder should have the choice to request a
device from the decoder owner, and that's what most (initially all) would do.
But to eventually support capture devices or such things, the decoder must be
able to push another decoder device of its own anyway.
> @@ -1925,6 +1930,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 0c9693fb9e8..984d68e3ffa 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_GetVoutDecoderDevice(input_resource_t
> *p_resource, const vout_configuration_t *cfg, -
> enum vlc_vout_order *order) +
> enum vlc_vout_order *order, +
> vlc_decoder_device **pp_dec_dev) {
> vout_configuration_t cfg_buf;
> vout_thread_t *vout;
> diff --git a/src/input/resource.h b/src/input/resource.h
> index a13ca0dc85c..537033c9d7c 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_GetVoutDecoderDevice(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 *);
>
> /**
--
雷米‧德尼-库尔蒙
http://www.remlab.net/
More information about the vlc-devel
mailing list