static void nvenc_setup_rate_control(AVCodecContext *avctx)

{

    NVENCContext *ctx    = avctx->priv_data;

    NV_ENC_RC_PARAMS *rc = &ctx->config.rcParams;



    if (avctx->bit_rate > 0)

        rc->averageBitRate = avctx->bit_rate;



    if (avctx->rc_max_rate > 0)

        rc->maxBitRate = avctx->rc_max_rate;



    if (ctx->rc > 0) {

        nvenc_override_rate_control(avctx, rc);

    } else if (ctx->flags & NVENC_LOSSLESS) {

        set_lossless(avctx, rc);

    } else if (avctx->global_quality > 0) {

        set_constqp(avctx, rc);

    } else if (avctx->qmin >= 0 && avctx->qmax >= 0) {

        rc->rateControlMode = NV_ENC_PARAMS_RC_VBR;

        set_vbr(avctx, rc);

    }



    if (avctx->rc_buffer_size > 0)

        rc->vbvBufferSize = avctx->rc_buffer_size;



    if (rc->averageBitRate > 0)

        avctx->bit_rate = rc->averageBitRate;



#if NVENCAPI_MAJOR_VERSION >= 7

    if (ctx->aq) {

        ctx->config.rcParams.enableAQ   = 1;

        ctx->config.rcParams.aqStrength = ctx->aq_strength;

        av_log(avctx, AV_LOG_VERBOSE, "AQ enabled.\n");

    }



    if (ctx->temporal_aq) {

        ctx->config.rcParams.enableTemporalAQ = 1;

        av_log(avctx, AV_LOG_VERBOSE, "Temporal AQ enabled.\n");

    }



    if (ctx->rc_lookahead) {

        int lkd_bound = FFMIN(ctx->nb_surfaces, ctx->async_depth) -

                        ctx->config.frameIntervalP - 4;



        if (lkd_bound < 0) {

            av_log(avctx, AV_LOG_WARNING,

                   "Lookahead not enabled. Increase buffer delay (-delay).\n");

        } else {

            ctx->config.rcParams.enableLookahead = 1;

            ctx->config.rcParams.lookaheadDepth  = av_clip(ctx->rc_lookahead, 0, lkd_bound);

            ctx->config.rcParams.disableIadapt   = ctx->no_scenecut;

            ctx->config.rcParams.disableBadapt   = !ctx->b_adapt;

            av_log(avctx, AV_LOG_VERBOSE,

                   "Lookahead enabled: depth %d, scenecut %s, B-adapt %s.\n",

                   ctx->config.rcParams.lookaheadDepth,

                   ctx->config.rcParams.disableIadapt ? "disabled" : "enabled",

                   ctx->config.rcParams.disableBadapt ? "disabled" : "enabled");

        }

    }



    if (ctx->strict_gop) {

        ctx->config.rcParams.strictGOPTarget = 1;

        av_log(avctx, AV_LOG_VERBOSE, "Strict GOP target enabled.\n");

    }



    if (ctx->nonref_p)

        ctx->config.rcParams.enableNonRefP = 1;



    if (ctx->zerolatency)

        ctx->config.rcParams.zeroReorderDelay = 1;



    if (ctx->quality)

        ctx->config.rcParams.targetQuality = ctx->quality;

#endif /* NVENCAPI_MAJOR_VERSION >= 7 */

}

static void nvenc_setup_rate_control(AVCodecContext *avctx)

{

    NVENCContext *ctx    = avctx->priv_data;

    NV_ENC_RC_PARAMS *rc = &ctx->config.rcParams;



    if (avctx->bit_rate > 0)

        rc->averageBitRate = avctx->bit_rate;



    if (avctx->rc_max_rate > 0)

        rc->maxBitRate = avctx->rc_max_rate;



    if (ctx->rc > 0) {

        nvenc_override_rate_control(avctx, rc);

    } else if (ctx->flags & NVENC_LOSSLESS) {

        set_lossless(avctx, rc);

    } else if (avctx->global_quality > 0) {

        set_constqp(avctx, rc);

    } else if (avctx->qmin >= 0 && avctx->qmax >= 0) {

        rc->rateControlMode = NV_ENC_PARAMS_RC_VBR;

        set_vbr(avctx, rc);

    }



    if (avctx->rc_buffer_size > 0)

        rc->vbvBufferSize = avctx->rc_buffer_size;



    if (rc->averageBitRate > 0)

        avctx->bit_rate = rc->averageBitRate;



#if NVENCAPI_MAJOR_VERSION >= 7

    if (ctx->aq) {

        ctx->config.rcParams.enableAQ   = 1;

        ctx->config.rcParams.aqStrength = ctx->aq_strength;

        av_log(avctx, AV_LOG_VERBOSE, "AQ enabled.\n");

    }



    if (ctx->temporal_aq) {

        ctx->config.rcParams.enableTemporalAQ = 1;

        av_log(avctx, AV_LOG_VERBOSE, "Temporal AQ enabled.\n");

    }



    if (ctx->rc_lookahead) {

        int lkd_bound = FFMIN(ctx->nb_surfaces, ctx->async_depth) -

                        ctx->config.frameIntervalP - 4;



        if (lkd_bound < 0) {

            av_log(avctx, AV_LOG_WARNING,

                   "Lookahead not enabled. Increase buffer delay (-delay).\n");

        } else {

            ctx->config.rcParams.enableLookahead = 1;

            ctx->config.rcParams.lookaheadDepth  = av_clip(ctx->rc_lookahead, 0, lkd_bound);

            ctx->config.rcParams.disableIadapt   = ctx->no_scenecut;

            ctx->config.rcParams.disableBadapt   = !ctx->b_adapt;

            av_log(avctx, AV_LOG_VERBOSE,

                   "Lookahead enabled: depth %d, scenecut %s, B-adapt %s.\n",

                   ctx->config.rcParams.lookaheadDepth,

                   ctx->config.rcParams.disableIadapt ? "disabled" : "enabled",

                   ctx->config.rcParams.disableBadapt ? "disabled" : "enabled");

        }

    }



    if (ctx->strict_gop) {

        ctx->config.rcParams.strictGOPTarget = 1;

        av_log(avctx, AV_LOG_VERBOSE, "Strict GOP target enabled.\n");

    }



    if (ctx->nonref_p)

        ctx->config.rcParams.enableNonRefP = 1;



    if (ctx->zerolatency)

        ctx->config.rcParams.zeroReorderDelay = 1;



    if (ctx->quality)

        ctx->config.rcParams.targetQuality = ctx->quality;

#endif 

}

static void FUNC_0(AVCodecContext *VAR_0)

{

    NVENCContext *ctx    = VAR_0->priv_data;

    NV_ENC_RC_PARAMS *rc = &ctx->config.rcParams;



    if (VAR_0->bit_rate > 0)

        rc->averageBitRate = VAR_0->bit_rate;



    if (VAR_0->rc_max_rate > 0)

        rc->maxBitRate = VAR_0->rc_max_rate;



    if (ctx->rc > 0) {

        nvenc_override_rate_control(VAR_0, rc);

    } else if (ctx->flags & NVENC_LOSSLESS) {

        set_lossless(VAR_0, rc);

    } else if (VAR_0->global_quality > 0) {

        set_constqp(VAR_0, rc);

    } else if (VAR_0->qmin >= 0 && VAR_0->qmax >= 0) {

        rc->rateControlMode = NV_ENC_PARAMS_RC_VBR;

        set_vbr(VAR_0, rc);

    }



    if (VAR_0->rc_buffer_size > 0)

        rc->vbvBufferSize = VAR_0->rc_buffer_size;



    if (rc->averageBitRate > 0)

        VAR_0->bit_rate = rc->averageBitRate;



#if NVENCAPI_MAJOR_VERSION >= 7

    if (ctx->aq) {

        ctx->config.rcParams.enableAQ   = 1;

        ctx->config.rcParams.aqStrength = ctx->aq_strength;

        av_log(VAR_0, AV_LOG_VERBOSE, "AQ enabled.\n");

    }



    if (ctx->temporal_aq) {

        ctx->config.rcParams.enableTemporalAQ = 1;

        av_log(VAR_0, AV_LOG_VERBOSE, "Temporal AQ enabled.\n");

    }



    if (ctx->rc_lookahead) {

        int lkd_bound = FFMIN(ctx->nb_surfaces, ctx->async_depth) -

                        ctx->config.frameIntervalP - 4;



        if (lkd_bound < 0) {

            av_log(VAR_0, AV_LOG_WARNING,

                   "Lookahead not enabled. Increase buffer delay (-delay).\n");

        } else {

            ctx->config.rcParams.enableLookahead = 1;

            ctx->config.rcParams.lookaheadDepth  = av_clip(ctx->rc_lookahead, 0, lkd_bound);

            ctx->config.rcParams.disableIadapt   = ctx->no_scenecut;

            ctx->config.rcParams.disableBadapt   = !ctx->b_adapt;

            av_log(VAR_0, AV_LOG_VERBOSE,

                   "Lookahead enabled: depth %d, scenecut %s, B-adapt %s.\n",

                   ctx->config.rcParams.lookaheadDepth,

                   ctx->config.rcParams.disableIadapt ? "disabled" : "enabled",

                   ctx->config.rcParams.disableBadapt ? "disabled" : "enabled");

        }

    }



    if (ctx->strict_gop) {

        ctx->config.rcParams.strictGOPTarget = 1;

        av_log(VAR_0, AV_LOG_VERBOSE, "Strict GOP target enabled.\n");

    }



    if (ctx->nonref_p)

        ctx->config.rcParams.enableNonRefP = 1;



    if (ctx->zerolatency)

        ctx->config.rcParams.zeroReorderDelay = 1;



    if (ctx->quality)

        ctx->config.rcParams.targetQuality = ctx->quality;

#endif 

}

static void FUNC_0(AVCodecContext *VAR_0)
{ NVENCContext *ctx    = VAR_0->priv_data; NV_ENC_RC_PARAMS *rc = &ctx->config.rcParams; if (VAR_0->bit_rate > 0)
rc->averageBitRate = VAR_0->bit_rate; if (VAR_0->rc_max_rate > 0)
rc->maxBitRate = VAR_0->rc_max_rate; if (ctx->rc > 0) { nvenc_override_rate_control(VAR_0, rc); } else if (ctx->flags & NVENC_LOSSLESS) { set_lossless(VAR_0, rc); } else if (VAR_0->global_quality > 0) { set_constqp(VAR_0, rc); } else if (VAR_0->qmin >= 0 && VAR_0->qmax >= 0) { rc->rateControlMode = NV_ENC_PARAMS_RC_VBR; set_vbr(VAR_0, rc); } if (VAR_0->rc_buffer_size > 0)
rc->vbvBufferSize = VAR_0->rc_buffer_size; if (rc->averageBitRate > 0)
VAR_0->bit_rate = rc->averageBitRate; #if NVENCAPI_MAJOR_VERSION >= 7
if (ctx->aq) { ctx->config.rcParams.enableAQ   = 1; ctx->config.rcParams.aqStrength = ctx->aq_strength; av_log(VAR_0, AV_LOG_VERBOSE, "AQ enabled.\n"); } if (ctx->temporal_aq) { ctx->config.rcParams.enableTemporalAQ = 1; av_log(VAR_0, AV_LOG_VERBOSE, "Temporal AQ enabled.\n"); } if (ctx->rc_lookahead) { int lkd_bound = FFMIN(ctx->nb_surfaces, ctx->async_depth) -
ctx->config.frameIntervalP - 4; if (lkd_bound < 0) { av_log(VAR_0, AV_LOG_WARNING,
"Lookahead not enabled. Increase buffer delay (-delay).\n"); } else { ctx->config.rcParams.enableLookahead = 1; ctx->config.rcParams.lookaheadDepth  = av_clip(ctx->rc_lookahead, 0, lkd_bound); ctx->config.rcParams.disableIadapt   = ctx->no_scenecut; ctx->config.rcParams.disableBadapt   = !ctx->b_adapt; av_log(VAR_0, AV_LOG_VERBOSE,
"Lookahead enabled: depth %d, scenecut %s, B-adapt %s.\n",
ctx->config.rcParams.lookaheadDepth,
ctx->config.rcParams.disableIadapt ? "disabled" : "enabled",
ctx->config.rcParams.disableBadapt ? "disabled" : "enabled"); } } if (ctx->strict_gop) { ctx->config.rcParams.strictGOPTarget = 1; av_log(VAR_0, AV_LOG_VERBOSE, "Strict GOP target enabled.\n"); } if (ctx->nonref_p)
ctx->config.rcParams.enableNonRefP = 1; if (ctx->zerolatency)
ctx->config.rcParams.zeroReorderDelay = 1; if (ctx->quality)
ctx->config.rcParams.targetQuality = ctx->quality; #endif
}