1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

avcodec/nvdec: Add support for decoding monochrome av1

The nvidia hardware explicitly supports decoding monochrome content,
presumably for the AVIF alpha channel. Supporting this requires an
adjustment in av1dec and explicit monochrome detection in nvdec.

I'm not sure why the monochrome path in av1dec did what it did - it
seems non-functional - YUV440P doesn't seem a logical pix_fmt for
monochrome and conditioning on chroma sub-sampling doesn't make sense.
So I changed it.

I've tested 8bit content, but I haven't found a way to create a 10bit
sample, so that path is untested for now.
This commit is contained in:
Philip Langdale 2020-12-05 20:25:29 -08:00
parent 51dfd6f1bd
commit 67bb11b5f6
3 changed files with 20 additions and 4 deletions

View File

@ -387,9 +387,12 @@ static int get_pixel_format(AVCodecContext *avctx)
av_log(avctx, AV_LOG_WARNING, "Unknown AV1 pixel format.\n");
}
} else {
if (seq->color_config.subsampling_x == 1 &&
seq->color_config.subsampling_y == 1)
pix_fmt = AV_PIX_FMT_YUV440P;
if (bit_depth == 8)
pix_fmt = AV_PIX_FMT_GRAY8;
else if (bit_depth == 10)
pix_fmt = AV_PIX_FMT_GRAY10;
else if (bit_depth == 12)
pix_fmt = AV_PIX_FMT_GRAY12;
else
av_log(avctx, AV_LOG_WARNING, "Unknown AV1 pixel format.\n");
}
@ -430,6 +433,16 @@ static int get_pixel_format(AVCodecContext *avctx)
#endif
#if CONFIG_AV1_VAAPI_HWACCEL
*fmtp++ = AV_PIX_FMT_VAAPI;
#endif
break;
case AV_PIX_FMT_GRAY8:
#if CONFIG_AV1_NVDEC_HWACCEL
*fmtp++ = AV_PIX_FMT_CUDA;
#endif
break;
case AV_PIX_FMT_GRAY10:
#if CONFIG_AV1_NVDEC_HWACCEL
*fmtp++ = AV_PIX_FMT_CUDA;
#endif
break;
}

View File

@ -83,6 +83,9 @@ static int map_chroma_format(enum AVPixelFormat pix_fmt)
{
int shift_h = 0, shift_v = 0;
if (av_pix_fmt_count_planes(pix_fmt) == 1)
return cudaVideoChromaFormat_Monochrome;
av_pix_fmt_get_chroma_sub_sample(pix_fmt, &shift_h, &shift_v);
if (shift_h == 1 && shift_v == 1)

View File

@ -29,7 +29,7 @@
#define LIBAVCODEC_VERSION_MAJOR 58
#define LIBAVCODEC_VERSION_MINOR 115
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_MICRO 101
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \