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: Re: [FFmpeg-devel] [PATCH v2 1/3] lavc/h265_profile_level: Expand profile compatibility checking
Date: Mon, 6 May 2024 21:13:12 +0100
Message-ID: <b458ef13-8a8b-4548-9f43-15509f1d797b@jkqxz.net> (raw)
In-Reply-To: <GV1P250MB073713DB13392E4B03D3316B8F1C2@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM>

On 06/05/2024 20:56, Andreas Rheinhardt wrote:
> Mark Thompson:
>> Replace existing get_profile() with find_profile(), which finds the
>> lowest compatible profile rather than requiring an exact match.
>> ---
>> Series changes since v1:
>> * Added H265_PROFILE_INVALID with value zero because it simplifies some code (and the values don't matter).
> 
> What code is simplified by using zero (instead of -1)? I only see that
> it leads to the addition of an unnecessary entry to h265_profiles.

The large number of empty entries in profile_table in the test work by being zero-initialised.  Filling them with -1 would not be fun.

(I originally put that table (and the bprint function) in h265_profile_level.c, but when no library caller was using it I moved it to the test.)

>> * Fixed the h265-levels test.
>> * Added a new h265-profiles test which tests the profile compatibility checking.
>> * Fixed missing VAAPI profiles.
>>
>>
>>  libavcodec/h265_profile_level.c | 78 +++++++++++++++++++++------------
>>  libavcodec/h265_profile_level.h | 71 +++++++++++++++++++++++++++++-
>>  libavcodec/tests/h265_levels.c  |  2 +-
>>  libavcodec/vaapi_hevc.c         |  2 +-
>>  libavcodec/vdpau_hevc.c         |  2 +-
>>  5 files changed, 123 insertions(+), 32 deletions(-)
>>
>> diff --git a/libavcodec/h265_profile_level.c b/libavcodec/h265_profile_level.c
>> index 7ff9681f65..2e4a1c88bf 100644
>> --- a/libavcodec/h265_profile_level.c
>> +++ b/libavcodec/h265_profile_level.c
>> @@ -40,6 +40,7 @@ static const H265LevelDescriptor h265_levels[] = {
>>  };
>>  
>>  static const H265ProfileDescriptor h265_profiles[] = {
>> +    { "Invalid" },
>>      // profile_idc   8bit       one-picture
>>      //   HT-profile  | 422chroma    | lower-bit-rate
>>      //   |  14bit    |  | 420chroma |  | CpbVclFactor     MinCrScaleFactor
>> @@ -119,41 +120,62 @@ 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)
> 
> Why don't you add a tag to this enum and pass a proper enum here?

No reason.  I can add an explicit type if you prefer that?

>>  {
>> -    int i;
>> +    const H265ProfileDescriptor *desc;
>> +
>> +    av_assert0(profile > H265_PROFILE_INVALID &&
>> +               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;
>> +}
>> +
>> ...

Thanks,

- Mark
_______________________________________________
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-05-06 20:12 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-06 18:47 Mark Thompson
2024-05-06 18:47 ` [FFmpeg-devel] [PATCH v2 2/3] lavc: Add test for H.265 profile handling Mark Thompson
2024-05-06 18:47 ` [FFmpeg-devel] [PATCH v2 3/3] lavc/vaapi_hevc: Don't require exact profiles Mark Thompson
2024-05-06 19:56 ` [FFmpeg-devel] [PATCH v2 1/3] lavc/h265_profile_level: Expand profile compatibility checking Andreas Rheinhardt
2024-05-06 20:13   ` Mark Thompson [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=b458ef13-8a8b-4548-9f43-15509f1d797b@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