@ -143,42 +143,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 )
{
@ -975,54 +939,69 @@ static int clone_slice(H264Context *dst, H264Context *src)
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 ;
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 8 :
if ( CHROMA444 ( h ) ) {
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 :
@ -1031,6 +1010,8 @@ static enum AVPixelFormat get_pixel_format(H264Context *h)
return AVERROR_INVALIDDATA ;
}
* fmt = AV_PIX_FMT_NONE ;
return ff_get_format ( h - > avctx , choices ) ;
}