diff options
-rw-r--r-- | src/video_out/macosx/video_window.h | 6 | ||||
-rw-r--r-- | src/video_out/macosx/video_window.m | 60 | ||||
-rw-r--r-- | src/video_out/video_out_macosx.m | 5 |
3 files changed, 57 insertions, 14 deletions
diff --git a/src/video_out/macosx/video_window.h b/src/video_out/macosx/video_window.h index f9217f56e..e0f199305 100644 --- a/src/video_out/macosx/video_window.h +++ b/src/video_out/macosx/video_window.h @@ -40,6 +40,8 @@ typedef enum { NSOpenGLContext *fullScreenContext; NSOpenGLContext *currentContext; NSLock *mutex; + BOOL keepsVideoAspectRatio; + BOOL resizeViewToVideoSizeOnLoad; } - (void) displayTexture; @@ -58,6 +60,10 @@ typedef enum { - (void) setHalfSize; - (void) setDoubleSize; - (NSSize) videoSize; +- (void) setKeepsVideoAspectRatio:(BOOL)flag; +- (BOOL) keepsVideoAspectRatio; +- (void) setResizeViewToVideoSizeOnLoad:(BOOL)flag; +- (BOOL) resizeViewToVideoSizeOnLoad; /* Delegate methods */ - (id) delegate; diff --git a/src/video_out/macosx/video_window.m b/src/video_out/macosx/video_window.m index d3b3aec83..20d311337 100644 --- a/src/video_out/macosx/video_window.m +++ b/src/video_out/macosx/video_window.m @@ -78,6 +78,7 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; screen: aScreen]; xineView = [[XineOpenGLView alloc] initWithFrame:rect]; + [xineView setResizeViewToVideoSizeOnLoad:YES]; /* receive notifications about window resizing from the xine view */ [xineView setDelegate:self]; @@ -146,6 +147,26 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; @implementation XineOpenGLView +- (void) setKeepsVideoAspectRatio:(BOOL)flag +{ + keepsVideoAspectRatio = flag; +} + +- (BOOL) keepsVideoAspectRatio +{ + return keepsVideoAspectRatio; +} + +- (void) setResizeViewToVideoSizeOnLoad:(BOOL)flag +{ + resizeViewToVideoSizeOnLoad = flag; +} + +- (BOOL) resizeViewToVideoSizeOnLoad +{ + return resizeViewToVideoSizeOnLoad; +} + - (BOOL)mouseDownCanMoveWindow { return YES; } @@ -187,11 +208,10 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; currentContext = [self openGLContext]; [currentContext makeCurrentContext]; + [mutex lock]; [currentContext update]; + [mutex unlock]; - /* Black background */ - glClearColor (0.0, 0.0, 0.0, 0.0); - i_texture = 0; initDone = NO; isFullScreen = NO; @@ -202,6 +222,9 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; [self initTextures]; + /* Black background */ + glClearColor (0.0, 0.0, 0.0, 0.0); + return self; } @@ -210,11 +233,20 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; [super initWithCoder:coder]; self = [self initWithFrame:[self frame]]; + + keepsVideoAspectRatio = [coder decodeBoolForKey:@"keepsVideoAspectRatio"]; + resizeViewToVideoSizeOnLoad = [coder decodeBoolForKey: + @"resizeViewToVideoSizeOnLoad"]; + return self; } - (void) encodeWithCoder:(NSCoder *)coder { + [coder encodeBool:keepsVideoAspectRatio forKey:@"keepsVideoAspectRatio"]; + [coder encodeBool:resizeViewToVideoSizeOnLoad + forKey:@"resizeViewToVideoSizeOnLoad"]; + [super encodeWithCoder:coder]; } @@ -224,16 +256,20 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; if (fullScreenContext) { [NSOpenGLContext clearCurrentContext]; + [mutex lock]; [fullScreenContext clearDrawable]; [fullScreenContext release]; + [mutex unlock]; if (currentContext == fullScreenContext) currentContext = nil; fullScreenContext = nil; } if (currentContext) { [NSOpenGLContext clearCurrentContext]; + [mutex lock]; [currentContext clearDrawable]; [currentContext release]; + [mutex unlock]; currentContext = nil; } @@ -358,13 +394,12 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; } - (void) reloadTexture { - [mutex lock]; - if (!initDone) { - [mutex unlock]; return; } + [mutex lock]; + [currentContext makeCurrentContext]; glBindTexture (GL_TEXTURE_RECTANGLE_EXT, i_texture); @@ -420,7 +455,9 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; printf ("MacOSX fullscreen mode: %dx%d => %dx%d @ %d,%d\n", video_width, video_height, w, h, x, y); + [mutex lock]; glViewport (x, y, w, h); + [mutex unlock]; } - (void) goFullScreen: (XineVideoWindowFullScreenMode) mode { @@ -483,7 +520,9 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; /* Free current OpenGL context */ [NSOpenGLContext clearCurrentContext]; + [mutex lock]; [fullScreenContext clearDrawable]; + [mutex unlock]; [fullScreenContext release]; fullScreenContext = nil; CGReleaseAllDisplays(); @@ -520,11 +559,12 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; - (void) drawRect: (NSRect) rect { [currentContext makeCurrentContext]; - if (!initDone || ![mutex tryLock]) { - [currentContext flushBuffer]; + if (!initDone) { return; } + [mutex lock]; + /* Swap buffers only during the vertical retrace of the monitor. http://developer.apple.com/documentation/GraphicsImaging/Conceptual/OpenGL/chap5/chapter_5_section_44.html */ @@ -565,11 +605,9 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; NSValue *sizeWrapper = [NSValue valueWithBytes:&size objCType:@encode(NSSize)]; - [mutex lock]; [self performSelectorOnMainThread:@selector(setViewSize:) withObject:sizeWrapper waitUntilDone:NO]; - [mutex unlock]; [pool release]; } @@ -609,7 +647,7 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; if (isFullScreen) [self calcFullScreenAspect]; - [self initTextures]; + [self initTextures]; } - (BOOL) isFullScreen { diff --git a/src/video_out/video_out_macosx.m b/src/video_out/video_out_macosx.m index 3585ed0af..c50a65f40 100644 --- a/src/video_out/video_out_macosx.m +++ b/src/video_out/video_out_macosx.m @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: video_out_macosx.m,v 1.6 2004/06/19 15:25:01 athp Exp $ + * $Id: video_out_macosx.m,v 1.7 2004/07/05 01:20:01 athp Exp $ * * This output driver makes use of xine's objective-c video_output * classes located in the macosx folder. @@ -159,7 +159,6 @@ static void macosx_update_frame_format(vo_driver_t *vo_driver, vo_frame_t *vo_fr } [this->view setVideoSize:video_size]; - [this->view setViewSizeInMainThread:video_size]; if((format == XINE_IMGFMT_YV12 && (frame->vo_frame.base[0] == NULL @@ -306,7 +305,7 @@ static char* get_identifier (video_driver_class_t *driver_class) { } static char* get_description (video_driver_class_t *driver_class) { - return _("xine video output plugin for MacOSX"); + return _("xine video output plugin for Mac OS X"); } static void dispose_class (video_driver_class_t *driver_class) { |