【FFmpeg】源码hevc.h

概述

因项目中频繁需要处理H265格式的视频流,所以根据FFmpeg库源码,对处理该视频流的方法进行学习。该头文件主要是枚举了一些H265常用的类型以及相关定义,可以简单了解,在需要的时候直接查询

NALU类型

该部分主要就是定义了HEVC码流中所有可能的Nalu,关键类型有以下几种

  • 参数集: HEVC_NAL_VPS, HEVC_NAL_SPS, HEVC_NAL_PPS (视频解码的关键参数)
  • SEI: HEVC_NAL_SEI_PREFIX, HEVC_NAL_SEI_SUFFIX (补充增强信息,例如时间信息、显示信息等)
  • Slice 类型: HEVC_NAL_SLICE_TRAIL_N, HEVC_NAL_SLICE_TRAIL_R, ... HEVC_NAL_SLICE_IDR_W_RADL, HEVC_NAL_SLICE_IDR_N_LP, HEVC_NAL_CRA_NUT (各种帧类型的 Slice 数据)
  • 控制 NALU: HEVC_NAL_AUD, HEVC_NAL_EOS_NUT, HEVC_NAL_EOB_NUT, HEVC_NAL_FD_NUT (访问单元分隔符、序列结束、码流结束、填充数据)
enum HEVCNALUnitType {
    HEVC_NAL_TRAIL_N        = 0,
    HEVC_NAL_TRAIL_R        = 1,
    HEVC_NAL_TSA_N          = 2,
    HEVC_NAL_TSA_R          = 3,
    HEVC_NAL_STSA_N         = 4,
    HEVC_NAL_STSA_R         = 5,
    HEVC_NAL_RADL_N         = 6,
    HEVC_NAL_RADL_R         = 7,
    HEVC_NAL_RASL_N         = 8,
    HEVC_NAL_RASL_R         = 9,
    HEVC_NAL_VCL_N10        = 10,
    HEVC_NAL_VCL_R11        = 11,
    HEVC_NAL_VCL_N12        = 12,
    HEVC_NAL_VCL_R13        = 13,
    HEVC_NAL_VCL_N14        = 14,
    HEVC_NAL_VCL_R15        = 15,
    HEVC_NAL_BLA_W_LP       = 16,
    HEVC_NAL_BLA_W_RADL     = 17,
    HEVC_NAL_BLA_N_LP       = 18,
    HEVC_NAL_IDR_W_RADL     = 19,
    HEVC_NAL_IDR_N_LP       = 20,
    HEVC_NAL_CRA_NUT        = 21,
    HEVC_NAL_RSV_IRAP_VCL22 = 22,
    HEVC_NAL_RSV_IRAP_VCL23 = 23,
    HEVC_NAL_RSV_VCL24      = 24,
    HEVC_NAL_RSV_VCL25      = 25,
    HEVC_NAL_RSV_VCL26      = 26,
    HEVC_NAL_RSV_VCL27      = 27,
    HEVC_NAL_RSV_VCL28      = 28,
    HEVC_NAL_RSV_VCL29      = 29,
    HEVC_NAL_RSV_VCL30      = 30,
    HEVC_NAL_RSV_VCL31      = 31,
    HEVC_NAL_VPS            = 32,
    HEVC_NAL_SPS            = 33,
    HEVC_NAL_PPS            = 34,
    HEVC_NAL_AUD            = 35,
    HEVC_NAL_EOS_NUT        = 36,
    HEVC_NAL_EOB_NUT        = 37,
    HEVC_NAL_FD_NUT         = 38,
    HEVC_NAL_SEI_PREFIX     = 39,
    HEVC_NAL_SEI_SUFFIX     = 40,
    HEVC_NAL_RSV_NVCL41     = 41,
    HEVC_NAL_RSV_NVCL42     = 42,
    HEVC_NAL_RSV_NVCL43     = 43,
    HEVC_NAL_RSV_NVCL44     = 44,
    HEVC_NAL_RSV_NVCL45     = 45,
    HEVC_NAL_RSV_NVCL46     = 46,
    HEVC_NAL_RSV_NVCL47     = 47,
    HEVC_NAL_UNSPEC48       = 48,
    HEVC_NAL_UNSPEC49       = 49,
    HEVC_NAL_UNSPEC50       = 50,
    HEVC_NAL_UNSPEC51       = 51,
    HEVC_NAL_UNSPEC52       = 52,
    HEVC_NAL_UNSPEC53       = 53,
    HEVC_NAL_UNSPEC54       = 54,
    HEVC_NAL_UNSPEC55       = 55,
    HEVC_NAL_UNSPEC56       = 56,
    HEVC_NAL_UNSPEC57       = 57,
    HEVC_NAL_UNSPEC58       = 58,
    HEVC_NAL_UNSPEC59       = 59,
    HEVC_NAL_UNSPEC60       = 60,
    HEVC_NAL_UNSPEC61       = 61,
    HEVC_NAL_UNSPEC62       = 62,
    HEVC_NAL_UNSPEC63       = 63,
};

slice类型

该处定义了三种基本的Slice类型,其也代表了不同的预测和编码方式,其中关键类型有三种

  • HEVC_SLICE_B: B 片 (双向预测) - 运动估计和补偿效率最高,但解码复杂度也最高。
  • HEVC_SLICE_P: P 片 (单向预测) - 效率和复杂度介于 I 片和 B 片之间。
  • HEVC_SLICE_I: I 片 (帧内编码) - 编码效率最低,但解码不依赖其他帧,是随机访问和错误恢复的关键帧。
enum HEVCSliceType {
    HEVC_SLICE_B = 0,
    HEVC_SLICE_P = 1,
    HEVC_SLICE_I = 2,
};

宏常量定义

这些宏定义了 HEVC 标准中各种重要的限制、能力级别、默认值等,用于约束码流的参数范围和解码器的行为

  • 最大值限制: 例如 HEVC_MAX_LAYERS, HEVC_MAX_SUB_LAYERS, HEVC_MAX_DPB_SIZE, HEVC_MAX_REFS, HEVC_MAX_WIDTH, HEVC_MAX_HEIGHT 等,定义了 HEVC 码流在不同 Profile 和 Level 下的各种参数上限。
  • CTB 相关: HEVC_MIN_LOG2_CTB_SIZE, HEVC_MAX_LOG2_CTB_SIZE (定义了 CTB 尺寸的范围)。
  • 其他关键常量: HEVC_MAX_NUH_LAYER_ID, HEVC_MAX_REFS 等。
enum {
    // 7.4.3.1: vps_max_layers_minus1 is in [0, 62].
    HEVC_MAX_LAYERS         = 63,
    // 7.4.3.1: vps_max_sub_layers_minus1 is in [0, 6].
    HEVC_MAX_SUB_LAYERS     = 7,
    // 7.4.3.1: vps_num_layer_sets_minus1 is in [0, 1023].
    HEVC_MAX_LAYER_SETS     = 1024,
    // 7.4.3.1: vps_max_layer_id is in [0, 63].
    HEVC_MAX_LAYER_ID       = 63,
    HEVC_MAX_NUH_LAYER_ID   = 62,

    // 7.4.2.1: vps_video_parameter_set_id is u(4).
    HEVC_MAX_VPS_COUNT = 16,
    // 7.4.3.2.1: sps_seq_parameter_set_id is in [0, 15].
    HEVC_MAX_SPS_COUNT = 16,
    // 7.4.3.3.1: pps_pic_parameter_set_id is in [0, 63].
    HEVC_MAX_PPS_COUNT = 64,

    // A.4.2: MaxDpbSize is bounded above by 16.
    HEVC_MAX_DPB_SIZE = 16,
    // 7.4.3.1: vps_max_dec_pic_buffering_minus1[i] is in [0, MaxDpbSize - 1].
    HEVC_MAX_REFS     = HEVC_MAX_DPB_SIZE,

    // 7.4.3.2.1: num_short_term_ref_pic_sets is in [0, 64].
    HEVC_MAX_SHORT_TERM_REF_PIC_SETS = 64,
    // 7.4.3.2.1: num_long_term_ref_pics_sps is in [0, 32].
    HEVC_MAX_LONG_TERM_REF_PICS      = 32,

    // A.3: all profiles require that CtbLog2SizeY is in [4, 6].
    HEVC_MIN_LOG2_CTB_SIZE = 4,
    HEVC_MAX_LOG2_CTB_SIZE = 6,

    // E.3.2: cpb_cnt_minus1[i] is in [0, 31].
    HEVC_MAX_CPB_CNT = 32,

    // A.4.1: in table A.6 the highest level allows a MaxLumaPs of 35 651 584.
    HEVC_MAX_LUMA_PS = 35651584,
    // A.4.1: pic_width_in_luma_samples and pic_height_in_luma_samples are
    // constrained to be not greater than sqrt(MaxLumaPs * 8).  Hence height/
    // width are bounded above by sqrt(8 * 35651584) = 16888.2 samples.
    HEVC_MAX_WIDTH  = 16888,
    HEVC_MAX_HEIGHT = 16888,

    // A.4.1: table A.6 allows at most 22 tile rows for any level.
    HEVC_MAX_TILE_ROWS    = 22,
    // A.4.1: table A.6 allows at most 20 tile columns for any level.
    HEVC_MAX_TILE_COLUMNS = 20,

    // A.4.2: table A.6 allows at most 600 slice segments for any level.
    HEVC_MAX_SLICE_SEGMENTS = 600,

    // 7.4.7.1: in the worst case (tiles_enabled_flag and
    // entropy_coding_sync_enabled_flag are both set), entry points can be
    // placed at the beginning of every Ctb row in every tile, giving an
    // upper bound of (num_tile_columns_minus1 + 1) * PicHeightInCtbsY - 1.
    // Only a stream with very high resolution and perverse parameters could
    // get near that, though, so set a lower limit here with the maximum
    // possible value for 4K video (at most 135 16x16 Ctb rows).
    HEVC_MAX_ENTRY_POINT_OFFSETS = HEVC_MAX_TILE_COLUMNS * 135,

    // A.3.7: Screen content coding extensions
    HEVC_MAX_PALETTE_PREDICTOR_SIZE = 128,
};

可伸缩掩码/辅助ID

可伸缩掩码,主要定义了HEVC可伸缩性的拓展属性,用于支持分层编码和传输。主要的类型有HEVC_SCALABILITY_DEPTH, HEVC_SCALABILITY_MULTIVIEW, HEVC_SCALABILITY_SPATIAL, HEVC_SCALABILITY_AUXILIARY (深度、多视角、空间、辅助信息可伸缩性)

enum HEVCScalabilityMask {
    HEVC_SCALABILITY_DEPTH      = 1 << (15 - 0),
    HEVC_SCALABILITY_MULTIVIEW  = 1 << (15 - 1),
    HEVC_SCALABILITY_SPATIAL    = 1 << (15 - 2),
    HEVC_SCALABILITY_AUXILIARY  = 1 << (15 - 3),
    HEVC_SCALABILITY_MASK_MAX   = 0xFFFF,
};

辅助ID

主要是定义了辅助信息的类型,一般用于表示视频流中附加的非视频流数据

enum HEVCAuxId {
    HEVC_AUX_ALPHA = 1,
    HEVC_AUX_DEPTH = 2,
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值