/** * 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 */ if (vout_display_opengl_Init (&sys->vgl, &vd->fmt, sys->gl)) 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; }
/***************************************************************************** * Init: initialize the OpenGL video thread output method *****************************************************************************/ static int Init( vout_thread_t *p_vout ) { vout_sys_t *p_sys = p_vout->p_sys; p_sys->p_vout->pf_init( p_sys->p_vout ); p_sys->gl.lock = OpenglLock; p_sys->gl.unlock = OpenglUnlock; p_sys->gl.swap = OpenglSwap; p_sys->gl.sys = p_sys->p_vout; video_format_t fmt; video_format_Init( &fmt, 0 ); video_format_Setup( &fmt, p_vout->render.i_chroma, p_vout->render.i_width, p_vout->render.i_height, p_vout->render.i_aspect * p_vout->render.i_height, VOUT_ASPECT_FACTOR * p_vout->render.i_width ); if( vout_display_opengl_Init( &p_sys->vgl, &fmt, &p_sys->gl ) ) { I_OUTPUTPICTURES = 0; return VLC_EGENERIC; } p_sys->p_pool = vout_display_opengl_GetPool( &p_sys->vgl ); if( !p_sys->p_pool ) { vout_display_opengl_Clean( &p_sys->vgl ); I_OUTPUTPICTURES = 0; return VLC_EGENERIC; } /* */ p_vout->output.i_chroma = fmt.i_chroma; p_vout->output.i_rmask = fmt.i_rmask; p_vout->output.i_gmask = fmt.i_gmask; p_vout->output.i_bmask = fmt.i_bmask; /* Since OpenGL can do rescaling for us, stick to the default * coordinates and aspect. */ p_vout->output.i_width = p_vout->render.i_width; p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; p_vout->fmt_out = p_vout->fmt_in; p_vout->fmt_out.i_chroma = p_vout->output.i_chroma; /* */ p_sys->p_current = picture_pool_Get( p_sys->p_pool ); p_vout->p_picture[0] = *p_sys->p_current; p_vout->p_picture[0].i_status = DESTROYED_PICTURE; p_vout->p_picture[0].i_type = DIRECT_PICTURE; p_vout->p_picture[0].i_refcount = 0; p_vout->p_picture[0].p_sys = NULL; PP_OUTPUTPICTURE[0] = &p_vout->p_picture[0]; I_OUTPUTPICTURES = 1; return VLC_SUCCESS; }