diff options
author | Liong Sauw Ming <ming@teluu.com> | 2017-01-17 04:28:39 +0000 |
---|---|---|
committer | Liong Sauw Ming <ming@teluu.com> | 2017-01-17 04:28:39 +0000 |
commit | fdc4c3a0f337e3405a0a72b2394250cc8e04020f (patch) | |
tree | f2692e177a594e4443d42d393e6f79d9f0cfef24 /pjsip-apps/src | |
parent | add65569866b1cf587fc1ec57917bae0371dfeb9 (diff) |
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
Diffstat (limited to 'pjsip-apps/src')
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 <jni.h> - 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__ */ |