[FFmpeg-devel] [PATCH] lavc/hevc_ps: parse constraint flags for HEVC REXT

Mark Thompson sw at jkqxz.net
Tue Apr 2 01:24:00 EEST 2019


On 01/04/2019 22:38, James Almer wrote:
> On 4/1/2019 6:43 AM, Linjie Fu wrote:
>> Parse all the constraint flags.
>>
>> It can be passed to hw decoders to detemine the exact profile for Range
>> Extension HEVC.
>>
>> Signed-off-by: Linjie Fu <linjie.fu at intel.com>
>> ---
>>  libavcodec/hevc_ps.c | 18 +++++++++++++++---
>>  libavcodec/hevc_ps.h | 10 ++++++++++
>>  2 files changed, 25 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c
>> index 80df417e4f..1365a9d640 100644
>> --- a/libavcodec/hevc_ps.c
>> +++ b/libavcodec/hevc_ps.c
>> @@ -295,9 +295,21 @@ static int decode_profile_tier_level(GetBitContext *gb, AVCodecContext *avctx,
>>      ptl->non_packed_constraint_flag = get_bits1(gb);
>>      ptl->frame_only_constraint_flag = get_bits1(gb);
>>  
>> -    skip_bits(gb, 16); // XXX_reserved_zero_44bits[0..15]
>> -    skip_bits(gb, 16); // XXX_reserved_zero_44bits[16..31]
>> -    skip_bits(gb, 12); // XXX_reserved_zero_44bits[32..43]
>> +    ptl->max_12bit_constraint_flag        = get_bits1(gb);
>> +    ptl->max_10bit_constraint_flag        = get_bits1(gb);
>> +    ptl->max_8bit_constraint_flag         = get_bits1(gb);
>> +    ptl->max_422chroma_constraint_flag    = get_bits1(gb);
>> +    ptl->max_420chroma_constraint_flag    = get_bits1(gb);
>> +    ptl->max_monochrome_constraint_flag   = get_bits1(gb);
>> +    ptl->intra_constraint_flag            = get_bits1(gb);
>> +    ptl->one_picture_only_constraint_flag = get_bits1(gb);
>> +    ptl->lower_bit_rate_constraint_flag   = get_bits1(gb);
>> +
>> +    skip_bits(gb, 16); // XXX_reserved_zero_34bits[0..15]
> 
> The first of these bits can be general_max_14bit_constraint_flag. I
> suppose no hardware really supports it?

I think it's worth getting these right anyway.

>From the set of flags you've ended up with here I'm guessing you're working from a pre-2018 version of the standard?  Try the 201802 version - <https://www.itu.int/rec/T-REC-H.265-201802-I/en>.

>> +    skip_bits(gb, 16); // XXX_reserved_zero_34bits[16..31]
>> +    skip_bits(gb, 2);  // XXX_reserved_zero_34bits[32..33]
>> +
>> +    ptl->inbld_flag = get_bits1(gb);
> 
> Strictly speaking, you should be checking ptl->profile_idc and
> ptl->profile_compatibility_flag to parse these, as per section 7.3.3 in
> the spec.
> Despite the amount of bits being fixed and the default value being 0, it
> would be ideal to prevent misparsing damaged samples.

+1.  Future profiles which could assign completely different meanings to these bits are also a possibility, though I would hope the standard people would avoid doing that.

Thanks,

- Mark


More information about the ffmpeg-devel mailing list