Commit 4cfbeef3 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont Committed by Anton Khirnov

h264: factor hwaccel pixel formats list

This is to avoid proliferation of similar tables in following changes.
Signed-off-by: 's avatarRémi Denis-Courmont <remi@remlab.net>
Signed-off-by: 's avatarAnton Khirnov <anton@khirnov.net>
parent 9cfa68c5
...@@ -143,42 +143,6 @@ static const uint8_t dequant8_coeff_init[6][6] = { ...@@ -143,42 +143,6 @@ static const uint8_t dequant8_coeff_init[6][6] = {
{ 36, 32, 58, 34, 46, 43 }, { 36, 32, 58, 34, 46, 43 },
}; };
static const enum AVPixelFormat h264_hwaccel_pixfmt_list_420[] = {
#if CONFIG_H264_DXVA2_HWACCEL
AV_PIX_FMT_DXVA2_VLD,
#endif
#if CONFIG_H264_VAAPI_HWACCEL
AV_PIX_FMT_VAAPI_VLD,
#endif
#if CONFIG_H264_VDA_HWACCEL
AV_PIX_FMT_VDA_VLD,
AV_PIX_FMT_VDA,
#endif
#if CONFIG_H264_VDPAU_HWACCEL
AV_PIX_FMT_VDPAU,
#endif
AV_PIX_FMT_YUV420P,
AV_PIX_FMT_NONE
};
static const enum AVPixelFormat h264_hwaccel_pixfmt_list_jpeg_420[] = {
#if CONFIG_H264_DXVA2_HWACCEL
AV_PIX_FMT_DXVA2_VLD,
#endif
#if CONFIG_H264_VAAPI_HWACCEL
AV_PIX_FMT_VAAPI_VLD,
#endif
#if CONFIG_H264_VDA_HWACCEL
AV_PIX_FMT_VDA_VLD,
AV_PIX_FMT_VDA,
#endif
#if CONFIG_H264_VDPAU_HWACCEL
AV_PIX_FMT_VDPAU,
#endif
AV_PIX_FMT_YUVJ420P,
AV_PIX_FMT_NONE
};
static void release_unused_pictures(H264Context *h, int remove_current) static void release_unused_pictures(H264Context *h, int remove_current)
{ {
...@@ -975,54 +939,69 @@ static int clone_slice(H264Context *dst, H264Context *src) ...@@ -975,54 +939,69 @@ static int clone_slice(H264Context *dst, H264Context *src)
static enum AVPixelFormat get_pixel_format(H264Context *h) static enum AVPixelFormat get_pixel_format(H264Context *h)
{ {
enum AVPixelFormat pix_fmts[2]; #define HWACCEL_MAX (CONFIG_H264_DXVA2_HWACCEL + \
CONFIG_H264_VAAPI_HWACCEL + \
(CONFIG_H264_VDA_HWACCEL * 2) + \
CONFIG_H264_VDPAU_HWACCEL)
enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
const enum AVPixelFormat *choices = pix_fmts; const enum AVPixelFormat *choices = pix_fmts;
pix_fmts[1] = AV_PIX_FMT_NONE;
switch (h->sps.bit_depth_luma) { switch (h->sps.bit_depth_luma) {
case 9: case 9:
if (CHROMA444(h)) { if (CHROMA444(h)) {
if (h->avctx->colorspace == AVCOL_SPC_RGB) { if (h->avctx->colorspace == AVCOL_SPC_RGB) {
pix_fmts[0] = AV_PIX_FMT_GBRP9; *fmt++ = AV_PIX_FMT_GBRP9;
} else } else
pix_fmts[0] = AV_PIX_FMT_YUV444P9; *fmt++ = AV_PIX_FMT_YUV444P9;
} else if (CHROMA422(h)) } else if (CHROMA422(h))
pix_fmts[0] = AV_PIX_FMT_YUV422P9; *fmt++ = AV_PIX_FMT_YUV422P9;
else else
pix_fmts[0] = AV_PIX_FMT_YUV420P9; *fmt++ = AV_PIX_FMT_YUV420P9;
break; break;
case 10: case 10:
if (CHROMA444(h)) { if (CHROMA444(h)) {
if (h->avctx->colorspace == AVCOL_SPC_RGB) { if (h->avctx->colorspace == AVCOL_SPC_RGB) {
pix_fmts[0] = AV_PIX_FMT_GBRP10; *fmt++ = AV_PIX_FMT_GBRP10;
} else } else
pix_fmts[0] = AV_PIX_FMT_YUV444P10; *fmt++ = AV_PIX_FMT_YUV444P10;
} else if (CHROMA422(h)) } else if (CHROMA422(h))
pix_fmts[0] = AV_PIX_FMT_YUV422P10; *fmt++ = AV_PIX_FMT_YUV422P10;
else else
pix_fmts[0] = AV_PIX_FMT_YUV420P10; *fmt++ = AV_PIX_FMT_YUV420P10;
break; break;
case 8: case 8:
if (CHROMA444(h)) { if (CHROMA444(h)) {
if (h->avctx->colorspace == AVCOL_SPC_RGB) if (h->avctx->colorspace == AVCOL_SPC_RGB)
pix_fmts[0] = AV_PIX_FMT_GBRP; *fmt++ = AV_PIX_FMT_GBRP;
else if (h->avctx->color_range == AVCOL_RANGE_JPEG) else if (h->avctx->color_range == AVCOL_RANGE_JPEG)
pix_fmts[0] = AV_PIX_FMT_YUVJ444P; *fmt++ = AV_PIX_FMT_YUVJ444P;
else else
pix_fmts[0] = AV_PIX_FMT_YUV444P; *fmt++ = AV_PIX_FMT_YUV444P;
} else if (CHROMA422(h)) { } else if (CHROMA422(h)) {
if (h->avctx->color_range == AVCOL_RANGE_JPEG) if (h->avctx->color_range == AVCOL_RANGE_JPEG)
pix_fmts[0] = AV_PIX_FMT_YUVJ422P; *fmt++ = AV_PIX_FMT_YUVJ422P;
else else
pix_fmts[0] = AV_PIX_FMT_YUV422P; *fmt++ = AV_PIX_FMT_YUV422P;
} else { } else {
#if CONFIG_H264_DXVA2_HWACCEL
*fmt++ = AV_PIX_FMT_DXVA2_VLD;
#endif
#if CONFIG_H264_VAAPI_HWACCEL
*fmt++ = AV_PIX_FMT_VAAPI_VLD;
#endif
#if CONFIG_H264_VDA_HWACCEL
*fmt++ = AV_PIX_FMT_VDA_VLD;
*fmt++ = AV_PIX_FMT_VDA;
#endif
#if CONFIG_H264_VDPAU_HWACCEL
*fmt++ = AV_PIX_FMT_VDPAU;
#endif
if (h->avctx->codec->pix_fmts) if (h->avctx->codec->pix_fmts)
choices = h->avctx->codec->pix_fmts; choices = h->avctx->codec->pix_fmts;
else if (h->avctx->color_range == AVCOL_RANGE_JPEG) else if (h->avctx->color_range == AVCOL_RANGE_JPEG)
choices = h264_hwaccel_pixfmt_list_jpeg_420; *fmt++ = AV_PIX_FMT_YUVJ420P;
else else
choices = h264_hwaccel_pixfmt_list_420; *fmt++ = AV_PIX_FMT_YUV420P;
} }
break; break;
default: default:
...@@ -1031,6 +1010,8 @@ static enum AVPixelFormat get_pixel_format(H264Context *h) ...@@ -1031,6 +1010,8 @@ static enum AVPixelFormat get_pixel_format(H264Context *h)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
*fmt = AV_PIX_FMT_NONE;
return ff_get_format(h->avctx, choices); return ff_get_format(h->avctx, choices);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment