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