From 356794688434ddfe8b4957df2405a978aacb6cce Mon Sep 17 00:00:00 2001 From: jeffqjiangNew <142832361+jeffqjiangNew@users.noreply.github.com> Date: Mon, 18 Dec 2023 08:20:55 -0500 Subject: [PATCH] Fixed a POC calculation error in some corner cases. (#145) * * rocDecode/HEVC: Fixed a POC calculation error in some corner cases. * * rocDecode/HEVC: Added a newline between two functions. No functional changes. [ROCm/rocdecode commit: 1cdbac7d707d2b34acd50d628017188e80814e7a] --- projects/rocdecode/src/parser/hevc_parser.cpp | 19 +++++++++++++++++-- projects/rocdecode/src/parser/hevc_parser.h | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/projects/rocdecode/src/parser/hevc_parser.cpp b/projects/rocdecode/src/parser/hevc_parser.cpp index 83d173890f..9bcbf2869e 100644 --- a/projects/rocdecode/src/parser/hevc_parser.cpp +++ b/projects/rocdecode/src/parser/hevc_parser.cpp @@ -1963,10 +1963,23 @@ bool HEVCVideoParser::IsRaslPic(NalUnitHeader *nal_header_ptr) { return (nal_header_ptr->nal_unit_type == NAL_UNIT_CODED_SLICE_RASL_N || nal_header_ptr->nal_unit_type == NAL_UNIT_CODED_SLICE_RASL_R); } +bool HEVCVideoParser::IsRadlPic(NalUnitHeader *nal_header_ptr) { + return (nal_header_ptr->nal_unit_type == NAL_UNIT_CODED_SLICE_RADL_N || nal_header_ptr->nal_unit_type == NAL_UNIT_CODED_SLICE_RADL_R); +} + bool HEVCVideoParser::IsIrapPic(NalUnitHeader *nal_header_ptr) { return (nal_header_ptr->nal_unit_type >= NAL_UNIT_CODED_SLICE_BLA_W_LP && nal_header_ptr->nal_unit_type <= NAL_UNIT_RESERVED_IRAP_VCL23); } +bool HEVCVideoParser::IsRefPic(NalUnitHeader *nal_header_ptr) { + if (((nal_header_ptr->nal_unit_type <= NAL_UNIT_RESERVED_VCL_R15) && ((nal_header_ptr->nal_unit_type % 2) != 0)) || + ((nal_header_ptr->nal_unit_type >= NAL_UNIT_CODED_SLICE_BLA_W_LP) && (nal_header_ptr->nal_unit_type <= NAL_UNIT_RESERVED_IRAP_VCL23))) { + return true; + } else { + return false; + } +} + void HEVCVideoParser::CalculateCurrPOC() { // Recode decode order count curr_pic_info_.decode_order_count = pic_count_; @@ -1996,9 +2009,11 @@ void HEVCVideoParser::CalculateCurrPOC() { } curr_pic_info_.pic_order_cnt = poc_msb + m_sh_->slice_pic_order_cnt_lsb; - curr_pic_info_.prev_poc_lsb = m_sh_->slice_pic_order_cnt_lsb; - curr_pic_info_.prev_poc_msb = poc_msb; curr_pic_info_.slice_pic_order_cnt_lsb = m_sh_->slice_pic_order_cnt_lsb; + if ((slice_nal_unit_header_.nuh_temporal_id_plus1 - 1) == 0 && IsRefPic(&slice_nal_unit_header_) && !IsRaslPic(&slice_nal_unit_header_) && !IsRadlPic(&slice_nal_unit_header_)) { + curr_pic_info_.prev_poc_lsb = m_sh_->slice_pic_order_cnt_lsb; + curr_pic_info_.prev_poc_msb = poc_msb; + } } } diff --git a/projects/rocdecode/src/parser/hevc_parser.h b/projects/rocdecode/src/parser/hevc_parser.h index eea9a5c76c..e2dcaf8dc1 100644 --- a/projects/rocdecode/src/parser/hevc_parser.h +++ b/projects/rocdecode/src/parser/hevc_parser.h @@ -947,4 +947,6 @@ private: bool IsBlaPic(NalUnitHeader *nal_header_ptr); bool IsIrapPic(NalUnitHeader *nal_header_ptr); bool IsRaslPic(NalUnitHeader *nal_header_ptr); + bool IsRadlPic(NalUnitHeader *nal_header_ptr); + bool IsRefPic(NalUnitHeader *nal_header_ptr); }; \ No newline at end of file