From 9355b670b889a2c3086a1893ed0f4be200ec0413 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Thu, 21 Sep 2023 17:02:35 +0800 Subject: [PATCH] Set I frame max qp to 22 for nvidia encoder --- .../decode/ffmpeg/ffmpeg_video_decoder.cpp | 2 +- .../decode/nvcodec/nvidia_video_decoder.cpp | 4 ++-- .../video/decode/video_decoder_factory.cpp | 4 ++++ .../encode/ffmpeg/ffmpeg_video_encoder.cpp | 2 +- .../encode/nvcodec/nvidia_video_encoder.cpp | 11 +++++---- .../video/encode/video_encoder_factory.cpp | 7 ++++++ src/pc/peer_connection.cpp | 23 +++++++++++++++++++ 7 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/media/video/decode/ffmpeg/ffmpeg_video_decoder.cpp b/src/media/video/decode/ffmpeg/ffmpeg_video_decoder.cpp index 5651762..6423747 100644 --- a/src/media/video/decode/ffmpeg/ffmpeg_video_decoder.cpp +++ b/src/media/video/decode/ffmpeg/ffmpeg_video_decoder.cpp @@ -2,7 +2,7 @@ #include "log.h" -#define SAVE_DECODER_STREAM 1 +#define SAVE_DECODER_STREAM 0 extern "C" { #include diff --git a/src/media/video/decode/nvcodec/nvidia_video_decoder.cpp b/src/media/video/decode/nvcodec/nvidia_video_decoder.cpp index 5ca7044..99a9078 100644 --- a/src/media/video/decode/nvcodec/nvidia_video_decoder.cpp +++ b/src/media/video/decode/nvcodec/nvidia_video_decoder.cpp @@ -2,7 +2,7 @@ #include "log.h" -#define SAVE_DECODER_STREAM 1 +#define SAVE_DECODER_STREAM 0 NvidiaVideoDecoder::NvidiaVideoDecoder() {} NvidiaVideoDecoder::~NvidiaVideoDecoder() { @@ -51,7 +51,7 @@ int NvidiaVideoDecoder::Decode( } if ((*(data + 4) & 0x1f) == 0x07) { - // LOG_WARN("Receive key frame"); + LOG_WARN("Receive key frame"); } int num_frame_returned = decoder->Decode(data, size); diff --git a/src/media/video/decode/video_decoder_factory.cpp b/src/media/video/decode/video_decoder_factory.cpp index 13033ed..6e36d8b 100644 --- a/src/media/video/decode/video_decoder_factory.cpp +++ b/src/media/video/decode/video_decoder_factory.cpp @@ -1,6 +1,7 @@ #include "video_decoder_factory.h" #include "ffmpeg/ffmpeg_video_decoder.h" +#include "log.h" #include "nvcodec/nvidia_video_decoder.h" VideoDecoderFactory::VideoDecoderFactory() {} @@ -26,6 +27,9 @@ bool VideoDecoderFactory::CheckIsHardwareAccerlerationSupported() { CUvideoctxlock cudaCtxLock; cuResult = cuvidCtxLockCreate(&cudaCtxLock, 0); if (cuResult != CUDA_SUCCESS) { + LOG_WARN( + "System not support hardware accelerated decode, use default software " + "decoder"); return false; } diff --git a/src/media/video/encode/ffmpeg/ffmpeg_video_encoder.cpp b/src/media/video/encode/ffmpeg/ffmpeg_video_encoder.cpp index 53d8d49..39a26af 100644 --- a/src/media/video/encode/ffmpeg/ffmpeg_video_encoder.cpp +++ b/src/media/video/encode/ffmpeg/ffmpeg_video_encoder.cpp @@ -4,7 +4,7 @@ #include "log.h" -#define SAVE_ENCODER_STREAM 1 +#define SAVE_ENCODER_STREAM 0 FFmpegVideoEncoder::FFmpegVideoEncoder() {} FFmpegVideoEncoder::~FFmpegVideoEncoder() { diff --git a/src/media/video/encode/nvcodec/nvidia_video_encoder.cpp b/src/media/video/encode/nvcodec/nvidia_video_encoder.cpp index 7facf37..fbd62dc 100644 --- a/src/media/video/encode/nvcodec/nvidia_video_encoder.cpp +++ b/src/media/video/encode/nvcodec/nvidia_video_encoder.cpp @@ -4,7 +4,7 @@ #include "log.h" -#define SAVE_ENCODER_STREAM 1 +#define SAVE_ENCODER_STREAM 0 NvidiaVideoEncoder::NvidiaVideoEncoder() {} NvidiaVideoEncoder::~NvidiaVideoEncoder() { @@ -50,14 +50,15 @@ int NvidiaVideoEncoder::Init() { init_params.encodeConfig->profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID; init_params.encodeConfig->encodeCodecConfig.h264Config.level = NV_ENC_LEVEL::NV_ENC_LEVEL_H264_31; - // TO TEST: not tested yet - // init_params.encodeConfig->gopLength = NVENC_INFINITE_GOPLENGTH; init_params.encodeConfig->gopLength = keyFrameInterval_; - // Do not use B-frame for realtime application init_params.encodeConfig->frameIntervalP = 1; init_params.encodeConfig->rcParams.rateControlMode = - NV_ENC_PARAMS_RC_MODE::NV_ENC_PARAMS_RC_CBR; + NV_ENC_PARAMS_RC_MODE::NV_ENC_PARAMS_RC_VBR; init_params.encodeConfig->rcParams.maxBitRate = maxBitrate_ * 500; + // init_params.encodeConfig->rcParams.enableMinQP = 1; + // init_params.encodeConfig->rcParams.minQP.qpIntra = 10; + init_params.encodeConfig->rcParams.enableMaxQP = 1; + init_params.encodeConfig->rcParams.maxQP.qpIntra = 22; init_params.encodeConfig->encodeCodecConfig.h264Config.sliceMode = 1; init_params.encodeConfig->encodeCodecConfig.h264Config.sliceModeData = max_payload_size_; diff --git a/src/media/video/encode/video_encoder_factory.cpp b/src/media/video/encode/video_encoder_factory.cpp index a4adfae..f583b8f 100644 --- a/src/media/video/encode/video_encoder_factory.cpp +++ b/src/media/video/encode/video_encoder_factory.cpp @@ -1,6 +1,7 @@ #include "video_encoder_factory.h" #include "ffmpeg/ffmpeg_video_encoder.h" +#include "log.h" #include "nvcodec/nvidia_video_encoder.h" VideoEncoderFactory::VideoEncoderFactory() {} @@ -26,11 +27,17 @@ bool VideoEncoderFactory::CheckIsHardwareAccerlerationSupported() { cuResult = cuInit(0); if (cuResult != CUDA_SUCCESS) { + LOG_WARN( + "System not support hardware accelerated encode, use default software " + "encoder"); return false; } NVENCSTATUS nvEncStatus = NvEncodeAPICreateInstance(&functionList); if (nvEncStatus != NV_ENC_SUCCESS) { + LOG_WARN( + "System not support hardware accelerated encode, use default software " + "encoder"); return false; } diff --git a/src/pc/peer_connection.cpp b/src/pc/peer_connection.cpp index 51cef0c..f6faae2 100644 --- a/src/pc/peer_connection.cpp +++ b/src/pc/peer_connection.cpp @@ -119,17 +119,33 @@ int PeerConnection::Init(PeerConnectionParams params, } int PeerConnection::CreateVideoCodec(bool hardware_acceleration) { +#ifdef __APPLE__ + if (hardware_acceleration) { + hardware_acceleration = false; + LOG_WARN( + "MacOS not support hardware acceleration, use default software codec"); + } +#else +#endif + video_encoder_ = VideoEncoderFactory::CreateVideoEncoder(hardware_acceleration_); if (hardware_acceleration_ && !video_encoder_) { + LOG_WARN( + "Hardware accelerated encoder not available, use default software " + "encoder"); video_encoder_ = VideoEncoderFactory::CreateVideoEncoder(false); if (!video_encoder_) { + LOG_ERROR( + "Hardware accelerated encoder and software encoder both not " + "available"); return -1; } } if (0 != video_encoder_->Init()) { video_encoder_ = VideoEncoderFactory::CreateVideoEncoder(false); if (!video_encoder_ || 0 != video_encoder_->Init()) { + LOG_ERROR("Encoder init failed"); return -1; } } @@ -137,14 +153,21 @@ int PeerConnection::CreateVideoCodec(bool hardware_acceleration) { video_decoder_ = VideoDecoderFactory::CreateVideoDecoder(hardware_acceleration_); if (hardware_acceleration_ && !video_decoder_) { + LOG_WARN( + "Hardware accelerated decoder not available, use default software " + "decoder"); video_decoder_ = VideoDecoderFactory::CreateVideoDecoder(false); if (!video_decoder_) { + LOG_ERROR( + "Hardware accelerated decoder and software decoder both not " + "available"); return -1; } } if (0 != video_decoder_->Init()) { video_decoder_ = VideoDecoderFactory::CreateVideoDecoder(false); if (!video_decoder_ || video_decoder_->Init()) { + LOG_ERROR("Decoder init failed"); return -1; } }