[FFmpeg-devel] [PATCH v2] libavcodec/amfenc: Vulkan initialization support for encoder.
Philip Langdale
philipl at overt.org
Tue Aug 27 20:08:43 EEST 2019
On 2019-08-08 11:33, OvchinnikovDmitrii wrote:
>
> diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c
> index 384d8efc92..f66b95645e 100644
> --- a/libavcodec/amfenc.c
> +++ b/libavcodec/amfenc.c
> @@ -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");
> }
> }
> }
It's fully contained in the decoder, so it's fine, and strictly better
than before. However, keep in mind that if we ever follow through on
adding a Vulkan hwcontext, this would need to be handled in a different
way - but we'll deal with that when we get there.
I'll push it when I get a chance later today.
--phil
More information about the ffmpeg-devel
mailing list