avcodec/hevcdec: Add VDPAU to list of supported formats

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.

Signed-off-by: Philip Langdale <philipl@overt.org>
This commit is contained in:
ManojGuptaBonda 2020-06-27 19:04:22 +05:30 committed by Philip Langdale
parent 3c821c4ad3
commit ed5ee04722
5 changed files with 31 additions and 3 deletions

View File

@ -6,6 +6,7 @@ version <next>:
- MacCaption demuxer - MacCaption demuxer
- PGX decoder - PGX decoder
- chromanr video filter - chromanr video filter
- VDPAU accelerated HEVC 10/12bit decoding
version 4.3: version 4.3:

View File

@ -424,6 +424,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
*fmt++ = AV_PIX_FMT_VIDEOTOOLBOX; *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
#endif #endif
#if CONFIG_HEVC_VDPAU_HWACCEL
*fmt++ = AV_PIX_FMT_VDPAU;
#endif
#if CONFIG_HEVC_NVDEC_HWACCEL #if CONFIG_HEVC_NVDEC_HWACCEL
*fmt++ = AV_PIX_FMT_CUDA; *fmt++ = AV_PIX_FMT_CUDA;
#endif #endif
@ -445,6 +448,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
case AV_PIX_FMT_YUV420P12: case AV_PIX_FMT_YUV420P12:
case AV_PIX_FMT_YUV444P10: case AV_PIX_FMT_YUV444P10:
case AV_PIX_FMT_YUV444P12: case AV_PIX_FMT_YUV444P12:
#if CONFIG_HEVC_VDPAU_HWACCEL
*fmt++ = AV_PIX_FMT_VDPAU;
#endif
#if CONFIG_HEVC_NVDEC_HWACCEL #if CONFIG_HEVC_NVDEC_HWACCEL
*fmt++ = AV_PIX_FMT_CUDA; *fmt++ = AV_PIX_FMT_CUDA;
#endif #endif

View File

@ -83,6 +83,8 @@ int av_vdpau_get_surface_parameters(AVCodecContext *avctx,
switch (avctx->sw_pix_fmt) { switch (avctx->sw_pix_fmt) {
case AV_PIX_FMT_YUV420P: case AV_PIX_FMT_YUV420P:
case AV_PIX_FMT_YUVJ420P: case AV_PIX_FMT_YUVJ420P:
case AV_PIX_FMT_YUV420P10:
case AV_PIX_FMT_YUV420P12:
t = VDP_CHROMA_TYPE_420; t = VDP_CHROMA_TYPE_420;
w = (w + 1) & ~1; w = (w + 1) & ~1;
h = (h + 3) & ~3; h = (h + 3) & ~3;
@ -95,6 +97,8 @@ int av_vdpau_get_surface_parameters(AVCodecContext *avctx,
break; break;
case AV_PIX_FMT_YUV444P: case AV_PIX_FMT_YUV444P:
case AV_PIX_FMT_YUVJ444P: case AV_PIX_FMT_YUVJ444P:
case AV_PIX_FMT_YUV444P10:
case AV_PIX_FMT_YUV444P12:
t = VDP_CHROMA_TYPE_444; t = VDP_CHROMA_TYPE_444;
h = (h + 1) & ~1; h = (h + 1) & ~1;
break; break;

View File

@ -28,7 +28,7 @@
#include "libavutil/version.h" #include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 58 #define LIBAVCODEC_VERSION_MAJOR 58
#define LIBAVCODEC_VERSION_MINOR 94 #define LIBAVCODEC_VERSION_MINOR 95
#define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \

View File

@ -39,8 +39,8 @@ typedef struct VDPAUDeviceContext {
VdpVideoSurfaceCreate *surf_create; VdpVideoSurfaceCreate *surf_create;
VdpVideoSurfaceDestroy *surf_destroy; VdpVideoSurfaceDestroy *surf_destroy;
enum AVPixelFormat *pix_fmts[3]; enum AVPixelFormat *pix_fmts[8];
int nb_pix_fmts[3]; int nb_pix_fmts[8];
} VDPAUDeviceContext; } VDPAUDeviceContext;
typedef struct VDPAUFramesContext { typedef struct VDPAUFramesContext {
@ -61,6 +61,10 @@ typedef struct VDPAUPixFmtMap {
static const VDPAUPixFmtMap pix_fmts_420[] = { static const VDPAUPixFmtMap pix_fmts_420[] = {
{ VDP_YCBCR_FORMAT_NV12, AV_PIX_FMT_NV12 }, { VDP_YCBCR_FORMAT_NV12, AV_PIX_FMT_NV12 },
{ VDP_YCBCR_FORMAT_YV12, AV_PIX_FMT_YUV420P }, { VDP_YCBCR_FORMAT_YV12, AV_PIX_FMT_YUV420P },
#ifdef VDP_YCBCR_FORMAT_P016
{ VDP_YCBCR_FORMAT_P016, AV_PIX_FMT_P016 },
{ VDP_YCBCR_FORMAT_P010, AV_PIX_FMT_P010 },
#endif
{ 0, AV_PIX_FMT_NONE, }, { 0, AV_PIX_FMT_NONE, },
}; };
@ -75,6 +79,9 @@ static const VDPAUPixFmtMap pix_fmts_422[] = {
static const VDPAUPixFmtMap pix_fmts_444[] = { static const VDPAUPixFmtMap pix_fmts_444[] = {
#ifdef VDP_YCBCR_FORMAT_Y_U_V_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, AV_PIX_FMT_YUV444P },
#endif
#ifdef VDP_YCBCR_FORMAT_P016
{VDP_YCBCR_FORMAT_Y_U_V_444_16, AV_PIX_FMT_YUV444P16},
#endif #endif
{ 0, AV_PIX_FMT_NONE, }, { 0, AV_PIX_FMT_NONE, },
}; };
@ -87,6 +94,13 @@ static const struct {
{ VDP_CHROMA_TYPE_420, AV_PIX_FMT_YUV420P, pix_fmts_420 }, { 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_422, AV_PIX_FMT_YUV422P, pix_fmts_422 },
{ VDP_CHROMA_TYPE_444, AV_PIX_FMT_YUV444P, pix_fmts_444 }, { VDP_CHROMA_TYPE_444, AV_PIX_FMT_YUV444P, pix_fmts_444 },
#ifdef VDP_YCBCR_FORMAT_P016
{ 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_YUV422P10, 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 },
#endif
}; };
static int count_pixfmts(const VDPAUPixFmtMap *map) static int count_pixfmts(const VDPAUPixFmtMap *map)
@ -354,6 +368,9 @@ static int vdpau_transfer_data_from(AVHWFramesContext *ctx, AVFrame *dst,
if ((vdpau_format == VDP_YCBCR_FORMAT_YV12) if ((vdpau_format == VDP_YCBCR_FORMAT_YV12)
#ifdef VDP_YCBCR_FORMAT_Y_U_V_444 #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)
#endif
#ifdef VDP_YCBCR_FORMAT_P016
|| (vdpau_format == VDP_YCBCR_FORMAT_Y_U_V_444_16)
#endif #endif
) )
FFSWAP(void*, data[1], data[2]); FFSWAP(void*, data[1], data[2]);