summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2017-01-17 04:28:39 +0000
committerLiong Sauw Ming <ming@teluu.com>2017-01-17 04:28:39 +0000
commitfdc4c3a0f337e3405a0a72b2394250cc8e04020f (patch)
treef2692e177a594e4443d42d393e6f79d9f0cfef24
parentadd65569866b1cf587fc1ec57917bae0371dfeb9 (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
-rw-r--r--pjsip-apps/src/pjsua/android/app/src/main/java/MainActivity.java21
-rwxr-xr-xpjsip-apps/src/pjsua/android/jni/pjsua.i6
-rw-r--r--pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.cpp26
-rw-r--r--pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.h10
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__ */