X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_output%2Fopengl.c;h=0db1210e392ea6fda26fed7a8869b7d853b4b09d;hb=8df18e2daf0d16177fd5317e0784ef637e307e32;hp=568217ed10ebfa96a62affba93cadd748a758f5b;hpb=67daaa16e0ce6cea8878f48b44fb9b19f5e66d12;p=vlc diff --git a/modules/video_output/opengl.c b/modules/video_output/opengl.c index 568217ed10..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 @@ -123,8 +118,8 @@ vlc_module_begin () #endif add_shortcut( "opengl" ) /* Allow opengl provider plugin selection */ - add_string( "opengl-provider", "default", NULL, PROVIDER_TEXT, - PROVIDER_LONGTEXT, true ); + add_module( "opengl-provider", "opengl provider", NULL, NULL, + PROVIDER_TEXT, PROVIDER_LONGTEXT, true ) set_callbacks( CreateVout, DestroyVout ) vlc_module_end () @@ -190,14 +185,35 @@ static int CreateVout( vlc_object_t *p_this ) p_sys->p_vout->render.i_aspect = p_vout->render.i_aspect; p_sys->p_vout->fmt_render = p_vout->fmt_render; p_sys->p_vout->fmt_in = p_vout->fmt_in; - p_sys->p_vout->b_scale = p_vout->b_scale; + p_sys->p_vout->b_autoscale = p_vout->b_autoscale; + p_sys->p_vout->i_zoom = p_vout->i_zoom; p_sys->p_vout->i_alignment = p_vout->i_alignment; + var_Create( p_sys->p_vout, "video-deco", + VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); - psz = config_GetPsz( p_vout, "opengl-provider" ); + /* 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 ); + var_Create( p_sys->p_vout, "mouse-moved", VLC_VAR_BOOL ); + var_Create( p_sys->p_vout, "mouse-clicked", VLC_VAR_BOOL ); + var_Create( p_sys->p_vout, "mouse-button-down", VLC_VAR_INTEGER ); + var_Create( p_sys->p_vout, "video-on-top", + VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); + var_Create( p_sys->p_vout, "autoscale", + VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); + var_Create( p_sys->p_vout, "scale", + VLC_VAR_FLOAT | VLC_VAR_DOINHERIT ); - msg_Dbg( p_vout, "requesting \"%s\" opengl provider", - psz ? psz : "default" ); + var_AddCallback( p_sys->p_vout, "mouse-x", SendEvents, p_vout ); + var_AddCallback( p_sys->p_vout, "mouse-y", SendEvents, p_vout ); + 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 ); @@ -205,7 +221,9 @@ static int CreateVout( vlc_object_t *p_this ) { 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; } @@ -216,21 +234,6 @@ static int CreateVout( vlc_object_t *p_this ) 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 ); - var_Create( p_sys->p_vout, "mouse-moved", VLC_VAR_BOOL ); - var_Create( p_sys->p_vout, "mouse-clicked", VLC_VAR_BOOL ); - var_Create( p_sys->p_vout, "mouse-button-down", VLC_VAR_INTEGER ); - var_Create( p_sys->p_vout, "video-on-top", - VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); - - var_AddCallback( p_sys->p_vout, "mouse-x", SendEvents, p_vout ); - var_AddCallback( p_sys->p_vout, "mouse-y", SendEvents, p_vout ); - 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 ); - return VLC_SUCCESS; } @@ -246,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; @@ -267,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; @@ -280,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; @@ -380,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 ); } /***************************************************************************** @@ -392,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 ); } @@ -454,9 +459,27 @@ static int Manage( vout_thread_t *p_vout ) // to align in real time in OPENGL if (p_sys->p_vout->i_alignment != p_vout->i_alignment) { - p_vout->i_changes = VOUT_CROP_CHANGE; //to force change + p_vout->i_changes |= VOUT_CROP_CHANGE; //to force change p_sys->p_vout->i_alignment = p_vout->i_alignment; } + + /* forward signal that autoscale toggle has changed */ + if (p_vout->i_changes & VOUT_SCALE_CHANGE ) + { + p_vout->i_changes &= ~VOUT_SCALE_CHANGE; + + p_sys->p_vout->i_changes |= VOUT_SCALE_CHANGE; + } + + /* forward signal that scale has changed */ + if (p_vout->i_changes & VOUT_ZOOM_CHANGE ) + { + p_vout->i_changes &= ~VOUT_ZOOM_CHANGE; + + p_sys->p_vout->i_changes |= VOUT_ZOOM_CHANGE; + } + + return i_ret; } @@ -601,17 +624,9 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args ) { vout_sys_t *p_sys = p_vout->p_sys; - switch( i_query ) - { - case VOUT_SNAPSHOT: - return vout_vaControlDefault( p_vout, i_query, args ); - - default: - if( p_sys->p_vout->pf_control ) - return p_sys->p_vout->pf_control( p_sys->p_vout, i_query, args ); - else - return vout_vaControlDefault( p_vout, i_query, args ); - } + if( p_sys->p_vout->pf_control ) + return p_sys->p_vout->pf_control( p_sys->p_vout, i_query, args ); + return VLC_EGENERIC; } static int InitTextures( vout_thread_t *p_vout )