Signed-off-by: Anton Khirnov <anton@khirnov.net>tags/n3.1
| @@ -840,6 +840,8 @@ static int nvenc_setup_surfaces(AVCodecContext *avctx) | |||||
| ctx->nb_surfaces = FFMAX(4 + avctx->max_b_frames, | ctx->nb_surfaces = FFMAX(4 + avctx->max_b_frames, | ||||
| ctx->nb_surfaces); | ctx->nb_surfaces); | ||||
| ctx->async_depth = FFMIN(ctx->async_depth, ctx->nb_surfaces - 1); | |||||
| ctx->frames = av_mallocz_array(ctx->nb_surfaces, sizeof(*ctx->frames)); | ctx->frames = av_mallocz_array(ctx->nb_surfaces, sizeof(*ctx->frames)); | ||||
| if (!ctx->frames) | if (!ctx->frames) | ||||
| @@ -1301,13 +1303,19 @@ FF_ENABLE_DEPRECATION_WARNINGS | |||||
| static int output_ready(AVCodecContext *avctx, int flush) | static int output_ready(AVCodecContext *avctx, int flush) | ||||
| { | { | ||||
| NVENCContext *ctx = avctx->priv_data; | NVENCContext *ctx = avctx->priv_data; | ||||
| int nb_ready, nb_pending; | |||||
| /* when B-frames are enabled, we wait for two initial timestamps to | /* when B-frames are enabled, we wait for two initial timestamps to | ||||
| * calculate the first dts */ | * calculate the first dts */ | ||||
| if (!flush && avctx->max_b_frames > 0 && | if (!flush && avctx->max_b_frames > 0 && | ||||
| (ctx->initial_pts[0] == AV_NOPTS_VALUE || ctx->initial_pts[1] == AV_NOPTS_VALUE)) | (ctx->initial_pts[0] == AV_NOPTS_VALUE || ctx->initial_pts[1] == AV_NOPTS_VALUE)) | ||||
| return 0; | return 0; | ||||
| return av_fifo_size(ctx->ready) > 0; | |||||
| nb_ready = av_fifo_size(ctx->ready) / sizeof(NVENCFrame*); | |||||
| nb_pending = av_fifo_size(ctx->pending) / sizeof(NVENCFrame*); | |||||
| if (flush) | |||||
| return nb_ready > 0; | |||||
| return (nb_ready > 0) && (nb_ready + nb_pending >= ctx->async_depth); | |||||
| } | } | ||||
| int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt, | int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt, | ||||
| @@ -142,6 +142,7 @@ typedef struct NVENCContext { | |||||
| int rc; | int rc; | ||||
| int device; | int device; | ||||
| int flags; | int flags; | ||||
| int async_depth; | |||||
| } NVENCContext; | } NVENCContext; | ||||
| int ff_nvenc_encode_init(AVCodecContext *avctx); | int ff_nvenc_encode_init(AVCodecContext *avctx); | ||||
| @@ -72,6 +72,8 @@ static const AVOption options[] = { | |||||
| { "device", "Select a specific NVENC device", OFFSET(device), AV_OPT_TYPE_INT, { .i64 = -1 }, -2, INT_MAX, VE, "device" }, | { "device", "Select a specific NVENC device", OFFSET(device), AV_OPT_TYPE_INT, { .i64 = -1 }, -2, INT_MAX, VE, "device" }, | ||||
| { "any", "Pick the first device available", 0, AV_OPT_TYPE_CONST, { .i64 = ANY_DEVICE }, 0, 0, VE, "device" }, | { "any", "Pick the first device available", 0, AV_OPT_TYPE_CONST, { .i64 = ANY_DEVICE }, 0, 0, VE, "device" }, | ||||
| { "list", "List the available devices", 0, AV_OPT_TYPE_CONST, { .i64 = LIST_DEVICES }, 0, 0, VE, "device" }, | { "list", "List the available devices", 0, AV_OPT_TYPE_CONST, { .i64 = LIST_DEVICES }, 0, 0, VE, "device" }, | ||||
| { "async_depth", "Delay frame output by the given amount of frames", OFFSET(async_depth), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 0, INT_MAX, VE }, | |||||
| { "delay", "Delay frame output by the given amount of frames", OFFSET(async_depth), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 0, INT_MAX, VE }, | |||||
| { NULL } | { NULL } | ||||
| }; | }; | ||||
| @@ -68,6 +68,8 @@ static const AVOption options[] = { | |||||
| { "device", "Select a specific NVENC device", OFFSET(device), AV_OPT_TYPE_INT, { .i64 = -1 }, -2, INT_MAX, VE, "device" }, | { "device", "Select a specific NVENC device", OFFSET(device), AV_OPT_TYPE_INT, { .i64 = -1 }, -2, INT_MAX, VE, "device" }, | ||||
| { "any", "Pick the first device available", 0, AV_OPT_TYPE_CONST, { .i64 = ANY_DEVICE }, 0, 0, VE, "device" }, | { "any", "Pick the first device available", 0, AV_OPT_TYPE_CONST, { .i64 = ANY_DEVICE }, 0, 0, VE, "device" }, | ||||
| { "list", "List the available devices", 0, AV_OPT_TYPE_CONST, { .i64 = LIST_DEVICES }, 0, 0, VE, "device" }, | { "list", "List the available devices", 0, AV_OPT_TYPE_CONST, { .i64 = LIST_DEVICES }, 0, 0, VE, "device" }, | ||||
| { "async_depth", "Delay frame output by the given amount of frames", OFFSET(async_depth), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 0, INT_MAX, VE }, | |||||
| { "delay", "Delay frame output by the given amount of frames", OFFSET(async_depth), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 0, INT_MAX, VE }, | |||||
| { NULL } | { NULL } | ||||
| }; | }; | ||||