?? opengl.c
字號:
/***************************************************************************** * opengl.c: OpenGL video output ***************************************************************************** * Copyright (C) 2004-2006 the VideoLAN team * $Id: opengl.c 19582 2007-03-31 23:56:53Z hartman $ * * Authors: Cyril Deguet <asmax@videolan.org> * Gildas Bazin <gbazin@videolan.org> * Eric Petit <titer@m0k.org> * Cedric Cocquebert <cedric.cocquebert@supelec.fr> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#include <errno.h> /* ENOMEM */#include <stdlib.h> /* malloc(), free() */#include <string.h>#include <vlc/vlc.h>#include <vlc/vout.h>#ifdef __APPLE__#include <OpenGL/gl.h>#include <OpenGL/glext.h>/* 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/* OS X OpenGL supports YUV. Hehe. */#define VLCGL_FORMAT GL_YCBCR_422_APPLE#define VLCGL_TYPE GL_UNSIGNED_SHORT_8_8_APPLE#else#include <GL/gl.h>#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/* RV32 */#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/* 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#endif#ifndef GL_CLAMP_TO_EDGE# define GL_CLAMP_TO_EDGE 0x812F#endif/* OpenGL effects */#define OPENGL_EFFECT_NONE 1#define OPENGL_EFFECT_CUBE 2#define OPENGL_EFFECT_TRANSPARENT_CUBE 4#if defined( HAVE_GL_GLU_H ) || defined( SYS_DARWIN ) #define OPENGL_MORE_EFFECT 8#endif#ifdef OPENGL_MORE_EFFECT #include <math.h> #ifdef SYS_DARWIN #include <OpenGL/glu.h> #else #include <GL/glu.h> #endif/* 3D MODEL */ #define CYLINDER 8 #define TORUS 16 #define SPHERE 32/*GRID2D TRANSFORMATION */ #define SQUAREXY 64 #define SQUARER 128 #define ASINXY 256 #define ASINR 512 #define SINEXY 1024 #define SINER 2048 #define INIFILE 4096 // not used, just for mark end ... #define SIGN(x) (x < 0 ? (-1) : 1) #define PID2 1.570796326794896619231322 static char *ppsz_effects[] = { "none", "cube", "transparent-cube", "cylinder", "torus", "sphere","SQUAREXY","SQUARER", "ASINXY", "ASINR", "SINEXY", "SINER" }; static char *ppsz_effects_text[] = { N_("None"), N_("Cube"), N_("Transparent Cube"), N_("Cylinder"), N_("Torus"), N_("Sphere"), N_("SQUAREXY"),N_("SQUARER"), N_("ASINXY"), N_("ASINR"), N_("SINEXY"), N_("SINER") };#endif/***************************************************************************** * Vout interface *****************************************************************************/static int CreateVout ( vlc_object_t * );static void DestroyVout ( vlc_object_t * );static int Init ( vout_thread_t * );static void End ( vout_thread_t * );static int Manage ( vout_thread_t * );static void Render ( vout_thread_t *, picture_t * );static void DisplayVideo ( vout_thread_t *, picture_t * );static int Control ( vout_thread_t *, int, va_list );static inline int GetAlignedSize( int );static int InitTextures( vout_thread_t * );static int SendEvents( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );/***************************************************************************** * Module descriptor *****************************************************************************/#ifdef OPENGL_MORE_EFFECT#define ACCURACY_TEXT N_( "OpenGL sampling accuracy " )#define ACCURACY_LONGTEXT N_( "Select the accuracy of 3D object sampling(1 = min and 10 = max)" )#define RADIUS_TEXT N_( "OpenGL Cylinder radius" )#define RADIUS_LONGTEXT N_( "Radius of the OpenGL cylinder effect, if enabled" )#define POV_X_TEXT N_("Point of view x-coordinate")#define POV_X_LONGTEXT N_("Point of view (X coordinate) of the cube/cylinder "\ "effect, if enabled.")#define POV_Y_TEXT N_("Point of view y-coordinate")#define POV_Y_LONGTEXT N_("Point of view (Y coordinate) of the cube/cylinder "\ "effect, if enabled.")#define POV_Z_TEXT N_("Point of view z-coordinate")#define POV_Z_LONGTEXT N_("Point of view (Z coordinate) of the cube/cylinder "\ "effect, if enabled.")#endif#define SPEED_TEXT N_( "OpenGL cube rotation speed" )#define SPEED_LONGTEXT N_( "Rotation speed of the OpenGL cube effect, if " \ "enabled." )#define EFFECT_TEXT N_("Effect")#define EFFECT_LONGTEXT N_( \ "Several visual OpenGL effects are available." )#ifndef OPENGL_MORE_EFFECTstatic char *ppsz_effects[] = { "none", "cube", "transparent-cube" };static char *ppsz_effects_text[] = { N_("None"), N_("Cube"), N_("Transparent Cube") };#endifvlc_module_begin(); set_shortname( "OpenGL" ); set_category( CAT_VIDEO ); set_subcategory( SUBCAT_VIDEO_VOUT ); set_description( _("OpenGL video output") );#ifdef __APPLE__ set_capability( "video output", 200 );#else set_capability( "video output", 20 );#endif add_shortcut( "opengl" ); add_float( "opengl-cube-speed", 2.0, NULL, SPEED_TEXT, SPEED_LONGTEXT, VLC_TRUE );#ifdef OPENGL_MORE_EFFECT add_integer_with_range( "opengl-accuracy", 4, 1, 10, NULL, ACCURACY_TEXT, ACCURACY_LONGTEXT, VLC_TRUE ); add_float_with_range( "opengl-pov-x", 0.0, -1.0, 1.0, NULL, POV_X_TEXT, POV_X_LONGTEXT, VLC_TRUE ); add_float_with_range( "opengl-pov-y", 0.0, -1.0, 1.0, NULL, POV_Y_TEXT, POV_Y_LONGTEXT, VLC_TRUE ); add_float_with_range( "opengl-pov-z", -1.0, -1.0, 1.0, NULL, POV_Z_TEXT, POV_Z_LONGTEXT, VLC_TRUE ); add_float( "opengl-cylinder-radius", -100.0, NULL, RADIUS_TEXT, RADIUS_LONGTEXT, VLC_TRUE );#endif set_callbacks( CreateVout, DestroyVout ); add_string( "opengl-effect", "none", NULL, EFFECT_TEXT, EFFECT_LONGTEXT, VLC_FALSE ); change_string_list( ppsz_effects, ppsz_effects_text, 0 );vlc_module_end();/***************************************************************************** * vout_sys_t: video output method descriptor ***************************************************************************** * This structure is part of the video output thread descriptor. * It describes the OpenGL specific properties of the output thread. *****************************************************************************/struct vout_sys_t{ vout_thread_t *p_vout; uint8_t *pp_buffer[2]; int i_index; int i_tex_width; int i_tex_height; GLuint p_textures[2]; int i_effect; float f_speed;#ifdef OPENGL_MORE_EFFECT // cylinder radius float f_radius;#endif};/***************************************************************************** * CreateVout: This function allocates and initializes the OpenGL vout method. *****************************************************************************/static int CreateVout( vlc_object_t *p_this ){ vout_thread_t *p_vout = (vout_thread_t *)p_this; vout_sys_t *p_sys; /* Allocate structure */ p_vout->p_sys = p_sys = malloc( sizeof( vout_sys_t ) ); if( p_sys == NULL ) { msg_Err( p_vout, "out of memory" ); return VLC_EGENERIC; } var_Create( p_vout, "opengl-effect", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); p_sys->i_index = 0;#ifdef __APPLE__ p_sys->i_tex_width = p_vout->fmt_in.i_width; p_sys->i_tex_height = p_vout->fmt_in.i_height;#else /* A texture must have a size aligned on a power of 2 */ p_sys->i_tex_width = GetAlignedSize( p_vout->fmt_in.i_width ); p_sys->i_tex_height = GetAlignedSize( p_vout->fmt_in.i_height );#endif msg_Dbg( p_vout, "Texture size: %dx%d", p_sys->i_tex_width, p_sys->i_tex_height ); /* Get window */ p_sys->p_vout = (vout_thread_t *)vlc_object_create( p_this, VLC_OBJECT_OPENGL ); if( p_sys->p_vout == NULL ) { msg_Err( p_vout, "out of memory" ); return VLC_ENOMEM; } vlc_object_attach( p_sys->p_vout, p_this ); p_sys->p_vout->i_window_width = p_vout->i_window_width; p_sys->p_vout->i_window_height = p_vout->i_window_height; p_sys->p_vout->b_fullscreen = p_vout->b_fullscreen; p_sys->p_vout->render.i_width = p_vout->render.i_width; p_sys->p_vout->render.i_height = p_vout->render.i_height; 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->i_alignment = p_vout->i_alignment; p_sys->p_vout->p_module = module_Need( p_sys->p_vout, "opengl provider", NULL, 0 ); 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_destroy( p_sys->p_vout ); return VLC_ENOOBJ; } p_sys->f_speed = var_CreateGetFloat( p_vout, "opengl-cube-speed" );#ifdef OPENGL_MORE_EFFECT p_sys->f_radius = var_CreateGetFloat( p_vout, "opengl-cylinder-radius" );#endif 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 ); var_Create( p_sys->p_vout, "mouse-moved", VLC_VAR_BOOL ); var_Create( p_sys->p_vout, "mouse-clicked", VLC_VAR_INTEGER ); 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;}/***************************************************************************** * 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; int i_pixel_pitch; vlc_value_t val; p_sys->p_vout->pf_init( p_sys->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'); i_pixel_pitch = 2;#elif (VLCGL_FORMAT == GL_YCBCR_422_APPLE) p_vout->output.i_chroma = VLC_FOURCC('U','Y','V','Y'); 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');# if defined( WORDS_BIGENDIAN ) p_vout->output.i_rmask = 0x00ff0000; p_vout->output.i_gmask = 0x0000ff00; p_vout->output.i_bmask = 0x000000ff;# else p_vout->output.i_rmask = 0x000000ff; p_vout->output.i_gmask = 0x0000ff00; p_vout->output.i_bmask = 0x00ff0000;# endif i_pixel_pitch = 3;# else p_vout->output.i_chroma = VLC_FOURCC('R','V','1','6');# if defined( WORDS_BIGENDIAN ) p_vout->output.i_rmask = 0x001f; p_vout->output.i_gmask = 0x07e0; p_vout->output.i_bmask = 0xf800;# else p_vout->output.i_rmask = 0xf800; p_vout->output.i_gmask = 0x07e0; p_vout->output.i_bmask = 0x001f;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -