diff --git a/bin/jni/jni_interface.i b/bin/jni/jni_interface.i index fc35f93a2375bb58de8ca5caed1ac904a3e7c5f3..c0e8c0e72fbebcfd8a614a03963aac75e376f7a0 100644 --- a/bin/jni/jni_interface.i +++ b/bin/jni/jni_interface.i @@ -286,6 +286,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::SetBitrate>(bind(&VideoCallback::setBitrate, videoM, _1, _2)), 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)), diff --git a/bin/jni/videomanager.i b/bin/jni/videomanager.i index 8a605c750685fefb6ce3fdfe09fa11b902c24e62..ae578dbdb4ef72a4e02e0d125e34d766dc9833ad 100644 --- a/bin/jni/videomanager.i +++ b/bin/jni/videomanager.i @@ -43,7 +43,8 @@ class VideoCallback { 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 setParameters(const std::string&, const int format, const int width, const int height, const int rate) {} + virtual void setBitrate(const std::string&, const int bitrate) {} virtual void requestKeyFrame(){} virtual void startCapture(const std::string& camid) {} virtual void stopCapture() {} @@ -421,7 +422,8 @@ class VideoCallback { 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 setParameters(const std::string&, const int format, const int width, const int height, const int rate) {} + virtual void setBitrate(const std::string&, const int bitrate) {} virtual void requestKeyFrame(){} virtual void startCapture(const std::string& camid) {} virtual void stopCapture() {} diff --git a/src/client/ring_signal.cpp b/src/client/ring_signal.cpp index 667c59caf8ee3eaee2862c16df13b8d5b08c6997..90a75c53216257b335130ff8f130d522b6abf5a2 100644 --- a/src/client/ring_signal.cpp +++ b/src/client/ring_signal.cpp @@ -110,6 +110,7 @@ getSignalHandlers() exported_callback<DRing::VideoSignal::GetCameraInfo>(), exported_callback<DRing::VideoSignal::SetParameters>(), exported_callback<DRing::VideoSignal::RequestKeyFrame>(), + exported_callback<DRing::VideoSignal::SetBitrate>(), #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 6dea0fbbc4c021300ddf0e86487c89c1d8f64a21..817aebee73d86f4dad109653f680dd28811c436f 100644 --- a/src/dring/videomanager_interface.h +++ b/src/dring/videomanager_interface.h @@ -224,6 +224,10 @@ struct DRING_PUBLIC VideoSignal { constexpr static const char* name = "RequestKeyFrame"; using cb_type = void(); }; + struct DRING_PUBLIC SetBitrate { + constexpr static const char* name = "SetBitrate"; + using cb_type = void(const std::string& device, const int bitrate); + }; #endif struct DRING_PUBLIC StartCapture { constexpr static const char* name = "StartCapture"; diff --git a/src/media/video/video_input.cpp b/src/media/video/video_input.cpp index a57d3ff00b36234c0caec44717bc974de97c238b..a2e807f36b6ca3b9acb75f37839011c3e0c2c097 100644 --- a/src/media/video/video_input.cpp +++ b/src/media/video/video_input.cpp @@ -482,7 +482,8 @@ VideoInput::switchInput(const std::string& resource) return futureDecOpts_; } -DeviceParams VideoInput::getParams() const +const DeviceParams& +VideoInput::getParams() const { return decOpts_; } MediaStream diff --git a/src/media/video/video_input.h b/src/media/video/video_input.h index 9d6f521eadfd896d3b118aa1f60cfd32a2a84554..f77c717e66a45f31db0e9a43eb1027ada4faed91 100644 --- a/src/media/video/video_input.h +++ b/src/media/video/video_input.h @@ -67,7 +67,7 @@ public: int getWidth() const; int getHeight() const; AVPixelFormat getPixelFormat() const; - DeviceParams getParams() const; + const DeviceParams& getParams() const; MediaStream getInfo() const; std::shared_future<DeviceParams> switchInput(const std::string& resource); diff --git a/src/media/video/video_rtp_session.cpp b/src/media/video/video_rtp_session.cpp index 3ed0edd5c772bef6f98209311386fc5e8c052a20..a553461246dc0b1f582e046a7989cc6391b15879 100644 --- a/src/media/video/video_rtp_session.cpp +++ b/src/media/video/video_rtp_session.cpp @@ -447,6 +447,11 @@ VideoRtpSession::adaptQualityAndBitrate() if(oldBitrate != videoBitrateInfo_.videoBitrateCurrent) { storeVideoBitrateInfo(); +#if __ANDROID__ + auto input_device = std::static_pointer_cast<VideoInput>(videoLocal_); + emitSignal<DRing::VideoSignal::SetBitrate>(input_device->getParams().name, (int)videoBitrateInfo_.videoBitrateCurrent); +#endif + // If encoder no longer exist do nothing if(sender_ && sender_->setBitrate(videoBitrateInfo_.videoBitrateCurrent) == 0) lastMediaRestart_ = now;