From e5c191fa3d6167c04e617787a3887c3bb31149e2 Mon Sep 17 00:00:00 2001
From: Pierre Lespagnol <pierre.lespagnol@savoirfairelinux.com>
Date: Tue, 5 Nov 2019 14:48:29 -0500
Subject: [PATCH] autoadapt: add signal to set bitrate dynamically for
 MediaCodec

Change-Id: Iba619f891d0412ca4abe4e03e4b2a11d5a3b2488
---
 bin/jni/jni_interface.i               | 1 +
 bin/jni/videomanager.i                | 6 ++++--
 src/client/ring_signal.cpp            | 1 +
 src/dring/videomanager_interface.h    | 4 ++++
 src/media/video/video_input.cpp       | 3 ++-
 src/media/video/video_input.h         | 2 +-
 src/media/video/video_rtp_session.cpp | 5 +++++
 7 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/bin/jni/jni_interface.i b/bin/jni/jni_interface.i
index fc35f93a23..c0e8c0e72f 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 8a605c7506..ae578dbdb4 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 667c59caf8..90a75c5321 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 6dea0fbbc4..817aebee73 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 a57d3ff00b..a2e807f36b 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 9d6f521ead..f77c717e66 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 3ed0edd5c7..a553461246 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;
-- 
GitLab