From 27625f2aaf97f8c2f0b65da101e4e9a00968c6fe Mon Sep 17 00:00:00 2001 From: philippegorley <philippe.gorley@savoirfairelinux.com> Date: Fri, 1 Feb 2019 10:29:22 -0500 Subject: [PATCH] api: add hardware encoding Also adds hardware decoding to nodejs and jni APIs. Change-Id: I2a89f2d9e09b597df0ec449e69e8e7b84bea5552 --- bin/dbus/cx.ring.Ring.VideoManager.xml | 14 ++++++++++++++ bin/dbus/dbusvideomanager.cpp | 12 ++++++++++++ bin/dbus/dbusvideomanager.h | 2 ++ bin/jni/videomanager.i | 8 ++++++++ bin/nodejs/videomanager.i | 8 ++++++++ src/client/videomanager.cpp | 19 +++++++++++++++++++ src/dring/videomanager_interface.h | 2 ++ 7 files changed, 65 insertions(+) diff --git a/bin/dbus/cx.ring.Ring.VideoManager.xml b/bin/dbus/cx.ring.Ring.VideoManager.xml index c3f73bf51f..4b637dc602 100644 --- a/bin/dbus/cx.ring.Ring.VideoManager.xml +++ b/bin/dbus/cx.ring.Ring.VideoManager.xml @@ -117,6 +117,20 @@ </arg> </method> + <method name="getEncodingAccelerated" tp:name-for-bindings="getEncodingAccelerated"> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="Bool"/> + <arg type="b" name="state" direction="out"> + <tp:docstring>Returns true if hardware encoding is enabled, false otherwise</tp:docstring> + </arg> + </method> + + <method name="setEncodingAccelerated" tp:name-for-bindings="setEncodingAccelerated"> + <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="Bool"/> + <arg type="b" name="state" direction="in"> + <tp:docstring>Toggle hardware encoding</tp:docstring> + </arg> + </method> + <method name="setDeviceOrientation" tp:name-for-bindings="setDeviceOrientation"> <arg type="s" name="name" direction="in"> <tp:docstring>Device name</tp:docstring> diff --git a/bin/dbus/dbusvideomanager.cpp b/bin/dbus/dbusvideomanager.cpp index 0ccda3f53d..febe4a0083 100644 --- a/bin/dbus/dbusvideomanager.cpp +++ b/bin/dbus/dbusvideomanager.cpp @@ -109,6 +109,18 @@ DBusVideoManager::setDecodingAccelerated(const bool& state) DRing::setDecodingAccelerated(state); } +auto +DBusVideoManager::getEncodingAccelerated() -> decltype(DRing::getEncodingAccelerated()) +{ + return DRing::getEncodingAccelerated(); +} + +void +DBusVideoManager::setEncodingAccelerated(const bool& state) +{ + DRing::setEncodingAccelerated(state); +} + void DBusVideoManager::setDeviceOrientation(const std::string& name, const int& angle) { diff --git a/bin/dbus/dbusvideomanager.h b/bin/dbus/dbusvideomanager.h index ea3b7f61f1..1cd3b7088f 100644 --- a/bin/dbus/dbusvideomanager.h +++ b/bin/dbus/dbusvideomanager.h @@ -65,6 +65,8 @@ class DRING_PUBLIC DBusVideoManager : bool hasCameraStarted(); bool getDecodingAccelerated(); void setDecodingAccelerated(const bool& state); + bool getEncodingAccelerated(); + void setEncodingAccelerated(const bool& state); void setDeviceOrientation(const std::string& name, const int& angle); std::map<std::string, std::string> getRenderer(const std::string& callId); std::string startLocalRecorder(const bool& audioOnly, const std::string& filepath); diff --git a/bin/jni/videomanager.i b/bin/jni/videomanager.i index 05128aced6..239b2f54cc 100644 --- a/bin/jni/videomanager.i +++ b/bin/jni/videomanager.i @@ -51,6 +51,10 @@ public: virtual void decodingStopped(const std::string& id, const std::string& shm_path, bool is_mixer) {} virtual std::string startLocalRecorder(const bool& audioOnly, const std::string& filepath) {} virtual void stopLocalRecorder(const std::string& filepath) {} + virtual bool getDecodingAccelerated() {} + virtual void setDecodingAccelerated(bool state) {} + virtual bool getEncodingAccelerated() {} + virtual void setEncodingAccelerated(bool state) {} virtual void setDeviceOrientation(const std::string&, int angle) {} }; %} @@ -407,6 +411,10 @@ void setDeviceOrientation(const std::string& name, int angle); uint8_t* obtainFrame(int length); void releaseFrame(uint8_t* frame); void registerSinkTarget(const std::string& sinkId, const DRing::SinkTarget& target); +bool getDecodingAccelerated(); +void setDecodingAccelerated(bool state); +bool getEncodingAccelerated(); +void setEncodingAccelerated(bool state); } class VideoCallback { diff --git a/bin/nodejs/videomanager.i b/bin/nodejs/videomanager.i index 82fed9556a..bb3b0e14ed 100644 --- a/bin/nodejs/videomanager.i +++ b/bin/nodejs/videomanager.i @@ -38,6 +38,10 @@ public: virtual void decodingStopped(const std::string& id, const std::string& shm_path, bool is_mixer) {} virtual std::string startLocalRecorder(const bool& audioOnly, const std::string& filepath) {} virtual void stopLocalRecorder(const std::string& filepath) {} + virtual bool getDecodingAccelerated() {} + virtual void setDecodingAccelerated(bool state) {} + virtual bool getEncodingAccelerated() {} + virtual void setEncodingAccelerated(bool state) {} virtual void setDeviceOrientation(const std::string& name, int angle) {} }; %} @@ -60,6 +64,10 @@ std::map<std::string, std::string> getSettings(const std::string& name); void applySettings(const std::string& name, const std::map<std::string, std::string>& settings); void registerSinkTarget(const std::string& sinkId, const DRing::SinkTarget& target); +bool getDecodingAccelerated(); +void setDecodingAccelerated(bool state); +bool getEncodingAccelerated(); +void setEncodingAccelerated(bool state); void setDeviceOrientation(const std::string& name, int angle); } diff --git a/src/client/videomanager.cpp b/src/client/videomanager.cpp index 1f498c3064..55e16e0eb6 100644 --- a/src/client/videomanager.cpp +++ b/src/client/videomanager.cpp @@ -546,6 +546,25 @@ setDecodingAccelerated(bool state) #endif } +bool +getEncodingAccelerated() +{ +#ifdef RING_ACCEL + return ring::Manager::instance().videoPreferences.getEncodingAccelerated(); +#else + return false; +#endif +} + +void +setEncodingAccelerated(bool state) +{ +#ifdef RING_ACCEL + RING_DBG("%s hardware acceleration", (state ? "Enabling" : "Disabling")); + ring::Manager::instance().videoPreferences.setEncodingAccelerated(state); +#endif +} + #if defined(__ANDROID__) || defined(RING_UWP) || (defined(TARGET_OS_IOS) && TARGET_OS_IOS) void addVideoDevice(const std::string &node, std::vector<std::map<std::string, std::string>> const * devInfo) diff --git a/src/dring/videomanager_interface.h b/src/dring/videomanager_interface.h index da6a7855b2..96a014e0bd 100644 --- a/src/dring/videomanager_interface.h +++ b/src/dring/videomanager_interface.h @@ -195,6 +195,8 @@ DRING_PUBLIC void publishFrame(); DRING_PUBLIC bool getDecodingAccelerated(); DRING_PUBLIC void setDecodingAccelerated(bool state); +DRING_PUBLIC bool getEncodingAccelerated(); +DRING_PUBLIC void setEncodingAccelerated(bool state); // Video signal type definitions struct DRING_PUBLIC VideoSignal { -- GitLab