summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_out/macosx/video_window.h6
-rw-r--r--src/video_out/macosx/video_window.m60
-rw-r--r--src/video_out/video_out_macosx.m5
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) {