On 12/11/2024 1:23 AM, Zhao Zhili wrote:
From: Zhao Zhili <zhiliz...@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.

+        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.

  #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;

Attachment: OpenPGP_signature.asc
Description: OpenPGP digital signature

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to