From: "Xiang, Haihao" <haihao.xiang-at-intel.com@ffmpeg.org> To: "ffmpeg-devel@ffmpeg.org" <ffmpeg-devel@ffmpeg.org> Subject: Re: [FFmpeg-devel] [PATCH 1/2] lavc/h265_profile_level: Expand profile compatibility checking Date: Wed, 24 Apr 2024 13:48:27 +0000 Message-ID: <3c2962a509939558344f87790ad6379e85abfdc5.camel@intel.com> (raw) In-Reply-To: <1bcdfb6e-8d63-4d1f-9cd9-631e79c03f5f@jkqxz.net> On Ma, 2024-04-22 at 22:22 +0100, Mark Thompson wrote: > Replace existing get_profile() with find_profile(), which finds the > lowest compatible profile rather than requiring an exact match. > --- > libavcodec/h265_profile_level.c | 73 +++++++++++++++++++++------------ > libavcodec/h265_profile_level.h | 70 ++++++++++++++++++++++++++++++- > libavcodec/vaapi_hevc.c | 2 +- > libavcodec/vdpau_hevc.c | 2 +- > 4 files changed, 117 insertions(+), 30 deletions(-) > > diff --git a/libavcodec/h265_profile_level.c b/libavcodec/h265_profile_level.c > index 7ff9681f65..4bc72414cb 100644 > --- a/libavcodec/h265_profile_level.c > +++ b/libavcodec/h265_profile_level.c > @@ -119,41 +119,60 @@ static const H265ProfileDescriptor h265_profiles[] = { > 5, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 4000, 4400, 6.000, 0.5, 6 }, > }; > > +_Static_assert(H265_PROFILE_COUNT == FF_ARRAY_ELEMS(h265_profiles), > + "Incorrect H.265 profiles table."); > > -const H265ProfileDescriptor *ff_h265_get_profile(const > H265RawProfileTierLevel *ptl) > + > +const int ff_h265_profile_compatible(const H265RawProfileTierLevel *ptl, > + int profile) > { > - int i; > + const H265ProfileDescriptor *desc; > + > + av_assert0(profile >= 0 && profile < H265_PROFILE_COUNT); > > if (ptl->general_profile_space) > - return NULL; > + return 0; > > - for (i = 0; i < FF_ARRAY_ELEMS(h265_profiles); i++) { > - const H265ProfileDescriptor *profile = &h265_profiles[i]; > + desc = &h265_profiles[profile]; > > - if (ptl->general_profile_idc && > - ptl->general_profile_idc != profile->profile_idc) > - continue; > - if (!ptl->general_profile_compatibility_flag[profile->profile_idc]) > - continue; > + if (ptl->general_profile_idc && > + ptl->general_profile_idc != desc->profile_idc) > + return 0; > + if (!ptl->general_profile_compatibility_flag[desc->profile_idc]) > + return 0; > > -#define check_flag(name) \ > - if (profile->name < 2) { \ > - if (profile->name != ptl->general_ ## name ## _constraint_flag) \ > - continue; \ > - } > - check_flag(max_14bit); > - check_flag(max_12bit); > - check_flag(max_10bit); > - check_flag(max_8bit); > - check_flag(max_422chroma); > - check_flag(max_420chroma); > - check_flag(max_monochrome); > - check_flag(intra); > - check_flag(one_picture_only); > - check_flag(lower_bit_rate); > +#define check_flag(flag) \ > + if (desc->flag < 2 && \ > + desc->flag > ptl->general_ ## flag ## _constraint_flag) \ > + return 0; > + check_flag(max_14bit); > + check_flag(max_12bit); > + check_flag(max_10bit); > + check_flag(max_8bit); > + check_flag(max_422chroma); > + check_flag(max_420chroma); > + check_flag(max_monochrome); > + check_flag(intra); > + check_flag(one_picture_only); > + check_flag(lower_bit_rate); > #undef check_flag > > - return profile; > + return 1; > +} > + > + > +const H265ProfileDescriptor *ff_h265_get_profile(int profile) > +{ > + av_assert0(profile >= 0 && profile < H265_PROFILE_COUNT); > + > + return &h265_profiles[profile]; > +} > + > +const H265ProfileDescriptor *ff_h265_find_profile(const > H265RawProfileTierLevel *ptl) > +{ > + for (int p = 0; p < H265_PROFILE_COUNT; p++) { > + if (ff_h265_profile_compatible(ptl, p)) > + return &h265_profiles[p]; > } > > return NULL; > @@ -171,7 +190,7 @@ const H265LevelDescriptor *ff_h265_guess_level(const > H265RawProfileTierLevel *pt > int i; > > if (ptl) > - profile = ff_h265_get_profile(ptl); > + profile = ff_h265_find_profile(ptl); > else > profile = NULL; > if (!profile) { > diff --git a/libavcodec/h265_profile_level.h b/libavcodec/h265_profile_level.h > index cd30ac5c50..f403f63211 100644 > --- a/libavcodec/h265_profile_level.h > +++ b/libavcodec/h265_profile_level.h > @@ -24,6 +24,49 @@ > #include "cbs_h265.h" > > > +// Enumeration of all H.265 profiles. > +// The list is ordered to match table A.10; numeric values are an index > +// into the latest version of this table and have no codec meaning. > +enum { > + H265_PROFILE_MONOCHROME, > + H265_PROFILE_MONOCHROME_10, > + H265_PROFILE_MONOCHROME_12, > + H265_PROFILE_MONOCHROME_16, > + H265_PROFILE_MAIN, > + H265_PROFILE_SCREEN_EXTENDED_MAIN, > + H265_PROFILE_MAIN_10, > + H265_PROFILE_SCREEN_EXTENDED_MAIN_10, > + H265_PROFILE_MAIN_12, > + H265_PROFILE_MAIN_STILL_PICTURE, > + H265_PROFILE_MAIN_10_STILL_PICTURE, > + H265_PROFILE_MAIN_422_10, > + H265_PROFILE_MAIN_422_12, > + H265_PROFILE_MAIN_444, > + H265_PROFILE_HIGH_THROUGHPUT_444, > + H265_PROFILE_SCREEN_EXTENDED_MAIN_444, > + H265_PROFILE_SCREEN_EXTENDED_HIGH_THROUGHPUT_444, > + H265_PROFILE_MAIN_444_10, > + H265_PROFILE_HIGH_THROUGHPUT_444_10, > + H265_PROFILE_SCREEN_EXTENDED_MAIN_444_10, > + H265_PROFILE_SCREEN_EXTENDED_HIGH_THROUGHPUT_444_10, > + H265_PROFILE_MAIN_444_12, > + H265_PROFILE_HIGH_THROUGHPUT_444_14, > + H265_PROFILE_SCREEN_EXTENDED_HIGH_THROUGHPUT_444_14, > + H265_PROFILE_MAIN_INTRA, > + H265_PROFILE_MAIN_10_INTRA, > + H265_PROFILE_MAIN_12_INTRA, > + H265_PROFILE_MAIN_422_10_INTRA, > + H265_PROFILE_MAIN_422_12_INTRA, > + H265_PROFILE_MAIN_444_INTRA, > + H265_PROFILE_MAIN_444_10_INTRA, > + H265_PROFILE_MAIN_444_12_INTRA, > + H265_PROFILE_MAIN_444_16_INTRA, > + H265_PROFILE_MAIN_444_STILL_PICTURE, > + H265_PROFILE_MAIN_444_16_STILL_PICTURE, > + H265_PROFILE_HIGH_THROUGHPUT_444_16_INTRA, > + H265_PROFILE_COUNT, > +}; > + > typedef struct H265LevelDescriptor { > char name[4]; // Large enough for all current levels like "4.1" > uint8_t level_idc; > @@ -70,7 +113,32 @@ typedef struct H265ProfileDescriptor { > } H265ProfileDescriptor; > > > -const H265ProfileDescriptor *ff_h265_get_profile(const > H265RawProfileTierLevel *ptl); > +/** > + * Test whether the PTL structure is compatible with the given profile. > + * > + * @param ptl PTL structure to check. > + * @param profile Profile to test compatibility with. Must be a valid > + * H265_PROFILE_* value. > + * @return Nonzero if compatible, zero if incompatible. > + */ > +const int ff_h265_profile_compatible(const H265RawProfileTierLevel *ptl, > + int profile); > + > +/** > + * Return profile descriptor for the given profile. > + * > + * @param profile Profile number; must be a valid H265_PROFILE_* value. > + * @return Profile descriptor. > + */ > +const H265ProfileDescriptor *ff_h265_get_profile(int profile); ff_h265_get_profile is called in libavcodec/tests/h265_levels.c which should be changed too. libavcodec/tests/h265_levels.c: profile = ff_h265_get_profile(test_bitrate[i].ptl); Thanks Haihao > + > +/** > + * Find the first profile compatible with the given PTL structure. > + * > + * @param ptl PTL structure to search for. > + * @return First compatible profile, or NULL if no compatible profiles. > + */ > +const H265ProfileDescriptor *ff_h265_find_profile(const > H265RawProfileTierLevel *ptl); > > > /** > diff --git a/libavcodec/vaapi_hevc.c b/libavcodec/vaapi_hevc.c > index 3bdd2dd1b8..77f55ff8b1 100644 > --- a/libavcodec/vaapi_hevc.c > +++ b/libavcodec/vaapi_hevc.c > @@ -604,7 +604,7 @@ VAProfile > ff_vaapi_parse_hevc_rext_scc_profile(AVCodecContext *avctx) > /* convert PTLCommon to H265RawProfileTierLevel */ > ptl_convert(general_ptl, &h265_raw_ptl); > > - profile = ff_h265_get_profile(&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; > diff --git a/libavcodec/vdpau_hevc.c b/libavcodec/vdpau_hevc.c > index 4cd7ce5621..a59a030b1c 100644 > --- a/libavcodec/vdpau_hevc.c > +++ b/libavcodec/vdpau_hevc.c > @@ -478,7 +478,7 @@ static int vdpau_hevc_parse_rext_profile(AVCodecContext > *avctx, VdpDecoderProfil > /* convert PTLCommon to H265RawProfileTierLevel */ > ptl_convert(general_ptl, &h265_raw_ptl); > > - profile = ff_h265_get_profile(&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"); > if (avctx->hwaccel_flags & AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH) { _______________________________________________ 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".
prev parent reply other threads:[~2024-04-24 13:48 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 ` [FFmpeg-devel] [PATCH 2/2] lavc/vaapi_hevc: Don't require exact profiles Mark Thompson 2024-04-24 13:45 ` 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 [this message]
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=3c2962a509939558344f87790ad6379e85abfdc5.camel@intel.com \ --to=haihao.xiang-at-intel.com@ffmpeg.org \ --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