From fdc4c3a0f337e3405a0a72b2394250cc8e04020f Mon Sep 17 00:00:00 2001 From: Liong Sauw Ming Date: Tue, 17 Jan 2017 04:28:39 +0000 Subject: Re #1945 (misc): Fixed occasional crash in pjsua Android sample app when initializing OpenGL renderer (crash in init_opengl()->ANativeWindow_setBuffersGeometry()). It doesn't happen in pjsua2 sample app. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5525 74dad513-b988-da41-8d7b-12977e46ad98 --- .../android/app/src/main/java/MainActivity.java | 21 ++++++++++++++--- pjsip-apps/src/pjsua/android/jni/pjsua.i | 6 ++++- .../src/pjsua/android/jni/pjsua_app_callback.cpp | 26 ++++++++++------------ .../src/pjsua/android/jni/pjsua_app_callback.h | 10 ++++++--- 4 files changed, 42 insertions(+), 21 deletions(-) diff --git a/pjsip-apps/src/pjsua/android/app/src/main/java/MainActivity.java b/pjsip-apps/src/pjsua/android/app/src/main/java/MainActivity.java index 927a70b6..b3e7e458 100644 --- a/pjsip-apps/src/pjsua/android/app/src/main/java/MainActivity.java +++ b/pjsip-apps/src/pjsua/android/app/src/main/java/MainActivity.java @@ -138,6 +138,17 @@ public class MainActivity extends Activity implements SurfaceHolder.Callback { ui.sendMessageDelayed(msg, 100); } } + + @Override + public void onCallVideoStart() { + MainActivity ma = ((MyHandler)ui_handler.get()).mTarget.get(); + SurfaceView surfaceView = (SurfaceView) + ma.findViewById(R.id.surfaceViewIncomingCall); + + WindowHandle wh = new WindowHandle(); + wh.setWindow(surfaceView.getHolder().getSurface()); + pjsua.setVideoWindow(wh); + } } private void updateStatus(String output) { @@ -261,17 +272,21 @@ public class MainActivity extends Activity implements SurfaceHolder.Callback { public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { - pjsua.setIncomingVideoRenderer(holder.getSurface()); + WindowHandle wh = new WindowHandle(); + wh.setWindow(holder.getSurface()); + pjsua.setVideoWindow(wh); } public void surfaceCreated(SurfaceHolder holder) { - pjsua.setIncomingVideoRenderer(holder.getSurface()); + } public void surfaceDestroyed(SurfaceHolder holder) { - pjsua.setIncomingVideoRenderer(null); + WindowHandle wh = new WindowHandle(); + wh.setWindow(null); + pjsua.setVideoWindow(wh); } } diff --git a/pjsip-apps/src/pjsua/android/jni/pjsua.i b/pjsip-apps/src/pjsua/android/jni/pjsua.i index e98954a4..e65574d3 100755 --- a/pjsip-apps/src/pjsua/android/jni/pjsua.i +++ b/pjsip-apps/src/pjsua/android/jni/pjsua.i @@ -14,9 +14,13 @@ /* Turn on director wrapping PjsuaAppCallback */ %feature("director") PjsuaAppCallback; -/* Convert Surface object to ANativeWindow for setIncomingVideoRenderer() */ +/* Convert Surface object to ANativeWindow */ %typemap(in) jobject surface { $1 = $input? (jobject)ANativeWindow_fromSurface(jenv, $input) : NULL; } +%extend WindowHandle { + void setWindow(jobject surface) { $self->window = surface; } +} + %include "pjsua_app_callback.h" diff --git a/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.cpp b/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.cpp index a7199423..b8b9ca64 100644 --- a/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.cpp +++ b/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.cpp @@ -30,7 +30,16 @@ static pjsua_app_cfg_t android_app_config; static int restart_argc; static char **restart_argv; static pjsua_callback pjsua_cb_orig; -static jobject callVideoSurface; +static pjsua_vid_win_id winId = PJSUA_INVALID_ID; + +void setVideoWindow(const WindowHandle& win) +{ + pjmedia_vid_dev_hwnd vhwnd; + + vhwnd.info.window = win.window; + if (winId != PJSUA_INVALID_ID) + pjsua_vid_win_set_win(winId, &vhwnd); +} extern const char *pjsua_app_def_argv[]; @@ -57,13 +66,8 @@ static void on_call_media_state(pjsua_call_id call_id) med_info->status == PJSUA_CALL_MEDIA_ACTIVE && med_info->stream.vid.win_in != PJSUA_INVALID_ID) { - pjmedia_vid_dev_hwnd vhwnd; - - /* Setup renderer surface */ - pj_bzero(&vhwnd, sizeof(vhwnd)); - vhwnd.type = PJMEDIA_VID_DEV_HWND_TYPE_ANDROID; - vhwnd.info.window = callVideoSurface; - pjsua_vid_win_set_win(med_info->stream.vid.win_in, &vhwnd); + winId = med_info->stream.vid.win_in; + registeredCallbackObject->onCallVideoStart(); break; } } @@ -162,10 +166,4 @@ void setCallbackObject(PjsuaAppCallback* callback) registeredCallbackObject = callback; } - -void setIncomingVideoRenderer(jobject surface) -{ - callVideoSurface = surface; -} - #endif diff --git a/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.h b/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.h index 38dc996d..b90ef60d 100644 --- a/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.h +++ b/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.h @@ -19,21 +19,25 @@ #ifndef __PJSUA_APP_CALLBACK_H__ #define __PJSUA_APP_CALLBACK_H__ -#include - class PjsuaAppCallback { public: virtual ~PjsuaAppCallback() {} virtual void onStarted(const char *msg) {} virtual void onStopped(int restart) {} + virtual void onCallVideoStart() {} }; +typedef struct WindowHandle { + void *window; +} WindowHandle; + +void setVideoWindow(const WindowHandle& win); + extern "C" { int pjsuaStart(); void pjsuaDestroy(); int pjsuaRestart(); void setCallbackObject(PjsuaAppCallback* callback); -void setIncomingVideoRenderer(jobject surface); } #endif /* __PJSUA_APP_CALLBACK_H__ */ -- cgit v1.2.3