* Provides functions to perform the YUV conversion.
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
+ * $Id: video_yuvmmx.c,v 1.10 2001/06/03 12:47:21 sam Exp $
*
- * Authors:
+ * Authors: Samuel Hocevar <sam@zoy.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include "mtime.h"
#include "tests.h"
-#include "modules.h"
-
#include "video.h"
#include "video_output.h"
#include "intf_msg.h"
+#include "modules.h"
+#include "modules_export.h"
+
static int yuv_Probe ( probedata_t *p_data );
static int yuv_Init ( vout_thread_t *p_vout );
static int yuv_Reset ( vout_thread_t *p_vout );
static int yuv_Probe( probedata_t *p_data )
{
/* Test for MMX support in the CPU */
- if( TestCPU( CPU_CAPABILITY_MMX ) )
+ if( !TestCPU( CPU_CAPABILITY_MMX ) )
{
- if( TestMethod( YUV_METHOD_VAR, "yuvmmx" ) )
- {
- return( 999 );
- }
- else
- {
- return( 100 );
- }
+ return( 0 );
}
- else
+
+ if( TestMethod( YUV_METHOD_VAR, "yuvmmx" ) )
{
- return( 0 );
+ return( 999 );
}
+
+ return( 100 );
}
/*****************************************************************************
{
switch( p_vout->i_bytes_per_pixel)
{
+#define _X( foo ) (vout_yuv_convert_t *) _M( foo )
case 1:
- p_vout->yuv.pf_yuv420 = (vout_yuv_convert_t *) ConvertYUV420YCbr8;
- p_vout->yuv.pf_yuv422 = (vout_yuv_convert_t *) ConvertYUV422YCbr8;
- p_vout->yuv.pf_yuv444 = (vout_yuv_convert_t *) ConvertYUV444YCbr8;
+ p_vout->yuv.pf_yuv420 = _X( ConvertYUV420YCbr8 );
+ p_vout->yuv.pf_yuv422 = _X( ConvertYUV422YCbr8 );
+ p_vout->yuv.pf_yuv444 = _X( ConvertYUV444YCbr8 );
break;
case 2:
- p_vout->yuv.pf_yuv420 = (vout_yuv_convert_t *) ConvertYUV420YCbr16;
- p_vout->yuv.pf_yuv422 = (vout_yuv_convert_t *) ConvertYUV422YCbr16;
- p_vout->yuv.pf_yuv444 = (vout_yuv_convert_t *) ConvertYUV444YCbr16;
+ p_vout->yuv.pf_yuv420 = _X( ConvertYUV420YCbr16 );
+ p_vout->yuv.pf_yuv422 = _X( ConvertYUV422YCbr16 );
+ p_vout->yuv.pf_yuv444 = _X( ConvertYUV444YCbr16 );
break;
case 3:
- p_vout->yuv.pf_yuv420 = (vout_yuv_convert_t *) ConvertYUV420YCbr24;
- p_vout->yuv.pf_yuv422 = (vout_yuv_convert_t *) ConvertYUV422YCbr24;
- p_vout->yuv.pf_yuv444 = (vout_yuv_convert_t *) ConvertYUV444YCbr24;
+ p_vout->yuv.pf_yuv420 = _X( ConvertYUV420YCbr24 );
+ p_vout->yuv.pf_yuv422 = _X( ConvertYUV422YCbr24 );
+ p_vout->yuv.pf_yuv444 = _X( ConvertYUV444YCbr24 );
break;
case 4:
- p_vout->yuv.pf_yuv420 = (vout_yuv_convert_t *) ConvertYUV420YCbr32;
- p_vout->yuv.pf_yuv422 = (vout_yuv_convert_t *) ConvertYUV422YCbr32;
- p_vout->yuv.pf_yuv444 = (vout_yuv_convert_t *) ConvertYUV444YCbr32;
+ p_vout->yuv.pf_yuv420 = _X( ConvertYUV420YCbr32 );
+ p_vout->yuv.pf_yuv422 = _X( ConvertYUV422YCbr32 );
+ p_vout->yuv.pf_yuv444 = _X( ConvertYUV444YCbr32 );
break;
+#undef _X
}
}
else if( p_vout->b_grayscale )
/* Grayscale */
switch( p_vout->i_bytes_per_pixel )
{
+#define _X( foo ) (vout_yuv_convert_t *) _M( foo )
case 1:
- p_vout->yuv.pf_yuv420 = (vout_yuv_convert_t *) ConvertY4Gray8;
- p_vout->yuv.pf_yuv422 = (vout_yuv_convert_t *) ConvertY4Gray8;
- p_vout->yuv.pf_yuv444 = (vout_yuv_convert_t *) ConvertY4Gray8;
+ p_vout->yuv.pf_yuv420 = _X( ConvertY4Gray8 );
+ p_vout->yuv.pf_yuv422 = _X( ConvertY4Gray8 );
+ p_vout->yuv.pf_yuv444 = _X( ConvertY4Gray8 );
break;
case 2:
- p_vout->yuv.pf_yuv420 = (vout_yuv_convert_t *) ConvertY4Gray16;
- p_vout->yuv.pf_yuv422 = (vout_yuv_convert_t *) ConvertY4Gray16;
- p_vout->yuv.pf_yuv444 = (vout_yuv_convert_t *) ConvertY4Gray16;
+ p_vout->yuv.pf_yuv420 = _X( ConvertY4Gray16 );
+ p_vout->yuv.pf_yuv422 = _X( ConvertY4Gray16 );
+ p_vout->yuv.pf_yuv444 = _X( ConvertY4Gray16 );
break;
case 3:
- p_vout->yuv.pf_yuv420 = (vout_yuv_convert_t *) ConvertYUV420RGB24;
- p_vout->yuv.pf_yuv422 = (vout_yuv_convert_t *) ConvertY4Gray24;
- p_vout->yuv.pf_yuv444 = (vout_yuv_convert_t *) ConvertY4Gray24;
+ p_vout->yuv.pf_yuv420 = _X( ConvertYUV420RGB24 );
+ p_vout->yuv.pf_yuv422 = _X( ConvertY4Gray24 );
+ p_vout->yuv.pf_yuv444 = _X( ConvertY4Gray24 );
break;
case 4:
- p_vout->yuv.pf_yuv420 = (vout_yuv_convert_t *) ConvertYUV420RGB32;
- p_vout->yuv.pf_yuv422 = (vout_yuv_convert_t *) ConvertY4Gray32;
- p_vout->yuv.pf_yuv444 = (vout_yuv_convert_t *) ConvertY4Gray32;
+ p_vout->yuv.pf_yuv420 = _X( ConvertYUV420RGB32 );
+ p_vout->yuv.pf_yuv422 = _X( ConvertY4Gray32 );
+ p_vout->yuv.pf_yuv444 = _X( ConvertY4Gray32 );
break;
+#undef _X
}
}
else
/* Color */
switch( p_vout->i_bytes_per_pixel )
{
+#define _X( foo ) (vout_yuv_convert_t *) _M( foo )
case 1:
- p_vout->yuv.pf_yuv420 = (vout_yuv_convert_t *) ConvertYUV420RGB8;
- p_vout->yuv.pf_yuv422 = (vout_yuv_convert_t *) ConvertYUV422RGB8;
- p_vout->yuv.pf_yuv444 = (vout_yuv_convert_t *) ConvertYUV444RGB8;
+ p_vout->yuv.pf_yuv420 = _X( ConvertYUV420RGB8 );
+ p_vout->yuv.pf_yuv422 = _X( ConvertYUV422RGB8 );
+ p_vout->yuv.pf_yuv444 = _X( ConvertYUV444RGB8 );
break;
case 2:
- p_vout->yuv.pf_yuv420 = (vout_yuv_convert_t *) ConvertYUV420RGB16;
- p_vout->yuv.pf_yuv422 = (vout_yuv_convert_t *) ConvertYUV422RGB16;
- p_vout->yuv.pf_yuv444 = (vout_yuv_convert_t *) ConvertYUV444RGB16;
+ p_vout->yuv.pf_yuv420 = _X( ConvertYUV420RGB16 );
+ p_vout->yuv.pf_yuv422 = _X( ConvertYUV422RGB16 );
+ p_vout->yuv.pf_yuv444 = _X( ConvertYUV444RGB16 );
break;
case 3:
- p_vout->yuv.pf_yuv420 = (vout_yuv_convert_t *) ConvertYUV420RGB24;
- p_vout->yuv.pf_yuv422 = (vout_yuv_convert_t *) ConvertYUV422RGB24;
- p_vout->yuv.pf_yuv444 = (vout_yuv_convert_t *) ConvertYUV444RGB24;
+ p_vout->yuv.pf_yuv420 = _X( ConvertYUV420RGB24 );
+ p_vout->yuv.pf_yuv422 = _X( ConvertYUV422RGB24 );
+ p_vout->yuv.pf_yuv444 = _X( ConvertYUV444RGB24 );
break;
case 4:
- p_vout->yuv.pf_yuv420 = (vout_yuv_convert_t *) ConvertYUV420RGB32;
- p_vout->yuv.pf_yuv422 = (vout_yuv_convert_t *) ConvertYUV422RGB32;
- p_vout->yuv.pf_yuv444 = (vout_yuv_convert_t *) ConvertYUV444RGB32;
+ p_vout->yuv.pf_yuv420 = _X( ConvertYUV420RGB32 );
+ p_vout->yuv.pf_yuv422 = _X( ConvertYUV422RGB32 );
+ p_vout->yuv.pf_yuv444 = _X( ConvertYUV444RGB32 );
break;
+#undef _X
}
}
}
* It will also set horizontal and vertical scaling indicators. If b_double
* is set, the p_offset structure has interleaved Y and U/V offsets.
*****************************************************************************/
-void SetOffset( int i_width, int i_height, int i_pic_width, int i_pic_height,
- boolean_t *pb_h_scaling, int *pi_v_scaling,
- int *p_offset, boolean_t b_double )
+void _M( SetOffset )( int i_width, int i_height, int i_pic_width,
+ int i_pic_height, boolean_t *pb_h_scaling,
+ int *pi_v_scaling, int *p_offset, boolean_t b_double )
{
int i_x; /* x position in destination */
int i_scale_count; /* modulo counter */