diff --git a/api/rocdecode.h b/api/rocdecode.h index 04ebf9f730..7df209f1f7 100644 --- a/api/rocdecode.h +++ b/api/rocdecode.h @@ -878,10 +878,10 @@ extern rocDecStatus ROCDECAPI rocDecMapVideoFrame(rocDecDecoderHandle hDecoder, RocdecProcParams *pVidPostprocParams); /*****************************************************************************************************/ -//! \fn rocDecStatus ROCDECAPI rocDecUnMapVideoFrame(rocDecDecoderHandle hDecoder, void *pMappedDevPtr) -//! Unmap a previously mapped video frame with the associated mapped raw pointer (pMappedDevPtr) +//! \fn rocDecStatus ROCDECAPI rocDecUnMapVideoFrame(rocDecDecoderHandle hDecoder, int nPicIdx) +//! Unmap a previously mapped video frame with the associated nPicIdx /*****************************************************************************************************/ -extern rocDecStatus ROCDECAPI rocDecUnMapVideoFrame(rocDecDecoderHandle hDecoder, void *pMappedDevPtr); +extern rocDecStatus ROCDECAPI rocDecUnMapVideoFrame(rocDecDecoderHandle hDecoder, int nPicIdx); #ifdef __cplusplus } diff --git a/src/rocdecode/roc_decoder.cpp b/src/rocdecode/roc_decoder.cpp index 0793c25f27..608d8ec295 100644 --- a/src/rocdecode/roc_decoder.cpp +++ b/src/rocdecode/roc_decoder.cpp @@ -123,10 +123,14 @@ rocDecStatus RocDecoder::mapVideoFrame(int pic_idx, void *dev_mem_ptr[3], return rocdec_status; } -rocDecStatus RocDecoder::unMapVideoFrame(void *pMappedDevPtr) { - // todo:: return appropriate decStatus - // Unmap a previously mapped video frame with the associated mapped raw pointer (pMappedDevPtr) - return ROCDEC_NOT_IMPLEMENTED; +rocDecStatus RocDecoder::unMapVideoFrame(int pic_idx) { + if (pic_idx >= hip_ext_mem_.size()) { + return ROCDEC_INVALID_PARAMETER; + } + + CHECK_HIP(hipDestroyExternalMemory(hip_ext_mem_[pic_idx])); + + return ROCDEC_SUCCESS; } diff --git a/src/rocdecode/roc_decoder.h b/src/rocdecode/roc_decoder.h index 6066cf8bd2..5d6a226b63 100644 --- a/src/rocdecode/roc_decoder.h +++ b/src/rocdecode/roc_decoder.h @@ -51,7 +51,7 @@ public: rocDecStatus getDecodeStatus(int nPicIdx, RocdecDecodeStatus* pDecodeStatus); rocDecStatus reconfigureDecoder(RocdecReconfigureDecoderInfo *pDecReconfigParams); rocDecStatus mapVideoFrame(int pic_idx, void *dev_mem_ptr[3], unsigned int horizontal_pitch[3], RocdecProcParams *vid_postproc_params); - rocDecStatus unMapVideoFrame(void *pMappedDevPtr); + rocDecStatus unMapVideoFrame(int pic_idx); private: rocDecStatus InitHIP(int device_id); diff --git a/src/rocdecode/rocdecode_api.cpp b/src/rocdecode/rocdecode_api.cpp index 3e87275788..0c5c809d29 100644 --- a/src/rocdecode/rocdecode_api.cpp +++ b/src/rocdecode/rocdecode_api.cpp @@ -180,15 +180,15 @@ rocDecMapVideoFrame(rocDecDecoderHandle hDecoder, int nPicIdx, } /*****************************************************************************************************/ -//! \fn rocDecStatus ROCDECAPI rocDecUnMapVideoFrame(rocDecDecoderHandle hDecoder, void *pMappedDevPtr) -//! Unmap a previously mapped video frame with the associated mapped raw pointer (pMappedDevPtr) +//! \fn rocDecStatus ROCDECAPI rocDecUnMapVideoFrame(rocDecDecoderHandle hDecoder, int nPicIdx) +//! Unmap a previously mapped video frame with the associated nPicIdx /*****************************************************************************************************/ rocDecStatus ROCDECAPI -rocDecUnMapVideoFrame(rocDecDecoderHandle hDecoder, void *pMappedDevPtr) { +rocDecUnMapVideoFrame(rocDecDecoderHandle hDecoder, int pic_idx) { auto handle = static_cast (hDecoder); rocDecStatus ret; try { - ret = handle->roc_decoder->unMapVideoFrame(pMappedDevPtr); + ret = handle->roc_decoder->unMapVideoFrame(pic_idx); } catch(const std::exception& e) { handle->capture_error(e.what()); diff --git a/utils/rocvideodecode/roc_video_dec.cpp b/utils/rocvideodecode/roc_video_dec.cpp index 32b467c100..8dc600ed48 100644 --- a/utils/rocvideodecode/roc_video_dec.cpp +++ b/utils/rocvideodecode/roc_video_dec.cpp @@ -471,7 +471,6 @@ int RocVideoDecoder::HandlePictureDisplay(RocdecParserDispInfo *pDispInfo) { void * src_dev_ptr[3] = { 0 }; uint32_t src_pitch[3] = { 0 }; ROCDEC_API_CALL(rocDecMapVideoFrame(roc_decoder_, pDispInfo->picture_index, src_dev_ptr, src_pitch, &video_proc_params)); - RocdecDecodeStatus dec_status; memset(&dec_status, 0, sizeof(dec_status)); rocDecStatus result = rocDecGetDecodeStatus(roc_decoder_, pDispInfo->picture_index, &dec_status); @@ -552,7 +551,7 @@ int RocVideoDecoder::HandlePictureDisplay(RocdecParserDispInfo *pDispInfo) { } HIP_API_CALL(hipStreamSynchronize(hip_stream_)); - ROCDEC_API_CALL(rocDecUnMapVideoFrame(roc_decoder_, src_dev_ptr[0])); + ROCDEC_API_CALL(rocDecUnMapVideoFrame(roc_decoder_, pDispInfo->picture_index)); } return 1; @@ -647,7 +646,7 @@ bool RocVideoDecoder::ReleaseFrame(int64_t pTimestamp) { std::cerr << "Decoded Frame is released out of order" << std::endl; return false; } - ROCDEC_API_CALL(rocDecUnMapVideoFrame(roc_decoder_, mapped_frame_ptr)); + ROCDEC_API_CALL(rocDecUnMapVideoFrame(roc_decoder_, fb->picture_index)); // pop decoded frame vp_frames_q_.pop(); }