[FFmpeg-devel] [PATCH WIP 4/5] avcodec/hevc/sei: Add support for alpha channel information

Zhao Zhili quinkblack at foxmail.com
Sun Dec 15 08:52:16 EET 2024



> On Dec 14, 2024, at 23:20, James Almer <jamrial at gmail.com> wrote:
> 
> On 12/11/2024 1:23 AM, Zhao Zhili wrote:
>> From: Zhao Zhili <zhilizhao at tencent.com>
>> ---
>>  libavcodec/hevc/sei.c | 30 ++++++++++++++++++++++++++++++
>>  libavcodec/hevc/sei.h | 14 ++++++++++++++
>>  2 files changed, 44 insertions(+)
>> diff --git a/libavcodec/hevc/sei.c b/libavcodec/hevc/sei.c
>> index e11a33773c..56983fe96e 100644
>> --- a/libavcodec/hevc/sei.c
>> +++ b/libavcodec/hevc/sei.c
>> @@ -150,6 +150,34 @@ static int decode_nal_sei_timecode(HEVCSEITimeCode *s, GetBitContext *gb)
>>      return 0;
>>  }
>>  +static int decode_nal_sei_alpha_info(HEVCSEIAlphaChannelInfo *s, GetBitContext *gb)
>> +{
>> +    int length;
>> +
>> +    s->has_alpha_channel_info = true;
>> +
>> +    s->alpha_channel_cancel_flag = get_bits1(gb);
>> +    if (!s->alpha_channel_cancel_flag) {
> 
> This should trigger when alpha_channel_cancel_flag is 1.

I made a mistake.

> 
>> +        s->alpha_channel_use_idc = 2;
>> +        s->alpha_channel_incr_flag = 0;
>> +        s->alpha_channel_clip_flag = 0;
>> +
>> +        return 0;
>> +    }
>> +
>> +    s->alpha_channel_use_idc = get_bits(gb, 3);
>> +    s->alpha_channel_bit_depth_minus8 = get_bits(gb, 3);
>> +    length = s->alpha_channel_bit_depth_minus8 + 9;
>> +    s->alpha_transparent_value = get_bits(gb, length);
>> +    s->alpha_opaque_value = get_bits(gb, length);
>> +    s->alpha_channel_incr_flag = get_bits1(gb);
>> +    s->alpha_channel_clip_flag = get_bits1(gb);
>> +    if (s->alpha_channel_clip_flag)
>> +        s->alpha_channel_clip_type_flag = get_bits1(gb);
>> +
>> +    return 0;
>> +}
>> +
>>  static int decode_nal_sei_3d_reference_displays_info(HEVCSEITDRDI *s, GetBitContext *gb)
>>  {
>>      s->prec_ref_display_width = get_ue_golomb(gb);
>> @@ -216,6 +244,8 @@ static int decode_nal_sei_prefix(GetBitContext *gb, GetByteContext *gbyte,
>>          return decode_nal_sei_active_parameter_sets(s, gb, logctx);
>>      case SEI_TYPE_TIME_CODE:
>>          return decode_nal_sei_timecode(&s->timecode, gb);
>> +    case SEI_TYPE_ALPHA_CHANNEL_INFO:
>> +        return decode_nal_sei_alpha_info(&s->alpha, gb);
>>      case SEI_TYPE_THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO:
>>          return decode_nal_sei_3d_reference_displays_info(&s->tdrdi, gb);
>>      default: {
>> diff --git a/libavcodec/hevc/sei.h b/libavcodec/hevc/sei.h
>> index ee640003bc..54122c27df 100644
>> --- a/libavcodec/hevc/sei.h
>> +++ b/libavcodec/hevc/sei.h
>> @@ -21,6 +21,7 @@
>>  #ifndef AVCODEC_HEVC_SEI_H
>>  #define AVCODEC_HEVC_SEI_H
>>  +#include <stdbool.h>
> 
> Are we using bool anywhere else? Afaik, we just use uint8_t everywhere since it's going to be a whole byte anyway.

Patchset v2 dropped this patch.

For something with only true/false state and has no other defect, I prefer to use bool for clarity.
Maybe we can list cases what’s forbidden or inappropriate to use bool, so bool can be used in
other cases.

> 
>>  #include <stdint.h>
>>    #include "libavutil/buffer.h"
>> @@ -95,6 +96,18 @@ typedef struct HEVCSEITDRDI {
>>      uint8_t three_dimensional_reference_displays_extension_flag;
>>  } HEVCSEITDRDI;
>>  +typedef struct HEVCSEIAlphaChannelInfo {
>> +    bool     has_alpha_channel_info;
>> +    uint8_t  alpha_channel_cancel_flag;
>> +    uint8_t  alpha_channel_use_idc;
>> +    uint8_t  alpha_channel_bit_depth_minus8;
>> +    uint16_t alpha_transparent_value;
>> +    uint16_t alpha_opaque_value;
>> +    uint8_t  alpha_channel_incr_flag;
>> +    uint8_t  alpha_channel_clip_flag;
>> +    uint8_t  alpha_channel_clip_type_flag;
>> +} HEVCSEIAlphaChannelInfo;
>> +
>>  typedef struct HEVCSEI {
>>      H2645SEI common;
>>      HEVCSEIPictureHash picture_hash;
>> @@ -102,6 +115,7 @@ typedef struct HEVCSEI {
>>      int active_seq_parameter_set_id;
>>      HEVCSEITimeCode timecode;
>>      HEVCSEITDRDI tdrdi;
>> +    HEVCSEIAlphaChannelInfo alpha;
>>  } HEVCSEI;
>>    struct HEVCParamSets;
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".



More information about the ffmpeg-devel mailing list