]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/voutqt.m
Removes trailing spaces. Removes tabs.
[vlc] / modules / gui / macosx / voutqt.m
index 5f7f175e117d481fadcfd7cacbd65fa2da4d5408..fcbd6785300d5427a486878d095c4070585c1f43 100644 (file)
@@ -2,7 +2,7 @@
  * vout.m: MacOS X video output module
  *****************************************************************************
  * Copyright (C) 2001-2004 the VideoLAN team
- * $Id: vout.m 8351 2004-08-02 13:06:38Z hartman $
+ * $Id$
  *
  * Authors: Colin Delacroix <colin@zoy.org>
  *          Florian G. Pflug <fgp@phlo.org>
@@ -15,7 +15,7 @@
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 /*****************************************************************************
  * VLCView interface
  *****************************************************************************/
-@interface VLCQTView : NSQuickDrawView
+@interface VLCQTView : NSQuickDrawView <VLCVoutViewResetting>
 {
     vout_thread_t * p_vout;
 }
 
++ (void)resetVout: (vout_thread_t *)p_vout;
 - (id) initWithVout:(vout_thread_t *)p_vout;
-
 @end
 
 struct vout_sys_t
@@ -62,7 +62,7 @@ struct vout_sys_t
     VLCVoutView       * o_vout_view;
 
     vlc_bool_t  b_saved_frame;
-    vlc_bool_t  b_altivec;
+    vlc_bool_t  b_cpu_has_simd; /* does CPU supports Altivec, MMX, etc... */
     NSRect      s_frame;
 
     CodecType i_codec;
@@ -140,17 +140,18 @@ int E_(OpenVideoQT) ( vlc_object_t *p_this )
 
     /* Are we embedded?  If so, the drawable value will be a pointer to a
      * CGrafPtr that we're expected to use */
-    var_Get( p_vout->p_vlc, "drawable", &value_drawable );
+    var_Get( p_vout->p_libvlc, "drawable", &value_drawable );
     if( value_drawable.i_int != 0 )
         p_vout->p_sys->b_embedded = VLC_TRUE;
     else
         p_vout->p_sys->b_embedded = VLC_FALSE;
 
-    p_vout->p_sys->b_altivec = p_vout->p_libvlc->i_cpu & CPU_CAPABILITY_ALTIVEC;
-    msg_Dbg( p_vout, "we do%s have Altivec", p_vout->p_sys->b_altivec ? "" : "n't" );
-    
+    p_vout->p_sys->b_cpu_has_simd =
+        vlc_CPU() & (CPU_CAPABILITY_ALTIVEC|CPU_CAPABILITY_MMXEXT);
+    msg_Dbg( p_vout, "we do%s have SIMD enabled CPU", p_vout->p_sys->b_cpu_has_simd ? "" : "n't" );
     /* Initialize QuickTime */
-    p_vout->p_sys->h_img_descr = 
+    p_vout->p_sys->h_img_descr =
         (ImageDescriptionHandle)NewHandleClear( sizeof(ImageDescription) );
     p_vout->p_sys->p_matrix =
         (MatrixRecordPtr)malloc( sizeof(MatrixRecord) );
@@ -164,11 +165,11 @@ int E_(OpenVideoQT) ( vlc_object_t *p_this )
         return VLC_EGENERIC;
     }
 
-    /* Damn QT isn't thread safe. so keep a lock in the p_vlc object */
-    vlc_mutex_lock( &p_vout->p_vlc->quicktime_lock );
+    /* Damn QT isn't thread safe. so keep a lock in the p_libvlc object */
+    vlc_mutex_lock( &p_vout->p_libvlc->quicktime_lock );
 
     /* Can we find the right chroma ? */
-    if( p_vout->p_sys->b_altivec )
+    if( p_vout->p_sys->b_cpu_has_simd )
     {
         err = FindCodec( kYUVSPixelFormat, bestSpeedCodec,
                         nil, &p_vout->p_sys->img_dc );
@@ -178,11 +179,11 @@ int E_(OpenVideoQT) ( vlc_object_t *p_this )
         err = FindCodec( kYUV420CodecType, bestSpeedCodec,
                         nil, &p_vout->p_sys->img_dc );
     }
-    vlc_mutex_unlock( &p_vout->p_vlc->quicktime_lock );
-    
+    vlc_mutex_unlock( &p_vout->p_libvlc->quicktime_lock );
     if( err == noErr && p_vout->p_sys->img_dc != 0 )
     {
-        if( p_vout->p_sys->b_altivec )
+        if( p_vout->p_sys->b_cpu_has_simd )
         {
             p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2');
             p_vout->p_sys->i_codec = kYUVSPixelFormat;
@@ -203,7 +204,7 @@ int E_(OpenVideoQT) ( vlc_object_t *p_this )
         free( p_vout->p_sys->p_matrix );
         DisposeHandle( (Handle)p_vout->p_sys->h_img_descr );
         free( p_vout->p_sys );
-        return VLC_EGENERIC;        
+        return VLC_EGENERIC;
     }
 
     if( p_vout->b_fullscreen || !p_vout->p_sys->b_embedded )
@@ -267,23 +268,23 @@ static int InitVideo    ( vout_thread_t *p_vout )
 
     if( p_vout->b_fullscreen || !p_vout->p_sys->b_embedded )
     {
-       Rect s_rect;
+    Rect s_rect;
         p_vout->p_sys->clip_mask = NULL;
-       GetPortBounds( p_vout->p_sys->p_qdport, &s_rect );
-       p_vout->p_sys->i_origx = s_rect.left;
-       p_vout->p_sys->i_origy = s_rect.top;
-       p_vout->p_sys->i_width = s_rect.right - s_rect.left;
-       p_vout->p_sys->i_height = s_rect.bottom - s_rect.top;
+    GetPortBounds( p_vout->p_sys->p_qdport, &s_rect );
+    p_vout->p_sys->i_origx = s_rect.left;
+    p_vout->p_sys->i_origy = s_rect.top;
+    p_vout->p_sys->i_width = s_rect.right - s_rect.left;
+    p_vout->p_sys->i_height = s_rect.bottom - s_rect.top;
     }
     else
     {
-       /* As we are embedded (e.g. running as a Mozilla plugin), use the pointer
-        * stored in the "drawable" value as the CGrafPtr for the QuickDraw
-        * graphics port */
+    /* As we are embedded (e.g. running as a Mozilla plugin), use the pointer
+     * stored in the "drawable" value as the CGrafPtr for the QuickDraw
+     * graphics port */
         /* Create the clipping mask */
         p_vout->p_sys->clip_mask = NewRgn();
-       UpdateEmbeddedGeometry(p_vout);
-       var_AddCallback(p_vout->p_vlc, "drawableredraw", DrawableRedraw, p_vout);
+    UpdateEmbeddedGeometry(p_vout);
+    var_AddCallback(p_vout->p_libvlc, "drawableredraw", DrawableRedraw, p_vout);
     }
 
     QTScaleMatrix( p_vout );
@@ -335,8 +336,8 @@ static void EndVideo( vout_thread_t *p_vout )
 
     if( !p_vout->b_fullscreen && p_vout->p_sys->b_embedded )
     {
-       var_DelCallback(p_vout->p_vlc, "drawableredraw", DrawableRedraw, p_vout);
-       DisposeRgn(p_vout->p_sys->clip_mask);
+    var_DelCallback(p_vout->p_libvlc, "drawableredraw", DrawableRedraw, p_vout);
+    DisposeRgn(p_vout->p_sys->clip_mask);
     }
 
     /* Free the direct buffers we allocated */
@@ -357,7 +358,7 @@ static int ManageVideo( vout_thread_t *p_vout )
 {
     if( p_vout->i_changes & VOUT_FULLSCREEN_CHANGE )
     {
-        if( CoToggleFullscreen( p_vout ) )  
+        if( CoToggleFullscreen( p_vout ) )
         {
             return( 1 );
         }
@@ -367,23 +368,23 @@ static int ManageVideo( vout_thread_t *p_vout )
 
     if( p_vout->i_changes & VOUT_SIZE_CHANGE )
     {
-       if( p_vout->b_fullscreen || !p_vout->p_sys->b_embedded )
-       {
-           /* get the geometry from NSQuickDrawView */
-           Rect s_rect;
-           GetPortBounds( p_vout->p_sys->p_qdport, &s_rect );
-           p_vout->p_sys->i_origx = s_rect.left;
-           p_vout->p_sys->i_origy = s_rect.top;
-           p_vout->p_sys->i_width = s_rect.right - s_rect.left;
-           p_vout->p_sys->i_height = s_rect.bottom - s_rect.top;
-       }
-       else 
-       {
-           /* As we're embedded, get the geometry from Mozilla/Safari NPWindow object */
-           UpdateEmbeddedGeometry( p_vout );
-           SetDSequenceMask(p_vout->p_sys->i_seq,
-               p_vout->p_sys->clip_mask);
-       }
+    if( p_vout->b_fullscreen || !p_vout->p_sys->b_embedded )
+    {
+        /* get the geometry from NSQuickDrawView */
+        Rect s_rect;
+        GetPortBounds( p_vout->p_sys->p_qdport, &s_rect );
+        p_vout->p_sys->i_origx = s_rect.left;
+        p_vout->p_sys->i_origy = s_rect.top;
+        p_vout->p_sys->i_width = s_rect.right - s_rect.left;
+        p_vout->p_sys->i_height = s_rect.bottom - s_rect.top;
+    }
+    else
+    {
+        /* As we're embedded, get the geometry from Mozilla/Safari NPWindow object */
+        UpdateEmbeddedGeometry( p_vout );
+        SetDSequenceMask(p_vout->p_sys->i_seq,
+        p_vout->p_sys->clip_mask);
+    }
     }
 
     if( p_vout->i_changes & VOUT_SIZE_CHANGE ||
@@ -419,32 +420,32 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
     CodecFlags flags;
     if( (NULL == p_vout->p_sys->clip_mask) || !EmptyRgn(p_vout->p_sys->clip_mask) )
     {
-       //CGrafPtr oldPort;
-       //Rect oldBounds;
-
-       /* since there is not way to lock a QuickDraw port for exclusive use
-          there is a potential problem that the frame will be displayed
-          in the wrong place if other embedded plugins redraws as the port
-          origin may be changed */
-       //GetPort(&oldPort);
-       //GetPortBounds(p_vout->p_sys->p_qdport, &oldBounds);
-       SetPort(p_vout->p_sys->p_qdport);
-       SetOrigin(p_vout->p_sys->i_origx, p_vout->p_sys->i_origy);
-       if( ( err = DecompressSequenceFrameWhen(
-                       p_vout->p_sys->i_seq,
-                       p_pic->p_sys->p_data,
-                       p_pic->p_sys->i_size,
-                       codecFlagUseImageBuffer, &flags, NULL, NULL ) == noErr ) )
-       {
-           QDFlushPortBuffer( p_vout->p_sys->p_qdport, p_vout->p_sys->clip_mask );
-           //QDFlushPortBuffer( p_vout->p_sys->p_qdport, NULL );
-       }
-       else
-       {
-           msg_Warn( p_vout, "QT failed to display the frame sequence: %d", err );
-       }
-       //SetPortBounds(p_vout->p_sys->p_qdport, &oldBounds);
-       //SetPort(oldPort);
+    //CGrafPtr oldPort;
+    //Rect oldBounds;
+
+    /* since there is not way to lock a QuickDraw port for exclusive use
+       there is a potential problem that the frame will be displayed
+       in the wrong place if other embedded plugins redraws as the port
+       origin may be changed */
+    //GetPort(&oldPort);
+    //GetPortBounds(p_vout->p_sys->p_qdport, &oldBounds);
+    SetPort(p_vout->p_sys->p_qdport);
+    SetOrigin(p_vout->p_sys->i_origx, p_vout->p_sys->i_origy);
+    if( ( err = DecompressSequenceFrameWhen(
+            p_vout->p_sys->i_seq,
+            p_pic->p_sys->p_data,
+            p_pic->p_sys->i_size,
+            codecFlagUseImageBuffer, &flags, NULL, NULL ) == noErr ) )
+    {
+        QDFlushPortBuffer( p_vout->p_sys->p_qdport, p_vout->p_sys->clip_mask );
+        //QDFlushPortBuffer( p_vout->p_sys->p_qdport, NULL );
+    }
+    else
+    {
+        msg_Warn( p_vout, "QT failed to display the frame sequence: %d", err );
+    }
+    //SetPortBounds(p_vout->p_sys->p_qdport, &oldBounds);
+    //SetPort(oldPort);
     }
 }
 
@@ -470,7 +471,7 @@ static int ControlVideo( vout_thread_t *p_vout, int i_query, va_list args )
 }
 
 /*****************************************************************************
- * CoToggleFullscreen: toggle fullscreen 
+ * CoToggleFullscreen: toggle fullscreen
  *****************************************************************************
  * Returns 0 on success, 1 otherwise
  *****************************************************************************/
@@ -478,74 +479,12 @@ static int CoToggleFullscreen( vout_thread_t *p_vout )
 {
     NSAutoreleasePool *o_pool = [[NSAutoreleasePool alloc] init];
 
-    QTDestroySequence( p_vout );
-
-    if( !p_vout->b_fullscreen )
-    {
-       if( !p_vout->p_sys->b_embedded )
-       {
-           /* Save window size and position */
-           p_vout->p_sys->s_frame.size =
-               [p_vout->p_sys->o_vout_view frame].size;
-           p_vout->p_sys->s_frame.origin =
-               [[p_vout->p_sys->o_vout_view getWindow] frame].origin;
-           p_vout->p_sys->b_saved_frame = VLC_TRUE;
-       }
-       else
-       {
-           var_DelCallback(p_vout->p_vlc, "drawableredraw", DrawableRedraw, p_vout);
-           DisposeRgn(p_vout->p_sys->clip_mask);
-       }
-    }
-    [p_vout->p_sys->o_vout_view closeVout];
-
     p_vout->b_fullscreen = !p_vout->b_fullscreen;
 
-    if( p_vout->b_fullscreen || !p_vout->p_sys->b_embedded )
-    {
-       Rect s_rect;
-        p_vout->p_sys->clip_mask = NULL;
-#define o_qtview p_vout->p_sys->o_qtview
-       o_qtview = [[VLCQTView alloc] initWithVout: p_vout];
-       [o_qtview autorelease];
-       
-       if( p_vout->p_sys->b_saved_frame )
-       {
-           p_vout->p_sys->o_vout_view = [VLCVoutView getVoutView: p_vout
-               subView: o_qtview
-               frame: &p_vout->p_sys->s_frame];
-       }
-       else
-       {
-           p_vout->p_sys->o_vout_view = [VLCVoutView getVoutView: p_vout
-               subView: o_qtview frame: nil];
-       }
-
-       /* Retrieve the QuickDraw port */
-       [o_qtview lockFocus];
-       p_vout->p_sys->p_qdport = [o_qtview qdPort];
-       [o_qtview unlockFocus];
-#undef o_qtview
-       GetPortBounds( p_vout->p_sys->p_qdport, &s_rect );
-       p_vout->p_sys->i_origx = s_rect.left;
-       p_vout->p_sys->i_origy = s_rect.top;
-       p_vout->p_sys->i_width = s_rect.right - s_rect.left;
-       p_vout->p_sys->i_height = s_rect.bottom - s_rect.top;
-    }
+    if( p_vout->b_fullscreen )
+        [p_vout->p_sys->o_vout_view enterFullscreen];
     else
-    {
-        /* Create the clipping mask */
-        p_vout->p_sys->clip_mask = NewRgn();
-       UpdateEmbeddedGeometry(p_vout);
-       var_AddCallback(p_vout->p_vlc, "drawableredraw", DrawableRedraw, p_vout);
-    }
-    QTScaleMatrix( p_vout );
-
-    if( QTCreateSequence( p_vout ) )
-    {
-        msg_Err( p_vout, "unable to initialize QT: QTCreateSequence failed" );
-        return( 1 );
-    }
+        [p_vout->p_sys->o_vout_view leaveFullscreen];
 
     [o_pool release];
     return 0;
@@ -562,14 +501,14 @@ static int DrawableRedraw( vlc_object_t *p_this, const char *psz_name,
     /* ignore changes until we are ready for them */
     if( (oval.i_int != nval.i_int) && (nval.i_int == 1) )
     {
-       vout_thread_t *p_vout = (vout_thread_t *)param;
-       /* prevent QT from rendering any more video until we have updated
-          the geometry */
-       SetEmptyRgn(p_vout->p_sys->clip_mask);
-       SetDSequenceMask(p_vout->p_sys->i_seq,
-           p_vout->p_sys->clip_mask);
+    vout_thread_t *p_vout = (vout_thread_t *)param;
+    /* prevent QT from rendering any more video until we have updated
+       the geometry */
+    SetEmptyRgn(p_vout->p_sys->clip_mask);
+    SetDSequenceMask(p_vout->p_sys->i_seq,
+        p_vout->p_sys->clip_mask);
 
-       p_vout->i_changes |= VOUT_SIZE_CHANGE;
+    p_vout->i_changes |= VOUT_SIZE_CHANGE;
     }
     return VLC_SUCCESS;
 }
@@ -583,19 +522,19 @@ static void UpdateEmbeddedGeometry( vout_thread_t *p_vout )
 {
     vlc_value_t val;
     vlc_value_t valt, vall, valb, valr, valx, valy, valw, valh,
-               valportx, valporty;
-
-    var_Get( p_vout->p_vlc, "drawable", &val );
-    var_Get( p_vout->p_vlc, "drawablet", &valt );
-    var_Get( p_vout->p_vlc, "drawablel", &vall );
-    var_Get( p_vout->p_vlc, "drawableb", &valb );
-    var_Get( p_vout->p_vlc, "drawabler", &valr );
-    var_Get( p_vout->p_vlc, "drawablex", &valx );
-    var_Get( p_vout->p_vlc, "drawabley", &valy );
-    var_Get( p_vout->p_vlc, "drawablew", &valw );
-    var_Get( p_vout->p_vlc, "drawableh", &valh );
-    var_Get( p_vout->p_vlc, "drawableportx", &valportx );
-    var_Get( p_vout->p_vlc, "drawableporty", &valporty );
+        valportx, valporty;
+
+    var_Get( p_vout->p_libvlc, "drawable", &val );
+    var_Get( p_vout->p_libvlc, "drawablet", &valt );
+    var_Get( p_vout->p_libvlc, "drawablel", &vall );
+    var_Get( p_vout->p_libvlc, "drawableb", &valb );
+    var_Get( p_vout->p_libvlc, "drawabler", &valr );
+    var_Get( p_vout->p_libvlc, "drawablex", &valx );
+    var_Get( p_vout->p_libvlc, "drawabley", &valy );
+    var_Get( p_vout->p_libvlc, "drawablew", &valw );
+    var_Get( p_vout->p_libvlc, "drawableh", &valh );
+    var_Get( p_vout->p_libvlc, "drawableportx", &valportx );
+    var_Get( p_vout->p_libvlc, "drawableporty", &valporty );
 
     /* portx, porty contains values for SetOrigin() function
        which isn't used, instead use QT Translate matrix */
@@ -607,19 +546,19 @@ static void UpdateEmbeddedGeometry( vout_thread_t *p_vout )
 
     /* update video clipping mask */
     /*SetRectRgn( p_vout->p_sys->clip_mask , vall.i_int ,
-               valt.i_int, valr.i_int, valb.i_int );*/
+        valt.i_int, valr.i_int, valb.i_int );*/
     SetRectRgn( p_vout->p_sys->clip_mask , vall.i_int + valportx.i_int ,
-               valt.i_int + valporty.i_int , valr.i_int + valportx.i_int ,
-               valb.i_int + valporty.i_int );
+        valt.i_int + valporty.i_int , valr.i_int + valportx.i_int ,
+        valb.i_int + valporty.i_int );
 
     /* reset drawableredraw variable indicating we are ready
        to take changes in video geometry */
     val.i_int=0;
-    var_Set( p_vout->p_vlc, "drawableredraw", val );
+    var_Set( p_vout->p_libvlc, "drawableredraw", val );
 }
 
 /*****************************************************************************
- * QTScaleMatrix: scale matrix 
+ * QTScaleMatrix: scale matrix
  *****************************************************************************/
 static void QTScaleMatrix( vout_thread_t *p_vout )
 {
@@ -682,7 +621,7 @@ static void QTScaleMatrix( vout_thread_t *p_vout )
 }
 
 /*****************************************************************************
- * QTCreateSequence: create a new sequence 
+ * QTCreateSequence: create a new sequence
  *****************************************************************************
  * Returns 0 on success, 1 otherwise
  *****************************************************************************/
@@ -711,7 +650,7 @@ static int QTCreateSequence( vout_thread_t *p_vout )
 
     HUnlock( (Handle)p_vout->p_sys->h_img_descr );
 
-    if( ( err = DecompressSequenceBeginS( 
+    if( ( err = DecompressSequenceBeginS(
                               &p_vout->p_sys->i_seq,
                               p_vout->p_sys->h_img_descr,
                               NULL,
@@ -732,7 +671,7 @@ static int QTCreateSequence( vout_thread_t *p_vout )
 }
 
 /*****************************************************************************
- * QTDestroySequence: destroy sequence 
+ * QTDestroySequence: destroy sequence
  *****************************************************************************/
 static void QTDestroySequence( vout_thread_t *p_vout )
 {
@@ -779,17 +718,17 @@ static int QTNewPicture( vout_thread_t *p_vout, picture_t *p_pic )
             p_pic->p_sys->p_data = (void *)p_pic->p[0].p_pixels;
 
             break;
-            
         case VLC_FOURCC('I','4','2','0'):
             p_pic->p_sys->p_data = (void *)&p_pic->p_sys->pixmap_i420;
             p_pic->p_sys->i_size = sizeof(PlanarPixmapInfoYUV420);
-            
             /* Allocate the memory buffer */
             p_pic->p_data = vlc_memalign( &p_pic->p_data_orig,
                                           16, p_vout->output.i_width * p_vout->output.i_height * 3 / 2 );
 
             /* Y buffer */
-            p_pic->Y_PIXELS = p_pic->p_data; 
+            p_pic->Y_PIXELS = p_pic->p_data;
             p_pic->p[Y_PLANE].i_lines = p_vout->output.i_height;
             p_pic->p[Y_PLANE].i_visible_lines = p_vout->output.i_height;
             p_pic->p[Y_PLANE].i_pitch = p_vout->output.i_width;
@@ -828,7 +767,7 @@ static int QTNewPicture( vout_thread_t *p_vout, picture_t *p_pic )
             P.componentInfoCr.rowBytes = p_vout->output.i_width / 2;
 #undef P
             break;
-        
         default:
             /* Unknown chroma, tell the guy to get lost */
             free( p_pic->p_sys );
@@ -861,6 +800,76 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic )
  *****************************************************************************/
 @implementation VLCQTView
 
+/* This function will reset the o_vout_view. It's useful to go fullscreen. */
++ (void)resetVout: (vout_thread_t *)p_vout
+{
+    QTDestroySequence( p_vout );
+
+    if( p_vout->b_fullscreen )
+    {
+    if( !p_vout->p_sys->b_embedded )
+    {
+        /* Save window size and position */
+        p_vout->p_sys->s_frame.size =
+        [p_vout->p_sys->o_vout_view frame].size;
+        p_vout->p_sys->s_frame.origin =
+        [[p_vout->p_sys->o_vout_view getWindow] frame].origin;
+        p_vout->p_sys->b_saved_frame = VLC_TRUE;
+    }
+        else
+        {
+            var_DelCallback(p_vout->p_libvlc, "drawableredraw", DrawableRedraw, p_vout);
+            DisposeRgn(p_vout->p_sys->clip_mask);
+        }
+    }
+
+    if( p_vout->b_fullscreen || !p_vout->p_sys->b_embedded )
+    {
+    Rect s_rect;
+        p_vout->p_sys->clip_mask = NULL;
+#define o_qtview p_vout->p_sys->o_qtview
+    o_qtview = [[VLCQTView alloc] initWithVout: p_vout];
+    [o_qtview autorelease];
+    
+    if( p_vout->p_sys->b_saved_frame )
+    {
+        p_vout->p_sys->o_vout_view = [VLCVoutView getVoutView: p_vout
+        subView: o_qtview
+        frame: &p_vout->p_sys->s_frame];
+    }
+    else
+    {
+        p_vout->p_sys->o_vout_view = [VLCVoutView getVoutView: p_vout
+        subView: o_qtview frame: nil];
+    }
+
+    /* Retrieve the QuickDraw port */
+    [o_qtview lockFocus];
+    p_vout->p_sys->p_qdport = [o_qtview qdPort];
+    [o_qtview unlockFocus];
+#undef o_qtview
+    GetPortBounds( p_vout->p_sys->p_qdport, &s_rect );
+    p_vout->p_sys->i_origx = s_rect.left;
+    p_vout->p_sys->i_origy = s_rect.top;
+    p_vout->p_sys->i_width = s_rect.right - s_rect.left;
+    p_vout->p_sys->i_height = s_rect.bottom - s_rect.top;
+    }
+    else
+    {
+        /* Create the clipping mask */
+        p_vout->p_sys->clip_mask = NewRgn();
+    UpdateEmbeddedGeometry(p_vout);
+    var_AddCallback(p_vout->p_libvlc, "drawableredraw", DrawableRedraw, p_vout);
+    }
+    QTScaleMatrix( p_vout );
+
+    if( QTCreateSequence( p_vout ) )
+    {
+        msg_Err( p_vout, "unable to initialize QT: QTCreateSequence failed" );
+        return;
+    }
+}
+
 - (id) initWithVout:(vout_thread_t *)_p_vout
 {
     p_vout = _p_vout;