diff mbox series

[FFmpeg-devel,2/2] Add VDPAU to list of supported formats

Message ID 20200625112302.21994-3-mbonda@nvidia.com
State Superseded
Headers show
Series VDPAU HEVC 10/12 Bit Decode Support | expand

Checks

Context Check Description
andriy/default pending
andriy/make fail Make failed

Commit Message

ManojGuptaBonda June 25, 2020, 11:23 a.m. UTC
Added VDPAU to list of supported formats for HEVC10 and 12 bit formats
also added 42010 bit to surface_parameters and new VDP chroma formats to
VDPAUPixFmtMaps

Add HEVC 420 10/12 Bit  and 444 10/12 Bit support for VDPAU


YUV444P10 is defined as the 444 surface with 10bit valid data in LSBs
but H/w returns Data in MSBs Hence if we map output as YUV444p16 it
is filtering out the LSB to convert to p10 format.
---
 libavcodec/hevcdec.c        |  6 ++++++
 libavcodec/vdpau.c          |  4 ++++
 libavutil/hwcontext_vdpau.c | 13 +++++++++++--
 3 files changed, 21 insertions(+), 2 deletions(-)

Comments

Philip Langdale June 25, 2020, 4:21 p.m. UTC | #1
On Thu, 25 Jun 2020 16:53:02 +0530
ManojGuptaBonda <mbonda@nvidia.com> wrote:

> Added VDPAU to list of supported formats for HEVC10 and 12 bit formats
> also added 42010 bit to surface_parameters and new VDP chroma formats
> to VDPAUPixFmtMaps
> 
> Add HEVC 420 10/12 Bit  and 444 10/12 Bit support for VDPAU
> 
> 
> YUV444P10 is defined as the 444 surface with 10bit valid data in LSBs
> but H/w returns Data in MSBs Hence if we map output as YUV444p16 it
> is filtering out the LSB to convert to p10 format.
> ---
>  libavcodec/hevcdec.c        |  6 ++++++
>  libavcodec/vdpau.c          |  4 ++++
>  libavutil/hwcontext_vdpau.c | 13 +++++++++++--
>  3 files changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
> index c9e28f5826..e576cce5de 100644
> --- a/libavcodec/hevcdec.c
> +++ b/libavcodec/hevcdec.c
> @@ -414,6 +414,9 @@ static enum AVPixelFormat get_format(HEVCContext
> *s, const HEVCSPS *sps) #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
>          *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
>  #endif
> +#if CONFIG_HEVC_VDPAU_HWACCEL
> +        *fmt++ = AV_PIX_FMT_VDPAU;
> +#endif
>  #if CONFIG_HEVC_NVDEC_HWACCEL
>          *fmt++ = AV_PIX_FMT_CUDA;
>  #endif
> @@ -435,6 +438,9 @@ static enum AVPixelFormat get_format(HEVCContext
> *s, const HEVCSPS *sps) case AV_PIX_FMT_YUV420P12:
>      case AV_PIX_FMT_YUV444P10:
>      case AV_PIX_FMT_YUV444P12:
> +#if CONFIG_HEVC_VDPAU_HWACCEL
> +        *fmt++ = AV_PIX_FMT_VDPAU;
> +#endif
>  #if CONFIG_HEVC_NVDEC_HWACCEL
>          *fmt++ = AV_PIX_FMT_CUDA;
>  #endif
> diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c
> index 167f06d7ae..fa10905c75 100644
> --- a/libavcodec/vdpau.c
> +++ b/libavcodec/vdpau.c
> @@ -83,6 +83,8 @@ int av_vdpau_get_surface_parameters(AVCodecContext
> *avctx, switch (avctx->sw_pix_fmt) {
>      case AV_PIX_FMT_YUV420P:
>      case AV_PIX_FMT_YUVJ420P:
> +    case AV_PIX_FMT_YUV420P10:
> +    case AV_PIX_FMT_YUV420P12:
>          t = VDP_CHROMA_TYPE_420;
>          w = (w + 1) & ~1;
>          h = (h + 3) & ~3;
> @@ -95,6 +97,8 @@ int av_vdpau_get_surface_parameters(AVCodecContext
> *avctx, break;
>      case AV_PIX_FMT_YUV444P:
>      case AV_PIX_FMT_YUVJ444P:
> +    case AV_PIX_FMT_YUV444P10:
> +    case AV_PIX_FMT_YUV444P12:
>          t = VDP_CHROMA_TYPE_444;
>          h = (h + 1) & ~1;
>          break;
> diff --git a/libavutil/hwcontext_vdpau.c b/libavutil/hwcontext_vdpau.c
> index 6b8c1d5f76..6061476094 100644
> --- a/libavutil/hwcontext_vdpau.c
> +++ b/libavutil/hwcontext_vdpau.c
> @@ -39,8 +39,8 @@ typedef struct VDPAUDeviceContext {
>      VdpVideoSurfaceCreate                           *surf_create;
>      VdpVideoSurfaceDestroy                          *surf_destroy;
>  
> -    enum AVPixelFormat *pix_fmts[3];
> -    int              nb_pix_fmts[3];
> +    enum AVPixelFormat *pix_fmts[8];
> +    int              nb_pix_fmts[8];
>  } VDPAUDeviceContext;
>  
>  typedef struct VDPAUFramesContext {
> @@ -61,6 +61,8 @@ typedef struct VDPAUPixFmtMap {
>  static const VDPAUPixFmtMap pix_fmts_420[] = {
>      { VDP_YCBCR_FORMAT_NV12, AV_PIX_FMT_NV12    },
>      { VDP_YCBCR_FORMAT_YV12, AV_PIX_FMT_YUV420P },
> +    { VDP_YCBCR_FORMAT_P016, AV_PIX_FMT_P016    },
> +    { VDP_YCBCR_FORMAT_P010, AV_PIX_FMT_P010    },
>      { 0,                     AV_PIX_FMT_NONE,   },
>  };
>  
> @@ -75,6 +77,7 @@ static const VDPAUPixFmtMap pix_fmts_422[] = {
>  static const VDPAUPixFmtMap pix_fmts_444[] = {
>  #ifdef VDP_YCBCR_FORMAT_Y_U_V_444
>      { VDP_YCBCR_FORMAT_Y_U_V_444, AV_PIX_FMT_YUV444P },
> +    {VDP_YCBCR_FORMAT_Y_U_V_444_16, AV_PIX_FMT_YUV444P16},
>  #endif
>      { 0,                          AV_PIX_FMT_NONE,   },
>  };
> @@ -87,6 +90,11 @@ static const struct {
>      { VDP_CHROMA_TYPE_420, AV_PIX_FMT_YUV420P, pix_fmts_420 },
>      { VDP_CHROMA_TYPE_422, AV_PIX_FMT_YUV422P, pix_fmts_422 },
>      { VDP_CHROMA_TYPE_444, AV_PIX_FMT_YUV444P, pix_fmts_444 },
> +    { VDP_CHROMA_TYPE_420_16, AV_PIX_FMT_YUV420P10, pix_fmts_420 },
> +    { VDP_CHROMA_TYPE_420_16, AV_PIX_FMT_YUV420P12, pix_fmts_420 },
> +    { VDP_CHROMA_TYPE_422_16, AV_PIX_FMT_YUV422P, pix_fmts_422 },

Is this right? That's the 8bit ffmpeg format.

> +    { VDP_CHROMA_TYPE_444_16, AV_PIX_FMT_YUV444P10, pix_fmts_444 },
> +    { VDP_CHROMA_TYPE_444_16, AV_PIX_FMT_YUV444P12, pix_fmts_444 },
>  };
>  
>  static int count_pixfmts(const VDPAUPixFmtMap *map)
> @@ -354,6 +362,7 @@ static int
> vdpau_transfer_data_from(AVHWFramesContext *ctx, AVFrame *dst, if
> ((vdpau_format == VDP_YCBCR_FORMAT_YV12) #ifdef
> VDP_YCBCR_FORMAT_Y_U_V_444 || (vdpau_format ==
> VDP_YCBCR_FORMAT_Y_U_V_444)
> +            || (vdpau_format == VDP_YCBCR_FORMAT_Y_U_V_444_16)
>  #endif
>              )
>          FFSWAP(void*, data[1], data[2]);




--phil
diff mbox series

Patch

diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index c9e28f5826..e576cce5de 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -414,6 +414,9 @@  static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
         *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
 #endif
+#if CONFIG_HEVC_VDPAU_HWACCEL
+        *fmt++ = AV_PIX_FMT_VDPAU;
+#endif
 #if CONFIG_HEVC_NVDEC_HWACCEL
         *fmt++ = AV_PIX_FMT_CUDA;
 #endif
@@ -435,6 +438,9 @@  static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
     case AV_PIX_FMT_YUV420P12:
     case AV_PIX_FMT_YUV444P10:
     case AV_PIX_FMT_YUV444P12:
+#if CONFIG_HEVC_VDPAU_HWACCEL
+        *fmt++ = AV_PIX_FMT_VDPAU;
+#endif
 #if CONFIG_HEVC_NVDEC_HWACCEL
         *fmt++ = AV_PIX_FMT_CUDA;
 #endif
diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c
index 167f06d7ae..fa10905c75 100644
--- a/libavcodec/vdpau.c
+++ b/libavcodec/vdpau.c
@@ -83,6 +83,8 @@  int av_vdpau_get_surface_parameters(AVCodecContext *avctx,
     switch (avctx->sw_pix_fmt) {
     case AV_PIX_FMT_YUV420P:
     case AV_PIX_FMT_YUVJ420P:
+    case AV_PIX_FMT_YUV420P10:
+    case AV_PIX_FMT_YUV420P12:
         t = VDP_CHROMA_TYPE_420;
         w = (w + 1) & ~1;
         h = (h + 3) & ~3;
@@ -95,6 +97,8 @@  int av_vdpau_get_surface_parameters(AVCodecContext *avctx,
         break;
     case AV_PIX_FMT_YUV444P:
     case AV_PIX_FMT_YUVJ444P:
+    case AV_PIX_FMT_YUV444P10:
+    case AV_PIX_FMT_YUV444P12:
         t = VDP_CHROMA_TYPE_444;
         h = (h + 1) & ~1;
         break;
diff --git a/libavutil/hwcontext_vdpau.c b/libavutil/hwcontext_vdpau.c
index 6b8c1d5f76..6061476094 100644
--- a/libavutil/hwcontext_vdpau.c
+++ b/libavutil/hwcontext_vdpau.c
@@ -39,8 +39,8 @@  typedef struct VDPAUDeviceContext {
     VdpVideoSurfaceCreate                           *surf_create;
     VdpVideoSurfaceDestroy                          *surf_destroy;
 
-    enum AVPixelFormat *pix_fmts[3];
-    int              nb_pix_fmts[3];
+    enum AVPixelFormat *pix_fmts[8];
+    int              nb_pix_fmts[8];
 } VDPAUDeviceContext;
 
 typedef struct VDPAUFramesContext {
@@ -61,6 +61,8 @@  typedef struct VDPAUPixFmtMap {
 static const VDPAUPixFmtMap pix_fmts_420[] = {
     { VDP_YCBCR_FORMAT_NV12, AV_PIX_FMT_NV12    },
     { VDP_YCBCR_FORMAT_YV12, AV_PIX_FMT_YUV420P },
+    { VDP_YCBCR_FORMAT_P016, AV_PIX_FMT_P016    },
+    { VDP_YCBCR_FORMAT_P010, AV_PIX_FMT_P010    },
     { 0,                     AV_PIX_FMT_NONE,   },
 };
 
@@ -75,6 +77,7 @@  static const VDPAUPixFmtMap pix_fmts_422[] = {
 static const VDPAUPixFmtMap pix_fmts_444[] = {
 #ifdef VDP_YCBCR_FORMAT_Y_U_V_444
     { VDP_YCBCR_FORMAT_Y_U_V_444, AV_PIX_FMT_YUV444P },
+    {VDP_YCBCR_FORMAT_Y_U_V_444_16, AV_PIX_FMT_YUV444P16},
 #endif
     { 0,                          AV_PIX_FMT_NONE,   },
 };
@@ -87,6 +90,11 @@  static const struct {
     { VDP_CHROMA_TYPE_420, AV_PIX_FMT_YUV420P, pix_fmts_420 },
     { VDP_CHROMA_TYPE_422, AV_PIX_FMT_YUV422P, pix_fmts_422 },
     { VDP_CHROMA_TYPE_444, AV_PIX_FMT_YUV444P, pix_fmts_444 },
+    { VDP_CHROMA_TYPE_420_16, AV_PIX_FMT_YUV420P10, pix_fmts_420 },
+    { VDP_CHROMA_TYPE_420_16, AV_PIX_FMT_YUV420P12, pix_fmts_420 },
+    { VDP_CHROMA_TYPE_422_16, AV_PIX_FMT_YUV422P, pix_fmts_422 },
+    { VDP_CHROMA_TYPE_444_16, AV_PIX_FMT_YUV444P10, pix_fmts_444 },
+    { VDP_CHROMA_TYPE_444_16, AV_PIX_FMT_YUV444P12, pix_fmts_444 },
 };
 
 static int count_pixfmts(const VDPAUPixFmtMap *map)
@@ -354,6 +362,7 @@  static int vdpau_transfer_data_from(AVHWFramesContext *ctx, AVFrame *dst,
     if ((vdpau_format == VDP_YCBCR_FORMAT_YV12)
 #ifdef VDP_YCBCR_FORMAT_Y_U_V_444
             || (vdpau_format == VDP_YCBCR_FORMAT_Y_U_V_444)
+            || (vdpau_format == VDP_YCBCR_FORMAT_Y_U_V_444_16)
 #endif
             )
         FFSWAP(void*, data[1], data[2]);