On Thu, 25 Jun 2020 16:53:02 +0530 ManojGuptaBonda <mbo...@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 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".