diff --git a/bin/jni/jni_interface.i b/bin/jni/jni_interface.i index ec12cb88261b49f7c1fe6f259752b2bb715083c4..5e7ec6b7df53e801750f639883f2029905cac803 100644 --- a/bin/jni/jni_interface.i +++ b/bin/jni/jni_interface.i @@ -284,6 +284,7 @@ void init(ConfigurationCallback* confM, Callback* callM, PresenceCallback* presM const std::map<std::string, SharedCallback> videoEvHandlers = { exportable_callback<VideoSignal::GetCameraInfo>(bind(&VideoCallback::getCameraInfo, videoM, _1, _2, _3, _4)), exportable_callback<VideoSignal::SetParameters>(bind(&VideoCallback::setParameters, videoM, _1, _2, _3, _4, _5)), + exportable_callback<VideoSignal::RequestKeyFrame>(bind(&VideoCallback::requestKeyFrame, videoM)), exportable_callback<VideoSignal::StartCapture>(bind(&VideoCallback::startCapture, videoM, _1)), exportable_callback<VideoSignal::StopCapture>(bind(&VideoCallback::stopCapture, videoM)), exportable_callback<VideoSignal::DecodingStarted>(bind(&VideoCallback::decodingStarted, videoM, _1, _2, _3, _4, _5)), diff --git a/bin/jni/videomanager.i b/bin/jni/videomanager.i index 245a6ef373b25dac17671cd8449cc9591759d7a1..06f63f46237d7796d2e48e2b65c6b7c445f3265c 100644 --- a/bin/jni/videomanager.i +++ b/bin/jni/videomanager.i @@ -43,6 +43,7 @@ public: virtual ~VideoCallback(){} virtual void getCameraInfo(const std::string& device, std::vector<int> *formats, std::vector<unsigned> *sizes, std::vector<unsigned> *rates) {} virtual void setParameters(const std::string, const int format, const int width, const int height, const int rate) {} + virtual void requestKeyFrame(){} virtual void startCapture(const std::string& camid) {} virtual void stopCapture() {} virtual void decodingStarted(const std::string& id, const std::string& shm_path, int w, int h, bool is_mixer) {} @@ -397,6 +398,7 @@ public: virtual ~VideoCallback(){} virtual void getCameraInfo(const std::string& device, std::vector<int> *formats, std::vector<unsigned> *sizes, std::vector<unsigned> *rates){} virtual void setParameters(const std::string, const int format, const int width, const int height, const int rate) {} + virtual void requestKeyFrame(){} virtual void startCapture(const std::string& camid) {} virtual void stopCapture() {} virtual void decodingStarted(const std::string& id, const std::string& shm_path, int w, int h, bool is_mixer) {} diff --git a/src/client/ring_signal.cpp b/src/client/ring_signal.cpp index 39f2c079316556a6efdba9e19d74fc00c378e8b4..bd0a3751037b78f687e8bc2878f519cebb51cda1 100644 --- a/src/client/ring_signal.cpp +++ b/src/client/ring_signal.cpp @@ -107,6 +107,7 @@ getSignalHandlers() #ifdef __ANDROID__ exported_callback<DRing::VideoSignal::GetCameraInfo>(), exported_callback<DRing::VideoSignal::SetParameters>(), + exported_callback<DRing::VideoSignal::RequestKeyFrame>(), #endif exported_callback<DRing::VideoSignal::StartCapture>(), exported_callback<DRing::VideoSignal::StopCapture>(), diff --git a/src/dring/videomanager_interface.h b/src/dring/videomanager_interface.h index a482be31cbf84bb0c99f5493da7d15b68f1337ed..e53c011352400e6a2d2a8163e6a54f2c9f98010b 100644 --- a/src/dring/videomanager_interface.h +++ b/src/dring/videomanager_interface.h @@ -209,6 +209,10 @@ struct DRING_PUBLIC VideoSignal { constexpr static const char* name = "GetCameraInfo"; using cb_type = void(const std::string& device, std::vector<int> *formats, std::vector<unsigned> *sizes, std::vector<unsigned> *rates); }; + struct DRING_PUBLIC RequestKeyFrame { + constexpr static const char* name = "RequestKeyFrame"; + using cb_type = void(); + }; #endif struct DRING_PUBLIC StartCapture { constexpr static const char* name = "StartCapture"; diff --git a/src/media/video/video_sender.cpp b/src/media/video/video_sender.cpp index 2421d96be1e47e50e388d258a0e3d9d50efad00f..8d2d8975543525947c23955abda52d159092d261 100644 --- a/src/media/video/video_sender.cpp +++ b/src/media/video/video_sender.cpp @@ -68,6 +68,12 @@ void VideoSender::encodeAndSendVideo(VideoFrame& input_frame) { if (auto packet = input_frame.packet()) { +#if __ANDROID__ + if (forceKeyFrame_) { + emitSignal<DRing::VideoSignal::RequestKeyFrame>(); + forceKeyFrame_ = 0; + } +#endif videoEncoder_->send(*packet); } else { bool is_keyframe = forceKeyFrame_ > 0