|
|
|
@@ -77,6 +77,21 @@ int ff_qsv_error(int mfx_err) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @brief Initialize a MSDK session |
|
|
|
* |
|
|
|
* Media SDK is based on sessions, so this is the prerequisite |
|
|
|
* initialization for HW acceleration. For Windows the session is |
|
|
|
* complete and ready to use, for Linux a display handle is |
|
|
|
* required. For releases of Media Server Studio >= 2015 R4 the |
|
|
|
* render nodes interface is preferred (/dev/dri/renderD). |
|
|
|
* Using Media Server Studio 2015 R4 or newer is recommended |
|
|
|
* but the older /dev/dri/card interface is also searched |
|
|
|
* for broader compatibility. |
|
|
|
* |
|
|
|
* @param avctx ffmpeg metadata for this codec context |
|
|
|
* @param session the MSDK session used |
|
|
|
*/ |
|
|
|
int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session) |
|
|
|
{ |
|
|
|
mfxIMPL impl = MFX_IMPL_AUTO_ANY; |
|
|
|
@@ -91,6 +106,61 @@ int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session) |
|
|
|
return ff_qsv_error(ret); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// this code is only required for Linux. It searches for a valid |
|
|
|
// display handle. First in /dev/dri/renderD then in /dev/dri/card |
|
|
|
#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE |
|
|
|
// VAAPI display handle |
|
|
|
VADisplay va_dpy = NULL; |
|
|
|
VAStatus va_res = VA_STATUS_SUCCESS; |
|
|
|
int major_version = 0, minor_version = 0; |
|
|
|
int fd = -1; |
|
|
|
char adapterpath[256]; |
|
|
|
int adapter_num; |
|
|
|
|
|
|
|
//search for valid graphics device |
|
|
|
for (adapter_num = 0;adapter_num < 6;adapter_num++) { |
|
|
|
|
|
|
|
if (adapter_num<3) { |
|
|
|
snprintf(adapterpath,sizeof(adapterpath), |
|
|
|
"/dev/dri/renderD%d", adapter_num+128); |
|
|
|
} else { |
|
|
|
snprintf(adapterpath,sizeof(adapterpath), |
|
|
|
"/dev/dri/card%d", adapter_num-3); |
|
|
|
} |
|
|
|
|
|
|
|
fd = open(adapterpath, O_RDWR); |
|
|
|
if (fd < 0) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
"mfx init: %s fd open failed\n", adapterpath); |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
va_dpy = vaGetDisplayDRM(fd); |
|
|
|
if (!va_dpy) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
"mfx init: %s vaGetDisplayDRM failed\n", adapterpath); |
|
|
|
close(fd); |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
va_res = vaInitialize(va_dpy, &major_version, &minor_version); |
|
|
|
if (VA_STATUS_SUCCESS != va_res) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
"mfx init: %s vaInitialize failed\n", adapterpath); |
|
|
|
close(fd); |
|
|
|
fd = -1; |
|
|
|
continue; |
|
|
|
} else { |
|
|
|
av_log(avctx, AV_LOG_VERBOSE, |
|
|
|
"mfx initialization: %s vaInitialize successful\n",adapterpath); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
MFXVideoCORE_SetHandle((*session), (mfxHandleType)MFX_HANDLE_VA_DISPLAY, (mfxHDL)va_dpy); |
|
|
|
|
|
|
|
#endif //AVCODEC_QSV_LINUX_SESSION_HANDLE |
|
|
|
|
|
|
|
MFXQueryIMPL(*session, &impl); |
|
|
|
|
|
|
|
switch (MFX_IMPL_BASETYPE(impl)) { |
|
|
|
|