From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 509E945149 for ; Mon, 6 May 2024 18:47:38 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C4F8368D6AF; Mon, 6 May 2024 21:47:19 +0300 (EEST) Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DE52168D647 for ; Mon, 6 May 2024 21:47:10 +0300 (EEST) Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-41bab13ca4eso15185375e9.1 for ; Mon, 06 May 2024 11:47:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20230601.gappssmtp.com; s=20230601; t=1715021230; x=1715626030; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=g/y8778iSFx/nDqWyBnL+l83Wfj0/OzwYbgUZMENxNM=; b=NW5Mu1rL/JpGzrljA+APxQrkURcPSqG2H1vJfSZqlFBqOu+xEUSCcNPQ/XlrAZvacI MyeD3wJdR3ChW6fO3MfLoJmZUKfDCH/3JmYDKdXwIEthcRyUysYoUClTFX11nInvZd+h b6lrdX5OaBt1muUElukM7bBvHVyS846o1eGovi9HX+knF9LzsbJDnXDXtqOTmccWiYV4 Z6JOKaYxjIKj8o7rIzxCBoR6RzM7I+EPBNXchw1qrSQBdGJ08iyAXpaMBigRO2jN89Q5 aLOwLi2+LTctfstxLNL0KYxCu9xZ/EwSeBrWZjwL6WoWthH/2cJTENX3lYSz9FC/Wzdj s6Bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715021230; x=1715626030; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=g/y8778iSFx/nDqWyBnL+l83Wfj0/OzwYbgUZMENxNM=; b=OPHwXRMHkHQQ7JBs5l0cEYIFqMFR34QgDAjiJhjZtq+N4XhXB164r3B7AJXWGNJiLp ilLG0Z9U+wWl/Pn51T8nNBdF/5Zh/llBn2B567/pJc1QzmHXyg97JGq8aCYoEn1V9t1f 3jUsSh4RxcqdOqR6XetgWpFjGfjgIwkuOvBoEP/zmJbEHUuDKHwUasK0QejQbysDgIId GPlvexorYlH+M5VY8BAzUM4l4c8x+Q/LAhCPcjmveYMBFGQE1dzchp9L4Xrh1eqVAn7f 6Gr5F5rUjP2N5p63xJZ+PSpg5UqWJnsdTiEzgEG2ICnh9hODnnAD3krtQwPt1upchxLi hCxw== X-Gm-Message-State: AOJu0YwlHiqX/IfZ7IRTzvGjwJWAo25+2Ma5o+80isAFT2tM4r6mIE1q hOahd0Y9NbpFcoU7vnmVpHcQWgAXV50BfbtETj17vLzzdhh8OxRQJVrcTiM0xSIIrnsVPgf0nCK l X-Google-Smtp-Source: AGHT+IFcgdB5GW+0DPfC7JWn9NPKNUUV1G/6+aBbdp/25n5JLexYUtkrx+x0DbARC5TWDDAT5pBlLA== X-Received: by 2002:a05:600c:5252:b0:41b:ebf6:87d7 with SMTP id fc18-20020a05600c525200b0041bebf687d7mr8456957wmb.9.1715021230053; Mon, 06 May 2024 11:47:10 -0700 (PDT) Received: from localhost.localdomain (cpc92302-cmbg19-2-0-cust1183.5-4.cable.virginm.net. [82.1.212.160]) by smtp.gmail.com with ESMTPSA id n20-20020a05600c501400b0041aa79f27a0sm16987184wmr.38.2024.05.06.11.47.09 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 May 2024 11:47:09 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 May 2024 19:47:21 +0100 Message-ID: <20240506184726.826159-3-sw@jkqxz.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240506184726.826159-1-sw@jkqxz.net> References: <20240506184726.826159-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 3/3] lavc/vaapi_hevc: Don't require exact profiles X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: 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. --- libavcodec/vaapi_decode.c | 45 +++++++++++------- libavcodec/vaapi_hevc.c | 99 ++++++++++++++++++++++----------------- libavcodec/vaapi_hevc.h | 4 +- 3 files changed, 87 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..bda9b5f589 100644 --- a/libavcodec/vaapi_hevc.c +++ b/libavcodec/vaapi_hevc.c @@ -590,63 +590,74 @@ 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_422_12, + VAProfileHEVCMain422_12 }, + { 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 }, + { H265_PROFILE_SCREEN_EXTENDED_MAIN_444, + VAProfileHEVCSccMain444 }, +#endif +#if VA_CHECK_VERSION(1, 8, 0) + { H265_PROFILE_SCREEN_EXTENDED_MAIN_444_10, + VAProfileHEVCSccMain444_10 }, +#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 #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".