[vlc-devel] [PATCH 1/7] avcodec: va: pass the software format description to the VA

Rémi Denis-Courmont remi at remlab.net
Fri Oct 4 16:26:07 CEST 2019


Hi,

Why does the decoder need to care? Isn't that a hassle for the RGB conversion shader rather than the decoding??

Le 4 octobre 2019 16:15:52 GMT+03:00, Steve Lhomme <robux4 at ycbcr.xyz> a écrit :
>The codec profile alone doesn't always give information on the bit
>depth or
>chroma subsampling (see HEVC Range Extension).
>
>The pixel format description is read in the lavc module rather than
>each VA so
>they don't have to link with libavutil.
>---
> modules/codec/avcodec/d3d11va.c    |  7 ++++---
> modules/codec/avcodec/directx_va.c | 11 +++++++----
> modules/codec/avcodec/directx_va.h |  3 ++-
> modules/codec/avcodec/dxva2.c      |  7 ++++---
> modules/codec/avcodec/va.c         |  8 +++++---
> modules/codec/avcodec/va.h         |  6 ++++--
> modules/codec/avcodec/vaapi.c      |  4 +++-
> modules/codec/avcodec/video.c      |  4 +++-
> modules/hw/vdpau/avcodec.c         |  4 +++-
> 9 files changed, 35 insertions(+), 19 deletions(-)
>
>diff --git a/modules/codec/avcodec/d3d11va.c
>b/modules/codec/avcodec/d3d11va.c
>index d6477cfaca2..c34430bed66 100644
>--- a/modules/codec/avcodec/d3d11va.c
>+++ b/modules/codec/avcodec/d3d11va.c
>@@ -55,7 +55,7 @@ typedef picture_sys_d3d11_t VA_PICSYS;
> 
> #include "directx_va.h"
> 
>-static int Open(vlc_va_t *, AVCodecContext *, enum PixelFormat,
>+static int Open(vlc_va_t *, AVCodecContext *, const AVPixFmtDescriptor
>*, enum PixelFormat,
>                 const es_format_t *, void *);
> 
> vlc_module_begin()
>@@ -302,7 +302,8 @@ static void Close(vlc_va_t *va)
> 
> static const struct vlc_va_operations ops = { Get, Close, };
> 
>-static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat
>pix_fmt,
>+static int Open(vlc_va_t *va, AVCodecContext *ctx, const
>AVPixFmtDescriptor *desc,
>+                enum PixelFormat pix_fmt,
>                 const es_format_t *fmt, void *picsys)
> {
>     int err = VLC_EGENERIC;
>@@ -383,7 +384,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx,
>enum PixelFormat pix_fmt,
> 
>     video_format_t fmt_out;
> static const directx_sys_t dx_sys = { DxGetInputList, DxSetupOutput };
>-    err = directx_va_Setup(va, &dx_sys, ctx, fmt,
>isXboxHardware(sys->d3d_dev.d3ddevice), &fmt_out,
>&sys->hw.surface_count, &sys->decoder_guid);
>+    err = directx_va_Setup(va, &dx_sys, ctx, desc, fmt,
>isXboxHardware(sys->d3d_dev.d3ddevice), &fmt_out,
>&sys->hw.surface_count, &sys->decoder_guid);
>     if (err != VLC_SUCCESS)
>         goto error;
> 
>diff --git a/modules/codec/avcodec/directx_va.c
>b/modules/codec/avcodec/directx_va.c
>index 9f6ce7520cc..51a729630d4 100644
>--- a/modules/codec/avcodec/directx_va.c
>+++ b/modules/codec/avcodec/directx_va.c
>@@ -267,7 +267,8 @@ static const directx_va_mode_t DXVA_MODES[] = {
>     { NULL, NULL, 0, NULL }
> };
> 
>-static int FindVideoServiceConversion(vlc_va_t *, const directx_sys_t
>*, const es_format_t *, video_format_t *fmt_out, const AVCodecContext
>*, GUID *found_guid);
>+static int FindVideoServiceConversion(vlc_va_t *, const directx_sys_t
>*, const es_format_t *, video_format_t *fmt_out,
>+                                      const AVCodecContext *, const
>AVPixFmtDescriptor *, GUID *found_guid);
> 
> char *directx_va_GetDecoderName(const GUID *guid)
> {
>@@ -283,7 +284,8 @@ char *directx_va_GetDecoderName(const GUID *guid)
> }
> 
> /* */
>-int directx_va_Setup(vlc_va_t *va, const directx_sys_t *dx_sys, const
>AVCodecContext *avctx,
>+int directx_va_Setup(vlc_va_t *va, const directx_sys_t *dx_sys,
>+                     const AVCodecContext *avctx, const
>AVPixFmtDescriptor *desc,
>                      const es_format_t *fmt, int flag_xbox,
>         video_format_t *fmt_out, unsigned *surfaces, GUID *found_guid)
> {
>@@ -344,7 +346,7 @@ int directx_va_Setup(vlc_va_t *va, const
>directx_sys_t *dx_sys, const AVCodecCon
>     fmt_out->i_frame_rate_base = avctx->framerate.den;
> 
>     /* */
>-    if (FindVideoServiceConversion(va, dx_sys, fmt, fmt_out, avctx,
>found_guid)) {
>+    if (FindVideoServiceConversion(va, dx_sys, fmt, fmt_out, avctx,
>desc, found_guid)) {
>         msg_Err(va, "FindVideoServiceConversion failed");
>         return VLC_EGENERIC;
>     }
>@@ -390,7 +392,8 @@ static bool profile_supported(const
>directx_va_mode_t *mode, const es_format_t *
>  * Find the best suited decoder mode GUID and render format.
>  */
>static int FindVideoServiceConversion(vlc_va_t *va, const directx_sys_t
>*dx_sys,
>-                                      const es_format_t *fmt,
>video_format_t *fmt_out, const AVCodecContext *avctx,
>+                                      const es_format_t *fmt,
>video_format_t *fmt_out,
>+                                      const AVCodecContext *avctx,
>const AVPixFmtDescriptor *desc,
>                                       GUID *found_guid)
> {
>     input_list_t p_list = { 0 };
>diff --git a/modules/codec/avcodec/directx_va.h
>b/modules/codec/avcodec/directx_va.h
>index 4e94a95a13a..e3cfea9e37c 100644
>--- a/modules/codec/avcodec/directx_va.h
>+++ b/modules/codec/avcodec/directx_va.h
>@@ -64,7 +64,8 @@ typedef struct
> 
> } directx_sys_t;
> 
>-int directx_va_Setup(vlc_va_t *, const directx_sys_t *, const
>AVCodecContext *avctx, const es_format_t *, int flag_xbox,
>+int directx_va_Setup(vlc_va_t *, const directx_sys_t *, const
>AVCodecContext *, const AVPixFmtDescriptor *,
>+                     const es_format_t *, int flag_xbox,
>   video_format_t *fmt_out, unsigned *surface_count, GUID *found_guid);
> char *directx_va_GetDecoderName(const GUID *guid);
>bool directx_va_canUseDecoder(vlc_va_t *, UINT VendorId, UINT DeviceId,
>const GUID *pCodec, UINT driverBuild);
>diff --git a/modules/codec/avcodec/dxva2.c
>b/modules/codec/avcodec/dxva2.c
>index 24eb59415c3..68e8727e696 100644
>--- a/modules/codec/avcodec/dxva2.c
>+++ b/modules/codec/avcodec/dxva2.c
>@@ -42,7 +42,7 @@ typedef picture_sys_d3d9_t VA_PICSYS;
> 
> #include "directx_va.h"
> 
>-static int Open(vlc_va_t *, AVCodecContext *, enum PixelFormat,
>+static int Open(vlc_va_t *, AVCodecContext *, const AVPixFmtDescriptor
>*, enum PixelFormat,
>                 const es_format_t *, void *);
> 
> vlc_module_begin()
>@@ -243,7 +243,8 @@ static void Close(vlc_va_t *va)
> 
> static const struct vlc_va_operations ops = { Get, Close, };
> 
>-static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat
>pix_fmt,
>+static int Open(vlc_va_t *va, AVCodecContext *ctx, const
>AVPixFmtDescriptor *desc,
>+                enum PixelFormat pix_fmt,
>                 const es_format_t *fmt, void *picsys)
> {
>     int err = VLC_EGENERIC;
>@@ -309,7 +310,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx,
>enum PixelFormat pix_fmt,
> 
>     video_format_t fmt_out;
> static const directx_sys_t dx_sys = { DxGetInputList, DxSetupOutput };
>-    err = directx_va_Setup(va, &dx_sys, ctx, fmt, 0, &fmt_out,
>&sys->hw.surface_count, &sys->decoder_guid);
>+    err = directx_va_Setup(va, &dx_sys, ctx, desc, fmt, 0, &fmt_out,
>&sys->hw.surface_count, &sys->decoder_guid);
>     if (err != VLC_SUCCESS)
>         goto error;
> 
>diff --git a/modules/codec/avcodec/va.c b/modules/codec/avcodec/va.c
>index 7558b2b6874..ac4bd75db88 100644
>--- a/modules/codec/avcodec/va.c
>+++ b/modules/codec/avcodec/va.c
>@@ -92,16 +92,18 @@ static int vlc_va_Start(void *func, bool forced,
>va_list ap)
> {
>     vlc_va_t *va = va_arg(ap, vlc_va_t *);
>     AVCodecContext *ctx = va_arg(ap, AVCodecContext *);
>+    const AVPixFmtDescriptor *src_desc = va_arg(ap, const
>AVPixFmtDescriptor *);
>     enum PixelFormat pix_fmt = va_arg(ap, enum PixelFormat);
>     const es_format_t *fmt = va_arg(ap, const es_format_t *);
>     void *p_sys = va_arg(ap, void *);
>     vlc_va_open open = func;
> 
>     (void) forced;
>-    return open(va, ctx, pix_fmt, fmt, p_sys);
>+    return open(va, ctx, src_desc, pix_fmt, fmt, p_sys);
> }
> 
>-vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *avctx,
>+vlc_va_t *vlc_va_New(vlc_object_t *obj,
>+                     AVCodecContext *avctx, const AVPixFmtDescriptor
>*src_desc,
>                      enum PixelFormat pix_fmt, const es_format_t *fmt,
>                      void *sys)
> {
>@@ -112,7 +114,7 @@ vlc_va_t *vlc_va_New(vlc_object_t *obj,
>AVCodecContext *avctx,
>     char *modlist = var_InheritString(obj, "avcodec-hw");
> 
>     if (vlc_module_load(va, "hw decoder", modlist, true,
>-                        vlc_va_Start, va, avctx, pix_fmt, fmt, sys) ==
>NULL)
>+                        vlc_va_Start, va, avctx, src_desc, pix_fmt,
>fmt, sys) == NULL)
>     {
>         vlc_object_delete(va);
>         va = NULL;
>diff --git a/modules/codec/avcodec/va.h b/modules/codec/avcodec/va.h
>index 3e6b827c8f2..7011124baaf 100644
>--- a/modules/codec/avcodec/va.h
>+++ b/modules/codec/avcodec/va.h
>@@ -24,6 +24,7 @@
> #define VLC_AVCODEC_VA_H 1
> 
> #include "avcommon_compat.h"
>+#include <libavutil/pixdesc.h>
> 
> typedef struct vlc_va_t vlc_va_t;
> typedef struct vlc_va_sys_t vlc_va_sys_t;
>@@ -40,7 +41,8 @@ struct vlc_va_t {
>     const struct vlc_va_operations *ops;
> };
> 
>-typedef int (*vlc_va_open)(vlc_va_t *, AVCodecContext *, enum
>PixelFormat,
>+typedef int (*vlc_va_open)(vlc_va_t *, AVCodecContext *, const
>AVPixFmtDescriptor *,
>+                           enum PixelFormat,
>                            const es_format_t *, void *);
> 
> #define set_va_callback(activate, priority) \
>@@ -66,7 +68,7 @@ vlc_fourcc_t vlc_va_GetChroma(enum PixelFormat hwfmt,
>enum PixelFormat swfmt);
>  * @param fmt VLC format of the content to decode
>  * @return a new VLC object on success, NULL on error.
>  */
>-vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *,
>+vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *, const
>AVPixFmtDescriptor *,
>                      enum PixelFormat, const es_format_t *fmt,
>                      void *p_sys);
> 
>diff --git a/modules/codec/avcodec/vaapi.c
>b/modules/codec/avcodec/vaapi.c
>index 7e8329bf888..be0a321b0e5 100644
>--- a/modules/codec/avcodec/vaapi.c
>+++ b/modules/codec/avcodec/vaapi.c
>@@ -145,9 +145,11 @@ static void Delete(vlc_va_t *va)
> 
> static const struct vlc_va_operations ops = { Get, Delete, };
> 
>-static int Create(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat
>pix_fmt,
>+static int Create(vlc_va_t *va, AVCodecContext *ctx, const
>AVPixFmtDescriptor *desc,
>+                  enum PixelFormat pix_fmt,
>                   const es_format_t *fmt, void *p_sys)
> {
>+    VLC_UNUSED(desc);
>     if (pix_fmt != AV_PIX_FMT_VAAPI_VLD || p_sys == NULL)
>         return VLC_EGENERIC;
> 
>diff --git a/modules/codec/avcodec/video.c
>b/modules/codec/avcodec/video.c
>index d69abd7419c..b9fa684290f 100644
>--- a/modules/codec/avcodec/video.c
>+++ b/modules/codec/avcodec/video.c
>@@ -1704,6 +1704,8 @@ no_reuse:
>         AV_PIX_FMT_NONE,
>     };
> 
>+    const AVPixFmtDescriptor *src_desc = av_pix_fmt_desc_get(swfmt);
>+
>     for( size_t i = 0; hwfmts[i] != AV_PIX_FMT_NONE; i++ )
>     {
>         enum PixelFormat hwfmt = AV_PIX_FMT_NONE;
>@@ -1730,7 +1732,7 @@ no_reuse:
> 
>         picture_t *test_pic = decoder_NewPicture(p_dec);
>assert(!test_pic || test_pic->format.i_chroma ==
>p_dec->fmt_out.video.i_chroma);
>-        vlc_va_t *va = vlc_va_New(VLC_OBJECT(p_dec), p_context, hwfmt,
>+        vlc_va_t *va = vlc_va_New(VLC_OBJECT(p_dec), p_context,
>src_desc, hwfmt,
>                                   &p_dec->fmt_in,
>                                   test_pic ? test_pic->p_sys : NULL);
>         if (test_pic)
>diff --git a/modules/hw/vdpau/avcodec.c b/modules/hw/vdpau/avcodec.c
>index 599e86cc06e..e0b94ec55e5 100644
>--- a/modules/hw/vdpau/avcodec.c
>+++ b/modules/hw/vdpau/avcodec.c
>@@ -132,7 +132,8 @@ static void Close(vlc_va_t *va)
> 
> static const struct vlc_va_operations ops = { Lock, Close, };
> 
>-static int Open(vlc_va_t *va, AVCodecContext *avctx, enum PixelFormat
>pix_fmt,
>+static int Open(vlc_va_t *va, AVCodecContext *avctx, const
>AVPixFmtDescriptor *desc,
>+                enum PixelFormat pix_fmt,
>                 const es_format_t *fmt, void *p_sys)
> {
>     if (pix_fmt != AV_PIX_FMT_VDPAU)
>@@ -140,6 +141,7 @@ static int Open(vlc_va_t *va, AVCodecContext
>*avctx, enum PixelFormat pix_fmt,
> 
>     (void) fmt;
>     (void) p_sys;
>+    (void) desc;
>     void *func;
>     VdpStatus err;
>     VdpChromaType type;
>-- 
>2.17.1
>
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel

-- 
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20191004/a4b2270f/attachment.html>


More information about the vlc-devel mailing list