Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Mark Thompson <sw@jkqxz.net>
To: ffmpeg-devel@ffmpeg.org
Subject: [FFmpeg-devel] [PATCH 2/2] lavc/vaapi_hevc: Don't require exact profiles
Date: Mon, 22 Apr 2024 22:23:22 +0100
Message-ID: <e547ab6f-a86d-46e3-abbb-7e6233195992@jkqxz.net> (raw)
In-Reply-To: <1bcdfb6e-8d63-4d1f-9cd9-631e79c03f5f@jkqxz.net>

Rather than turning the constraint flags into a single profile and then
searching for that profile (and failing if it doesn't match any profile
exactly), instead search all supported profiles and use the first one
which supports the given set of constraint flags.
---
This fixes decode of rext 8-bit 4:2:0; it will correctly pick Main 12 or Main 4:2:2 10 or Main 4:4:4 (first one available) to use as the decoding profile after this patch.

 libavcodec/vaapi_decode.c | 45 ++++++++++++-------
 libavcodec/vaapi_hevc.c   | 95 +++++++++++++++++++++------------------
 libavcodec/vaapi_hevc.h   |  4 +-
 3 files changed, 83 insertions(+), 61 deletions(-)

diff --git a/libavcodec/vaapi_decode.c b/libavcodec/vaapi_decode.c
index 21b273cd0f..f1327464f5 100644
--- a/libavcodec/vaapi_decode.c
+++ b/libavcodec/vaapi_decode.c
@@ -387,7 +387,9 @@ static const struct {
     enum AVCodecID codec_id;
     int codec_profile;
     VAProfile va_profile;
-    VAProfile (*profile_parser)(AVCodecContext *avctx);
+    VAProfile (*match_profile)(AVCodecContext *avctx,
+                               const VAProfile *profile_list,
+                               int profile_count);
 } vaapi_profile_map[] = {
 #define MAP(c, p, v, ...) { AV_CODEC_ID_ ## c, AV_PROFILE_ ## p, VAProfile ## v, __VA_ARGS__ }
     MAP(MPEG2VIDEO,  MPEG2_SIMPLE,    MPEG2Simple ),
@@ -414,9 +416,9 @@ static const struct {
 #endif
 #if VA_CHECK_VERSION(1, 2, 0) && CONFIG_HEVC_VAAPI_HWACCEL
     MAP(HEVC,        HEVC_REXT,       None,
-                 ff_vaapi_parse_hevc_rext_scc_profile ),
+             ff_vaapi_hevc_match_rext_scc_profile ),
     MAP(HEVC,        HEVC_SCC,        None,
-                 ff_vaapi_parse_hevc_rext_scc_profile ),
+             ff_vaapi_hevc_match_rext_scc_profile ),
 #endif
     MAP(MJPEG,       MJPEG_HUFFMAN_BASELINE_DCT,
                                       JPEGBaseline),
@@ -499,22 +501,33 @@ static int vaapi_decode_make_config(AVCodecContext *avctx,
             vaapi_profile_map[i].codec_profile == AV_PROFILE_UNKNOWN)
             profile_match = 1;

-        va_profile = vaapi_profile_map[i].profile_parser ?
-                     vaapi_profile_map[i].profile_parser(avctx) :
-                     vaapi_profile_map[i].va_profile;
         codec_profile = vaapi_profile_map[i].codec_profile;
-
-        for (j = 0; j < profile_count; j++) {
-            if (va_profile == profile_list[j]) {
-                exact_match = profile_match;
+        if (vaapi_profile_map[i].match_profile) {
+            va_profile =
+                vaapi_profile_map[i].match_profile(avctx, profile_list,
+                                                   profile_count);
+            if (va_profile != VAProfileNone) {
+                matched_va_profile = va_profile;
+                matched_ff_profile = codec_profile;
+                exact_match = 1;
                 break;
             }
-        }
-        if (j < profile_count) {
-            matched_va_profile = va_profile;
-            matched_ff_profile = codec_profile;
-            if (exact_match)
-                break;
+        } else {
+            va_profile = vaapi_profile_map[i].va_profile;
+
+            for (j = 0; j < profile_count; j++) {
+                if (va_profile == profile_list[j]) {
+                    exact_match = profile_match;
+                    break;
+                }
+            }
+
+            if (j < profile_count) {
+                matched_va_profile = va_profile;
+                matched_ff_profile = codec_profile;
+                if (exact_match)
+                    break;
+            }
         }
     }
     av_freep(&profile_list);
diff --git a/libavcodec/vaapi_hevc.c b/libavcodec/vaapi_hevc.c
index 77f55ff8b1..28f7c9280e 100644
--- a/libavcodec/vaapi_hevc.c
+++ b/libavcodec/vaapi_hevc.c
@@ -590,63 +590,70 @@ static int ptl_convert(const PTLCommon *general_ptl, H265RawProfileTierLevel *h2
 }

 /*
- * Find exact va_profile for HEVC Range Extension and Screen Content Coding Extension
+ * Find compatible va_profile for HEVC Range Extension and Screen
+ * Content Coding Extension profiles.
  */
-VAProfile ff_vaapi_parse_hevc_rext_scc_profile(AVCodecContext *avctx)
+VAProfile ff_vaapi_hevc_match_rext_scc_profile(AVCodecContext *avctx,
+                                               const VAProfile *profile_list,
+                                               int profile_count)
 {
     const HEVCContext *h = avctx->priv_data;
     const HEVCSPS *sps = h->ps.sps;
     const PTL *ptl = &sps->ptl;
     const PTLCommon *general_ptl = &ptl->general_ptl;
-    const H265ProfileDescriptor *profile;
     H265RawProfileTierLevel h265_raw_ptl = {0};

+    static const struct {
+        int profile;
+        VAProfile va_profile;
+    } map[] = {
+#if VA_CHECK_VERSION(1, 2, 0)
+        { H265_PROFILE_MAIN_12,
+          VAProfileHEVCMain12 },
+        { H265_PROFILE_MAIN_422_10,
+          VAProfileHEVCMain422_10 },
+        { H265_PROFILE_MAIN_444,
+          VAProfileHEVCMain444 },
+        { H265_PROFILE_MAIN_444_10,
+          VAProfileHEVCMain444_10 },
+        { H265_PROFILE_MAIN_444_12,
+          VAProfileHEVCMain444_12 },
+        { H265_PROFILE_SCREEN_EXTENDED_MAIN,
+          VAProfileHEVCSccMain },
+        { H265_PROFILE_SCREEN_EXTENDED_MAIN_10,
+          VAProfileHEVCSccMain10 },
+#endif
+#if VA_CHECK_VERSION(1, 8, 0)
+        { H265_PROFILE_SCREEN_EXTENDED_MAIN_444,
+          VAProfileHEVCSccMain444 },
+#endif
+    };
+
     /* convert PTLCommon to H265RawProfileTierLevel */
     ptl_convert(general_ptl, &h265_raw_ptl);

-    profile = ff_h265_find_profile(&h265_raw_ptl);
-    if (!profile) {
-        av_log(avctx, AV_LOG_WARNING, "HEVC profile is not found.\n");
-        goto end;
-    } else {
-        av_log(avctx, AV_LOG_VERBOSE, "HEVC profile %s is found.\n", profile->name);
+    for (int i = 0; i < FF_ARRAY_ELEMS(map); i++) {
+        int available = 0;
+        for (int j = 0; j < profile_count; j++) {
+            if (profile_list[j] == map[i].va_profile) {
+                available = 1;
+                break;
+            }
+        }
+        if (!available)
+            continue;
+
+        if (ff_h265_profile_compatible(&h265_raw_ptl,
+                                       map[i].profile)) {
+            const H265ProfileDescriptor *profile_desc =
+                ff_h265_get_profile(map[i].profile);
+            av_log(avctx, AV_LOG_VERBOSE,
+                   "Decoding with HEVC profile %s.\n",
+                   profile_desc->name);
+            return map[i].va_profile;
+        }
     }

-#if VA_CHECK_VERSION(1, 2, 0)
-    if (!strcmp(profile->name, "Main 12") ||
-        !strcmp(profile->name, "Main 12 Intra"))
-        return VAProfileHEVCMain12;
-    else if (!strcmp(profile->name, "Main 4:2:2 10") ||
-        !strcmp(profile->name, "Main 4:2:2 10 Intra"))
-        return VAProfileHEVCMain422_10;
-    else if (!strcmp(profile->name, "Main 4:2:2 12") ||
-        !strcmp(profile->name, "Main 4:2:2 12 Intra"))
-        return VAProfileHEVCMain422_12;
-    else if (!strcmp(profile->name, "Main 4:4:4") ||
-             !strcmp(profile->name, "Main 4:4:4 Intra"))
-        return VAProfileHEVCMain444;
-    else if (!strcmp(profile->name, "Main 4:4:4 10") ||
-             !strcmp(profile->name, "Main 4:4:4 10 Intra"))
-        return VAProfileHEVCMain444_10;
-    else if (!strcmp(profile->name, "Main 4:4:4 12") ||
-             !strcmp(profile->name, "Main 4:4:4 12 Intra"))
-        return VAProfileHEVCMain444_12;
-    else if (!strcmp(profile->name, "Screen-Extended Main"))
-        return VAProfileHEVCSccMain;
-    else if (!strcmp(profile->name, "Screen-Extended Main 10"))
-        return VAProfileHEVCSccMain10;
-    else if (!strcmp(profile->name, "Screen-Extended Main 4:4:4"))
-        return VAProfileHEVCSccMain444;
-#if VA_CHECK_VERSION(1, 8, 0)
-    else if (!strcmp(profile->name, "Screen-Extended Main 4:4:4 10"))
-        return VAProfileHEVCSccMain444_10;
-#endif
-#else
-    av_log(avctx, AV_LOG_WARNING, "HEVC profile %s is "
-           "not supported with this VA version.\n", profile->name);
-#endif
-
-end:
     if (avctx->hwaccel_flags & AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH) {
         // Default to selecting Main profile if profile mismatch is allowed
         return VAProfileHEVCMain;
diff --git a/libavcodec/vaapi_hevc.h b/libavcodec/vaapi_hevc.h
index 449635d0d7..455c68e6ba 100644
--- a/libavcodec/vaapi_hevc.h
+++ b/libavcodec/vaapi_hevc.h
@@ -22,6 +22,8 @@
 #include <va/va.h>
 #include "avcodec.h"

-VAProfile ff_vaapi_parse_hevc_rext_scc_profile(AVCodecContext *avctx);
+VAProfile ff_vaapi_hevc_match_rext_scc_profile(AVCodecContext *avctx,
+                                               const VAProfile *profile_list,
+                                               int profile_count);

 #endif /* AVCODEC_VAAPI_HEVC_H */
-- 
2.43.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  reply	other threads:[~2024-04-22 21:23 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-18  4:21 [FFmpeg-devel] [PATCH v3 1/2] lavc/vaapi_encode_h265: Map HEVC AV REXT profile to VA REXT profile fei.w.wang-at-intel.com
2024-03-18  4:21 ` [FFmpeg-devel] [PATCH v3 2/2] lavc/vaapi_encode_h265: Set general_*_constriaint flags with profile fei.w.wang-at-intel.com
2024-03-18 21:22   ` Mark Thompson
2024-03-20  8:44     ` Wang, Fei W
2024-04-01  6:11       ` Wang, Fei W
2024-04-01 20:02       ` Mark Thompson
2024-04-02  5:18         ` Wang, Fei W
2024-03-18 21:11 ` [FFmpeg-devel] [PATCH v3 1/2] lavc/vaapi_encode_h265: Map HEVC AV REXT profile to VA REXT profile Mark Thompson
2024-03-20  7:39   ` Wang, Fei W
2024-04-15  1:21 ` Xiang, Haihao
2024-04-15 22:07   ` Mark Thompson
2024-04-16  4:57     ` Wang, Fei W
2024-04-18  8:21       ` Wang, Fei W
2024-04-22 21:20         ` Mark Thompson
2024-04-22 21:22           ` [FFmpeg-devel] [PATCH 1/2] lavc/h265_profile_level: Expand profile compatibility checking Mark Thompson
2024-04-22 21:23             ` Mark Thompson [this message]
2024-04-24 13:45               ` [FFmpeg-devel] [PATCH 2/2] lavc/vaapi_hevc: Don't require exact profiles Xiang, Haihao
2024-04-28 14:14                 ` Mark Thompson
2024-04-30  6:00                   ` Xiang, Haihao
2024-04-23  0:04             ` [FFmpeg-devel] [PATCH 1/2] lavc/h265_profile_level: Expand profile compatibility checking Michael Niedermayer
2024-04-24 13:48             ` Xiang, Haihao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e547ab6f-a86d-46e3-abbb-7e6233195992@jkqxz.net \
    --to=sw@jkqxz.net \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git