diff --git a/src/parser/hevc_parser.cpp b/src/parser/hevc_parser.cpp index 6865a886cc..9d9f0ba7e6 100644 --- a/src/parser/hevc_parser.cpp +++ b/src/parser/hevc_parser.cpp @@ -90,7 +90,7 @@ rocDecStatus HEVCVideoParser::ParseVideoData(RocdecSourceDataPacket *p_data) { } // Whenever new sei message found - if (sei_message_count_ > 0) { + if (pfn_get_sei_message_cb_ && sei_message_count_ > 0) { FillSeiMessageCallbackFn(m_sei_message_); } @@ -226,7 +226,7 @@ void HEVCVideoParser::FillSeiMessageCallbackFn(SeiMessageData* sei_message_data) sei_message_info_params_.picIdx = 0; // callback function with RocdecSeiMessageInfo params filled out - pfn_get_sei_message_cb_(parser_params_.pUserData, &sei_message_info_params_); + if (pfn_get_sei_message_cb_) pfn_get_sei_message_cb_(parser_params_.pUserData, &sei_message_info_params_); } int HEVCVideoParser::SendPicForDecode() { @@ -621,8 +621,10 @@ bool HEVCVideoParser::ParseFrameData(const uint8_t* p_stream, uint32_t frame_dat memcpy(m_rbsp_buf_, (frame_data_buffer_ptr_ + curr_start_code_offset_ + 5), ebsp_size); m_rbsp_size_ = EBSPtoRBSP(m_rbsp_buf_, 0, ebsp_size); // todo:: ParseSeiMessage is causing Segfault: disabling until we fix it - //ParseSeiMessage(m_rbsp_buf_, m_rbsp_size_); - //sei_message_count_++; + if (pfn_get_sei_message_cb_) { + //ParseSeiMessage(m_rbsp_buf_, m_rbsp_size_); + //sei_message_count_++; + } break; } diff --git a/utils/rocvideodecode/roc_video_dec.cpp b/utils/rocvideodecode/roc_video_dec.cpp index 95c7884854..3dc58d3be2 100644 --- a/utils/rocvideodecode/roc_video_dec.cpp +++ b/utils/rocvideodecode/roc_video_dec.cpp @@ -557,34 +557,36 @@ int RocVideoDecoder::HandlePictureDisplay(RocdecParserDispInfo *pDispInfo) { int RocVideoDecoder::GetSEIMessage(RocdecSeiMessageInfo *pSEIMessageInfo) { uint32_t sei_num_mesages = pSEIMessageInfo->sei_message_count; - RocdecSeiMessage *p_sei_msg_info = pSEIMessageInfo->pSEIMessage; - size_t total_SEI_buff_size = 0; - if ((pSEIMessageInfo->picIdx < 0) || (pSEIMessageInfo->picIdx >= MAX_FRAME_NUM)) { - ERR("Invalid picture index for SEI message: " + TOSTR(pSEIMessageInfo->picIdx)); - return 0; + if (sei_num_mesages) { + RocdecSeiMessage *p_sei_msg_info = pSEIMessageInfo->pSEIMessage; + size_t total_SEI_buff_size = 0; + if ((pSEIMessageInfo->picIdx < 0) || (pSEIMessageInfo->picIdx >= MAX_FRAME_NUM)) { + ERR("Invalid picture index for SEI message: " + TOSTR(pSEIMessageInfo->picIdx)); + return 0; + } + for (uint32_t i = 0; i < sei_num_mesages; i++) { + total_SEI_buff_size += p_sei_msg_info[i].sei_message_size; + } + if (!curr_sei_message_ptr_) { + ERR("Out of Memory, Allocation failed for m_pCurrSEIMessage"); + return 0; + } + curr_sei_message_ptr_->pSEIData = malloc(total_SEI_buff_size); + if (!curr_sei_message_ptr_->pSEIData) { + ERR("Out of Memory, Allocation failed for SEI Buffer"); + return 0; + } + memcpy(curr_sei_message_ptr_->pSEIData, pSEIMessageInfo->pSEIData, total_SEI_buff_size); + curr_sei_message_ptr_->pSEIMessage = (RocdecSeiMessage *)malloc(sizeof(RocdecSeiMessage) * sei_num_mesages); + if (!curr_sei_message_ptr_->pSEIMessage) { + free(curr_sei_message_ptr_->pSEIData); + curr_sei_message_ptr_->pSEIData = NULL; + return 0; + } + memcpy(curr_sei_message_ptr_->pSEIMessage, pSEIMessageInfo->pSEIMessage, sizeof(RocdecSeiMessage) * sei_num_mesages); + curr_sei_message_ptr_->sei_message_count = pSEIMessageInfo->sei_message_count; + sei_message_display_q_[pSEIMessageInfo->picIdx] = *curr_sei_message_ptr_; } - for (uint32_t i = 0; i < sei_num_mesages; i++) { - total_SEI_buff_size += p_sei_msg_info[i].sei_message_size; - } - if (!curr_sei_message_ptr_) { - ERR("Out of Memory, Allocation failed for m_pCurrSEIMessage"); - return 0; - } - curr_sei_message_ptr_->pSEIData = malloc(total_SEI_buff_size); - if (!curr_sei_message_ptr_->pSEIData) { - ERR("Out of Memory, Allocation failed for SEI Buffer"); - return 0; - } - memcpy(curr_sei_message_ptr_->pSEIData, pSEIMessageInfo->pSEIData, total_SEI_buff_size); - curr_sei_message_ptr_->pSEIMessage = (RocdecSeiMessage *)malloc(sizeof(RocdecSeiMessage) * sei_num_mesages); - if (!curr_sei_message_ptr_->pSEIMessage) { - free(curr_sei_message_ptr_->pSEIData); - curr_sei_message_ptr_->pSEIData = NULL; - return 0; - } - memcpy(curr_sei_message_ptr_->pSEIMessage, pSEIMessageInfo->pSEIMessage, sizeof(RocdecSeiMessage) * sei_num_mesages); - curr_sei_message_ptr_->sei_message_count = pSEIMessageInfo->sei_message_count; - sei_message_display_q_[pSEIMessageInfo->picIdx] = *curr_sei_message_ptr_; return 1; }