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;
}