diff --git a/src/media/video/video_sender.cpp b/src/media/video/video_sender.cpp index 087d1427917b3ad6bc80c41bb4a149f21da63f04..e8e332fb0b960bdc3e86eaa186fa2eaae49b1d25 100644 --- a/src/media/video/video_sender.cpp +++ b/src/media/video/video_sender.cpp @@ -50,6 +50,7 @@ VideoSender::VideoSender(const std::string& dest, const DeviceParams& dev, , videoEncoder_(new MediaEncoder) { videoEncoder_->setDeviceOptions(dev); + keyFrameFreq_ = dev.framerate.numerator() * KEY_FRAME_PERIOD; videoEncoder_->openOutput(dest.c_str(), args); videoEncoder_->setInitSeqVal(seqVal); videoEncoder_->setIOContext(muxContext_); @@ -66,10 +67,13 @@ VideoSender::~VideoSender() void VideoSender::encodeAndSendVideo(VideoFrame& input_frame) { - bool is_keyframe = forceKeyFrame_ > 0; + bool is_keyframe = forceKeyFrame_ > 0 \ + or (keyFrameFreq_ > 0 and (frameNumber_ % keyFrameFreq_) == 0); - if (is_keyframe) + if (is_keyframe) { + RING_DBG("keyframe requested"); --forceKeyFrame_; + } if (videoEncoder_->encode(input_frame, is_keyframe, frameNumber_++) < 0) RING_ERR("encoding failed"); diff --git a/src/media/video/video_sender.h b/src/media/video/video_sender.h index cac8f30d8535ac9022cbb9f17c0e61ec13c889e0..d1d1fd64521d1695dc71f9c03314e51c097aef50 100644 --- a/src/media/video/video_sender.h +++ b/src/media/video/video_sender.h @@ -74,6 +74,9 @@ public: bool useCodec(const AccountVideoCodecInfo* codec) const; private: + static constexpr int KEYFRAMES_AT_START {3}; // Number of keyframes to enforce at stream startup + static constexpr unsigned KEY_FRAME_PERIOD {5}; // seconds before forcing a keyframe + NON_COPYABLE(VideoSender); void encodeAndSendVideo(VideoFrame&); @@ -82,8 +85,8 @@ private: std::unique_ptr<MediaIOHandle> muxContext_ = nullptr; std::unique_ptr<MediaEncoder> videoEncoder_ = nullptr; - static constexpr int KEYFRAMES_AT_START {3}; // Number of keyframes to enforce at stream startup std::atomic<int> forceKeyFrame_ {KEYFRAMES_AT_START}; + int keyFrameFreq_ {0}; // Set keyframe rate, 0 to disable auto-keyframe. Computed in constructor int64_t frameNumber_ = 0; std::string sdp_ = ""; };