static void glxvideo_prepare(MSFilter *f){ GLXVideo *s=(GLXVideo*)f->data; XWindowAttributes wa; if (s->display==NULL) return; if (s->window_id==0){ if (createX11GLWindow(s->display, s->wsize, &s->glContext, &s->window_id)) { GLenum err; s->glhelper = ogl_display_new(); glXMakeCurrent( s->display, s->window_id, s->glContext ); err = glewInit(); if (err != GLEW_OK) { ms_error("Failed to initialize GLEW"); return; } else if (!GLEW_VERSION_2_0) { ms_error("Need OpenGL 2.0+"); return; } else { ogl_display_init(s->glhelper, s->wsize.width, s->wsize.height); } } if (s->window_id==0) return; s->own_window=TRUE; }else if (s->own_window==FALSE){ /*we need to register for resize events*/ XSelectInput(s->display,s->window_id,StructureNotifyMask); } XGetWindowAttributes(s->display,s->window_id,&wa); ms_message("glxvideo_prepare(): Window has size %ix%i, received video is %ix%i",wa.width,wa.height,s->vsize.width,s->vsize.height); if (wa.width<MS_LAYOUT_MIN_SIZE || wa.height<MS_LAYOUT_MIN_SIZE){ return; } s->wsize.width=wa.width; s->wsize.height=wa.height; s->ready=TRUE; }
static void android_display_init(MSFilter *f){ AndroidDisplay *ad=(AndroidDisplay*)ms_new0(AndroidDisplay,1); JNIEnv *jenv=NULL; jclass wc; jenv=ms_get_jni_env(); wc=(*jenv)->FindClass(jenv,"org/linphone/mediastream/video/AndroidVideoWindowImpl"); if (wc==0){ ms_fatal("Could not find org/linphone/mediastream/video/AndroidVideoWindowImpl class !"); } ad->set_opengles_display_id=(*jenv)->GetMethodID(jenv,wc,"setOpenGLESDisplay","(I)V"); ad->request_render_id=(*jenv)->GetMethodID(jenv,wc,"requestRender","()V"); if (ad->set_opengles_display_id == 0) ms_error("Could not find 'setOpenGLESDisplay' method\n"); if (ad->request_render_id == 0) ms_error("Could not find 'requestRender' method\n"); ad->ogl = ogl_display_new(); ad->ogl_free_ready = FALSE; f->data=ad; ms_message("%s %p %p", __FUNCTION__, f, ad); }
static int android_display_set_window(MSFilter *f, void *arg){ AndroidDisplay *ad=(AndroidDisplay*)f->data; unsigned long id=*(unsigned long*)arg; JNIEnv *jenv=ms_get_jni_env(); jobject window=(jobject)id; jobject old_window; if (window == ad->android_video_window) return 0; ms_filter_lock(f); old_window=ad->android_video_window; if (ad->android_video_window) { ms_message("Clearing old opengles_display (%p)", ad->ogl); /* clear native ptr, to prevent rendering to occur now that ptr is invalid */ (*jenv)->CallVoidMethod(jenv,ad->android_video_window,ad->set_opengles_display_id, 0); /* when context is lost GL resources are freed by Android */ ogl_display_uninit(ad->ogl, FALSE); ms_free(ad->ogl); ad->ogl = ogl_display_new(); } if (window) { unsigned int ptr = (unsigned int)ad->ogl; ad->android_video_window=(*jenv)->NewGlobalRef(jenv, window); ms_message("Sending opengles_display pointer as long: %p -> %u", ad->ogl, ptr); (*jenv)->CallVoidMethod(jenv,window,ad->set_opengles_display_id, ptr); }else ad->android_video_window=NULL; if (old_window) (*jenv)->DeleteGlobalRef(jenv, old_window); ms_filter_unlock(f); return 0; }