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>tags/n4.4
@@ -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: | ||||
@@ -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 | ||||
@@ -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; | ||||
@@ -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, \ | ||||
@@ -39,8 +39,8 @@ typedef struct VDPAUDeviceContext { | |||||
VdpVideoSurfaceCreate *surf_create; | VdpVideoSurfaceCreate *surf_create; | ||||
VdpVideoSurfaceDestroy *surf_destroy; | VdpVideoSurfaceDestroy *surf_destroy; | ||||
enum AVPixelFormat *pix_fmts[3]; | |||||
int nb_pix_fmts[3]; | |||||
enum AVPixelFormat *pix_fmts[8]; | |||||
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]); | ||||