mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
3c821c4ad3
commit
ed5ee04722
|
@ -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];
|
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]);
|
||||||
|
|
Loading…
Reference in New Issue