X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_output%2Fopengl.c;h=0db1210e392ea6fda26fed7a8869b7d853b4b09d;hb=3b8026787a014e483a3721355b7b530aea79dae7;hp=ecacbeb48b45134afc1b450791a37d3a2c57c7cc;hpb=548f78df2e9dd0ba08055d34b021480a016870b2;p=vlc diff --git a/modules/video_output/opengl.c b/modules/video_output/opengl.c index ecacbeb48b..0db1210e39 100644 --- a/modules/video_output/opengl.c +++ b/modules/video_output/opengl.c @@ -39,56 +39,51 @@ #include #ifdef __APPLE__ -#include -#include +# include +# include +#else +# include +#endif + +#ifndef YCBCR_MESA +# define YCBCR_MESA 0x8757 +#endif +#ifndef UNSIGNED_SHORT_8_8_MESA +# define UNSIGNED_SHORT_8_8_MESA 0x85BA +#endif +/* RV16 */ +#ifndef GL_UNSIGNED_SHORT_5_6_5 +# define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#endif +#ifndef GL_CLAMP_TO_EDGE +# define GL_CLAMP_TO_EDGE 0x812F +#endif +#ifdef __APPLE__ /* On OS X, use GL_TEXTURE_RECTANGLE_EXT instead of GL_TEXTURE_2D. This allows sizes which are not powers of 2 */ -#define VLCGL_TARGET GL_TEXTURE_RECTANGLE_EXT +# define VLCGL_TARGET GL_TEXTURE_RECTANGLE_EXT /* OS X OpenGL supports YUV. Hehe. */ -#define VLCGL_FORMAT GL_YCBCR_422_APPLE -#define VLCGL_TYPE GL_UNSIGNED_SHORT_8_8_APPLE +# define VLCGL_FORMAT GL_YCBCR_422_APPLE +# define VLCGL_TYPE GL_UNSIGNED_SHORT_8_8_APPLE #else -#include -#define VLCGL_TARGET GL_TEXTURE_2D - -/* RV16 */ -#ifndef GL_UNSIGNED_SHORT_5_6_5 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#endif -//#define VLCGL_RGB_FORMAT GL_RGB -//#define VLCGL_RGB_TYPE GL_UNSIGNED_SHORT_5_6_5 - -/* RV24 */ -//#define VLCGL_RGB_FORMAT GL_RGB -//#define VLCGL_RGB_TYPE GL_UNSIGNED_BYTE +# define VLCGL_TARGET GL_TEXTURE_2D /* RV32 */ -#define VLCGL_RGB_FORMAT GL_RGBA -#define VLCGL_RGB_TYPE GL_UNSIGNED_BYTE +# define VLCGL_RGB_FORMAT GL_RGBA +# define VLCGL_RGB_TYPE GL_UNSIGNED_BYTE /* YUY2 */ -#ifndef YCBCR_MESA -#define YCBCR_MESA 0x8757 -#endif -#ifndef UNSIGNED_SHORT_8_8_MESA -#define UNSIGNED_SHORT_8_8_MESA 0x85BA -#endif -#define VLCGL_YUV_FORMAT YCBCR_MESA -#define VLCGL_YUV_TYPE UNSIGNED_SHORT_8_8_MESA +# define VLCGL_YUV_FORMAT YCBCR_MESA +# define VLCGL_YUV_TYPE UNSIGNED_SHORT_8_8_MESA /* Use RGB on Win32/GLX */ -#define VLCGL_FORMAT VLCGL_RGB_FORMAT -#define VLCGL_TYPE VLCGL_RGB_TYPE -//#define VLCGL_FORMAT VLCGL_YUV_FORMAT -//#define VLCGL_TYPE VLCGL_YUV_TYPE +# define VLCGL_FORMAT VLCGL_RGB_FORMAT +# define VLCGL_TYPE VLCGL_RGB_TYPE #endif -#ifndef GL_CLAMP_TO_EDGE -# define GL_CLAMP_TO_EDGE 0x812F -#endif /***************************************************************************** * Vout interface @@ -196,26 +191,6 @@ static int CreateVout( vlc_object_t *p_this ) var_Create( p_sys->p_vout, "video-deco", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); - psz = var_CreateGetString( p_vout, "opengl-provider" ); - p_sys->p_vout->p_module = - module_need( p_sys->p_vout, "opengl provider", psz, false ); - free( psz ); - if( p_sys->p_vout->p_module == NULL ) - { - msg_Warn( p_vout, "No OpenGL provider found" ); - vlc_object_detach( p_sys->p_vout ); - vlc_object_release( p_sys->p_vout ); - free( p_sys ); - return VLC_ENOOBJ; - } - - p_vout->pf_init = Init; - p_vout->pf_end = End; - p_vout->pf_manage = Manage; - p_vout->pf_render = Render; - p_vout->pf_display = DisplayVideo; - p_vout->pf_control = Control; - /* Forward events from the opengl provider */ var_Create( p_sys->p_vout, "mouse-x", VLC_VAR_INTEGER ); var_Create( p_sys->p_vout, "mouse-y", VLC_VAR_INTEGER ); @@ -234,9 +209,31 @@ static int CreateVout( vlc_object_t *p_this ) var_AddCallback( p_sys->p_vout, "mouse-moved", SendEvents, p_vout ); var_AddCallback( p_sys->p_vout, "mouse-clicked", SendEvents, p_vout ); var_AddCallback( p_sys->p_vout, "mouse-button-down", SendEvents, p_vout ); + var_AddCallback( p_sys->p_vout, "video-on-top", SendEvents, p_vout ); var_AddCallback( p_vout, "autoscale", SendEvents, p_sys->p_vout ); var_AddCallback( p_vout, "scale", SendEvents, p_sys->p_vout ); + psz = var_CreateGetString( p_vout, "opengl-provider" ); + p_sys->p_vout->p_module = + module_need( p_sys->p_vout, "opengl provider", psz, false ); + free( psz ); + if( p_sys->p_vout->p_module == NULL ) + { + msg_Warn( p_vout, "No OpenGL provider found" ); + vlc_object_detach( p_sys->p_vout ); + /* no need for var_DelCallback here :-) */ + vlc_object_release( p_sys->p_vout ); + free( p_sys ); + return VLC_ENOOBJ; + } + + p_vout->pf_init = Init; + p_vout->pf_end = End; + p_vout->pf_manage = Manage; + p_vout->pf_render = Render; + p_vout->pf_display = DisplayVideo; + p_vout->pf_control = Control; + return VLC_SUCCESS; } @@ -252,16 +249,16 @@ static int Init( vout_thread_t *p_vout ) /* TODO: We use YCbCr on Mac which is Y422, but on OSX it seems to == YUY2. Verify */ #if ( defined( WORDS_BIGENDIAN ) && VLCGL_FORMAT == GL_YCBCR_422_APPLE ) || (VLCGL_FORMAT == YCBCR_MESA) - p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2'); + p_vout->output.i_chroma = VLC_CODEC_YUYV; i_pixel_pitch = 2; -#elif (VLCGL_FORMAT == GL_YCBCR_422_APPLE) - p_vout->output.i_chroma = VLC_FOURCC('U','Y','V','Y'); +#elif defined( GL_YCBCR_422_APPLE ) && (VLCGL_FORMAT == GL_YCBCR_422_APPLE) + p_vout->output.i_chroma = VLC_CODEC_UYVY; i_pixel_pitch = 2; #elif VLCGL_FORMAT == GL_RGB # if VLCGL_TYPE == GL_UNSIGNED_BYTE - p_vout->output.i_chroma = VLC_FOURCC('R','V','2','4'); + p_vout->output.i_chroma = VLC_CODEC_RGB24; # if defined( WORDS_BIGENDIAN ) p_vout->output.i_rmask = 0x00ff0000; p_vout->output.i_gmask = 0x0000ff00; @@ -273,7 +270,7 @@ static int Init( vout_thread_t *p_vout ) # endif i_pixel_pitch = 3; # else - p_vout->output.i_chroma = VLC_FOURCC('R','V','1','6'); + p_vout->output.i_chroma = VLC_CODEC_RGB16; # if defined( WORDS_BIGENDIAN ) p_vout->output.i_rmask = 0x001f; p_vout->output.i_gmask = 0x07e0; @@ -286,7 +283,7 @@ static int Init( vout_thread_t *p_vout ) i_pixel_pitch = 2; # endif #else - p_vout->output.i_chroma = VLC_FOURCC('R','V','3','2'); + p_vout->output.i_chroma = VLC_CODEC_RGB32; # if defined( WORDS_BIGENDIAN ) p_vout->output.i_rmask = 0xff000000; p_vout->output.i_gmask = 0x00ff0000; @@ -386,6 +383,11 @@ static void End( vout_thread_t *p_vout ) { p_sys->p_vout->pf_unlock( p_sys->p_vout ); } + + /* We must release the opengl provider here: opengl requiere init and end + to be done in the same thread */ + module_unneed( p_sys->p_vout, p_sys->p_vout->p_module ); + vlc_object_release( p_sys->p_vout ); } /***************************************************************************** @@ -398,9 +400,6 @@ static void DestroyVout( vlc_object_t *p_this ) vout_thread_t *p_vout = (vout_thread_t *)p_this; vout_sys_t *p_sys = p_vout->p_sys; - module_unneed( p_sys->p_vout, p_sys->p_vout->p_module ); - vlc_object_release( p_sys->p_vout ); - free( p_sys ); }