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:
parent
b319feb05f
commit
f8ad2ddd7a
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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, \
|
||||||
|
Loading…
Reference in New Issue
Block a user