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;

	ms_filter_lock(f);
	
	if (window) {
		unsigned int ptr = (unsigned int)ad->ogl;
		ms_message("Sending opengles_display pointer as long: %p -> %u", ad->ogl, ptr);
		(*jenv)->CallVoidMethod(jenv,window,ad->set_opengles_display_id, ptr);
		ad->ogl_free_ready = FALSE;
	} else {
		if (window != ad->android_video_window) {
			ms_message("Clearing opengles_display (%p : %d)", ad->ogl, ad->ogl_free_ready);
			/* when context is lost GL resources are freed by Android */
			ogl_display_uninit(ad->ogl, FALSE);
			if (ad->ogl_free_ready) {
				ms_free(ad->ogl);
				ad->ogl = 0;
			} else {
				ad->ogl_free_ready = TRUE;
			}
			/* 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);
		}
	}

	ad->android_video_window=window;

	ms_filter_unlock(f);

	return 0;
}
static void android_display_uninit(MSFilter *f){
	AndroidDisplay *ad=(AndroidDisplay*)f->data;
	JNIEnv *jenv=ms_get_jni_env();
	ms_message("%s %p %p", __FUNCTION__, f, ad->ogl);
	
	if (ad->ogl) {
		/* clear native ptr, to prevent rendering to occur now that ptr is invalid */
		if (ad->android_video_window)
			(*jenv)->CallVoidMethod(jenv,ad->android_video_window,ad->set_opengles_display_id, 0);
		ogl_display_uninit(ad->ogl,FALSE);
		ms_free(ad->ogl);
	}
	if (ad->android_video_window) (*jenv)->DeleteGlobalRef(jenv, ad->android_video_window);

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