|
|
|
@ -147,42 +147,6 @@ static const uint8_t dequant8_coeff_init[6][6] = { |
|
|
|
|
{ 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) |
|
|
|
|
{ |
|
|
|
@ -1036,79 +1000,94 @@ static int clone_slice(H264Context *dst, H264Context *src) |
|
|
|
|
|
|
|
|
|
static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback) |
|
|
|
|
{ |
|
|
|
|
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; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
pix_fmts[1] = AV_PIX_FMT_NONE; |
|
|
|
|
|
|
|
|
|
switch (h->sps.bit_depth_luma) { |
|
|
|
|
case 9: |
|
|
|
|
if (CHROMA444(h)) { |
|
|
|
|
if (h->avctx->colorspace == AVCOL_SPC_RGB) { |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_GBRP9; |
|
|
|
|
*fmt++ = AV_PIX_FMT_GBRP9; |
|
|
|
|
} else |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV444P9; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV444P9; |
|
|
|
|
} else if (CHROMA422(h)) |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV422P9; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV422P9; |
|
|
|
|
else |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV420P9; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV420P9; |
|
|
|
|
break; |
|
|
|
|
case 10: |
|
|
|
|
if (CHROMA444(h)) { |
|
|
|
|
if (h->avctx->colorspace == AVCOL_SPC_RGB) { |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_GBRP10; |
|
|
|
|
*fmt++ = AV_PIX_FMT_GBRP10; |
|
|
|
|
} else |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV444P10; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV444P10; |
|
|
|
|
} else if (CHROMA422(h)) |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV422P10; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV422P10; |
|
|
|
|
else |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV420P10; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV420P10; |
|
|
|
|
break; |
|
|
|
|
case 12: |
|
|
|
|
if (CHROMA444(h)) { |
|
|
|
|
if (h->avctx->colorspace == AVCOL_SPC_RGB) { |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_GBRP12; |
|
|
|
|
*fmt++ = AV_PIX_FMT_GBRP12; |
|
|
|
|
} else |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV444P12; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV444P12; |
|
|
|
|
} else if (CHROMA422(h)) |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV422P12; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV422P12; |
|
|
|
|
else |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV420P12; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV420P12; |
|
|
|
|
break; |
|
|
|
|
case 14: |
|
|
|
|
if (CHROMA444(h)) { |
|
|
|
|
if (h->avctx->colorspace == AVCOL_SPC_RGB) { |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_GBRP14; |
|
|
|
|
*fmt++ = AV_PIX_FMT_GBRP14; |
|
|
|
|
} else |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV444P14; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV444P14; |
|
|
|
|
} else if (CHROMA422(h)) |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV422P14; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV422P14; |
|
|
|
|
else |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV420P14; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV420P14; |
|
|
|
|
break; |
|
|
|
|
case 8: |
|
|
|
|
if (CHROMA444(h)) { |
|
|
|
|
if (h->avctx->colorspace == AVCOL_SPC_YCGCO) |
|
|
|
|
av_log(h->avctx, AV_LOG_WARNING, "Detected unsupported YCgCo colorspace.\n"); |
|
|
|
|
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) |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUVJ444P; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUVJ444P; |
|
|
|
|
else |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV444P; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV444P; |
|
|
|
|
} else if (CHROMA422(h)) { |
|
|
|
|
if (h->avctx->color_range == AVCOL_RANGE_JPEG) |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUVJ422P; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUVJ422P; |
|
|
|
|
else |
|
|
|
|
pix_fmts[0] = AV_PIX_FMT_YUV422P; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV422P; |
|
|
|
|
} 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) |
|
|
|
|
choices = h->avctx->codec->pix_fmts; |
|
|
|
|
else if (h->avctx->color_range == AVCOL_RANGE_JPEG) |
|
|
|
|
choices = h264_hwaccel_pixfmt_list_jpeg_420; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUVJ420P; |
|
|
|
|
else |
|
|
|
|
choices = h264_hwaccel_pixfmt_list_420; |
|
|
|
|
*fmt++ = AV_PIX_FMT_YUV420P; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
@ -1117,6 +1096,8 @@ static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
*fmt = AV_PIX_FMT_NONE; |
|
|
|
|
|
|
|
|
|
for (i=0; choices[i] != AV_PIX_FMT_NONE; i++) |
|
|
|
|
if (choices[i] == h->avctx->pix_fmt && !force_callback) |
|
|
|
|
return choices[i]; |
|
|
|
|