* vout.m: MacOS X video output module
*****************************************************************************
* Copyright (C) 2001-2003 VideoLAN
- * $Id: vout.m,v 1.73 2004/01/28 14:36:53 titer Exp $
+ * $Id: vout.m,v 1.74 2004/01/28 21:31:15 titer Exp $
*
* Authors: Colin Delacroix <colin@zoy.org>
* Florian G. Pflug <fgp@phlo.org>
if( !fmt )
{
fprintf( stderr, "Cannot create NSOpenGLPixelFormat\n" );
- return self;
+ return nil;
}
self = [super initWithFrame:frame pixelFormat: fmt];
if( !i_textures_loaded )
{
- glGenTextures( 3, pi_textures );
+ glGenTextures( 1, &i_texture );
+ glEnable( GL_TEXTURE_RECTANGLE_EXT );
+ glBindTexture(GL_TEXTURE_RECTANGLE_EXT, i_texture);
+ 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_index]->p_data );
+
+ /* 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 );
+
i_textures_loaded = 1;
}
else
{
- glDisable( GL_TEXTURE_2D );
- glEnable( GL_TEXTURE_RECTANGLE_EXT );
- glBindTexture(GL_TEXTURE_RECTANGLE_EXT, pi_textures[i_index]);
-
- /* Map our buffer to the texture */
- glTexImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA,
- p_vout->output.i_width, p_vout->output.i_height, 0,
+ /* glTexSubImage2D is supposed to be faster than glTexImage2D,
+ so we use it starting from the second frame */
+ glBindTexture(GL_TEXTURE_RECTANGLE_EXT, i_texture);
+ 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,
PP_OUTPUTPICTURE[i_index]->p_data );
}
- glDisable( GL_TEXTURE_2D );
- glEnable( GL_TEXTURE_RECTANGLE_EXT );
- glBindTexture(GL_TEXTURE_RECTANGLE_EXT, pi_textures[i_index] );
-
- /* 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 out
- 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 );
-
-
- /* Draw a quad with our texture on it */
+ /* 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->i_window_width <
- bounds.size.width * p_vout->i_window_height )
+ if( bounds.size.height * p_vout->output.i_aspect <
+ bounds.size.width * VOUT_ASPECT_FACTOR )
{
- f_x = bounds.size.height * p_vout->i_window_width /
- bounds.size.width / p_vout->i_window_height;
+ 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 * p_vout->i_window_height /
- bounds.size.height / p_vout->i_window_width;
+ f_y = bounds.size.width * VOUT_ASPECT_FACTOR /
+ p_vout->output.i_aspect / bounds.size.height;
}
glBegin( GL_QUADS );