[client] nal: corrections to parsing logic

This commit is contained in:
Geoffrey McRae 2018-01-06 13:40:31 +11:00
parent 859e984827
commit 8ccce5666c
2 changed files with 31 additions and 24 deletions

View File

@ -663,29 +663,31 @@ static bool parse_pred_weight_table(NAL this, const uint8_t * src, size_t size,
NAL_SLICE * slice = &this->slice; NAL_SLICE * slice = &this->slice;
NAL_PW_TABLE * tbl = &this->slice.pred_weight_table; NAL_PW_TABLE * tbl = &this->slice.pred_weight_table;
tbl->luma_log2_weight_denom = decode_u_golomb(src, offset); tbl->luma_log2_weight_denom = decode_u_golomb(src, offset);
tbl->chroma_log2_weight_denom = decode_u_golomb(src, offset); if (this->sps.chroma_format_idc != 0)
tbl->l0 = this->slice_pred_weight_table_l0; tbl->chroma_log2_weight_denom = decode_u_golomb(src, offset);
tbl->l1 = this->slice_pred_weight_table_l1;
for(uint32_t i = 0; i <= this->pps.num_ref_idx_l0_active_minus1; ++i) for(uint32_t i = 0; i <= this->pps.num_ref_idx_l0_active_minus1; ++i)
{ {
NAL_PW_TABLE_L * l = &tbl->l0[i]; NAL_PW_TABLE_L * l = &tbl->l0[i];
l->luma_weight_flag = get_bit(src, offset); tbl->luma_weight_flag[0] = get_bit(src, offset);
if (l->luma_weight_flag) if (tbl->luma_weight_flag[0])
{ {
l->luma_weight = decode_s_golomb(src, offset); l->luma_weight = decode_s_golomb(src, offset);
l->luma_offset = decode_s_golomb(src, offset); l->luma_offset = decode_s_golomb(src, offset);
} }
l->chroma_weight_flag = get_bit(src, offset); if (this->sps.chroma_format_idc != 0)
if (l->chroma_weight_flag) {
for(int j = 0; j < 2; ++j) tbl->chroma_weight_flag[0] = get_bit(src, offset);
{ if (tbl->chroma_weight_flag[0])
l->chroma_weight[j] = decode_s_golomb(src, offset); for(int j = 0; j < 2; ++j)
l->chroma_offset[j] = decode_s_golomb(src, offset); {
} l->chroma_weight[j] = decode_s_golomb(src, offset);
l->chroma_offset[j] = decode_s_golomb(src, offset);
}
}
} }
if (slice->slice_type == NAL_SLICE_TYPE_B) if (slice->slice_type == NAL_SLICE_TYPE_B)
@ -694,20 +696,23 @@ static bool parse_pred_weight_table(NAL this, const uint8_t * src, size_t size,
{ {
NAL_PW_TABLE_L * l = &tbl->l1[i]; NAL_PW_TABLE_L * l = &tbl->l1[i];
l->luma_weight_flag = get_bit(src, offset); tbl->luma_weight_flag[1] = get_bit(src, offset);
if (l->luma_weight_flag) if (tbl->luma_weight_flag[1])
{ {
l->luma_weight = decode_s_golomb(src, offset); l->luma_weight = decode_s_golomb(src, offset);
l->luma_offset = decode_s_golomb(src, offset); l->luma_offset = decode_s_golomb(src, offset);
} }
l->chroma_weight_flag = get_bit(src, offset); if (this->sps.chroma_format_idc != 0)
if (l->chroma_weight_flag) {
for(int j = 0; j < 2; ++j) tbl->chroma_weight_flag[1] = get_bit(src, offset);
{ if (tbl->chroma_weight_flag[1])
l->chroma_weight[j] = decode_s_golomb(src, offset); for(int j = 0; j < 2; ++j)
l->chroma_offset[j] = decode_s_golomb(src, offset); {
} l->chroma_weight[j] = decode_s_golomb(src, offset);
l->chroma_offset[j] = decode_s_golomb(src, offset);
}
}
} }
} }
@ -776,6 +781,8 @@ static bool parse_nal_coded_slice(
slice->slice_type = decode_u_golomb(src, offset); slice->slice_type = decode_u_golomb(src, offset);
slice->pic_parameter_set_id = decode_u_golomb(src, offset); slice->pic_parameter_set_id = decode_u_golomb(src, offset);
slice->frame_num = get_bits(src, offset, this->sps.log2_max_frame_num_minus4 + 4); slice->frame_num = get_bits(src, offset, this->sps.log2_max_frame_num_minus4 + 4);
slice->pred_weight_table.l0 = this->slice_pred_weight_table_l0;
slice->pred_weight_table.l1 = this->slice_pred_weight_table_l1;
if (!this->sps.frame_mbs_only_flag) if (!this->sps.frame_mbs_only_flag)
{ {

View File

@ -230,10 +230,8 @@ NAL_RPL_REORDER;
typedef struct NAL_PW_TABLE_L typedef struct NAL_PW_TABLE_L
{ {
uint8_t luma_weight_flag;
int32_t luma_weight; int32_t luma_weight;
int32_t luma_offset; int32_t luma_offset;
uint8_t chroma_weight_flag;
int32_t chroma_weight[2]; int32_t chroma_weight[2];
int32_t chroma_offset[2]; int32_t chroma_offset[2];
} }
@ -243,6 +241,8 @@ typedef struct NAL_PW_TABLE
{ {
uint32_t luma_log2_weight_denom; uint32_t luma_log2_weight_denom;
uint32_t chroma_log2_weight_denom; uint32_t chroma_log2_weight_denom;
uint8_t luma_weight_flag[2];
uint8_t chroma_weight_flag[2];
NAL_PW_TABLE_L * l0; NAL_PW_TABLE_L * l0;
NAL_PW_TABLE_L * l1; NAL_PW_TABLE_L * l1;
} }