diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp index 8b1336e47a58cf227a89487146842f9f060e3db5..a8ab8131b7211cf11ec7e2362fe07885148914d8 100644 --- a/src/media/media_encoder.cpp +++ b/src/media/media_encoder.cpp @@ -213,7 +213,7 @@ MediaEncoder::initStream(const SystemCodecInfo& systemCodecInfo, AVBufferRef* fr for (const auto& it : APIs) { accel_ = std::make_unique<video::HardwareAccel>(it); // save accel // Init codec need accel_ to init encoderCtx accelerated - encoderCtx = initCodec(mediaType, static_cast<AVCodecID>(systemCodecInfo.avcodecId), SystemCodecInfo::DEFAULT_VIDEO_BITRATE); + encoderCtx = initCodec(mediaType, static_cast<AVCodecID>(systemCodecInfo.avcodecId), videoOpts_.bitrate); encoderCtx->opaque = accel_.get(); // Check if pixel format from encoder match pixel format from decoder frame context // if it mismatch, it means that we are using two different hardware API (nvenc and vaapi for example) @@ -249,7 +249,7 @@ MediaEncoder::initStream(const SystemCodecInfo& systemCodecInfo, AVBufferRef* fr if (!encoderCtx) { JAMI_WARN("Not using hardware encoding for %s", avcodec_get_name(static_cast<AVCodecID>(systemCodecInfo.avcodecId))); - encoderCtx = initCodec(mediaType, static_cast<AVCodecID>(systemCodecInfo.avcodecId), SystemCodecInfo::DEFAULT_VIDEO_BITRATE); + encoderCtx = initCodec(mediaType, static_cast<AVCodecID>(systemCodecInfo.avcodecId), videoOpts_.bitrate); readConfig(encoderCtx); encoders_.push_back(encoderCtx); if (avcodec_open2(encoderCtx, outputCodec_, &options_) < 0) diff --git a/src/media/video/video_rtp_session.cpp b/src/media/video/video_rtp_session.cpp index 54bd15936ece7c018b5c1859dc45d7fb8abc4b13..c9b53e54396f2023b21bfcf452d7506e9d2a2e30 100644 --- a/src/media/video/video_rtp_session.cpp +++ b/src/media/video/video_rtp_session.cpp @@ -51,7 +51,7 @@ static constexpr unsigned MAX_SIZE_HISTO_QUALITY {30}; static constexpr unsigned MAX_SIZE_HISTO_BITRATE {100}; static constexpr unsigned MAX_SIZE_HISTO_JITTER {50}; static constexpr unsigned MAX_SIZE_HISTO_DELAY {25}; -static constexpr unsigned MAX_REMB_DEC {2}; +static constexpr unsigned MAX_REMB_DEC {1}; constexpr auto DELAY_AFTER_RESTART = std::chrono::milliseconds(1000); constexpr auto EXPIRY_TIME_RTCP = std::chrono::seconds(2); @@ -131,6 +131,7 @@ void VideoRtpSession::startSender() send_.mode = autoQuality ? RateMode::CBR : RateMode::CRF_CONSTRAINED; send_.linkableHW = conference_ == nullptr; + send_.bitrate = videoBitrateInfo_.videoBitrateCurrent; if (sender_) initSeqVal_ = sender_->getLastSeqValue() + 10; // Skip a few sequences to make nvenc happy on a sender restart @@ -489,7 +490,7 @@ VideoRtpSession::dropProcessing(RTCPInfo* rtcpi) else { // If ponderate drops are inferior to 10% that mean drop are not from congestion but from network... // ... we can increase - if (pondLoss >= 10.0f && rtcpi->packetLoss > 0.0f) { + if (pondLoss >= 5.0f && rtcpi->packetLoss > 0.0f) { newBitrate *= 1.0f - rtcpi->packetLoss/150.0f; histoLoss_.clear(); lastMediaRestart_ = now; @@ -515,7 +516,6 @@ VideoRtpSession::delayProcessing(int br) setNewBitrate(newBitrate); } - void VideoRtpSession::setNewBitrate(unsigned int newBR) { diff --git a/src/media/video/video_sender.cpp b/src/media/video/video_sender.cpp index 061e24ce5792be5460c639045a7a58597c8020f6..65a30c3506342b0f899f67e21ce9e3c50dd48c81 100644 --- a/src/media/video/video_sender.cpp +++ b/src/media/video/video_sender.cpp @@ -53,7 +53,7 @@ VideoSender::VideoSender(const std::string& dest, const DeviceParams& dev, { keyFrameFreq_ = dev.framerate.numerator() * KEY_FRAME_PERIOD; videoEncoder_->openOutput(dest, "rtp"); - auto opts = MediaStream("video sender", AV_PIX_FMT_YUV420P, 1 / (rational<int>)dev.framerate, dev.width, dev.height, 1, (rational<int>)dev.framerate); + auto opts = MediaStream("video sender", AV_PIX_FMT_YUV420P, 1 / (rational<int>)dev.framerate, dev.width, dev.height, args.bitrate, (rational<int>)dev.framerate); videoEncoder_->setOptions(opts); videoEncoder_->setOptions(args); videoEncoder_->addStream(args.codec->systemCodecInfo);