/** * Allocates a surface and an OpenGL context for video output. */ static int Open (vlc_object_t *obj) { vout_display_t *vd = (vout_display_t *)obj; vout_display_sys_t *sys = malloc (sizeof (*sys)); if (unlikely(sys == NULL)) return VLC_ENOMEM; sys->gl = NULL; sys->pool = NULL; sys->window = MakeWindow (vd); if (sys->window == NULL) goto error; sys->gl = vlc_gl_Create (sys->window, API, "$" MODULE_VARNAME); if (sys->gl == NULL) goto error; if (vlc_gl_MakeCurrent (sys->gl)) goto error; /* Initialize video display */ sys->vgl = vout_display_opengl_New (&vd->fmt, NULL, sys->gl); if (!sys->vgl) goto error; vd->sys = sys; vd->info.has_pictures_invalid = false; vd->info.has_event_thread = false; vd->pool = Pool; vd->prepare = PictureRender; vd->display = PictureDisplay; vd->control = Control; vd->manage = NULL; return VLC_SUCCESS; error: if (sys->gl != NULL) vlc_gl_Destroy (sys->gl); if (sys->window != NULL) vout_display_DeleteWindow (vd, sys->window); free (sys); return VLC_EGENERIC; }
static void ClearSurface(vout_display_t *vd) { vout_display_sys_t *sys = vd->sys; if (sys->p_window->b_opaque) { /* Clear the surface to black with OpenGL ES 2 */ char *modlist = var_InheritString(sys->embed, "gles2"); vlc_gl_t *gl = vlc_gl_Create(vd->cfg, VLC_OPENGL_ES2, modlist); free(modlist); if (gl == NULL) return; if (vlc_gl_MakeCurrent(gl)) goto end; vlc_gl_Resize(gl, 1, 1); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); vlc_gl_Swap(gl); vlc_gl_ReleaseCurrent(gl); end: vlc_gl_Release(gl); } else { android_window *p_window = sys->p_window; ANativeWindow_Buffer buf; if (sys->anw->setBuffersGeometry(p_window->p_surface, 1, 1, WINDOW_FORMAT_RGB_565) == 0 && sys->anw->winLock(p_window->p_surface, &buf, NULL) == 0) { uint16_t *p_bit = buf.bits; p_bit[0] = 0x0000; sys->anw->unlockAndPost(p_window->p_surface); } } }