Add support for creating a vaapi context and surfaces for decoding (#41)

Этот коммит содержится в:
Aryan Salmanpour
2023-11-07 13:47:53 -05:00
коммит произвёл GitHub
родитель ba484a91a9
Коммит 2c940dd9d0
2 изменённых файлов: 55 добавлений и 1 удалений
+51 -1
Просмотреть файл
@@ -23,13 +23,16 @@ THE SOFTWARE.
#include "vaapi_videodecoder.h"
VaapiVideoDecoder::VaapiVideoDecoder(RocDecoderCreateInfo &decoder_create_info) : decoder_create_info_{decoder_create_info},
drm_fd_{-1}, va_display_{0}, va_config_attrib_{{}}, va_config_id_{0}, va_profile_ {VAProfileNone} {};
drm_fd_{-1}, va_display_{0}, va_config_attrib_{{}}, va_config_id_{0}, va_profile_ {VAProfileNone}, va_context_id_{0}, va_surface_ids_{{}} {};
VaapiVideoDecoder::~VaapiVideoDecoder() {
if (drm_fd_ != -1) {
close(drm_fd_);
}
if (va_display_) {
vaDestroySurfaces(va_display_, va_surface_ids_.data(), va_surface_ids_.size());
if (va_context_id_)
vaDestroyContext(va_display_, va_context_id_);
if (va_config_id_)
vaDestroyConfig(va_display_, va_config_id_);
vaTerminate(va_display_);
@@ -60,6 +63,16 @@ rocDecStatus VaapiVideoDecoder::InitializeDecoder(std::string gcn_arch_name) {
ERR("ERROR: Failed to create a VAAPI decoder configuration" + TOSTR(rocdec_status));
return rocdec_status;
}
rocdec_status = CreateSurfaces();
if (rocdec_status != ROCDEC_SUCCESS) {
ERR("ERROR: Failed to create VAAPI surfaces " + TOSTR(rocdec_status));
return rocdec_status;
}
rocdec_status = CreateContext();
if (rocdec_status != ROCDEC_SUCCESS) {
ERR("ERROR: Failed to create a VAAPI context " + TOSTR(rocdec_status));
return rocdec_status;
}
return rocdec_status;
}
@@ -98,6 +111,43 @@ rocDecStatus VaapiVideoDecoder::CreateDecoderConfig() {
return ROCDEC_SUCCESS;
}
rocDecStatus VaapiVideoDecoder::CreateSurfaces() {
if (decoder_create_info_.ulNumDecodeSurfaces < 1) {
ERR("ERROR: invalid number of decode surfaces ");
return ROCDEC_INVALID_PARAMETER;
}
va_surface_ids_.resize(decoder_create_info_.ulNumDecodeSurfaces);
uint8_t surface_format;
switch (decoder_create_info_.ChromaFormat) {
case rocDecVideoChromaFormat_Monochrome:
surface_format = VA_RT_FORMAT_YUV400;
break;
case rocDecVideoChromaFormat_420:
surface_format = VA_RT_FORMAT_YUV420;
break;
case rocDecVideoChromaFormat_422:
surface_format = VA_RT_FORMAT_YUV422;
break;
case rocDecVideoChromaFormat_444:
surface_format = VA_RT_FORMAT_YUV444;
break;
default:
ERR("ERROR: the surface type is not supported!");
return ROCDEC_NOT_SUPPORTED;
}
CHECK_VAAPI(vaCreateSurfaces(va_display_, surface_format, decoder_create_info_.ulWidth,
decoder_create_info_.ulHeight, va_surface_ids_.data(), va_surface_ids_.size(), nullptr, 0));
return ROCDEC_SUCCESS;
}
rocDecStatus VaapiVideoDecoder::CreateContext() {
CHECK_VAAPI(vaCreateContext(va_display_, va_config_id_, decoder_create_info_.ulWidth, decoder_create_info_.ulHeight,
VA_PROGRESSIVE, va_surface_ids_.data(), va_surface_ids_.size(), &va_context_id_));
return ROCDEC_SUCCESS;
}
rocDecStatus VaapiVideoDecoder::SubmitDecode(RocdecPicParams *pPicParams) {
// Todo copy pic param, slice param, IQ matrix and slice data from RocdecPicParams to VAAPI struct buffers, then submit to VAAPI driver.
return ROCDEC_SUCCESS;