Message ID | 20200625112302.21994-3-mbonda@nvidia.com |
---|---|
State | Superseded |
Headers | show |
Series | VDPAU HEVC 10/12 Bit Decode Support | expand |
Context | Check | Description |
---|---|---|
andriy/default | pending | |
andriy/make | fail | Make failed |
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 --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]);