Commit 06114cbe authored by Derk-Jan Hartman's avatar Derk-Jan Hartman

* modules/gui/macosx/vout: Output YUY2 to QT/QD.

  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.
parent 52ac6789
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Authors: Colin Delacroix <colin@zoy.org> * Authors: Colin Delacroix <colin@zoy.org>
* Florian G. Pflug <fgp@phlo.org> * Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net> * 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> * Eric Petit <titer@m0k.org>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -52,11 +52,8 @@ ...@@ -52,11 +52,8 @@
struct picture_sys_t struct picture_sys_t
{ {
void *p_info; void *p_data;
unsigned int i_size; unsigned int i_size;
/* When using I420 output */
PlanarPixmapInfoYUV420 pixmap_i420;
}; };
/***************************************************************************** /*****************************************************************************
...@@ -181,15 +178,15 @@ int E_(OpenVideo) ( vlc_object_t *p_this ) ...@@ -181,15 +178,15 @@ int E_(OpenVideo) ( vlc_object_t *p_this )
vlc_mutex_lock( &p_vout->p_vlc->quicktime_lock ); vlc_mutex_lock( &p_vout->p_vlc->quicktime_lock );
/* Can we find the right chroma ? */ /* Can we find the right chroma ? */
err = FindCodec( kYUV420CodecType, bestSpeedCodec, err = FindCodec( kComponentVideoUnsigned, bestSpeedCodec,
nil, &p_vout->p_sys->img_dc ); nil, &p_vout->p_sys->img_dc );
vlc_mutex_unlock( &p_vout->p_vlc->quicktime_lock ); vlc_mutex_unlock( &p_vout->p_vlc->quicktime_lock );
if( err == noErr && p_vout->p_sys->img_dc != 0 ) if( err == noErr && p_vout->p_sys->img_dc != 0 )
{ {
p_vout->output.i_chroma = VLC_FOURCC('I','4','2','0'); p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2');
p_vout->p_sys->i_codec = kYUV420CodecType; p_vout->p_sys->i_codec = kComponentVideoUnsigned;
} }
else else
{ {
...@@ -532,13 +529,13 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -532,13 +529,13 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
OSErr err; OSErr err;
CodecFlags flags; CodecFlags flags;
if( ( err = DecompressSequenceFrameS( if( ( err = DecompressSequenceFrameWhen(
p_vout->p_sys->i_seq, p_vout->p_sys->i_seq,
p_pic->p_sys->p_info, p_pic->p_sys->p_data,
p_pic->p_sys->i_size, 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 else
{ {
...@@ -931,9 +928,9 @@ static int QTCreateSequence( vout_thread_t *p_vout ) ...@@ -931,9 +928,9 @@ static int QTCreateSequence( vout_thread_t *p_vout )
p_descr->idSize = sizeof(ImageDescription); p_descr->idSize = sizeof(ImageDescription);
p_descr->cType = p_vout->p_sys->i_codec; p_descr->cType = p_vout->p_sys->i_codec;
p_descr->version = 1; p_descr->version = 2;
p_descr->revisionLevel = 0; p_descr->revisionLevel = 0;
p_descr->vendor = 'appl'; p_descr->vendor = 'mpla';
p_descr->width = p_vout->output.i_width; p_descr->width = p_vout->output.i_width;
p_descr->height = p_vout->output.i_height; p_descr->height = p_vout->output.i_height;
p_descr->hRes = Long2Fix(72); p_descr->hRes = Long2Fix(72);
...@@ -949,14 +946,15 @@ static int QTCreateSequence( vout_thread_t *p_vout ) ...@@ -949,14 +946,15 @@ static int QTCreateSequence( vout_thread_t *p_vout )
if( ( err = DecompressSequenceBeginS( if( ( err = DecompressSequenceBeginS(
&p_vout->p_sys->i_seq, &p_vout->p_sys->i_seq,
p_vout->p_sys->h_img_descr, p_vout->p_sys->h_img_descr,
NULL, 0, NULL,
(p_descr->width * p_descr->height * 16) / 8,
p_vout->p_sys->p_qdport, p_vout->p_sys->p_qdport,
NULL, NULL, NULL, NULL,
p_vout->p_sys->p_matrix, p_vout->p_sys->p_matrix,
0, NULL, srcCopy, NULL,
codecFlagUseImageBuffer, codecFlagUseImageBuffer,
codecLosslessQuality, codecLosslessQuality,
p_vout->p_sys->img_dc ) ) ) bestSpeedCodec ) ) )
{ {
msg_Err( p_vout, "DecompressSequenceBeginS failed: %d", err ); msg_Err( p_vout, "DecompressSequenceBeginS failed: %d", err );
return( 1 ); return( 1 );
...@@ -980,9 +978,6 @@ static void QTDestroySequence( vout_thread_t *p_vout ) ...@@ -980,9 +978,6 @@ static void QTDestroySequence( vout_thread_t *p_vout )
*****************************************************************************/ *****************************************************************************/
static int QTNewPicture( vout_thread_t *p_vout, picture_t *p_pic ) 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 /* We know the chroma, allocate a buffer which will be used
* directly by the decoder */ * directly by the decoder */
p_pic->p_sys = malloc( sizeof( picture_sys_t ) ); p_pic->p_sys = malloc( sizeof( picture_sys_t ) );
...@@ -992,53 +987,27 @@ static int QTNewPicture( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -992,53 +987,27 @@ static int QTNewPicture( vout_thread_t *p_vout, picture_t *p_pic )
return( -1 ); 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 ) switch( p_vout->output.i_chroma )
{ {
case VLC_FOURCC('I','4','2','0'): case VLC_FOURCC('Y','U','Y','2'):
p_pic->p_sys->i_size = p_vout->output.i_width * p_vout->output.i_height * 2;
p_pic->p_sys->p_info = (void *)&p_pic->p_sys->pixmap_i420;
p_pic->p_sys->i_size = sizeof(PlanarPixmapInfoYUV420);
/* Allocate the memory buffer */ /* Allocate the memory buffer */
p_pic->p_data = vlc_memalign( &p_pic->p_data_orig, p_pic->p_data = vlc_memalign( &p_pic->p_data_orig,
16, i_width * i_height * 3 / 2 ); 16, p_pic->p_sys->i_size );
/* Y buffer */ p_pic->p[0].p_pixels = p_pic->p_data;
p_pic->Y_PIXELS = p_pic->p_data; p_pic->p[0].i_lines = p_vout->output.i_height;
p_pic->p[Y_PLANE].i_lines = i_height; p_pic->p[0].i_pitch = p_vout->output.i_width * 2;
p_pic->p[Y_PLANE].i_pitch = i_width; p_pic->p[0].i_pixel_pitch = 1;
p_pic->p[Y_PLANE].i_pixel_pitch = 1; p_pic->p[0].i_visible_pitch = p_vout->output.i_width * 2;
p_pic->p[Y_PLANE].i_visible_pitch = i_width; p_pic->i_planes = 1;
/* U buffer */ p_pic->p_sys->p_data = (void *)p_pic->p[0].p_pixels;
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
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment