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;