[vlc-commits] avcodec: va: pass the software format description to the VA

Steve Lhomme git at videolan.org
Tue Oct 8 10:14:29 CEST 2019


vlc | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Fri Oct  4 10:04:28 2019 +0200| [c8a1298cec05f2947a5f9708fcb12c99e20490ca] | committer: Steve Lhomme

avcodec: va: pass the software format description to the VA

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.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c8a1298cec05f2947a5f9708fcb12c99e20490ca
---

 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 d6477cfaca..c34430bed6 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 9f6ce7520c..51a729630d 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 4e94a95a13..e3cfea9e37 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 24eb59415c..68e8727e69 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 7558b2b687..ac4bd75db8 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 3e6b827c8f..7011124baa 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 7e8329bf88..be0a321b0e 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 d69abd7419..b9fa684290 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 599e86cc06..e0b94ec55e 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;



More information about the vlc-commits mailing list