]> git.sesse.net Git - vlc/commitdiff
* ./modules/video_output/svgalib.c: SVGAlib video output module.
authorSam Hocevar <sam@videolan.org>
Wed, 21 Aug 2002 15:10:33 +0000 (15:10 +0000)
committerSam Hocevar <sam@videolan.org>
Wed, 21 Aug 2002 15:10:33 +0000 (15:10 +0000)
    Currently only supports 256 color output, and defaults to 320x200. You need     to be root to use it, it may leave your console in an unusable state, lock
    up your video card, it will segfault at exit if you compile it as a plugin
    because of SVGAlib's ludicrous use of atexit() and signal().
    Apart from these few glitches, it's rather OK, use "-I dummy -V svgalib"
    to activate. Q or Esc to quit (press for a long time if it doesn't work).

Makefile.opts.in
configure
configure.in
modules/video_output/Makefile
modules/video_output/svgalib.c [new file with mode: 0644]
src/video_output/vout_pictures.c

index e0bafc36bf73707eaf3512dc2f83ad1c49da09c3..1c1029269ec636bfc9403221c8ef7e02903eb2ab 100644 (file)
@@ -82,6 +82,7 @@ ts_dvbpsi_CFLAGS = @ts_dvbpsi_CFLAGS@
 qt_CFLAGS = @qt_CFLAGS@
 qte_CFLAGS = @qte_CFLAGS@
 sdl_CFLAGS = @sdl_CFLAGS@
+svgalib_CFLAGS = @svgalib_CFLAGS@
 x11_CFLAGS = @x11_CFLAGS@
 xvideo_CFLAGS = @xvideo_CFLAGS@
 
@@ -135,6 +136,7 @@ qt_LDFLAGS = @qt_LDFLAGS@
 qte_LDFLAGS = @qte_LDFLAGS@
 rc_LDFLAGS = @rc_LDFLAGS@
 sdl_LDFLAGS = @sdl_LDFLAGS@
+svgalib_LDFLAGS = @svgalib_LDFLAGS@
 audio_LDFLAGS = @audio_LDFLAGS@
 ts_dvbpsi_LDFLAGS = @ts_dvbpsi_LDFLAGS@
 vcd_LDFLAGS = @vcd_LDFLAGS@
index 2f40892c10a323bf203f7750c4a328925b16d8e9..020edfefbff53b698bebe4fb38e4ed9ce86667c5 100755 (executable)
--- a/configure
+++ b/configure
@@ -8153,8 +8153,8 @@ fi
 
 if test "x${enable_svgalib}" = "xyes"
 then
-  PLUGINS="${PLUGINS} video_output/svgalib"
-  svgalib_LDFLAGS="${svgalib_LDFLAGS} -lvga -lvgagl"
+  BUILTINS="${BUILTINS} video_output/svgalib"
+  svgalib_LDFLAGS="${svgalib_LDFLAGS} -lvgagl -lvga"
 fi
 
 # Check whether --enable-ggi or --disable-ggi was given.
index aa92cf06727addb8a410bb8ff3d8466bf105c5f9..d5f7f56acea03ddb67787d27cb02986c39bb3200 100644 (file)
@@ -1435,8 +1435,8 @@ AC_ARG_ENABLE(svgalib,
   [  --enable-svgalib        SVGAlib support (default disabled)])
 if test "x${enable_svgalib}" = "xyes"
 then
-  PLUGINS="${PLUGINS} video_output/svgalib"
-  svgalib_LDFLAGS="${svgalib_LDFLAGS} -lvga -lvgagl"
+  BUILTINS="${BUILTINS} video_output/svgalib"
+  svgalib_LDFLAGS="${svgalib_LDFLAGS} -lvgagl -lvga"
 fi
 
 dnl
index c294c6002fb251538aaa19f8494abd235fba1850..f297b1e2cd0ea7f74c8dc1fe3940b536d94fe004 100644 (file)
@@ -3,3 +3,4 @@ fb_SOURCES = fb.c
 ggi_SOURCES = ggi.c
 glide_SOURCES = glide.c
 sdl_SOURCES = sdl.c
+svgalib_SOURCES = svgalib.c
diff --git a/modules/video_output/svgalib.c b/modules/video_output/svgalib.c
new file mode 100644 (file)
index 0000000..03dbba3
--- /dev/null
@@ -0,0 +1,261 @@
+/*****************************************************************************
+ * svgalib.c : SVGAlib plugin for vlc
+ *****************************************************************************
+ * Copyright (C) 2002 VideoLAN
+ * $Id: svgalib.c,v 1.1 2002/08/21 15:10:33 sam Exp $
+ *
+ * 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
+ * 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, USA.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include <stdlib.h>
+
+#include <vlc/vlc.h>
+#include <vlc/vout.h>
+
+#include <vga.h>
+#include <vgagl.h>
+#include <vgakeyboard.h>
+
+/*****************************************************************************
+ * Local prototypes
+ *****************************************************************************/
+static int  Create    ( vlc_object_t * );
+static void Destroy   ( vlc_object_t * );
+
+static int  Init      ( vout_thread_t * );
+static void End       ( vout_thread_t * );
+static int  Manage    ( vout_thread_t * );
+static void Display   ( vout_thread_t *, picture_t * );
+
+static void SetPalette( vout_thread_t *, u16 *, u16 *, u16 * );
+
+/*****************************************************************************
+ * Module descriptor
+ *****************************************************************************/
+vlc_module_begin();                                            
+    set_description( _("SVGAlib module") );
+    set_capability( "video output", 0 );
+    set_callbacks( Create, Destroy );
+vlc_module_end();
+
+/*****************************************************************************
+ * vout_sys_t: video output descriptor
+ *****************************************************************************
+ * This structure is part of the video output thread descriptor.
+ * It describes the SVGAlib specific properties of an output thread.
+ *****************************************************************************/
+struct vout_sys_t
+{
+    int i_vgamode;
+};
+
+/*****************************************************************************
+ * Create: allocates video thread
+ *****************************************************************************
+ * This function allocates and initializes a vout method.
+ *****************************************************************************/
+static int Create( vlc_object_t *p_this )
+{
+    vout_thread_t *p_vout = (vout_thread_t *)p_this;
+
+    /* Allocate instance and initialize some members */
+    p_vout->p_sys = malloc( sizeof( vout_sys_t ) );
+    if( p_vout->p_sys == NULL )
+    {
+        return VLC_ENOMEM;
+    }
+
+    /* FIXME: find a way to test for SVGAlib availability. We cannot call
+     * vga_init from here because it needs to be closed from the same thread
+     * and we might give away the video output to another thread. Bah, it
+     * doesn't matter anyway ... SVGAlib is being an UGLY DIRTY PIG and calls
+     * atexit() and exit() so what can we do? */
+
+    p_vout->pf_init = Init;
+    p_vout->pf_end = End;
+    p_vout->pf_manage = Manage;
+    p_vout->pf_render = NULL;
+    p_vout->pf_display = Display;
+
+    return VLC_SUCCESS;
+}
+
+/*****************************************************************************
+ * Init: initialize video thread
+ *****************************************************************************/
+static int Init( vout_thread_t *p_vout )
+{
+    int i_index;
+    picture_t *p_pic;
+
+    I_OUTPUTPICTURES = 0;
+
+    /* SVGAlib shut up! */
+    vga_disabledriverreport();
+
+    /* We cannot call vga_init() in Create() because it has to be run
+     * from the same thread as the other vga calls. */
+    vga_init();
+
+    /* Check that we have a 8bpp mode available */
+    p_vout->p_sys->i_vgamode = vga_getdefaultmode();
+    if( p_vout->p_sys->i_vgamode == -1
+         || vga_getmodeinfo(p_vout->p_sys->i_vgamode)->bytesperpixel != 1 )
+    {
+        p_vout->p_sys->i_vgamode = G320x200x256;
+    }
+
+    if( !vga_hasmode( p_vout->p_sys->i_vgamode ) )
+    {
+        msg_Err( p_vout, "mode %i not available", p_vout->p_sys->i_vgamode );
+        return VLC_EGENERIC;
+    }
+
+    vga_setmode( p_vout->p_sys->i_vgamode );
+    gl_setcontextvga( p_vout->p_sys->i_vgamode );
+    gl_enableclipping();
+
+    if( keyboard_init() )
+    {
+        msg_Err( p_vout, "could not initialize keyboard" );
+        vga_setmode( TEXT );
+        return VLC_EGENERIC;
+    }
+
+    /* Just in case */
+    keyboard_translatekeys( TRANSLATE_CURSORKEYS |
+                            TRANSLATE_KEYPADENTER |
+                            TRANSLATE_DIAGONAL );
+
+    /* Initialize the output structure: RGB with square pixels, whatever
+     * the input format is, since it's the only format we know */
+    p_vout->output.i_chroma = VLC_FOURCC('R','G','B','2');
+    p_vout->output.pf_setpalette = SetPalette;
+    p_vout->output.i_width = vga_getxdim();
+    p_vout->output.i_height = vga_getydim();
+    p_vout->output.i_aspect = p_vout->output.i_width
+                               * VOUT_ASPECT_FACTOR / p_vout->output.i_height;
+
+    /* Try to initialize 1 direct buffer */
+    p_pic = NULL;
+
+    /* Find an empty picture slot */
+    for( i_index = 0 ; i_index < VOUT_MAX_PICTURES ; i_index++ )
+    {
+        if( p_vout->p_picture[ i_index ].i_status == FREE_PICTURE )
+        {
+            p_pic = p_vout->p_picture + i_index;
+            break;
+        }
+    }
+    
+    /* Allocate the picture */
+    if( p_pic == NULL )
+    {
+        return VLC_SUCCESS;
+    }
+
+    vout_AllocatePicture( p_vout, p_pic, p_vout->output.i_width,
+                          p_vout->output.i_height,
+                          p_vout->output.i_chroma );
+
+    if( p_pic->i_planes == 0 )
+    {
+        return VLC_SUCCESS;
+    }
+
+    p_pic->i_status = DESTROYED_PICTURE;
+    p_pic->i_type   = DIRECT_PICTURE;
+
+    PP_OUTPUTPICTURE[ I_OUTPUTPICTURES ] = p_pic;
+
+    I_OUTPUTPICTURES++;
+
+    return VLC_SUCCESS;
+}
+
+/*****************************************************************************
+ * End: terminate video thread
+ *****************************************************************************/
+static void End( vout_thread_t *p_vout )
+{
+    keyboard_close();
+    vga_clear();
+    vga_setmode( TEXT );
+}
+
+/*****************************************************************************
+ * Destroy: destroy video thread
+ *****************************************************************************
+ * Terminate an output method created by Create
+ *****************************************************************************/
+static void Destroy( vlc_object_t *p_this )
+{
+    vout_thread_t *p_vout = (vout_thread_t *)p_this;
+
+    /* Destroy structure */
+    free( p_vout->p_sys );
+}
+
+/*****************************************************************************
+ * Manage: handle SVGAlib events
+ *****************************************************************************
+ * This function should be called regularly by video output thread. It manages
+ * console events. It returns a non null value on error.
+ *****************************************************************************/
+static int Manage( vout_thread_t *p_vout )
+{
+    keyboard_update();
+
+    if( keyboard_keypressed(SCANCODE_ESCAPE)
+         || keyboard_keypressed(SCANCODE_Q ) )
+    {
+        p_vout->p_vlc->b_die = VLC_TRUE;
+    }
+
+    return VLC_SUCCESS;
+}
+
+/*****************************************************************************
+ * Display: displays previously rendered output
+ *****************************************************************************
+ * This function sends the currently rendered image to the VGA card.
+ *****************************************************************************/
+static void Display( vout_thread_t *p_vout, picture_t *p_pic )
+{
+    gl_putbox( 0, 0, p_vout->output.i_width,
+               p_vout->output.i_height, p_pic->p->p_pixels );
+}
+
+/*****************************************************************************
+ * SetPalette: set a 8bpp palette
+ *****************************************************************************
+ * TODO: support 8 bits clut (for Mach32 cards and others).
+ *****************************************************************************/
+static void SetPalette( vout_thread_t *p_vout, u16 *red, u16 *green, u16 *blue )
+{
+    int i = 256;
+
+    while( i-- )
+    {
+        vga_setpalette( i, red[i]>>10, green[i]>>10, blue[i]>>10 );
+    }
+}
+
index aba7ae901486843bd1f495183aba862df4eac75c..eeffce966dd868d96b72fbd1bbe646f9b256a24c 100644 (file)
@@ -2,7 +2,7 @@
  * vout_pictures.c : picture management functions
  *****************************************************************************
  * Copyright (C) 2000 VideoLAN
- * $Id: vout_pictures.c,v 1.28 2002/07/23 00:39:17 sam Exp $
+ * $Id: vout_pictures.c,v 1.29 2002/08/21 15:10:33 sam Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -500,6 +500,14 @@ void vout_AllocatePicture( vout_thread_t *p_vout, picture_t *p_pic,
             p_pic->i_planes = 1;
             break;
 
+        case FOURCC_RGB2:
+            p_pic->p->i_lines = i_height;
+            p_pic->p->i_pitch = i_width;
+            p_pic->p->i_visible_pitch = p_pic->p->i_pitch;
+            p_pic->p->i_pixel_pitch = 1;
+            p_pic->i_planes = 1;
+            break;
+
         case FOURCC_RV15:
             p_pic->p->i_lines = i_height;
             p_pic->p->i_pitch = i_width * 2;