* rocDecode/HEVC error resilience: Added dependant slice error handling. (#547)
[ROCm/rocdecode commit: fc01d72aea]
Este cometimento está contido em:
cometido por
GitHub
ascendente
bde6adab91
cometimento
13e8e15d7b
@@ -512,6 +512,7 @@ typedef struct {
|
||||
/*! \brief Structure for Slice Segment Header
|
||||
*/
|
||||
typedef struct {
|
||||
uint32_t is_received;
|
||||
bool first_slice_segment_in_pic_flag; //u(1)
|
||||
bool no_output_of_prior_pics_flag; //u(1)
|
||||
uint32_t slice_pic_parameter_set_id; //ue(v)
|
||||
|
||||
@@ -597,9 +597,6 @@ ParserResult HevcVideoParser::ParsePictureData(const uint8_t* p_stream, uint32_t
|
||||
slice_info_list_.resize(num_slices_ + 1, {{0}});
|
||||
}
|
||||
|
||||
slice_info_list_[num_slices_].slice_data_offset = curr_start_code_offset_;
|
||||
slice_info_list_[num_slices_].slice_data_size = nal_unit_size_;
|
||||
|
||||
memcpy(rbsp_buf_, (pic_data_buffer_ptr_ + curr_start_code_offset_ + 5), ebsp_size);
|
||||
rbsp_size_ = EbspToRbsp(rbsp_buf_, 0, ebsp_size);
|
||||
HevcSliceSegHeader *p_slice_header = &slice_info_list_[num_slices_].slice_header;
|
||||
@@ -608,6 +605,9 @@ ParserResult HevcVideoParser::ParsePictureData(const uint8_t* p_stream, uint32_t
|
||||
break; // ignore and continue to next nal_unit
|
||||
}
|
||||
|
||||
slice_info_list_[num_slices_].slice_data_offset = curr_start_code_offset_;
|
||||
slice_info_list_[num_slices_].slice_data_size = nal_unit_size_;
|
||||
|
||||
// Start decode process
|
||||
if (num_slices_ == 0) {
|
||||
// Use the data directly from demuxer without copying
|
||||
@@ -1719,6 +1719,7 @@ ParserResult HevcVideoParser::ParseSliceHeader(uint8_t *nalu, size_t size, HevcS
|
||||
}
|
||||
|
||||
if (!p_slice_header->dependent_slice_segment_flag) {
|
||||
memset(&slice_header_copy_, 0, sizeof(slice_header_copy_));
|
||||
for (int i = 0; i < pps_ptr->num_extra_slice_header_bits; i++) {
|
||||
p_slice_header->slice_reserved_flag[i] = Parser::GetBit(nalu, offset);
|
||||
}
|
||||
@@ -1943,9 +1944,13 @@ ParserResult HevcVideoParser::ParseSliceHeader(uint8_t *nalu, size_t size, HevcS
|
||||
p_slice_header->slice_loop_filter_across_slices_enabled_flag = Parser::GetBit(nalu, offset);
|
||||
}
|
||||
|
||||
p_slice_header->is_received = 1;
|
||||
memcpy(&slice_header_copy_, p_slice_header, sizeof(HevcSliceSegHeader));
|
||||
} else {
|
||||
//dependant slice
|
||||
if (!slice_header_copy_.is_received) {
|
||||
return PARSER_WRONG_STATE;
|
||||
}
|
||||
memcpy(p_slice_header, &slice_header_copy_, sizeof(HevcSliceSegHeader));
|
||||
p_slice_header->first_slice_segment_in_pic_flag = temp_sh.first_slice_segment_in_pic_flag;
|
||||
p_slice_header->no_output_of_prior_pics_flag = temp_sh.no_output_of_prior_pics_flag;
|
||||
|
||||
Criar uma nova questão referindo esta
Bloquear um utilizador