From: Andrey Turkin Date: Wed, 25 May 2016 14:26:25 +0000 (+0300) Subject: avcodec/nvenc: convert profile parsing to AVOptions X-Git-Tag: android-x86-7.1-r1~5083 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=9824321b321448854102070383aa99fa8e56f491;p=android-x86%2Fexternal-ffmpeg.git avcodec/nvenc: convert profile parsing to AVOptions Signed-off-by: Timo Rothenpieler --- diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index 7166b9dfc2..d984b58354 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -603,9 +603,6 @@ static av_cold void nvenc_setup_rate_control(AVCodecContext *avctx) ctx->encode_config.rcParams.maxBitRate = avctx->rc_max_rate; if (ctx->flags & NVENC_LOSSLESS) { - if (avctx->codec->id == AV_CODEC_ID_H264) - ctx->encode_config.encodeCodecConfig.h264Config.qpPrimeYZeroTransformBypassFlag = 1; - set_lossless(avctx); avctx->qmin = -1; @@ -710,42 +707,26 @@ static av_cold int nvenc_setup_h264_config(AVCodecContext *avctx) h264->outputAUD = 1; - if (!ctx->profile && !(ctx->flags & NVENC_LOSSLESS)) { - switch (avctx->profile) { - case FF_PROFILE_H264_HIGH_444_PREDICTIVE: - cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_444_GUID; - break; - case FF_PROFILE_H264_BASELINE: + if (ctx->flags & NVENC_LOSSLESS) { + h264->qpPrimeYZeroTransformBypassFlag = 1; + } else { + switch(ctx->profile) { + case NV_ENC_H264_PROFILE_BASELINE: cc->profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID; + avctx->profile = FF_PROFILE_H264_BASELINE; break; - case FF_PROFILE_H264_MAIN: + case NV_ENC_H264_PROFILE_MAIN: cc->profileGUID = NV_ENC_H264_PROFILE_MAIN_GUID; + avctx->profile = FF_PROFILE_H264_MAIN; break; - case FF_PROFILE_H264_HIGH: - case FF_PROFILE_UNKNOWN: - cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_GUID; - break; - default: - av_log(avctx, AV_LOG_WARNING, "Unsupported profile requested, falling back to high\n"); - cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_GUID; - break; - } - } else if (!(ctx->flags & NVENC_LOSSLESS)) { - if (!strcmp(ctx->profile, "high")) { + case NV_ENC_H264_PROFILE_HIGH: cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_GUID; avctx->profile = FF_PROFILE_H264_HIGH; - } else if (!strcmp(ctx->profile, "main")) { - cc->profileGUID = NV_ENC_H264_PROFILE_MAIN_GUID; - avctx->profile = FF_PROFILE_H264_MAIN; - } else if (!strcmp(ctx->profile, "baseline")) { - cc->profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID; - avctx->profile = FF_PROFILE_H264_BASELINE; - } else if (!strcmp(ctx->profile, "high444p")) { + break; + case NV_ENC_H264_PROFILE_HIGH_444P: cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_444_GUID; avctx->profile = FF_PROFILE_H264_HIGH_444_PREDICTIVE; - } else { - av_log(avctx, AV_LOG_FATAL, "Profile \"%s\" is unknown! Supported profiles: high, main, baseline\n", ctx->profile); - return AVERROR(EINVAL); + break; } } diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h index 5b81fc8667..b5a0a2abf0 100644 --- a/libavcodec/nvenc.h +++ b/libavcodec/nvenc.h @@ -120,6 +120,13 @@ enum { }; enum { + NV_ENC_H264_PROFILE_BASELINE, + NV_ENC_H264_PROFILE_MAIN, + NV_ENC_H264_PROFILE_HIGH, + NV_ENC_H264_PROFILE_HIGH_444P, +}; + +enum { NVENC_LOWLATENCY = 1, NVENC_LOSSLESS = 2, NVENC_ONE_PASS = 4, @@ -160,7 +167,7 @@ typedef struct NvencContext void *nvencoder; int preset; - char *profile; + int profile; char *level; char *tier; int cbr; diff --git a/libavcodec/nvenc_h264.c b/libavcodec/nvenc_h264.c index 0ed3f7cced..4e294781b8 100644 --- a/libavcodec/nvenc_h264.c +++ b/libavcodec/nvenc_h264.c @@ -39,7 +39,11 @@ static const AVOption options[] = { { "llhp", "low latency hp", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOW_LATENCY_HP }, 0, 0, VE, "preset" }, { "lossless", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOSSLESS_DEFAULT }, 0, 0, VE, "preset" }, { "losslesshp", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOSSLESS_HP }, 0, 0, VE, "preset" }, - { "profile", "Set the encoding profile (high, main, baseline or high444p)", OFFSET(profile), AV_OPT_TYPE_STRING, { .str = "main" }, 0, 0, VE }, + { "profile", "Set the encoding profile", OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = NV_ENC_H264_PROFILE_MAIN }, NV_ENC_H264_PROFILE_BASELINE, NV_ENC_H264_PROFILE_HIGH_444P, VE, "profile" }, + { "baseline", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_BASELINE }, 0, 0, VE, "profile" }, + { "main", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_MAIN }, 0, 0, VE, "profile" }, + { "high", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_HIGH }, 0, 0, VE, "profile" }, + { "high444p", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_HIGH_444P }, 0, 0, VE, "profile" }, { "level", "Set the encoding level restriction (auto, 1.0, 1.0b, 1.1, 1.2, ..., 4.2, 5.0, 5.1)", OFFSET(level), AV_OPT_TYPE_STRING, { .str = "auto" }, 0, 0, VE }, { "cbr", "Use cbr encoding mode", OFFSET(cbr), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, { "2pass", "Use 2pass encoding mode", OFFSET(twopass), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE }, diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c index 28e28b38e2..990d730932 100644 --- a/libavcodec/nvenc_hevc.c +++ b/libavcodec/nvenc_hevc.c @@ -39,7 +39,8 @@ static const AVOption options[] = { { "llhp", "low latency hp", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOW_LATENCY_HP }, 0, 0, VE, "preset" }, { "lossless", "lossless", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOSSLESS_DEFAULT }, 0, 0, VE, "preset" }, { "losslesshp", "lossless hp", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOSSLESS_HP }, 0, 0, VE, "preset" }, - { "profile", "Set the encoding profile (high, main, baseline or high444p)", OFFSET(profile), AV_OPT_TYPE_STRING, { .str = "main" }, 0, 0, VE }, + { "profile", "Set the encoding profile", OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = FF_PROFILE_HEVC_MAIN }, FF_PROFILE_HEVC_MAIN, FF_PROFILE_HEVC_MAIN, VE, "profile" }, + { "main", "", 0, AV_OPT_TYPE_CONST, { .i64 = FF_PROFILE_HEVC_MAIN }, 0, 0, VE, "profile" }, { "level", "Set the encoding level restriction (auto, 1.0, 1.0b, 1.1, 1.2, ..., 4.2, 5.0, 5.1)", OFFSET(level), AV_OPT_TYPE_STRING, { .str = "auto" }, 0, 0, VE }, { "tier", "Set the encoding tier (main or high)", OFFSET(tier), AV_OPT_TYPE_STRING, { .str = "main" }, 0, 0, VE }, { "cbr", "Use cbr encoding mode", OFFSET(cbr), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },