]> git.sesse.net Git - vlc/blobdiff - plugins/sdl/video_yuv.c
A few new things:
[vlc] / plugins / sdl / video_yuv.c
diff --git a/plugins/sdl/video_yuv.c b/plugins/sdl/video_yuv.c
new file mode 100644 (file)
index 0000000..9089bbf
--- /dev/null
@@ -0,0 +1,150 @@
+/*****************************************************************************
+ * video_yuv.c: YUV transformation functions
+ * Provides functions to perform the YUV conversion. The functions provided here
+ * are a complete and portable C implementation, and may be replaced in certain
+ * case by optimized functions.
+ *****************************************************************************
+ * Copyright (C) 1999, 2000 VideoLAN
+ *
+ * Authors:
+ *
+ * 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
+ * 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 GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include "defs.h"
+
+#include <math.h>                                            /* exp(), pow() */
+#include <errno.h>                                                 /* ENOMEM */
+#include <stdlib.h>                                                /* free() */
+#include <string.h>                                            /* strerror() */
+
+#include "config.h"
+#include "common.h"
+#include "threads.h"
+#include "mtime.h"
+#include "plugins.h"
+#include "video.h"
+#include "video_output.h"
+#include "video_yuv.h"
+
+#include "intf_msg.h"
+
+/*****************************************************************************
+ * vout_InitYUV: allocate and initialize translations tables
+ *****************************************************************************
+ * This function will allocate memory to store translation tables, depending
+ * of the screen depth.
+ *****************************************************************************/
+int yuv_CInit( vout_thread_t *p_vout )
+{
+
+    /* Initialize tables */
+    SetSDLYUV( p_vout );
+    return( 0 );
+}
+
+/*****************************************************************************
+ * yuv_CEnd: destroy translations tables
+ *****************************************************************************
+ * Free memory allocated by yuv_CCreate.
+ *****************************************************************************/
+void yuv_CEnd( vout_thread_t *p_vout )
+{
+    free( p_vout->yuv.p_base );
+    free( p_vout->yuv.p_buffer );
+    free( p_vout->yuv.p_offset );
+}
+
+/*****************************************************************************
+ * yuv_CReset: re-initialize translations tables
+ *****************************************************************************
+ * This function will initialize the tables allocated by vout_CreateTables and
+ * set functions pointers.
+ *****************************************************************************/
+int yuv_CReset( vout_thread_t *p_vout )
+{
+    yuv_CEnd( p_vout );
+    return( yuv_CInit( p_vout ) );
+}
+
+/* following functions are local */
+
+/*****************************************************************************
+ * SetYUV: compute tables and set function pointers
++ *****************************************************************************/
+void SetSDLYUV( vout_thread_t *p_vout )
+{
+    /*
+     * Set functions pointers
+     */
+    if( p_vout->b_grayscale )
+    {
+        /* Grayscale */
+        switch( p_vout->i_bytes_per_pixel )
+        {
+        case 1:
+            p_vout->yuv.p_Convert420 = (vout_yuv_convert_t *) Convert8;
+            p_vout->yuv.p_Convert422 = (vout_yuv_convert_t *) Convert8;
+            p_vout->yuv.p_Convert444 = (vout_yuv_convert_t *) Convert8;
+            break;
+        case 2:
+            p_vout->yuv.p_Convert420 = (vout_yuv_convert_t *) Convert16;
+            p_vout->yuv.p_Convert422 = (vout_yuv_convert_t *) Convert16;
+            p_vout->yuv.p_Convert444 = (vout_yuv_convert_t *) Convert16;
+            break;
+        case 3:
+            p_vout->yuv.p_Convert420 = (vout_yuv_convert_t *) Convert24;
+            p_vout->yuv.p_Convert422 = (vout_yuv_convert_t *) Convert24;
+            p_vout->yuv.p_Convert444 = (vout_yuv_convert_t *) Convert24;
+            break;
+        case 4:
+            p_vout->yuv.p_Convert420 = (vout_yuv_convert_t *) Convert32;
+            p_vout->yuv.p_Convert422 = (vout_yuv_convert_t *) Convert32;
+            p_vout->yuv.p_Convert444 = (vout_yuv_convert_t *) Convert32;
+            break;
+        }
+    }
+    else
+    {
+        /* Color */
+        switch( p_vout->i_bytes_per_pixel )
+        {
+        case 1:
+            p_vout->yuv.p_Convert420 = (vout_yuv_convert_t *) ConvertRGB8;
+            p_vout->yuv.p_Convert422 = (vout_yuv_convert_t *) ConvertRGB8;
+            p_vout->yuv.p_Convert444 = (vout_yuv_convert_t *) ConvertRGB8;
+            break;
+        case 2:
+            p_vout->yuv.p_Convert420 =   (vout_yuv_convert_t *) ConvertRGB16;
+            p_vout->yuv.p_Convert422 =   (vout_yuv_convert_t *) ConvertRGB16;
+            p_vout->yuv.p_Convert444 =   (vout_yuv_convert_t *) ConvertRGB16;
+            break;
+        case 3:
+            p_vout->yuv.p_Convert420 =   (vout_yuv_convert_t *) ConvertRGB24;
+            p_vout->yuv.p_Convert422 =   (vout_yuv_convert_t *) ConvertRGB24;
+            p_vout->yuv.p_Convert444 =   (vout_yuv_convert_t *) ConvertRGB24;
+            break;
+        case 4:
+            p_vout->yuv.p_Convert420 =   (vout_yuv_convert_t *) ConvertRGB32;
+            p_vout->yuv.p_Convert422 =   (vout_yuv_convert_t *) ConvertRGB32;
+            p_vout->yuv.p_Convert444 =   (vout_yuv_convert_t *) ConvertRGB32;
+            break;
+        }
+    }
+}