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: