diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp index d239501056ee841466ef3a61ccc9c9e170e4f93a..4849facc7ae34825a115380aed813e0a0466e9d8 100644 --- a/src/media/media_encoder.cpp +++ b/src/media/media_encoder.cpp @@ -597,18 +597,28 @@ MediaEncoder::prepareEncoderContext(AVCodec* outputCodec, bool is_video) } void -MediaEncoder::forcePresetX264_X265(AVCodecContext* encoderCtx) +MediaEncoder::forcePresetX2645(AVCodecContext* encoderCtx) { + if(accel_ && accel_->getName() == "nvenc") { + if (av_opt_set(encoderCtx, "preset", "fast", AV_OPT_SEARCH_CHILDREN)) + JAMI_WARN("Failed to set preset to 'fast'"); + if (av_opt_set(encoderCtx, "level", "auto", AV_OPT_SEARCH_CHILDREN)) + JAMI_WARN("Failed to set level to 'auto'"); + if (av_opt_set_int(encoderCtx, "zerolatency", 1, AV_OPT_SEARCH_CHILDREN)) + JAMI_WARN("Failed to set zerolatency to '1'"); + } + else { #if (defined(TARGET_OS_IOS) && TARGET_OS_IOS) - const char *speedPreset = "ultrafast"; + const char *speedPreset = "ultrafast"; #else - const char *speedPreset = "veryfast"; + const char *speedPreset = "veryfast"; #endif - if (av_opt_set(encoderCtx, "preset", speedPreset, AV_OPT_SEARCH_CHILDREN)) - JAMI_WARN("Failed to set x264 preset '%s'", speedPreset); - const char *tune = "zerolatency"; - if (av_opt_set(encoderCtx, "tune", tune, AV_OPT_SEARCH_CHILDREN)) - JAMI_WARN("Failed to set x264 tune '%s'", tune); + if (av_opt_set(encoderCtx, "preset", speedPreset, AV_OPT_SEARCH_CHILDREN)) + JAMI_WARN("Failed to set preset '%s'", speedPreset); + const char *tune = "zerolatency"; + if (av_opt_set(encoderCtx, "tune", tune, AV_OPT_SEARCH_CHILDREN)) + JAMI_WARN("Failed to set tune '%s'", tune); + } } void @@ -748,11 +758,11 @@ MediaEncoder::initCodec(AVMediaType mediaType, AVCodecID avcodecId, uint64_t br) if (avcodecId == AV_CODEC_ID_H264) { auto profileLevelId = libav_utils::getDictValue(options_, "parameters"); extractProfileLevelID(profileLevelId, encoderCtx); - forcePresetX264_X265(encoderCtx); + forcePresetX2645(encoderCtx); initH264(encoderCtx, br); } else if (avcodecId == AV_CODEC_ID_HEVC) { encoderCtx->profile = FF_PROFILE_HEVC_MAIN; - forcePresetX264_X265(encoderCtx); + forcePresetX2645(encoderCtx); initH265(encoderCtx, br); } else if (avcodecId == AV_CODEC_ID_VP8) { initVP8(encoderCtx, br); diff --git a/src/media/media_encoder.h b/src/media/media_encoder.h index b578a8a6735150d628c315b201db7442f3d6e3ff..bba38a3b474208c55382bf2c38880ef978e3cd39 100644 --- a/src/media/media_encoder.h +++ b/src/media/media_encoder.h @@ -114,7 +114,7 @@ public: private: NON_COPYABLE(MediaEncoder); AVCodecContext* prepareEncoderContext(AVCodec* outputCodec, bool is_video); - void forcePresetX264_X265(AVCodecContext* encoderCtx); + void forcePresetX2645(AVCodecContext* encoderCtx); void extractProfileLevelID(const std::string ¶meters, AVCodecContext *ctx); int initStream(const std::string& codecName, AVBufferRef* framesCtx); int initStream(const SystemCodecInfo& systemCodecInfo, AVBufferRef* framesCtx);