Add support for rocDecMapVideoFrame API (#53)
Cette révision appartient à :
@@ -23,7 +23,7 @@ THE SOFTWARE.
|
||||
#include "../commons.h"
|
||||
#include "roc_decoder.h"
|
||||
|
||||
RocDecoder::RocDecoder(RocDecoderCreateInfo& decoder_create_info): va_video_decoder_{decoder_create_info}, device_id_{decoder_create_info.deviceid} {}
|
||||
RocDecoder::RocDecoder(RocDecoderCreateInfo& decoder_create_info): va_video_decoder_{decoder_create_info}, decoder_create_info_{decoder_create_info} {}
|
||||
|
||||
RocDecoder::~RocDecoder() {
|
||||
// todo::
|
||||
@@ -38,11 +38,16 @@ RocDecoder::RocDecoder(RocDecoderCreateInfo& decoder_create_info): va_video_deco
|
||||
|
||||
rocDecStatus RocDecoder::InitializeDecoder() {
|
||||
rocDecStatus rocdec_status = ROCDEC_SUCCESS;
|
||||
rocdec_status = InitHIP(device_id_);
|
||||
rocdec_status = InitHIP(decoder_create_info_.deviceid);
|
||||
if (rocdec_status != ROCDEC_SUCCESS) {
|
||||
ERR("ERROR: Failed to initilize the HIP!" + TOSTR(rocdec_status));
|
||||
return rocdec_status;
|
||||
}
|
||||
if (decoder_create_info_.ulNumDecodeSurfaces < 1) {
|
||||
ERR("ERROR: invalid number of decode surfaces ");
|
||||
return ROCDEC_INVALID_PARAMETER;
|
||||
}
|
||||
hip_ext_mem_.resize(decoder_create_info_.ulNumDecodeSurfaces);
|
||||
|
||||
rocdec_status = va_video_decoder_.InitializeDecoder(hip_dev_prop_.gcnArchName);
|
||||
if (rocdec_status != ROCDEC_SUCCESS) {
|
||||
@@ -80,12 +85,38 @@ rocDecStatus RocDecoder::reconfigureDecoder(RocdecReconfigureDecoderInfo *pDecRe
|
||||
return ROCDEC_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
rocDecStatus RocDecoder::mapVideoFrame(int nPicIdx, void *pDevMemPtr[3],
|
||||
unsigned int pHorizontalPitch[3], RocdecProcParams *pVidPostprocParams) {
|
||||
// todo:: return appropriate decStatus
|
||||
// Post-process and map video frame corresponding to nPicIdx for use in HIP. Returns HIP device pointer and associated
|
||||
// pitch(horizontal stride) of the video frame. Returns device memory pointers for each plane (Y, U and V) seperately
|
||||
return ROCDEC_NOT_IMPLEMENTED;
|
||||
rocDecStatus RocDecoder::mapVideoFrame(int pic_idx, void *dev_mem_ptr[3],
|
||||
unsigned int horizontal_pitch[3], RocdecProcParams *vid_postproc_params) {
|
||||
if (pic_idx >= hip_ext_mem_.size() || &dev_mem_ptr[0] == nullptr || vid_postproc_params == nullptr) {
|
||||
return ROCDEC_INVALID_PARAMETER;
|
||||
}
|
||||
rocDecStatus rocdec_status = ROCDEC_SUCCESS;
|
||||
hipExternalMemoryHandleDesc external_mem_handle_desc_ = {};
|
||||
hipExternalMemoryBufferDesc external_mem_buffer_desc_ = {};
|
||||
VADRMPRIMESurfaceDescriptor va_drm_prime_surface_desc = {};
|
||||
|
||||
rocdec_status = va_video_decoder_.ExportSurface(pic_idx, va_drm_prime_surface_desc);
|
||||
if (rocdec_status != ROCDEC_SUCCESS) {
|
||||
ERR("ERROR: Failed to export surface for picture id" + TOSTR(pic_idx) + TOSTR(rocdec_status));
|
||||
}
|
||||
|
||||
external_mem_handle_desc_.type = hipExternalMemoryHandleTypeOpaqueFd;
|
||||
external_mem_handle_desc_.handle.fd = va_drm_prime_surface_desc.objects[0].fd;
|
||||
external_mem_handle_desc_.size = va_drm_prime_surface_desc.objects[0].size;
|
||||
CHECK_HIP(hipImportExternalMemory(&hip_ext_mem_[pic_idx], &external_mem_handle_desc_));
|
||||
|
||||
external_mem_buffer_desc_.size = va_drm_prime_surface_desc.objects[0].size;
|
||||
CHECK_HIP(hipExternalMemoryGetMappedBuffer(&*&dev_mem_ptr[0], hip_ext_mem_[pic_idx], &external_mem_buffer_desc_));
|
||||
horizontal_pitch[0] = va_drm_prime_surface_desc.layers[0].pitch[0];
|
||||
if (va_drm_prime_surface_desc.num_layers == 2) {
|
||||
*&dev_mem_ptr[1] = static_cast<uint8_t*>(*&dev_mem_ptr[0]) + va_drm_prime_surface_desc.layers[1].offset[0];
|
||||
horizontal_pitch[1] = va_drm_prime_surface_desc.layers[1].pitch[0];
|
||||
} else if (va_drm_prime_surface_desc.num_layers == 3) {
|
||||
*&dev_mem_ptr[2] = static_cast<uint8_t*>(*&dev_mem_ptr[0]) + va_drm_prime_surface_desc.layers[2].offset[0];
|
||||
horizontal_pitch[2] = va_drm_prime_surface_desc.layers[2].pitch[0];
|
||||
}
|
||||
|
||||
return rocdec_status;
|
||||
}
|
||||
|
||||
rocDecStatus RocDecoder::unMapVideoFrame(void *pMappedDevPtr) {
|
||||
|
||||
Référencer dans un nouveau ticket
Bloquer un utilisateur