]> git.sesse.net Git - vlc/commitdiff
* modules/gui/macosx/vout: Output YUY2 to QT/QD.
authorDerk-Jan Hartman <hartman@videolan.org>
Mon, 2 Aug 2004 13:06:38 +0000 (13:06 +0000)
committerDerk-Jan Hartman <hartman@videolan.org>
Mon, 2 Aug 2004 13:06:38 +0000 (13:06 +0000)
  This way we bypass Apple's very, very, very unoptimized
  I420 -> YUY2 routine and use titer's altivec optimized one.
  Quartz output is herefore now altivec optimized and close to the opengl output.

modules/gui/macosx/vout.m

index 37369af7868f12c843b39b7d630a65880c0cb924..0ba5e13909c253d42de74a0c683fec0b755c09c2 100644 (file)
@@ -7,7 +7,7 @@
  * Authors: Colin Delacroix <colin@zoy.org>
  *          Florian G. Pflug <fgp@phlo.org>
  *          Jon Lech Johansen <jon-vl@nanocrew.net>
- *          Derk-Jan Hartman <thedj@users.sourceforge.net>
+ *          Derk-Jan Hartman <hartman at videolan dot org>
  *          Eric Petit <titer@m0k.org>
  *
  * This program is free software; you can redistribute it and/or modify
 
 struct picture_sys_t
 {
-    void *p_info;
+    void *p_data;
     unsigned int i_size;
-
-    /* When using I420 output */
-    PlanarPixmapInfoYUV420 pixmap_i420;
 };
 
 /*****************************************************************************
@@ -181,15 +178,15 @@ int E_(OpenVideo) ( vlc_object_t *p_this )
         vlc_mutex_lock( &p_vout->p_vlc->quicktime_lock );
 
         /* Can we find the right chroma ? */
-        err = FindCodec( kYUV420CodecType, bestSpeedCodec,
+        err = FindCodec( kComponentVideoUnsigned, bestSpeedCodec,
                             nil, &p_vout->p_sys->img_dc );
         
         vlc_mutex_unlock( &p_vout->p_vlc->quicktime_lock );
         
         if( err == noErr && p_vout->p_sys->img_dc != 0 )
         {
-            p_vout->output.i_chroma = VLC_FOURCC('I','4','2','0');
-            p_vout->p_sys->i_codec = kYUV420CodecType;
+            p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2');
+            p_vout->p_sys->i_codec = kComponentVideoUnsigned;
         }
         else
         {
@@ -532,13 +529,13 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
         OSErr err;
         CodecFlags flags;
 
-        if( ( err = DecompressSequenceFrameS
+        if( ( err = DecompressSequenceFrameWhen
                         p_vout->p_sys->i_seq,
-                        p_pic->p_sys->p_info,
+                        p_pic->p_sys->p_data,
                         p_pic->p_sys->i_size,                    
-                        codecFlagUseImageBuffer, &flags, nil ) != noErr ) )
+                        codecFlagUseImageBuffer, &flags, NULL, NULL ) != noErr ) )
         {
-            msg_Warn( p_vout, "DecompressSequenceFrameS failed: %d", err );
+            msg_Warn( p_vout, "DecompressSequenceFrameWhen failed: %d", err );
         }
         else
         {
@@ -931,9 +928,9 @@ static int QTCreateSequence( vout_thread_t *p_vout )
 
     p_descr->idSize = sizeof(ImageDescription);
     p_descr->cType = p_vout->p_sys->i_codec;
-    p_descr->version = 1;
+    p_descr->version = 2;
     p_descr->revisionLevel = 0;
-    p_descr->vendor = 'appl';
+    p_descr->vendor = 'mpla';
     p_descr->width = p_vout->output.i_width;
     p_descr->height = p_vout->output.i_height;
     p_descr->hRes = Long2Fix(72);
@@ -949,14 +946,15 @@ static int QTCreateSequence( vout_thread_t *p_vout )
     if( ( err = DecompressSequenceBeginS( 
                               &p_vout->p_sys->i_seq,
                               p_vout->p_sys->h_img_descr,
-                              NULL, 0,
+                              NULL,
+                              (p_descr->width * p_descr->height * 16) / 8,
                               p_vout->p_sys->p_qdport,
                               NULL, NULL,
                               p_vout->p_sys->p_matrix,
-                              0, NULL,
+                              srcCopy, NULL,
                               codecFlagUseImageBuffer,
                               codecLosslessQuality,
-                              p_vout->p_sys->img_dc ) ) )
+                              bestSpeedCodec ) ) )
     {
         msg_Err( p_vout, "DecompressSequenceBeginS failed: %d", err );
         return( 1 );
@@ -980,9 +978,6 @@ static void QTDestroySequence( vout_thread_t *p_vout )
  *****************************************************************************/
 static int QTNewPicture( vout_thread_t *p_vout, picture_t *p_pic )
 {
-    int i_width  = p_vout->output.i_width;
-    int i_height = p_vout->output.i_height;
-
     /* We know the chroma, allocate a buffer which will be used
      * directly by the decoder */
     p_pic->p_sys = malloc( sizeof( picture_sys_t ) );
@@ -991,54 +986,28 @@ static int QTNewPicture( vout_thread_t *p_vout, picture_t *p_pic )
     {
         return( -1 );
     }
+    
+    vout_InitPicture( VLC_OBJECT( p_vout), p_pic, p_vout->output.i_chroma,
+                      p_vout->output.i_width, p_vout->output.i_height,
+                      p_vout->output.i_aspect );
 
     switch( p_vout->output.i_chroma )
     {
-        case VLC_FOURCC('I','4','2','0'):
-
-            p_pic->p_sys->p_info = (void *)&p_pic->p_sys->pixmap_i420;
-            p_pic->p_sys->i_size = sizeof(PlanarPixmapInfoYUV420);
+        case VLC_FOURCC('Y','U','Y','2'):
+            p_pic->p_sys->i_size = p_vout->output.i_width * p_vout->output.i_height * 2;
 
             /* Allocate the memory buffer */
             p_pic->p_data = vlc_memalign( &p_pic->p_data_orig,
-                                          16, i_width * i_height * 3 / 2 );
-
-            /* Y buffer */
-            p_pic->Y_PIXELS = p_pic->p_data; 
-            p_pic->p[Y_PLANE].i_lines = i_height;
-            p_pic->p[Y_PLANE].i_pitch = i_width;
-            p_pic->p[Y_PLANE].i_pixel_pitch = 1;
-            p_pic->p[Y_PLANE].i_visible_pitch = i_width;
-
-            /* U buffer */
-            p_pic->U_PIXELS = p_pic->Y_PIXELS + i_height * i_width;
-            p_pic->p[U_PLANE].i_lines = i_height / 2;
-            p_pic->p[U_PLANE].i_pitch = i_width / 2;
-            p_pic->p[U_PLANE].i_pixel_pitch = 1;
-            p_pic->p[U_PLANE].i_visible_pitch = i_width / 2;
-
-            /* V buffer */
-            p_pic->V_PIXELS = p_pic->U_PIXELS + i_height * i_width / 4;
-            p_pic->p[V_PLANE].i_lines = i_height / 2;
-            p_pic->p[V_PLANE].i_pitch = i_width / 2;
-            p_pic->p[V_PLANE].i_pixel_pitch = 1;
-            p_pic->p[V_PLANE].i_visible_pitch = i_width / 2;
-
-            /* We allocated 3 planes */
-            p_pic->i_planes = 3;
-
-#define P p_pic->p_sys->pixmap_i420
-            P.componentInfoY.offset = (void *)p_pic->Y_PIXELS
-                                       - p_pic->p_sys->p_info;
-            P.componentInfoCb.offset = (void *)p_pic->U_PIXELS
-                                        - p_pic->p_sys->p_info;
-            P.componentInfoCr.offset = (void *)p_pic->V_PIXELS
-                                        - p_pic->p_sys->p_info;
-
-            P.componentInfoY.rowBytes = i_width;
-            P.componentInfoCb.rowBytes = i_width / 2;
-            P.componentInfoCr.rowBytes = i_width / 2;
-#undef P
+                                          16, p_pic->p_sys->i_size );
+
+            p_pic->p[0].p_pixels = p_pic->p_data;
+            p_pic->p[0].i_lines = p_vout->output.i_height;
+            p_pic->p[0].i_pitch = p_vout->output.i_width * 2;
+            p_pic->p[0].i_pixel_pitch = 1;
+            p_pic->p[0].i_visible_pitch = p_vout->output.i_width * 2;
+            p_pic->i_planes = 1;
+
+            p_pic->p_sys->p_data = (void *)p_pic->p[0].p_pixels;
 
             break;