Commit f8ad2ddd authored by OvchinnikovDmitrii's avatar OvchinnikovDmitrii Committed by Philip Langdale

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.
parent b319feb0
......@@ -6,6 +6,7 @@ version <next>:
- Intel QSV-accelerated MJPEG decoding
- Intel QSV-accelerated VP9 decoding
- support for TrueHD in mp4
- Supoort AMD AMF encoder on Linux (via Vulkan)
version 4.2:
......
......@@ -27,16 +27,26 @@ enable it.
@section AMD AMF/VCE
FFmpeg can use the AMD Advanced Media Framework library under Windows
for accelerated H.264 and HEVC encoding on hardware with Video Coding Engine (VCE).
FFmpeg can use the AMD Advanced Media Framework library
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}.
Create an @code{AMF/} directory in the system include path.
Copy the contents of @code{AMF/amf/public/include/} into that directory.
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
FFmpeg can read AviSynth scripts as input. To enable support, pass
......
......@@ -213,6 +213,7 @@ static int amf_init_from_dxva2_device(AVCodecContext *avctx, AVDXVA2DeviceContex
static int amf_init_context(AVCodecContext *avctx)
{
AmfContext *ctx = avctx->priv_data;
AMFContext1 *context1 = NULL;
AMF_RESULT res;
av_unused int ret;
......@@ -311,8 +312,20 @@ static int amf_init_context(AVCodecContext *avctx)
if (res == AMF_OK) {
av_log(avctx, AV_LOG_VERBOSE, "AMF initialisation succeeded via D3D9.\n");
} else {
av_log(avctx, AV_LOG_ERROR, "AMF initialisation failed via D3D9: error %d.\n", res);
return AVERROR(ENOSYS);
AMFGuid guid = IID_AMFContext1();
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");
}
}
}
......
......@@ -29,7 +29,7 @@
#define LIBAVCODEC_VERSION_MAJOR 58
#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, \
LIBAVCODEC_VERSION_MINOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment