[MPlayer-cvslog] r35983 - in trunk: Changelog configure libvo/gl_common.c libvo/gl_common.h libvo/gl_compat.h libvo/vo_gl.c
reimar
subversion at mplayerhq.hu
Sat Mar 16 20:15:42 CET 2013
Author: reimar
Date: Sat Mar 16 20:15:42 2013
New Revision: 35983
Log:
Add (hackish) support for OpenGL on Android.
The only to run that actually works in my system is running
from adb shell, since trying to create a window from native code
is not possible when running from a app.
Modified:
trunk/Changelog
trunk/configure
trunk/libvo/gl_common.c
trunk/libvo/gl_common.h
trunk/libvo/gl_compat.h
trunk/libvo/vo_gl.c
Modified: trunk/Changelog
==============================================================================
--- trunk/Changelog Sat Mar 16 16:18:15 2013 (r35982)
+++ trunk/Changelog Sat Mar 16 20:15:42 2013 (r35983)
@@ -18,6 +18,10 @@ MPlayer
Ports:
* Windows: support file names as UTF-8 in slave mode and passing
file names as wchar command line arguments.
+ * Android: MPlayer can be run from adb shell and display videos
+ via OpenGL ES.
+ Note that just a bit of seeking etc. would cause reproducible
+ system reboots after just a few seconds on my Galaxy S2.
1.1: "We gave up on 1.0"
Modified: trunk/configure
==============================================================================
--- trunk/configure Sat Mar 16 16:18:15 2013 (r35982)
+++ trunk/configure Sat Mar 16 20:15:42 2013 (r35983)
@@ -5317,7 +5317,7 @@ echores "$_sdl"
# conflicts between -lGL and -framework OpenGL
echocheck "OpenGL"
#Note: this test is run even with --enable-gl since we autodetect linker flags
-if (test "$_x11" = yes || test "$_sdl" = yes || win32 || test "$_corevideo" = yes) && test "$_gl" != no ; then
+if test "$_gl" != no ; then
cat > $TMPC << EOF
#ifdef GL_WIN32
#include <windows.h>
@@ -5337,6 +5337,9 @@ if (test "$_x11" = yes || test "$_sdl" =
#include <GL/gl.h>
#include <X11/Xlib.h>
#include <EGL/egl.h>
+#elif defined(GL_EGL_ANDROID)
+#include <GLES/gl.h>
+#include <EGL/egl.h>
#else
#include <GL/gl.h>
#include <X11/Xlib.h>
@@ -5348,13 +5351,16 @@ int main(int argc, char *argv[]) {
wglCreateContext(dc);
#elif defined(GL_SDL)
SDL_GL_SwapBuffers();
-#elif defined(GL_EGL_X11)
+#elif defined(GL_EGL_X11) || defined(GL_EGL_ANDROID)
EGLDisplay eglDisplay = EGL_NO_DISPLAY;
eglInitialize(eglDisplay, NULL, NULL);
#else
glXCreateContext(NULL, NULL, NULL, True);
#endif
-#ifndef GL_EGL_X11
+#ifdef GL_EGL_ANDROID
+ EGLNativeWindowType android_createDisplaySurface(void);
+ android_createDisplaySurface();
+#elif !defined(GL_EGL_X11)
glFinish();
#endif
return 0;
@@ -5369,6 +5375,11 @@ EOF
break
fi
done
+ if cc_check -DGL_EGL_ANDROID -lEGL -lui ; then
+ _gl=yes
+ _gl_egl_android=yes
+ libs_mplayer="$libs_mplayer -lEGL -lui $ld_dl"
+ fi
if test "$_x11" = yes && cc_check -DGL_EGL_X11 -lEGL ; then
_gl=yes
_gl_egl_x11=yes
@@ -5410,6 +5421,10 @@ if test "$_gl" = yes ; then
def_gl_x11='#define CONFIG_GL_X11 1'
res_comment="$res_comment x11"
fi
+ if test "$_gl_egl_android" = yes ; then
+ def_gl_egl_android='#define CONFIG_GL_EGL_ANDROID 1'
+ res_comment="$res_comment egl_android"
+ fi
if test "$_gl_egl_x11" = yes ; then
def_gl_egl_x11='#define CONFIG_GL_EGL_X11 1'
res_comment="$res_comment egl_x11"
@@ -5427,6 +5442,7 @@ else
def_gl='#undef CONFIG_GL'
def_gl_win32='#undef CONFIG_GL_WIN32'
def_gl_x11='#undef CONFIG_GL_X11'
+ def_gl_egl_android='#undef CONFIG_GL_EGL_ANDROID'
def_gl_egl_x11='#undef CONFIG_GL_EGL_X11'
def_gl_sdl='#undef CONFIG_GL_SDL'
def_gl_osx='#undef CONFIG_GL_OSX'
@@ -8916,6 +8932,7 @@ $def_gif_tvt_hack
$def_gl
$def_gl_win32
$def_gl_x11
+$def_gl_egl_android
$def_gl_egl_x11
$def_gl_sdl
$def_gl_osx
Modified: trunk/libvo/gl_common.c
==============================================================================
--- trunk/libvo/gl_common.c Sat Mar 16 16:18:15 2013 (r35982)
+++ trunk/libvo/gl_common.c Sat Mar 16 20:15:42 2013 (r35983)
@@ -2181,7 +2181,7 @@ static int sdl_check_events(void) {
#endif
-#ifdef CONFIG_GL_EGL_X11
+#if defined(CONFIG_GL_EGL_X11) || defined(CONFIG_GL_EGL_ANDROID)
static EGLDisplay eglDisplay = EGL_NO_DISPLAY;
static EGLSurface eglSurface = EGL_NO_SURFACE;
@@ -2191,7 +2191,16 @@ static EGLSurface eglSurface = EGL_NO_SU
* So we have to use a non-portable way that in addition
* might also return symbols from a different library
* that the one providing the current context, great job!
+ * In addition the implementation of eglGetProcAddress
+ * on Galaxy S2 Android seems to actively return wrong
+ * pointers, it just gets better and better...
*/
+#ifdef CONFIG_GL_EGL_ANDROID
+static EGLNativeWindowType vo_window;
+#define eglGetProcAddress(a) 0
+#define mDisplay EGL_DEFAULT_DISPLAY
+EGLNativeWindowType android_createDisplaySurface(void);
+#endif
static void *eglgpa(const GLubyte *name) {
void *res = eglGetProcAddress(name);
if (!res) {
@@ -2207,10 +2216,23 @@ static int setGlWindow_egl(MPGLContext *
static const EGLint cfg_attribs[] = { EGL_NONE };
static const EGLint ctx_attribs[] = { EGL_NONE };
EGLContext *context = &ctx->context.egl;
- Window win = vo_window;
EGLContext new_context = NULL;
EGLConfig eglConfig;
int num_configs;
+#ifdef CONFIG_GL_EGL_ANDROID
+ EGLint w, h;
+ if (vo_window) {
+ eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH, &w);
+ eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT, &h);
+ vo_screenwidth = vo_dwidth = w;
+ vo_screenheight = vo_dheight = h;
+ return SET_WINDOW_OK;
+ }
+ if (!vo_window)
+ vo_window = android_createDisplaySurface();
+ if (!vo_window)
+ return SET_WINDOW_FAILED;
+#endif
if (eglDisplay == EGL_NO_DISPLAY) {
eglDisplay = eglGetDisplay(mDisplay);
if (eglDisplay == EGL_NO_DISPLAY) {
@@ -2230,7 +2252,7 @@ static int setGlWindow_egl(MPGLContext *
if (!eglChooseConfig(eglDisplay, cfg_attribs, &eglConfig, 1, &num_configs) ||
num_configs != 1)
return SET_WINDOW_FAILED;
- eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, win, NULL);
+ eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, vo_window, NULL);
if (eglSurface == EGL_NO_SURFACE)
return SET_WINDOW_FAILED;
@@ -2241,8 +2263,14 @@ static int setGlWindow_egl(MPGLContext *
return SET_WINDOW_FAILED;
// set new values
- vo_window = win;
+#ifdef CONFIG_GL_EGL_X11
vo_x11_update_geometry();
+#else
+ eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH, &w);
+ eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT, &h);
+ vo_screenwidth = vo_dwidth = w;
+ vo_screenheight = vo_dheight = h;
+#endif
*context = new_context;
getFunctions(eglgpa, eglQueryString(eglDisplay, EGL_EXTENSIONS));
@@ -2289,6 +2317,10 @@ static int dummy_check_events(void) {
return 0;
}
+static void dummy_fullscreen(void) {
+ vo_fs = !vo_fs;
+}
+
static void dummy_update_xinerama_info(void) {
if (vo_screenwidth <= 0 || vo_screenheight <= 0) {
mp_msg(MSGT_VO, MSGL_ERR, "You must specify the screen dimensions "
@@ -2309,6 +2341,8 @@ int init_mpglcontext(MPGLContext *ctx, e
if (res) return res;
res = init_mpglcontext(ctx, GLTYPE_SDL);
if (res) return res;
+ res = init_mpglcontext(ctx, GLTYPE_EGL_ANDROID);
+ if (res) return res;
res = init_mpglcontext(ctx, GLTYPE_EGL_X11);
return res;
}
@@ -2318,6 +2352,7 @@ int init_mpglcontext(MPGLContext *ctx, e
ctx->swapGlBuffers = swapGlBuffers_dummy;
ctx->update_xinerama_info = dummy_update_xinerama_info;
ctx->check_events = dummy_check_events;
+ ctx->fullscreen = dummy_fullscreen;
ctx->type = type;
switch (ctx->type) {
#ifdef CONFIG_GL_WIN32
@@ -2353,6 +2388,13 @@ int init_mpglcontext(MPGLContext *ctx, e
ctx->fullscreen = vo_sdl_fullscreen;
return vo_sdl_init();
#endif
+#ifdef CONFIG_GL_EGL_ANDROID
+ case GLTYPE_EGL_ANDROID:
+ ctx->setGlWindow = setGlWindow_egl;
+ ctx->releaseGlContext = releaseGlContext_egl;
+ ctx->swapGlBuffers = swapGlBuffers_egl;
+ return 1;
+#endif
#ifdef CONFIG_GL_EGL_X11
case GLTYPE_EGL_X11:
ctx->setGlWindow = setGlWindow_egl;
Modified: trunk/libvo/gl_common.h
==============================================================================
--- trunk/libvo/gl_common.h Sat Mar 16 16:18:15 2013 (r35982)
+++ trunk/libvo/gl_common.h Sat Mar 16 20:15:42 2013 (r35983)
@@ -47,6 +47,9 @@
#ifdef CONFIG_GL_OSX
#include "osx_common.h"
#include <OpenGL/gl.h>
+#elif defined(CONFIG_GL_EGL_ANDROID)
+#include <EGL/egl.h>
+#include <GLES/gl.h>
#else
#include <GL/gl.h>
#endif
@@ -192,6 +195,7 @@ enum MPGLType {
GLTYPE_SDL,
GLTYPE_EGL_X11,
GLTYPE_OSX,
+ GLTYPE_EGL_ANDROID,
GLTYPE_COUNT
};
@@ -210,7 +214,7 @@ typedef struct MPGLContext {
#ifdef CONFIG_GL_X11
GLXContext x11;
#endif
-#ifdef CONFIG_GL_EGL_X11
+#if defined(CONFIG_GL_EGL_X11) || defined(CONFIG_GL_EGL_ANDROID)
EGLContext egl;
#endif
} context;
Modified: trunk/libvo/gl_compat.h
==============================================================================
--- trunk/libvo/gl_compat.h Sat Mar 16 16:18:15 2013 (r35982)
+++ trunk/libvo/gl_compat.h Sat Mar 16 20:15:42 2013 (r35983)
@@ -80,6 +80,9 @@
#ifndef GL_INT
#define GL_INT 0x1404
#endif
+#ifndef GL_UNSIGNED_INT
+#define GL_UNSIGNED_INT 0x1405
+#endif
#ifndef GL_2_BYTES
#define GL_2_BYTES 0x1407
#endif
Modified: trunk/libvo/vo_gl.c
==============================================================================
--- trunk/libvo/vo_gl.c Sat Mar 16 16:18:15 2013 (r35982)
+++ trunk/libvo/vo_gl.c Sat Mar 16 20:15:42 2013 (r35983)
@@ -1164,7 +1164,12 @@ query_format(uint32_t format)
int depth;
int caps = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW |
VFCAP_FLIP |
- VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_ACCEPT_STRIDE;
+ VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN;
+ // TODO: This assumes backend auto-detection was run
+ // before this code.
+ // In addition strides might not work with X11 GLES either.
+ if (glctx.type != GLTYPE_EGL_ANDROID)
+ caps |= VFCAP_ACCEPT_STRIDE;
if (use_osd)
caps |= VFCAP_OSD | VFCAP_EOSD | (scaled_osd ? 0 : VFCAP_EOSD_UNSCALED);
if (format == IMGFMT_RGB24 || format == IMGFMT_RGBA)
More information about the MPlayer-cvslog
mailing list