Commit 23ed147e authored by Timo Rothenpieler's avatar Timo Rothenpieler

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.
parent d6489ddb
...@@ -1560,12 +1560,15 @@ static int nvenc_find_free_reg_resource(AVCodecContext *avctx) ...@@ -1560,12 +1560,15 @@ static int nvenc_find_free_reg_resource(AVCodecContext *avctx)
NV_ENCODE_API_FUNCTION_LIST *p_nvenc = &dl_fn->nvenc_funcs; NV_ENCODE_API_FUNCTION_LIST *p_nvenc = &dl_fn->nvenc_funcs;
NVENCSTATUS nv_status; NVENCSTATUS nv_status;
int i; int i, first_round;
if (ctx->nb_registered_frames == FF_ARRAY_ELEMS(ctx->registered_frames)) { 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++) { for (i = 0; i < ctx->nb_registered_frames; i++) {
if (!ctx->registered_frames[i].mapped) { if (!ctx->registered_frames[i].mapped) {
if (ctx->registered_frames[i].regptr) { if (ctx->registered_frames[i].regptr) {
if (first_round)
continue;
nv_status = p_nvenc->nvEncUnregisterResource(ctx->nvencoder, ctx->registered_frames[i].regptr); nv_status = p_nvenc->nvEncUnregisterResource(ctx->nvencoder, ctx->registered_frames[i].regptr);
if (nv_status != NV_ENC_SUCCESS) if (nv_status != NV_ENC_SUCCESS)
return nvenc_print_error(avctx, nv_status, "Failed unregistering unused input resource"); 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) ...@@ -1575,6 +1578,7 @@ static int nvenc_find_free_reg_resource(AVCodecContext *avctx)
return i; return i;
} }
} }
}
} else { } else {
return ctx->nb_registered_frames++; return ctx->nb_registered_frames++;
} }
...@@ -1846,13 +1850,6 @@ static int process_output_surface(AVCodecContext *avctx, AVPacket *pkt, NvencSur ...@@ -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"); res = nvenc_print_error(avctx, nv_status, "Failed unmapping input resource");
goto error; 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) { } else if (ctx->registered_frames[tmpoutsurf->reg_idx].mapped < 0) {
res = AVERROR_BUG; res = AVERROR_BUG;
goto error; goto error;
......
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