]> git.sesse.net Git - vlc/blobdiff - modules/video_output/macosx.m
Use var_InheritString for --decklink-video-connection.
[vlc] / modules / video_output / macosx.m
index ff965fd3b542d96834661908d47a5ee1f85497c9..5bacb08ceffc521ca371efb05a65dea1515ddb01 100644 (file)
@@ -72,8 +72,7 @@ vlc_module_begin ()
     set_capability("vout display", 300)
     set_callbacks(Open, Close)
 
-    add_shortcut("macosx")
-    add_shortcut("vout_macosx")
+    add_shortcut("macosx", "vout_macosx")
 vlc_module_end ()
 
 /**
@@ -99,6 +98,7 @@ struct vout_display_sys_t
     VLCOpenGLVideoView *glView;
     id<VLCOpenGLVideoViewEmbedding> container;
 
+    vout_window_t *embed;
     vout_opengl_t gl;
     vout_display_opengl_t vgl;
 
@@ -119,13 +119,34 @@ static int Open(vlc_object_t *this)
     vd->sys = sys;
     sys->pool = NULL;
     sys->gl.sys = NULL;
+    sys->embed = NULL;
 
     /* Get the drawable object */
     id container = var_CreateGetAddress(vd, "drawable-nsobject");
-    if (!container)
+    if (container)
     {
-        msg_Dbg(vd, "No drawable-nsobject, passing over.");
-        goto error;
+        vout_display_DeleteWindow(vd, NULL);
+    }
+    else
+    {
+        vout_window_cfg_t wnd_cfg;
+
+        memset (&wnd_cfg, 0, sizeof (wnd_cfg));
+        wnd_cfg.type = VOUT_WINDOW_TYPE_NSOBJECT;
+        wnd_cfg.x = var_InheritInteger (vd, "video-x");
+        wnd_cfg.y = var_InheritInteger (vd, "video-y");
+        wnd_cfg.width  = vd->cfg->display.width;
+        wnd_cfg.height = vd->cfg->display.height;
+
+        sys->embed = vout_display_NewWindow (vd, &wnd_cfg);
+        if (sys->embed)
+            container = sys->embed->handle.nsobject;
+
+        if (!container)
+        {
+            msg_Dbg(vd, "No drawable-nsobject nor vout_window_t found, passing over.");
+            goto error;
+        }
     }
 
     /* This will be released in Close(), on
@@ -150,7 +171,7 @@ static int Open(vlc_object_t *this)
     {
         NSView *parentView = container;
         [parentView performSelectorOnMainThread:@selector(addSubview:) withObject:sys->glView waitUntilDone:NO];
-        [sys->glView performSelectorOnMainThread:@selector(setFrame:) withObject:[NSValue valueWithRect:[parentView bounds]] waitUntilDone:NO];
+        [sys->glView performSelectorOnMainThread:@selector(setFrameWithValue:) withObject:[NSValue valueWithRect:[parentView bounds]] waitUntilDone:NO];
     }
     else
     {
@@ -220,6 +241,8 @@ void Close(vlc_object_t *this)
     if (sys->gl.sys != NULL)
         vout_display_opengl_Clean(&sys->vgl);
 
+    if (sys->embed)
+        vout_display_DeleteWindow(vd, sys->embed);
     free (sys);
 }
 
@@ -374,6 +397,14 @@ static void OpenglSwap(vout_opengl_t *gl)
     return self;
 }
 
+/**
+ * Gets called by the Open() method.
+ */
+- setFrameWithValue:(NSValue *)value
+{
+    [self setFrame:[value rectValue]];
+}
+
 /**
  * Gets called by the Close and Open methods.
  * (Non main thread).
@@ -419,7 +450,10 @@ static void OpenglSwap(vout_opengl_t *gl)
 - (BOOL)lockgl
 {
     VLCAssertMainThread();
-    CGLError err = CGLLockContext([[self openGLContext] CGLContextObj]);
+    NSOpenGLContext *context = [self openGLContext];
+    CGLError err = CGLLockContext([context CGLContextObj]);
+    if (err == kCGLNoError)
+        [context makeCurrentContext];
     return err == kCGLNoError;
 }
 
@@ -493,21 +527,21 @@ static void OpenglSwap(vout_opengl_t *gl)
         }
     }
 
-    [self lockgl];
-
-    glViewport((width - x) / 2, (height - y) / 2, x, y);
+    if ([self lockgl]) {
+        glViewport((width - x) / 2, (height - y) / 2, x, y);
 
-    @synchronized(self) {
-        // This may be cleared before -drawRect is being called,
-        // in this case we'll skip the rendering.
-        // This will save us for rendering two frames (or more) for nothing
-        // (one by the vout, one (or more) by drawRect)
-        _hasPendingReshape = YES;
-    }
+        @synchronized(self) {
+            // This may be cleared before -drawRect is being called,
+            // in this case we'll skip the rendering.
+            // This will save us for rendering two frames (or more) for nothing
+            // (one by the vout, one (or more) by drawRect)
+            _hasPendingReshape = YES;
+        }
 
-    [self unlockgl];
+        [self unlockgl];
 
-    [super reshape];
+        [super reshape];
+    }
 }
 
 /**