Commit d2a09538 for libheif
commit d2a09538cb631847716507d6969ea3608097ec63
Author: John Preston <johnprestonmail@gmail.com>
Date: Fri Sep 25 22:16:18 2026 +0400
FFmpeg decoder: support 9-bit output
FFmpeg returns GRAY9 and YUV420P9/422P9/444P9 (and GBRP9 for AVC with the
identity matrix) for 9-bit streams, which were rejected as unsupported pixel
formats while libde265 decodes the same files.
diff --git a/libheif/plugins/decoder_ffmpeg.cc b/libheif/plugins/decoder_ffmpeg.cc
index 3af918c1..60e4cbe5 100644
--- a/libheif/plugins/decoder_ffmpeg.cc
+++ b/libheif/plugins/decoder_ffmpeg.cc
@@ -354,6 +354,7 @@ static heif_error ffmpeg_push_data(void *decoder_raw, const void *data, size_t s
static heif_chroma ffmpeg_get_chroma_format(AVPixelFormat pix_fmt) {
switch (pix_fmt) {
case AV_PIX_FMT_GRAY8:
+ case AV_PIX_FMT_GRAY9:
case AV_PIX_FMT_GRAY10:
case AV_PIX_FMT_GRAY12:
case AV_PIX_FMT_GRAY14:
@@ -362,6 +363,7 @@ static heif_chroma ffmpeg_get_chroma_format(AVPixelFormat pix_fmt) {
case AV_PIX_FMT_YUV420P:
case AV_PIX_FMT_YUVJ420P:
+ case AV_PIX_FMT_YUV420P9:
case AV_PIX_FMT_YUV420P10:
case AV_PIX_FMT_YUV420P12:
case AV_PIX_FMT_YUV420P14:
@@ -369,6 +371,7 @@ static heif_chroma ffmpeg_get_chroma_format(AVPixelFormat pix_fmt) {
return heif_chroma_420;
case AV_PIX_FMT_YUV422P:
+ case AV_PIX_FMT_YUV422P9:
case AV_PIX_FMT_YUV422P10:
case AV_PIX_FMT_YUV422P12:
case AV_PIX_FMT_YUV422P14:
@@ -376,6 +379,7 @@ static heif_chroma ffmpeg_get_chroma_format(AVPixelFormat pix_fmt) {
return heif_chroma_422;
case AV_PIX_FMT_YUV444P:
+ case AV_PIX_FMT_YUV444P9:
case AV_PIX_FMT_YUV444P10:
case AV_PIX_FMT_YUV444P12:
case AV_PIX_FMT_YUV444P14:
@@ -386,6 +390,7 @@ static heif_chroma ffmpeg_get_chroma_format(AVPixelFormat pix_fmt) {
// matrix_coefficients 0. Its G, B, R planes map onto Y, Cb, Cr, which is
// exactly how libheif stores images with the identity matrix.
case AV_PIX_FMT_GBRP:
+ case AV_PIX_FMT_GBRP9:
case AV_PIX_FMT_GBRP10:
case AV_PIX_FMT_GBRP12:
return heif_chroma_444;
@@ -438,6 +443,12 @@ static int get_ffmpeg_format_bpp(AVPixelFormat pix_fmt)
case AV_PIX_FMT_YUV444P:
case AV_PIX_FMT_GBRP:
return 8;
+ case AV_PIX_FMT_GRAY9:
+ case AV_PIX_FMT_YUV420P9:
+ case AV_PIX_FMT_YUV422P9:
+ case AV_PIX_FMT_YUV444P9:
+ case AV_PIX_FMT_GBRP9:
+ return 9;
case AV_PIX_FMT_GRAY10:
case AV_PIX_FMT_YUV420P10:
case AV_PIX_FMT_YUV422P10: