mirror of https://git.ffmpeg.org/ffmpeg.git
nvenc: Delay frame output to increase encoding speed
Signed-off-by: Anton Khirnov <anton@khirnov.net>
This commit is contained in:
parent
9427d92f40
commit
a1e215ea01
|
@ -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 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue