* prefs.m: MacOS X module for vlc
*****************************************************************************
* Copyright (C) 2002-2003 VideoLAN
- * $Id: prefs.m,v 1.38 2004/01/30 12:44:21 hartman Exp $
+ * $Id: prefs.m,v 1.39 2004/02/02 08:50:41 titer Exp $
*
* Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
* Derk-Jan Hartman <hartman at videolan.org>
#define MODULE_ID 1243
#define CAPABILITY_ID 1244
+/*****************************************************************************
+ * GetCapabilityHelp: Display the help for one capability.
+ *****************************************************************************/
+static char * GetCapabilityHelp( char *psz_capability, int i_type)
+{
+ if( psz_capability == NULL) return "";
+
+ if( !strcasecmp(psz_capability,"access") )
+ return i_type == 1 ? ACCESS_TITLE : ACCESS_HELP;
+ if( !strcasecmp(psz_capability,"audio filter") )
+ return i_type == 1 ? AUDIO_FILTER_TITLE : AUDIO_FILTER_HELP;
+ if( !strcasecmp(psz_capability,"audio output") )
+ return i_type == 1 ? AOUT_TITLE : AOUT_HELP;
+ if( !strcasecmp(psz_capability,"audio encoder") )
+ return i_type == 1 ? AOUT_ENC_TITLE : AOUT_ENC_HELP;
+ if( !strcasecmp(psz_capability,"chroma") )
+ return i_type == 1 ? CHROMA_TITLE : CHROMA_HELP;
+ if( !strcasecmp(psz_capability,"decoder") )
+ return i_type == 1 ? DECODER_TITLE : DECODER_HELP;
+ if( !strcasecmp(psz_capability,"demux") )
+ return i_type == 1 ? DEMUX_TITLE : DEMUX_HELP;
+ if( !strcasecmp(psz_capability,"interface") )
+ return i_type == 1 ? INTERFACE_TITLE : INTERFACE_HELP;
+ if( !strcasecmp(psz_capability,"sout access") )
+ return i_type == 1 ? SOUT_TITLE : SOUT_HELP;
+ if( !strcasecmp(psz_capability,"subtitle demux") )
+ return i_type == 1 ? SUBTITLE_DEMUX_TITLE : SUBTITLE_DEMUX_HELP;
+ if( !strcasecmp(psz_capability,"text renderer") )
+ return i_type == 1 ? TEXT_TITLE : TEXT_HELP;
+ if( !strcasecmp(psz_capability,"video output") )
+ return i_type == 1 ? VOUT__TITLE : VOUT_HELP;
+ if( !strcasecmp(psz_capability,"video filter") )
+ return i_type == 1 ? VIDEO_FILTER_TITLE : VIDEO_FILTER_HELP;
+
+ return " ";
+}
+
/*****************************************************************************
* VLCPrefs implementation
*****************************************************************************/
* vout.m: MacOS X video output module
*****************************************************************************
* Copyright (C) 2001-2003 VideoLAN
- * $Id: vout.m,v 1.75 2004/01/29 02:01:49 titer Exp $
+ * $Id: vout.m,v 1.76 2004/02/02 08:50:41 titer Exp $
*
* Authors: Colin Delacroix <colin@zoy.org>
* Florian G. Pflug <fgp@phlo.org>
if( p_vout->p_sys->i_opengl )
{
- /* Do this now instead of initWithFrame because we need a
- first buffer for the glTexImage2D call */
- [p_vout->p_sys->o_glview initTexture];
+ [p_vout->p_sys->o_glview lockFocus];
+ [p_vout->p_sys->o_glview initTextures];
+ [p_vout->p_sys->o_glview unlockFocus];
}
return( 0 );
}
else
{
- /* Update the texture with our new picture */
- [p_vout->p_sys->o_glview reloadTexture: p_pic->p->p_pixels];
+ if( [p_vout->p_sys->o_glview lockFocusIfCanDraw] )
+ {
+ [p_vout->p_sys->o_glview reloadTexture: p_pic];
+ [p_vout->p_sys->o_glview drawRect:
+ [p_vout->p_sys->o_glview bounds]];
+ [p_vout->p_sys->o_glview unlockFocus];
+ }
}
}
@implementation VLCGLView
-- (id) initWithFrame: (NSRect) frame
+- (id) initWithFrame: (NSRect) frame vout: (vout_thread_t*) _p_vout
{
+ p_vout = _p_vout;
+
NSOpenGLPixelFormatAttribute attribs[] =
{
NSOpenGLPFAAccelerated,
NSOpenGLPFANoRecovery,
NSOpenGLPFADoubleBuffer,
+ NSOpenGLPFAWindow,
0
};
[[self openGLContext] makeCurrentContext];
[[self openGLContext] update];
- glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
- glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
glClearColor( 0.0, 0.0, 0.0, 0.0 );
- i_init_done = 0;
+ b_init_done = 0;
return self;
}
- (void) reshape
{
- [[self openGLContext] update];
+ [[self openGLContext] makeCurrentContext];
+
NSRect bounds = [self bounds];
+
glViewport( 0, 0, (GLint) bounds.size.width,
(GLint) bounds.size.height );
+
+ /* Quad size is set in order to preserve the aspect ratio */
+ if( bounds.size.height * p_vout->output.i_aspect <
+ bounds.size.width * VOUT_ASPECT_FACTOR )
+ {
+ f_x = bounds.size.height * p_vout->render.i_aspect /
+ VOUT_ASPECT_FACTOR / bounds.size.width;
+ f_y = 1.0;
+ }
+ else
+ {
+ f_x = 1.0;
+ f_y = bounds.size.width * VOUT_ASPECT_FACTOR /
+ p_vout->render.i_aspect / bounds.size.height;
+ }
}
-- (void) initTexture
+- (void) initTextures
{
- vout_thread_t * p_vout;
- id o_window = [self window];
- p_vout = (vout_thread_t *)[o_window getVout];
-
- [self lockFocus];
+ int i;
+ GLuint pi_textures[QT_MAX_DIRECTBUFFERS];
[[self openGLContext] makeCurrentContext];
- /* Swap buffers only during the vertical retrace of the monitor.
- http://developer.apple.com/documentation/GraphicsImaging/
- Conceptual/OpenGL/chap5/chapter_5_section_44.html */
- long params[] = { 1 };
- CGLSetParameter( CGLGetCurrentContext(), kCGLCPSwapInterval,
- params );
+ /* Create textures */
+ glGenTextures( QT_MAX_DIRECTBUFFERS, pi_textures );
- /* Create the texture */
- glGenTextures( 1, &i_texture );
- glEnable( GL_TEXTURE_RECTANGLE_EXT );
- glBindTexture( GL_TEXTURE_RECTANGLE_EXT, i_texture );
-
- /* Turn on AGP transferts */
- glTexParameterf( GL_TEXTURE_RECTANGLE_EXT,
- GL_TEXTURE_PRIORITY, 0.0 );
-
- /* Use AGP texturing */
- glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
- GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_CACHED_APPLE );
-
- /* Tell the driver not to make a copy of the texture but to use
- our buffer */
- glPixelStorei( GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE );
-
- /* Linear interpolation */
- glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
- GL_TEXTURE_MIN_FILTER, GL_LINEAR );
- glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
- GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-
- /* I have no idea what this exactly does, but it seems to be
- necessary for scaling */
- glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
- GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE );
- glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
- GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
-
- glTexImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA,
- p_vout->output.i_width, p_vout->output.i_height, 0,
- GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE,
- PP_OUTPUTPICTURE[0]->p_data );
+ for( i = 0; i < I_OUTPUTPICTURES; i++ )
+ {
+ glEnable( GL_TEXTURE_RECTANGLE_EXT );
+ glEnable( GL_UNPACK_CLIENT_STORAGE_APPLE );
+ glEnable( GL_APPLE_texture_range );
+
+ glBindTexture( GL_TEXTURE_RECTANGLE_EXT, pi_textures[i] );
+
+#if 0
+ FIXME: the lines below are supposed to avoid a memcpy and get
+ a noticeable performance boost, but they are annoying side
+ effects at the moment -- titer
+
+ /* Use AGP texturing */
+ glTextureRangeAPPLE( GL_TEXTURE_RECTANGLE_EXT, 0, NULL );
+ glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
+ GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_SHARED_APPLE );
+#endif
+
+ /* Tell the driver not to make a copy of the texture but to use
+ our buffer */
+ glPixelStorei( GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE );
+
+ /* Linear interpolation */
+ glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
+ GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
+ GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+
+ /* I have no idea what this exactly does, but it seems to be
+ necessary for scaling */
+ glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
+ GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE );
+ glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
+ GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
+
+ glTexImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA,
+ p_vout->output.i_width, p_vout->output.i_height, 0,
+ GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE,
+ PP_OUTPUTPICTURE[i]->p_data );
+
+ PP_OUTPUTPICTURE[i]->p_sys = malloc( sizeof( GLuint ) );
+ *((GLuint*) PP_OUTPUTPICTURE[i]->p_sys) = pi_textures[i];
+ }
- i_init_done = 1;
-
- [self unlockFocus];
+ b_init_done = 1;
}
-- (void) reloadTexture: (uint8_t *) buffer
+- (void) reloadTexture: (picture_t *) p_pic
{
- vout_thread_t * p_vout;
- id o_window = [self window];
- p_vout = (vout_thread_t *)[o_window getVout];
+ i_cur_texture = *((GLuint*) p_pic->p_sys);
- [self lockFocus];
-
[[self openGLContext] makeCurrentContext];
- glBindTexture( GL_TEXTURE_RECTANGLE_EXT, i_texture );
- /* glTexSubImage2D is usually faster than glTexImage2D */
+ glBindTexture( GL_TEXTURE_RECTANGLE_EXT, i_cur_texture );
+
+ /* glTexSubImage2D is faster than glTexImage2D
+ http://developer.apple.com/samplecode/Sample_Code/Graphics_3D/
+ TextureRange/MainOpenGLView.m.htm */
glTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0,
p_vout->output.i_width, p_vout->output.i_height,
GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE,
- buffer );
- [self drawRect: [self bounds]];
-
- [self unlockFocus];
+ p_pic->p_data );
}
- (void) drawRect: (NSRect) rect
{
- vout_thread_t * p_vout;
- id o_window = [self window];
- p_vout = (vout_thread_t *)[o_window getVout];
+ [[self openGLContext] makeCurrentContext];
+ /* Swap buffers only during the vertical retrace of the monitor.
+ http://developer.apple.com/documentation/GraphicsImaging/
+ Conceptual/OpenGL/chap5/chapter_5_section_44.html */
+ long params[] = { 1 };
+ CGLSetParameter( CGLGetCurrentContext(), kCGLCPSwapInterval,
+ params );
+
/* Black background */
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
- if( !i_init_done )
- return;
-
- /* Draw a quad with our texture on it. Quad size is set in order
- to preserve the aspect ratio */
- NSRect bounds = [self bounds];
- float f_x, f_y;
- if( bounds.size.height * p_vout->output.i_aspect <
- bounds.size.width * VOUT_ASPECT_FACTOR )
+ if( !b_init_done )
{
- f_x = bounds.size.height * p_vout->output.i_aspect /
- VOUT_ASPECT_FACTOR / bounds.size.width;
- f_y = 1.0;
- }
- else
- {
- f_x = 1.0;
- f_y = bounds.size.width * VOUT_ASPECT_FACTOR /
- p_vout->output.i_aspect / bounds.size.height;
+ [[self openGLContext] flushBuffer];
+ return;
}
- glBindTexture( GL_TEXTURE_RECTANGLE_EXT, i_texture );
+ /* Draw a quad with our texture on it */
+ glBindTexture( GL_TEXTURE_RECTANGLE_EXT, i_cur_texture );
glBegin( GL_QUADS );
/* Top left */
- glTexCoord2f( 0.0f, 0.0f );
+ glTexCoord2f( 0.0, 0.0 );
glVertex2f( - f_x, f_y );
/* Bottom left */
- glTexCoord2f( 0.0f, (float) p_vout->output.i_height );
+ glTexCoord2f( 0.0, (float) p_vout->output.i_height );
glVertex2f( - f_x, - f_y );
/* Bottom right */
glTexCoord2f( (float) p_vout->output.i_width,
(float) p_vout->output.i_height );
glVertex2f( f_x, - f_y );
/* Top right */
- glTexCoord2f( (float) p_vout->output.i_width, 0.0f );
+ glTexCoord2f( (float) p_vout->output.i_width, 0.0 );
glVertex2f( f_x, f_y );
glEnd();
else
{
#define o_glview p_vout->p_sys->o_glview
- o_glview = [[VLCGLView alloc] initWithFrame: p_vout->p_sys->s_rect];
+ o_glview = [[VLCGLView alloc] initWithFrame: p_vout->p_sys->s_rect vout: p_vout];
[p_vout->p_sys->o_window setContentView: o_glview];
[o_glview autorelease];
#undef o_glview