diff options
author | Mark Thompson <sw@jkqxz.net> | 2019-05-06 22:02:20 +0100 |
---|---|---|
committer | Mark Thompson <sw@jkqxz.net> | 2019-07-07 13:29:50 +0100 |
commit | f344bb2466f8e340bafdd8ecdcf497dd6780e737 (patch) | |
tree | 42b3af32c4d517ec0b8b6a654664441a3a6e8f5d | |
parent | c1a430885dc7a7c7fc305e9bbe7fbd6a50e90ecf (diff) | |
download | ffmpeg-f344bb2466f8e340bafdd8ecdcf497dd6780e737.tar.gz |
lavc/h265_profile_level: Do not allow high tier at level < 4
-rw-r--r-- | libavcodec/h265_profile_level.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/libavcodec/h265_profile_level.c b/libavcodec/h265_profile_level.c index 692252bb4d..126f8dbc2a 100644 --- a/libavcodec/h265_profile_level.c +++ b/libavcodec/h265_profile_level.c @@ -175,7 +175,7 @@ const H265LevelDescriptor *ff_h265_guess_level(const H265RawProfileTierLevel *pt int max_dec_pic_buffering) { const H265ProfileDescriptor *profile; - int pic_size, lbr_flag, hbr_factor; + int pic_size, tier_flag, lbr_flag, hbr_factor; int i; if (ptl) @@ -189,10 +189,13 @@ const H265LevelDescriptor *ff_h265_guess_level(const H265RawProfileTierLevel *pt pic_size = width * height; - if (ptl) - lbr_flag = ptl->general_lower_bit_rate_constraint_flag; - else - lbr_flag = profile->lower_bit_rate > 0; + if (ptl) { + tier_flag = ptl->general_tier_flag; + lbr_flag = ptl->general_lower_bit_rate_constraint_flag; + } else { + tier_flag = 0; + lbr_flag = profile->lower_bit_rate > 0; + } if (profile->profile_idc == 1 || profile->profile_idc == 2) { hbr_factor = 1; } else if (profile->high_throughput) { @@ -208,6 +211,9 @@ const H265LevelDescriptor *ff_h265_guess_level(const H265RawProfileTierLevel *pt const H265LevelDescriptor *level = &h265_levels[i]; int max_br, max_dpb_size; + if (tier_flag && !level->max_br_high) + continue; + if (pic_size > level->max_luma_ps) continue; if (width * width > 8 * level->max_luma_ps) @@ -222,7 +228,7 @@ const H265LevelDescriptor *ff_h265_guess_level(const H265RawProfileTierLevel *pt if (tile_cols > level->max_tile_cols) continue; - if (ptl && ptl->general_tier_flag) + if (tier_flag) max_br = level->max_br_high; else max_br = level->max_br_main; |