1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

libavcodec/amfenc: Vulkan initialization support for encoder.

Added linux support for amf encoder through vulkan.

To use h.264(AMD VCE) encoder on linux amdgru-pro version 19.20+ and
amf-amdgpu-pro package(amdgru-pro contains, but does not install
automatically) are required.

This driver can be installed using amdgpu-pro-install script in
official amd driver archive.

Initialization of amf encoder occurs in this order:
1) trying to initialize through dx11(only windows)
2) trying to initialize through dx9(only windows)
3) trying to initialize through vulkan

Only Vulkan initialization available on linux.
This commit is contained in:
OvchinnikovDmitrii 2019-08-08 21:33:25 +03:00 committed by Philip Langdale
parent b319feb05f
commit f8ad2ddd7a
4 changed files with 30 additions and 6 deletions

View File

@ -6,6 +6,7 @@ version <next>:
- Intel QSV-accelerated MJPEG decoding - Intel QSV-accelerated MJPEG decoding
- Intel QSV-accelerated VP9 decoding - Intel QSV-accelerated VP9 decoding
- support for TrueHD in mp4 - support for TrueHD in mp4
- Supoort AMD AMF encoder on Linux (via Vulkan)
version 4.2: version 4.2:

View File

@ -27,16 +27,26 @@ enable it.
@section AMD AMF/VCE @section AMD AMF/VCE
FFmpeg can use the AMD Advanced Media Framework library under Windows FFmpeg can use the AMD Advanced Media Framework library
for accelerated H.264 and HEVC encoding on hardware with Video Coding Engine (VCE). for accelerated H.264 and HEVC(only windows) encoding on hardware with Video Coding Engine (VCE).
To enable support you must obtain the AMF framework header files from To enable support you must obtain the AMF framework header files(version 1.4.9+) from
@url{https://github.com/GPUOpen-LibrariesAndSDKs/AMF.git}. @url{https://github.com/GPUOpen-LibrariesAndSDKs/AMF.git}.
Create an @code{AMF/} directory in the system include path. Create an @code{AMF/} directory in the system include path.
Copy the contents of @code{AMF/amf/public/include/} into that directory. Copy the contents of @code{AMF/amf/public/include/} into that directory.
Then configure FFmpeg with @code{--enable-amf}. Then configure FFmpeg with @code{--enable-amf}.
Initialization of amf encoder occurs in this order:
1) trying to initialize through dx11(only windows)
2) trying to initialize through dx9(only windows)
3) trying to initialize through vulkan
To use h.264(AMD VCE) encoder on linux amdgru-pro version 19.20+ and amf-amdgpu-pro
package(amdgru-pro contains, but does not install automatically) are required.
This driver can be installed using amdgpu-pro-install script in official amd driver archive.
@section AviSynth @section AviSynth
FFmpeg can read AviSynth scripts as input. To enable support, pass FFmpeg can read AviSynth scripts as input. To enable support, pass

View File

@ -213,6 +213,7 @@ static int amf_init_from_dxva2_device(AVCodecContext *avctx, AVDXVA2DeviceContex
static int amf_init_context(AVCodecContext *avctx) static int amf_init_context(AVCodecContext *avctx)
{ {
AmfContext *ctx = avctx->priv_data; AmfContext *ctx = avctx->priv_data;
AMFContext1 *context1 = NULL;
AMF_RESULT res; AMF_RESULT res;
av_unused int ret; av_unused int ret;
@ -311,8 +312,20 @@ static int amf_init_context(AVCodecContext *avctx)
if (res == AMF_OK) { if (res == AMF_OK) {
av_log(avctx, AV_LOG_VERBOSE, "AMF initialisation succeeded via D3D9.\n"); av_log(avctx, AV_LOG_VERBOSE, "AMF initialisation succeeded via D3D9.\n");
} else { } else {
av_log(avctx, AV_LOG_ERROR, "AMF initialisation failed via D3D9: error %d.\n", res); AMFGuid guid = IID_AMFContext1();
return AVERROR(ENOSYS); res = ctx->context->pVtbl->QueryInterface(ctx->context, &guid, (void**)&context1);
AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_UNKNOWN, "CreateContext1() failed with error %d\n", res);
res = context1->pVtbl->InitVulkan(context1, NULL);
context1->pVtbl->Release(context1);
if (res != AMF_OK) {
if (res == AMF_NOT_SUPPORTED)
av_log(avctx, AV_LOG_ERROR, "AMF via Vulkan is not supported on the given device.\n");
else
av_log(avctx, AV_LOG_ERROR, "AMF failed to initialise on the given Vulkan device: %d.\n", res);
return AVERROR(ENOSYS);
}
av_log(avctx, AV_LOG_VERBOSE, "AMF initialisation succeeded via Vulkan.\n");
} }
} }
} }

View File

@ -29,7 +29,7 @@
#define LIBAVCODEC_VERSION_MAJOR 58 #define LIBAVCODEC_VERSION_MAJOR 58
#define LIBAVCODEC_VERSION_MINOR 55 #define LIBAVCODEC_VERSION_MINOR 55
#define LIBAVCODEC_VERSION_MICRO 101 #define LIBAVCODEC_VERSION_MICRO 102
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \ LIBAVCODEC_VERSION_MINOR, \