From 23ed147e8fc2b6b51a88af66b40f99049e5fa0d8 Mon Sep 17 00:00:00 2001 From: Timo Rothenpieler Date: Wed, 24 Apr 2019 19:00:25 +0200 Subject: avcodec/nvenc: only unregister input resources when absolutely needed This reverts nvenc to old behaviour, which in some super rare edge cases performs better. The implication of this is that any potential API user who relies on nvenc cleaning up every frames device resources after it's done using them will have to change their usage pattern. That should not be a problem, since pretty much every normal usage pattern automatically implies that surfaces are reused from a common pool, since constant re-allocation is also very expensive. --- libavcodec/nvenc.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'libavcodec/nvenc.c') diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index d3413b3fd7..626662f02c 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -1560,12 +1560,15 @@ static int nvenc_find_free_reg_resource(AVCodecContext *avctx) NV_ENCODE_API_FUNCTION_LIST *p_nvenc = &dl_fn->nvenc_funcs; NVENCSTATUS nv_status; - int i; + int i, first_round; if (ctx->nb_registered_frames == FF_ARRAY_ELEMS(ctx->registered_frames)) { + for (first_round = 1; first_round >= 0; first_round--) { for (i = 0; i < ctx->nb_registered_frames; i++) { if (!ctx->registered_frames[i].mapped) { if (ctx->registered_frames[i].regptr) { + if (first_round) + continue; nv_status = p_nvenc->nvEncUnregisterResource(ctx->nvencoder, ctx->registered_frames[i].regptr); if (nv_status != NV_ENC_SUCCESS) return nvenc_print_error(avctx, nv_status, "Failed unregistering unused input resource"); @@ -1575,6 +1578,7 @@ static int nvenc_find_free_reg_resource(AVCodecContext *avctx) return i; } } + } } else { return ctx->nb_registered_frames++; } @@ -1846,13 +1850,6 @@ static int process_output_surface(AVCodecContext *avctx, AVPacket *pkt, NvencSur res = nvenc_print_error(avctx, nv_status, "Failed unmapping input resource"); goto error; } - nv_status = p_nvenc->nvEncUnregisterResource(ctx->nvencoder, ctx->registered_frames[tmpoutsurf->reg_idx].regptr); - if (nv_status != NV_ENC_SUCCESS) { - res = nvenc_print_error(avctx, nv_status, "Failed unregistering input resource"); - goto error; - } - ctx->registered_frames[tmpoutsurf->reg_idx].ptr = NULL; - ctx->registered_frames[tmpoutsurf->reg_idx].regptr = NULL; } else if (ctx->registered_frames[tmpoutsurf->reg_idx].mapped < 0) { res = AVERROR_BUG; goto error; -- cgit v1.2.3