2
0

* rocDecode/HEVC error resilience: Added dependant slice error handling. (#547)

[ROCm/rocdecode commit: fc01d72aea]
Este cometimento está contido em:
jeffqjiangNew
2025-03-28 16:35:03 -04:00
cometido por GitHub
ascendente bde6adab91
cometimento 13e8e15d7b
2 ficheiros modificados com 9 adições e 3 eliminações
+1
Ver ficheiro
@@ -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)
+8 -3
Ver ficheiro
@@ -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;