[vlc-devel] [PATCH 03/34] video context: add a function to test if 2 context are similar

Steve Lhomme robux4 at ycbcr.xyz
Tue Nov 12 08:32:13 CET 2019


On 2019-11-09 3:52, Rémi Denis-Courmont wrote:
> Le vendredi 8 novembre 2019, 16:40:07 EET Steve Lhomme a écrit :
>> If they are not similar a converter from one to the other should be used.
> 
> What is the definition of similar ? For non-serial objects, the idea seems
> rather fishy.

"Video Context are similar when they can use surfaces from one another."

This is used in places where the video_format_IsSimilar() is used. A 
hardware decoder may push the same video format (same opaque chroma) but 
using a different video context. In some cases (NVDEC/CUDA for example) 
the new video context can be used without reconfiguring anything. In 
some other cases they might not be (DXVA2 after a device reset has been 
received).

>> A NULL callback is allowed, in which case only the type of the video context
>> is checked.
>> ---
>>   include/vlc_picture.h            | 11 +++++++++++
>>   modules/hw/vdpau/avcodec.c       |  2 +-
>>   modules/video_chroma/d3d11_fmt.c |  2 +-
>>   modules/video_chroma/d3d9_fmt.c  |  2 +-
>>   src/input/decoder_helpers.c      | 16 ++++++++++++++++
>>   src/libvlccore.sym               |  1 +
>>   6 files changed, 31 insertions(+), 3 deletions(-)
>>
>> diff --git a/include/vlc_picture.h b/include/vlc_picture.h
>> index a5931ef67af..c9bf28a9ed8 100644
>> --- a/include/vlc_picture.h
>> +++ b/include/vlc_picture.h
>> @@ -85,6 +85,11 @@ typedef struct vlc_video_context vlc_video_context;
>>   struct vlc_video_context_operations
>>   {
>>       void (*destroy)(void *priv);
>> +    /**
>> +     * Check if two video context of the same type are similar.
>> +     * The callback can be NULL.
>> +     */
>> +    bool (*similar)(const vlc_video_context*, const vlc_video_context*);
>>   };
>>
>>   /** Decoder device type */
>> @@ -110,6 +115,12 @@ VLC_API void
>> vlc_video_context_Release(vlc_video_context *); VLC_API enum
>> vlc_video_context_type vlc_video_context_GetType(const vlc_video_context
>> *); VLC_API void *vlc_video_context_GetPrivate(vlc_video_context *, enum
>> vlc_video_context_type); VLC_API vlc_video_context
>> *vlc_video_context_Hold(vlc_video_context *); +/**
>> + * Test if two video context are similar/compatible.
>> + *
>> + * Video Context are similar when they can use surfaces from one another.
>> + */
>> +VLC_API bool vlc_video_context_IsSimilar(const vlc_video_context *, const
>> vlc_video_context *);
>>
>>   /**
>>    * Get the decoder device used by the device context.
>> diff --git a/modules/hw/vdpau/avcodec.c b/modules/hw/vdpau/avcodec.c
>> index 74aa135f70c..6f9a75fd803 100644
>> --- a/modules/hw/vdpau/avcodec.c
>> +++ b/modules/hw/vdpau/avcodec.c
>> @@ -153,7 +153,7 @@ static void DestroyVDPAUVideoContext(void *private)
>>   }
>>
>>   const struct vlc_video_context_operations vdpau_vctx_ops = {
>> -    DestroyVDPAUVideoContext,
>> +    DestroyVDPAUVideoContext, NULL // TODO
>>   };
>>
>>   static int Open(vlc_va_t *va, AVCodecContext *avctx, const
>> AVPixFmtDescriptor *desc, diff --git a/modules/video_chroma/d3d11_fmt.c
>> b/modules/video_chroma/d3d11_fmt.c index 77156f509bb..edb39244a33 100644
>> --- a/modules/video_chroma/d3d11_fmt.c
>> +++ b/modules/video_chroma/d3d11_fmt.c
>> @@ -771,7 +771,7 @@ static void ReleaseD3D11ContextPrivate(void *private)
>>   }
>>
>>   const struct vlc_video_context_operations d3d11_vctx_ops = {
>> -    ReleaseD3D11ContextPrivate,
>> +    ReleaseD3D11ContextPrivate, NULL // TODO
>>   };
>>
>>   void d3d11_pic_context_destroy(picture_context_t *ctx)
>> diff --git a/modules/video_chroma/d3d9_fmt.c
>> b/modules/video_chroma/d3d9_fmt.c index 508bfc838f8..3a53484908e 100644
>> --- a/modules/video_chroma/d3d9_fmt.c
>> +++ b/modules/video_chroma/d3d9_fmt.c
>> @@ -293,7 +293,7 @@ static void ReleaseD3D9ContextPrivate(void *private)
>>   }
>>
>>   const struct vlc_video_context_operations d3d9_vctx_ops = {
>> -    ReleaseD3D9ContextPrivate,
>> +    ReleaseD3D9ContextPrivate, NULL // TODO
>>   };
>>
>>   void d3d9_pic_context_destroy(picture_context_t *ctx)
>> diff --git a/src/input/decoder_helpers.c b/src/input/decoder_helpers.c
>> index 3ff71f49c23..e4b8f2797b6 100644
>> --- a/src/input/decoder_helpers.c
>> +++ b/src/input/decoder_helpers.c
>> @@ -294,3 +294,19 @@ vlc_decoder_device*
>> vlc_video_context_HoldDevice(vlc_video_context *vctx) return NULL;
>>       return vlc_decoder_device_Hold( vctx->device );
>>   }
>> +
>> +bool vlc_video_context_IsSimilar(const vlc_video_context *a, const
>> vlc_video_context *b) +{
>> +    if (!a && !b)
>> +        return true;
>> +    if (!a || !b)
>> +        return false;
> 
> if (a == NULL || b == NULL)
>      return a == b;
> 
>> +    if (a->private_type != b->private_type)
>> +        return false;
>> +    if (a->ops == NULL)
>> +    {
>> +        assert(b->ops == NULL);
>> +        return b->ops == NULL;
>> +    }
>> +    return a->ops->similar == NULL || a->ops->similar(a, b);
>> +}
>> diff --git a/src/libvlccore.sym b/src/libvlccore.sym
>> index 7dce1c2c25b..3ea59614722 100644
>> --- a/src/libvlccore.sym
>> +++ b/src/libvlccore.sym
>> @@ -952,3 +952,4 @@ vlc_video_context_GetType
>>   vlc_video_context_GetPrivate
>>   vlc_video_context_Hold
>>   vlc_video_context_HoldDevice
>> +vlc_video_context_IsSimilar
> 
> 
> -- 
> Rémi Denis-Courmont
> 
> 
> _______________________________________________
> 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