From 514cb1134014d4604ec4062981e75f6d37fa9660 Mon Sep 17 00:00:00 2001 From: eisneinechse <42617957+eisneinechse@users.noreply.github.com> Date: Sun, 25 Nov 2018 20:28:25 -0800 Subject: [PATCH] When multiple graphics cards are installed the import with hardware acceleration has to have the card number set or the opening of the device will fail. TODO check multiple formats. Right now only the first is checked which is vaapi. --- src/FFmpegReader.cpp | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp index d78b7c8f..231d41c7 100644 --- a/src/FFmpegReader.cpp +++ b/src/FFmpegReader.cpp @@ -300,21 +300,24 @@ void FFmpegReader::Open() dev_hw = getenv( "HW_DE_DEVICE_SET" ); if( dev_hw != NULL) { adapter_num = atoi(dev_hw); - if (adapter_num < 3 && adapter_num >=0) { - #if defined(__linux__) - snprintf(adapter,sizeof(adapter),"/dev/dri/renderD%d", adapter_num+128); - // Maybe 127 is better because the first card would be 1?! - adapter_ptr = adapter; - #elif defined(_WIN32) - adapter_ptr = NULL; - #elif defined(__APPLE__) - adapter_ptr = NULL; - #endif - } - else { - adapter_ptr = NULL; // Just to be sure - } + } else { + adapter_num = 0; } + if (adapter_num < 3 && adapter_num >=0) { + #if defined(__linux__) + snprintf(adapter,sizeof(adapter),"/dev/dri/renderD%d", adapter_num+128); + // Maybe 127 is better because the first card would be 1?! + adapter_ptr = adapter; + #elif defined(_WIN32) + adapter_ptr = NULL; + #elif defined(__APPLE__) + adapter_ptr = NULL; + #endif + } + else { + adapter_ptr = NULL; // Just to be sure + } + //} // Check if it is there and writable #if defined(__linux__) if( adapter_ptr != NULL && access( adapter_ptr, W_OK ) == -1 ) { @@ -329,6 +332,8 @@ void FFmpegReader::Open() } hw_device_ctx = NULL; // Here the first hardware initialisations are made + // TODO: check for each format in an extra call + // Now only vaapi the first in the list is found pCodecCtx->get_format = get_hw_dec_format; if (av_hwdevice_ctx_create(&hw_device_ctx, hw_de_av_device_type, adapter_ptr, NULL, 0) >= 0) { if (!(pCodecCtx->hw_device_ctx = av_buffer_ref(hw_device_ctx))) {