diff options
Diffstat (limited to 'video/out/opengl')
-rw-r--r-- | video/out/opengl/context_android.c | 61 |
1 files changed, 9 insertions, 52 deletions
diff --git a/video/out/opengl/context_android.c b/video/out/opengl/context_android.c index d405e79fa0..bc1717c1be 100644 --- a/video/out/opengl/context_android.c +++ b/video/out/opengl/context_android.c @@ -17,35 +17,17 @@ #include <EGL/egl.h> #include <EGL/eglext.h> -#include <libavcodec/jni.h> -#include <android/native_window_jni.h> +#include "video/out/android_common.h" #include "egl_helpers.h" - #include "common/common.h" -#include "options/m_config.h" #include "context.h" -struct android_opts { - struct m_geometry surface_size; -}; - -#define OPT_BASE_STRUCT struct android_opts -const struct m_sub_options android_conf = { - .opts = (const struct m_option[]) { - OPT_SIZE_BOX("android-surface-size", surface_size, UPDATE_VO_RESIZE), - {0} - }, - .size = sizeof(struct android_opts), -}; - struct priv { struct GL gl; EGLDisplay egl_display; - EGLConfig egl_config; EGLContext egl_context; EGLSurface egl_surface; - ANativeWindow *native_window; }; static void android_swap_buffers(struct ra_ctx *ctx) @@ -67,28 +49,15 @@ static void android_uninit(struct ra_ctx *ctx) if (p->egl_context) eglDestroyContext(p->egl_display, p->egl_context); - if (p->native_window) { - ANativeWindow_release(p->native_window); - p->native_window = NULL; - } + vo_android_uninit(ctx->vo); } static bool android_init(struct ra_ctx *ctx) { struct priv *p = ctx->priv = talloc_zero(ctx, struct priv); - jobject surface = (jobject)(intptr_t)ctx->vo->opts->WinID; - JavaVM *vm = (JavaVM *)av_jni_get_java_vm(NULL); - JNIEnv *env; - int ret = (*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_6); - if (ret == JNI_EDETACHED) { - if ((*vm)->AttachCurrentThread(vm, &env, NULL) != 0) { - MP_FATAL(ctx, "Could not attach java VM.\n"); - goto fail; - } - } - p->native_window = ANativeWindow_fromSurface(env, surface); - (*vm)->DetachCurrentThread(vm); + if (!vo_android_init(ctx->vo)) + goto fail; p->egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY); if (!eglInitialize(p->egl_display, NULL, NULL)) { @@ -100,12 +69,13 @@ static bool android_init(struct ra_ctx *ctx) if (!mpegl_create_context(ctx, p->egl_display, &p->egl_context, &config)) goto fail; + ANativeWindow *native_window = vo_android_native_window(ctx->vo); EGLint format; eglGetConfigAttrib(p->egl_display, config, EGL_NATIVE_VISUAL_ID, &format); - ANativeWindow_setBuffersGeometry(p->native_window, 0, 0, format); + ANativeWindow_setBuffersGeometry(native_window, 0, 0, format); p->egl_surface = eglCreateWindowSurface(p->egl_display, config, - (EGLNativeWindowType)p->native_window, NULL); + (EGLNativeWindowType)native_window, NULL); if (p->egl_surface == EGL_NO_SURFACE) { MP_FATAL(ctx, "Could not create EGL surface!\n"); @@ -135,26 +105,13 @@ fail: static bool android_reconfig(struct ra_ctx *ctx) { - struct priv *p = ctx->priv; - void *tmp = talloc_new(NULL); - struct android_opts *opts = mp_get_config_group(tmp, ctx->global, &android_conf); - int w = opts->surface_size.w, h = opts->surface_size.h; - - if (!w) - eglQuerySurface(p->egl_display, p->egl_surface, EGL_WIDTH, &w); - if (!h) - eglQuerySurface(p->egl_display, p->egl_surface, EGL_HEIGHT, &h); - - if (!w || !h) { - MP_FATAL(ctx, "Failed to get height and width!\n"); + int w, h; + if (!vo_android_surface_size(ctx->vo, &w, &h)) return false; - } ctx->vo->dwidth = w; ctx->vo->dheight = h; ra_gl_ctx_resize(ctx->swapchain, w, h, 0); - - talloc_free(tmp); return true; } |