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