[vlc-devel] [PATCH 10/39] decoder: request decoder device when getting the vout

Steve Lhomme robux4 at ycbcr.xyz
Tue Oct 8 07:44:41 CEST 2019


On 2019-10-07 20:04, Rémi Denis-Courmont wrote:
> 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.

That was the plan before the workshop. After we concluded that we needed 
a hint for all cases (i.e. VAAPI) to work. It's still push because there 
will not be any picture PULLed from the display anymore. All pictures 
will be PUSHed from the source (decoder -> filters -> converter -> display).

> But to eventually support capture devices or such things, the decoder must be
> able to push another decoder device of its own anyway.

It's similar to forcing --dec-dev to the non default value (for example 
--dec-dev=nvdec-device). We already support the case where the default 
hint wasn't used. Maybe another display than the default one will be 
used, or a converter will be used.

>> @@ -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/
> 
> 
> 
> _______________________________________________
> 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