Skip to content

Commit

Permalink
H265: Refine the exponential golomb for ue.
Browse files Browse the repository at this point in the history
  • Loading branch information
chundonglinlin committed Jan 16, 2023
1 parent def7d4f commit 56ec2c1
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 77 deletions.
6 changes: 3 additions & 3 deletions trunk/src/kernel/srs_kernel_buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,7 @@ int32_t SrsBitBuffer::read_32bits()
return read_bits(32);
}

srs_error_t SrsBitBuffer::read_bits_ue(int32_t& v)
srs_error_t SrsBitBuffer::read_bits_ue(uint32_t& v)
{
srs_error_t err = srs_success;

Expand Down Expand Up @@ -489,7 +489,7 @@ srs_error_t SrsBitBuffer::read_bits_ue(int32_t& v)
return srs_error_new(ERROR_HEVC_NALU_UEV, "no bytes for leadingZeroBits=%d", leadingZeroBits);
}

int32_t b = read_bit();
uint32_t b = read_bit();
v += b << (leadingZeroBits - 1 - i);
}

Expand All @@ -506,7 +506,7 @@ srs_error_t SrsBitBuffer::read_bits_se(int32_t& v)

// ue(v) in 9.2.1 General Parsing process for Exp-Golomb codes
// ITU-T-H.265-2021.pdf, page 221.
int32_t val = 0;
uint32_t val = 0;
if ((err = read_bits_ue(val)) != srs_success) {
return srs_error_wrap(err, "read uev");
}
Expand Down
2 changes: 1 addition & 1 deletion trunk/src/kernel/srs_kernel_buffer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ class SrsBitBuffer
int8_t read_8bits();
int16_t read_16bits();
int32_t read_32bits();
srs_error_t read_bits_ue(int32_t& v);
srs_error_t read_bits_ue(uint32_t& v);
srs_error_t read_bits_se(int32_t& v);
};

Expand Down
36 changes: 24 additions & 12 deletions trunk/src/kernel/srs_kernel_codec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1225,7 +1225,7 @@ srs_error_t SrsFormat::hevc_demux_vps_rbsp(char* rbsp, int nb_rbsp)
vps->layer_id_included_flag[i].resize(vps->vps_max_layer_id);
}

for (int i = 1; i <= vps->vps_num_layer_sets_minus1; i++) {
for (int i = 1; i <= (int)vps->vps_num_layer_sets_minus1; i++) {
vps->layer_id_included_flag[i].resize(vps->vps_num_layer_sets_minus1 + 1);
}

Expand All @@ -1234,7 +1234,7 @@ srs_error_t SrsFormat::hevc_demux_vps_rbsp(char* rbsp, int nb_rbsp)
vps->vps_num_layer_sets_minus1 * vps->vps_max_layer_id, bs.left_bits());
}

for (int i = 1; i <= vps->vps_num_layer_sets_minus1; i++) {
for (int i = 1; i <= (int)vps->vps_num_layer_sets_minus1; i++) {
for (int j = 0; j <= vps->vps_max_layer_id; j++) {
// layer_id_included_flag[i][j] u(1)
vps->layer_id_included_flag[i][j] = bs.read_bit();
Expand Down Expand Up @@ -1272,7 +1272,7 @@ srs_error_t SrsFormat::hevc_demux_vps_rbsp(char* rbsp, int nb_rbsp)
vps->hrd_layer_set_idx.resize(vps->vps_num_hrd_parameters);
vps->cprms_present_flag.resize(vps->vps_num_hrd_parameters);

for (int i = 0; i < vps->vps_num_hrd_parameters; i++) {
for (int i = 0; i < (int)vps->vps_num_hrd_parameters; i++) {
// hrd_layer_set_idx[i] ue(v)
if ((err = bs.read_bits_ue(vps->hrd_layer_set_idx[i])) != srs_success) {
return srs_error_wrap(err, "hrd_layer_set_idx");
Expand Down Expand Up @@ -1406,7 +1406,7 @@ srs_error_t SrsFormat::hevc_demux_sps_rbsp(char* rbsp, int nb_rbsp)
vcodec->hevc_level = (SrsHevcLevel)profile_tier_level.general_level_idc;

// sps_seq_parameter_set_id ue(v)
int sps_seq_parameter_set_id = 0;
uint32_t sps_seq_parameter_set_id = 0;
if ((err = bs.read_bits_ue(sps_seq_parameter_set_id)) != srs_success) {
return srs_error_wrap(err, "sps_seq_parameter_set_id");
}
Expand All @@ -1422,12 +1422,11 @@ srs_error_t SrsFormat::hevc_demux_sps_rbsp(char* rbsp, int nb_rbsp)
memcpy(&(sps->ptl), &profile_tier_level, sizeof(SrsHevcProfileTierLevel));

// chroma_format_idc ue(v)
int chroma_format_idc = 0;
if ((err = bs.read_bits_ue(chroma_format_idc)) != srs_success) {
if ((err = bs.read_bits_ue(sps->chroma_format_idc)) != srs_success) {
return srs_error_wrap(err, "chroma_format_idc");
}

if (chroma_format_idc == 3) {
if (sps->chroma_format_idc == 3) {
if (!bs.require_bits(1)) {
return srs_error_new(ERROR_HEVC_DECODE_ERROR, "separate_colour_plane_flag requires 1 only %d bits", bs.left_bits());
}
Expand Down Expand Up @@ -1579,7 +1578,7 @@ srs_error_t SrsFormat::hevc_demux_pps_rbsp(char* rbsp, int nb_rbsp)
SrsBitBuffer bs(&stream);

// pps_pic_parameter_set_id ue(v)
int pps_pic_parameter_set_id = 0;
uint32_t pps_pic_parameter_set_id = 0;
if ((err = bs.read_bits_ue(pps_pic_parameter_set_id)) != srs_success) {
return srs_error_wrap(err, "pps_pic_parameter_set_id");
}
Expand All @@ -1593,7 +1592,7 @@ srs_error_t SrsFormat::hevc_demux_pps_rbsp(char* rbsp, int nb_rbsp)
pps->pps_pic_parameter_set_id = pps_pic_parameter_set_id;

// pps_seq_parameter_set_id ue(v)
int pps_seq_parameter_set_id = 0;
uint32_t pps_seq_parameter_set_id = 0;
if ((err = bs.read_bits_ue(pps_seq_parameter_set_id)) != srs_success) {
return srs_error_wrap(err, "pps_seq_parameter_set_id");
}
Expand Down Expand Up @@ -1689,14 +1688,14 @@ srs_error_t SrsFormat::hevc_demux_pps_rbsp(char* rbsp, int nb_rbsp)
pps->column_width_minus1.resize(pps->num_tile_columns_minus1);
pps->row_height_minus1.resize(pps->num_tile_rows_minus1);

for (int i = 0; i < pps->num_tile_columns_minus1; i++) {
for (int i = 0; i < (int)pps->num_tile_columns_minus1; i++) {
// column_width_minus1[i] ue(v)
if ((err = bs.read_bits_ue(pps->column_width_minus1[i])) != srs_success) {
return srs_error_wrap(err, "column_width_minus1");
}
}

for (int i = 0; i < pps->num_tile_rows_minus1; i++) {
for (int i = 0; i < (int)pps->num_tile_rows_minus1; i++) {
// row_height_minus1[i] ue(v)
if ((err = bs.read_bits_ue(pps->row_height_minus1[i])) != srs_success) {
return srs_error_wrap(err, "row_height_minus1");
Expand Down Expand Up @@ -1752,8 +1751,10 @@ srs_error_t SrsFormat::hevc_demux_pps_rbsp(char* rbsp, int nb_rbsp)
SrsHevcScalingListData* sld = &pps->scaling_list_data;
for (int sizeId = 0; sizeId < 4; sizeId++) {
for (int matrixId = 0; matrixId < 6; matrixId += (sizeId == 3) ? 3 : 1) {
// scaling_list_pred_mode_flag u(1)
sld->scaling_list_pred_mode_flag[sizeId][matrixId] = bs.read_bit();
if (!sld->scaling_list_pred_mode_flag[sizeId][matrixId]) {
// scaling_list_pred_matrix_id_delta ue(v)
if ((err = bs.read_bits_ue(sld->scaling_list_pred_matrix_id_delta[sizeId][matrixId])) != srs_success) {
return srs_error_wrap(err, "scaling_list_pred_matrix_id_delta");
}
Expand All @@ -1762,13 +1763,15 @@ srs_error_t SrsFormat::hevc_demux_pps_rbsp(char* rbsp, int nb_rbsp)
int coefNum = srs_min(64, (1 << (4 + (sizeId << 1))));
sld->coefNum = coefNum; // tmp store
if (sizeId > 1) {
// scaling_list_dc_coef_minus8 se(v)
if ((err = bs.read_bits_se(sld->scaling_list_dc_coef_minus8[sizeId - 2][matrixId])) != srs_success) {
return srs_error_wrap(err, "scaling_list_dc_coef_minus8");
}
nextCoef = sld->scaling_list_dc_coef_minus8[sizeId - 2][matrixId] + 8;
}

for (int i = 0; i < sld->coefNum; i++) {
// scaling_list_delta_coef se(v)
int scaling_list_delta_coef = 0;
if ((err = bs.read_bits_se(scaling_list_delta_coef)) != srs_success) {
return srs_error_wrap(err, "scaling_list_delta_coef");
Expand Down Expand Up @@ -1827,35 +1830,44 @@ srs_error_t SrsFormat::hevc_demux_pps_rbsp(char* rbsp, int nb_rbsp)
if (!bs.require_bits(2)) {
return srs_error_new(ERROR_HEVC_DECODE_ERROR, "cross_component_prediction_enabled_flag requires 2 only %d bits", bs.left_bits());
}

// cross_component_prediction_enabled_flag u(1)
pps->pps_range_extension.cross_component_prediction_enabled_flag = bs.read_bit();
// chroma_qp_offset_list_enabled_flag u(1)
pps->pps_range_extension.chroma_qp_offset_list_enabled_flag = bs.read_bit();
if (pps->pps_range_extension.chroma_qp_offset_list_enabled_flag) {
// diff_cu_chroma_qp_offset_depth ue(v)
if ((err = bs.read_bits_ue(pps->pps_range_extension.diff_cu_chroma_qp_offset_depth)) != srs_success) {
return srs_error_wrap(err, "diff_cu_chroma_qp_offset_depth");
}

// chroma_qp_offset_list_len_minus1 ue(v)
if ((err = bs.read_bits_ue(pps->pps_range_extension.chroma_qp_offset_list_len_minus1)) != srs_success) {
return srs_error_wrap(err, "chroma_qp_offset_list_len_minus1");
}

pps->pps_range_extension.cb_qp_offset_list.resize(pps->pps_range_extension.chroma_qp_offset_list_len_minus1);
pps->pps_range_extension.cr_qp_offset_list.resize(pps->pps_range_extension.chroma_qp_offset_list_len_minus1);

for (int i = 0; i < pps->pps_range_extension.chroma_qp_offset_list_len_minus1; i++) {
for (int i = 0; i < (int)pps->pps_range_extension.chroma_qp_offset_list_len_minus1; i++) {
// cb_qp_offset_list[i] se(v)
if ((err = bs.read_bits_se(pps->pps_range_extension.cb_qp_offset_list[i])) != srs_success) {
return srs_error_wrap(err, "cb_qp_offset_list");
}

// cr_qp_offset_list[i] se(v)
if ((err = bs.read_bits_se(pps->pps_range_extension.cr_qp_offset_list[i])) != srs_success) {
return srs_error_wrap(err, "cr_qp_offset_list");
}
}
}

// log2_sao_offset_scale_luma ue(v)
if ((err = bs.read_bits_se(pps->pps_range_extension.log2_sao_offset_scale_luma)) != srs_success) {
return srs_error_wrap(err, "log2_sao_offset_scale_luma");
}

// log2_sao_offset_scale_chroma ue(v)
if ((err = bs.read_bits_se(pps->pps_range_extension.log2_sao_offset_scale_chroma)) != srs_success) {
return srs_error_wrap(err, "log2_sao_offset_scale_chroma");
}
Expand Down
122 changes: 61 additions & 61 deletions trunk/src/kernel/srs_kernel_codec.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -599,11 +599,11 @@ struct SrsHevcHrdParameters
*/
struct SrsHevcScalingListData
{
int scaling_list_pred_mode_flag[4][6];
int scaling_list_pred_matrix_id_delta[4][6];
int scaling_list_dc_coef_minus8[4][6];
int ScalingList[4][6][64];
int coefNum;
uint32_t scaling_list_pred_mode_flag[4][6];
uint32_t scaling_list_pred_matrix_id_delta[4][6];
int32_t scaling_list_dc_coef_minus8[4][6];
uint32_t ScalingList[4][6][64];
int32_t coefNum;
};

/**
Expand Down Expand Up @@ -631,11 +631,11 @@ struct SrsHevcSpsRangeExtension
*/
struct SrsHevcPpsRangeExtension
{
int log2_max_transform_skip_block_size_minus2;
uint32_t log2_max_transform_skip_block_size_minus2;
uint8_t cross_component_prediction_enabled_flag;
uint8_t chroma_qp_offset_list_enabled_flag;
int diff_cu_chroma_qp_offset_depth;
int chroma_qp_offset_list_len_minus1;
uint32_t diff_cu_chroma_qp_offset_depth;
uint32_t chroma_qp_offset_list_len_minus1;
std::vector<int> cb_qp_offset_list;
std::vector<int> cr_qp_offset_list;
int log2_sao_offset_scale_luma;
Expand Down Expand Up @@ -730,19 +730,19 @@ struct SrsHevcRbspVps
SrsHevcProfileTierLevel ptl;
uint8_t vps_sub_layer_ordering_info_present_flag;
// Sublayers
int vps_max_dec_pic_buffering_minus1[8]; // max u(3)
int vps_max_num_reorder_pics[8];
int vps_max_latency_increase_plus1[8];
uint32_t vps_max_dec_pic_buffering_minus1[8]; // max u(3)
uint32_t vps_max_num_reorder_pics[8];
uint32_t vps_max_latency_increase_plus1[8];
uint8_t vps_max_layer_id;
int vps_num_layer_sets_minus1;
uint32_t vps_num_layer_sets_minus1;
std::vector<std::vector<uint8_t>> layer_id_included_flag;
uint8_t vps_timing_info_present_flag;
int vps_num_units_in_tick;
int vps_time_scale;
uint32_t vps_num_units_in_tick;
uint32_t vps_time_scale;
uint8_t vps_poc_proportional_to_timing_flag;
int vps_num_ticks_poc_diff_one_minus1;
int vps_num_hrd_parameters;
std::vector<int> hrd_layer_set_idx;
uint32_t vps_num_ticks_poc_diff_one_minus1;
uint32_t vps_num_hrd_parameters;
std::vector<uint32_t> hrd_layer_set_idx;
std::vector<uint8_t> cprms_present_flag;
SrsHevcHrdParameters hrd_parameters;
uint8_t vps_extension_flag;
Expand All @@ -760,48 +760,48 @@ struct SrsHevcRbspSps
uint8_t sps_max_sub_layers_minus1;
uint8_t sps_temporal_id_nesting_flag;
SrsHevcProfileTierLevel ptl;
int sps_seq_parameter_set_id;
int chroma_format_idc;
uint32_t sps_seq_parameter_set_id;
uint32_t chroma_format_idc;
uint8_t separate_colour_plane_flag;
int pic_width_in_luma_samples;
int pic_height_in_luma_samples;
int conformance_window_flag;
int conf_win_left_offset;
int conf_win_right_offset;
int conf_win_top_offset;
int conf_win_bottom_offset;
int bit_depth_luma_minus8;
int bit_depth_chroma_minus8;
int log2_max_pic_order_cnt_lsb_minus4;
uint32_t pic_width_in_luma_samples;
uint32_t pic_height_in_luma_samples;
uint32_t conformance_window_flag;
uint32_t conf_win_left_offset;
uint32_t conf_win_right_offset;
uint32_t conf_win_top_offset;
uint32_t conf_win_bottom_offset;
uint32_t bit_depth_luma_minus8;
uint32_t bit_depth_chroma_minus8;
uint32_t log2_max_pic_order_cnt_lsb_minus4;
uint8_t sps_sub_layer_ordering_info_present_flag;
int sps_max_dec_pic_buffering_minus1[8]; // max u(3)
int sps_max_num_reorder_pics[8];
int sps_max_latency_increase_plus1[8];
int log2_min_luma_coding_block_size_minus3;
int log2_diff_max_min_luma_coding_block_size;
int log2_min_luma_transform_block_size_minus2;
int log2_diff_max_min_luma_transform_block_size;
int max_transform_hierarchy_depth_inter;
int max_transform_hierarchy_depth_intra;
uint32_t sps_max_dec_pic_buffering_minus1[8]; // max u(3)
uint32_t sps_max_num_reorder_pics[8];
uint32_t sps_max_latency_increase_plus1[8];
uint32_t log2_min_luma_coding_block_size_minus3;
uint32_t log2_diff_max_min_luma_coding_block_size;
uint32_t log2_min_luma_transform_block_size_minus2;
uint32_t log2_diff_max_min_luma_transform_block_size;
uint32_t max_transform_hierarchy_depth_inter;
uint32_t max_transform_hierarchy_depth_intra;
uint8_t scaling_list_enabled_flag;
uint8_t sps_infer_scaling_list_flag;
int sps_scaling_list_ref_layer_id;
int sps_scaling_list_data_present_flag;
uint32_t sps_scaling_list_ref_layer_id;
uint32_t sps_scaling_list_data_present_flag;
SrsHevcScalingListData scaling_list_data;
uint8_t amp_enabled_flag;
uint8_t sample_adaptive_offset_enabled_flag;
uint8_t pcm_enabled_flag;
uint8_t pcm_sample_bit_depth_luma_minus1;
uint8_t pcm_sample_bit_depth_chroma_minus1;
int log2_min_pcm_luma_coding_block_size_minus3;
int log2_diff_max_min_pcm_luma_coding_block_size;
uint32_t log2_min_pcm_luma_coding_block_size_minus3;
uint32_t log2_diff_max_min_pcm_luma_coding_block_size;
uint8_t pcm_loop_filter_disabled_flag;
int num_short_term_ref_pic_sets;
uint32_t num_short_term_ref_pic_sets;
std::vector<SrsHevcStRefPicSet> st_ref_pic_set;
uint8_t long_term_ref_pics_present_flag;
int num_long_term_ref_pics_sps;
int lt_ref_pic_poc_lsb_sps_bytes;
std::vector<int> lt_ref_pic_poc_lsb_sps;
uint32_t num_long_term_ref_pics_sps;
uint32_t lt_ref_pic_poc_lsb_sps_bytes;
std::vector<uint32_t> lt_ref_pic_poc_lsb_sps;
std::vector<uint8_t> used_by_curr_pic_lt_sps_flag;
uint8_t sps_temporal_mvp_enabled_flag;
uint8_t strong_intra_smoothing_enabled_flag;
Expand Down Expand Up @@ -833,37 +833,37 @@ struct SrsHevcRbspPps
uint8_t num_extra_slice_header_bits;
uint8_t sign_data_hiding_enabled_flag;
uint8_t cabac_init_present_flag;
int num_ref_idx_l0_default_active_minus1;
int num_ref_idx_l1_default_active_minus1;
int init_qp_minus26;
uint32_t num_ref_idx_l0_default_active_minus1;
uint32_t num_ref_idx_l1_default_active_minus1;
int32_t init_qp_minus26;
uint8_t constrained_intra_pred_flag;
uint8_t transform_skip_enabled_flag;
uint8_t cu_qp_delta_enabled_flag;
int diff_cu_qp_delta_depth;
int pps_cb_qp_offset;
int pps_cr_qp_offset;
uint32_t diff_cu_qp_delta_depth;
int32_t pps_cb_qp_offset;
int32_t pps_cr_qp_offset;
uint8_t pps_slice_chroma_qp_offsets_present_flag;
uint8_t weighted_pred_flag;
int weighted_bipred_flag;
uint32_t weighted_bipred_flag;
uint8_t transquant_bypass_enabled_flag;
uint8_t tiles_enabled_flag;
uint8_t entropy_coding_sync_enabled_flag;
int num_tile_columns_minus1;
int num_tile_rows_minus1;
int uniform_spacing_flag;
std::vector<int> column_width_minus1;
std::vector<int> row_height_minus1;
uint32_t num_tile_columns_minus1;
uint32_t num_tile_rows_minus1;
uint32_t uniform_spacing_flag;
std::vector<uint32_t> column_width_minus1;
std::vector<uint32_t> row_height_minus1;
uint8_t loop_filter_across_tiles_enabled_flag;
uint8_t pps_loop_filter_across_slices_enabled_flag;
uint8_t deblocking_filter_control_present_flag;
uint8_t deblocking_filter_override_enabled_flag;
uint8_t pps_deblocking_filter_disabled_flag;
int pps_beta_offset_div2;
int pps_tc_offset_div2;
int32_t pps_beta_offset_div2;
int32_t pps_tc_offset_div2;
uint8_t pps_scaling_list_data_present_flag;
SrsHevcScalingListData scaling_list_data;
uint8_t lists_modification_present_flag;
int log2_parallel_merge_level_minus2;
uint32_t log2_parallel_merge_level_minus2;
uint8_t slice_segment_header_extension_present_flag;
uint8_t pps_extension_present_flag;
uint8_t pps_range_extension_flag;
Expand Down

0 comments on commit 56ec2c1

Please sign in to comment.