From 657c47c51d315b8523519b4bc7d7eae189e33ad2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Fri, 6 May 2022 12:26:21 -0400
Subject: [PATCH] video API: return bool from registerSinkTarget

This allows clients to know if sink registration succeeded.

Change-Id: Ic22d4a50b9cf3c071562c6425724008a54e5f3a6
---
 bin/jni/videomanager.i            | 15 ++++++++-------
 src/client/videomanager.cpp       |  8 +++++---
 src/jami/videomanager_interface.h |  2 +-
 3 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/bin/jni/videomanager.i b/bin/jni/videomanager.i
index 414da8da48..6fdb6584d8 100644
--- a/bin/jni/videomanager.i
+++ b/bin/jni/videomanager.i
@@ -349,19 +349,20 @@ DRing::FrameBuffer sinkTargetPullCallback(ANativeWindow *window)
             }
         }
     } catch (...) {
+        __android_log_print(ANDROID_LOG_WARN, TAG, "Exception in pull callback");
     }
     return {};
 }
 
-JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_registerVideoCallback(JNIEnv *jenv, jclass jcls, jstring sinkId, jlong window)
+JNIEXPORT jboolean JNICALL Java_net_jami_daemon_JamiServiceJNI_registerVideoCallback(JNIEnv *jenv, jclass jcls, jstring sinkId, jlong window)
 {
     if(!sinkId) {
         SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string");
-        return;
+        return JNI_FALSE;
     }
     const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(sinkId, 0);
     if (!arg1_pstr)
-        return;
+        return JNI_FALSE;
     std::string sink(arg1_pstr);
     jenv->ReleaseStringUTFChars(sinkId, arg1_pstr);
 
@@ -371,9 +372,9 @@ JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_registerVideoCallback
 
     {
         std::lock_guard<std::mutex> guard(windows_mutex);
-        windows.emplace(nativeWindow, av_frame_alloc());
+        windows.emplace(nativeWindow, DRing::FrameBuffer{av_frame_alloc()});
     }
-    DRing::registerSinkTarget(sink, DRing::SinkTarget {.pull=p_display_cb, .push=f_display_cb});
+    return DRing::registerSinkTarget(sink, DRing::SinkTarget {.pull=p_display_cb, .push=f_display_cb}) ? JNI_TRUE : JNI_FALSE;
 }
 
 JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_unregisterVideoCallback(JNIEnv *jenv, jclass jcls, jstring sinkId, jlong window)
@@ -400,7 +401,7 @@ JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_unregisterVideoCallba
 %native(acquireNativeWindow) jlong acquireNativeWindow(jobject);
 %native(releaseNativeWindow) void releaseNativeWindow(jlong);
 %native(setNativeWindowGeometry) void setNativeWindowGeometry(jlong, int, int);
-%native(registerVideoCallback) void registerVideoCallback(jstring, jlong);
+%native(registerVideoCallback) jboolean registerVideoCallback(jstring, jlong);
 %native(unregisterVideoCallback) void unregisterVideoCallback(jstring, jlong);
 
 %native(captureVideoFrame) void captureVideoFrame(jstring, jobject, jint);
@@ -419,7 +420,7 @@ void applySettings(const std::string& name, const std::map<std::string, std::str
 void addVideoDevice(const std::string &node);
 void removeVideoDevice(const std::string &node);
 void setDeviceOrientation(const std::string& name, int angle);
-void registerSinkTarget(const std::string& sinkId, const DRing::SinkTarget& target);
+bool registerSinkTarget(const std::string& sinkId, const DRing::SinkTarget& target);
 std::string startLocalMediaRecorder(const std::string& videoInputId, const std::string& filepath);
 void stopLocalRecorder(const std::string& filepath);
 bool getDecodingAccelerated();
diff --git a/src/client/videomanager.cpp b/src/client/videomanager.cpp
index b486d13871..8cb564139b 100644
--- a/src/client/videomanager.cpp
+++ b/src/client/videomanager.cpp
@@ -522,15 +522,17 @@ stopLocalRecorder(const std::string& filepath)
     jami::LocalRecorderManager::instance().removeRecorderByPath(filepath);
 }
 
-void
+bool
 registerSinkTarget(const std::string& sinkId, SinkTarget target)
 {
 #ifdef ENABLE_VIDEO
-    if (auto sink = jami::Manager::instance().getSinkClient(sinkId))
+    if (auto sink = jami::Manager::instance().getSinkClient(sinkId)) {
         sink->registerTarget(std::move(target));
-    else
+        return true;
+    } else
         JAMI_WARN("No sink found for id '%s'", sinkId.c_str());
 #endif
+    return false;
 }
 
 #if HAVE_SHM
diff --git a/src/jami/videomanager_interface.h b/src/jami/videomanager_interface.h
index 372dfc031d..955d290d51 100644
--- a/src/jami/videomanager_interface.h
+++ b/src/jami/videomanager_interface.h
@@ -194,7 +194,7 @@ DRING_PUBLIC bool mutePlayerAudio(const std::string& id, bool mute);
 DRING_PUBLIC bool playerSeekToTime(const std::string& id, int time);
 int64_t getPlayerPosition(const std::string& id);
 
-DRING_PUBLIC void registerSinkTarget(const std::string& sinkId, SinkTarget target);
+DRING_PUBLIC bool registerSinkTarget(const std::string& sinkId, SinkTarget target);
 #if HAVE_SHM
 DRING_PUBLIC void startShmSink(const std::string& sinkId, bool value);
 #endif
-- 
GitLab