On Sun, Mar 02 2003, Xavier Bachelot wrote:
> On Fri, 2003-02-28 at 17:48, Chris Kleeschulte wrote:
> > I am also looking for this patch. The one that was posted by Jens was
> > truncated. Can someone help?
> >
> You can find that patch on its original author webpage at:
>
> http://www.gdv.uni-hannover.de/~hunold1/linux/dxr3/sdl/
That one is based on fame, it is much slower than the attached which
uses ffmpeg. Maybe someone can stick it on the wiki or something, I get
regular requests for it (and I'm not using a dxr3 myself anymore).
--
Jens Axboe
--- /usr/local/SDL-1.2.5/configure.in 2002-10-06 13:34:53.000000000 -0700
+++ SDL-1.2.5/configure.in 2002-12-29 06:58:58.000000000 -0800
@@ -1000,6 +1002,25 @@
fi
}
+dnl Set up the Dxr3 video driver.
+CheckDxr3Video()
+{
+ AC_ARG_ENABLE(video-dxr3,
+[ --enable-video-dxr3 use dxr3 video driver [default=yes]],
+ , enable_video_dxr3=yes)
+ if test x$enable_video_dxr3 = xyes; then
+ CFLAGS="$CFLAGS -DENABLE_DXR3VIDEO"
+ VIDEO_SUBDIRS="$VIDEO_SUBDIRS dxr3"
+ VIDEO_DRIVERS="$VIDEO_DRIVERS dxr3/libvideo_dxr3.la"
+
+ DXR3_CFLAGS="-I/usr/include/ffmpeg"
+ DXR3_LIBS="-lavcodec"
+
+ AC_SUBST(DXR3_CFLAGS)
+ AC_SUBST(DXR3_LIBS)
+ fi
+}
+
dnl Check to see if OpenGL support is desired
AC_ARG_ENABLE(video-opengl,
[ --enable-video-opengl include OpenGL context creation [default=yes]],
@@ -1680,6 +1701,7 @@
case "$target" in
*-*-linux*)
ARCH=linux
+ CheckDxr3Video
CheckDummyVideo
CheckDiskAudio
CheckDLOPEN
@@ -2623,6 +2643,7 @@
src/video/photon/Makefile
src/video/epoc/Makefile
src/video/dummy/Makefile
+src/video/dxr3/Makefile
src/video/ataricommon/Makefile
src/video/xbios/Makefile
src/video/gem/Makefile
--- /dev/null 2002-11-18 10:54:08.000000000 -0800
+++ SDL-1.2.5/src/video/dxr3/Makefile.am 2002-12-29 06:58:58.000000000 -0800
@@ -0,0 +1,18 @@
+
+## Makefile.am for SDL using the dxr3 video driver
+
+CFLAGS = @CFLAGS@ $(DXR3_CFLAGS)
+
+noinst_LTLIBRARIES = libvideo_dxr3.la
+libvideo_dxr3_la_SOURCES = $(DXR3_SRCS)
+libvideo_dxr3_la_LIBADD = $(DXR3_LIBS)
+
+# The SDL null video driver sources
+DXR3_SRCS = \
+ SDL_dxr3video.h \
+ SDL_dxr3events.c \
+ SDL_dxr3events_c.h \
+ SDL_dxr3mouse.c \
+ SDL_dxr3mouse_c.h \
+ SDL_dxr3video.c
+
--- /dev/null 2002-11-18 10:54:08.000000000 -0800
+++ SDL-1.2.5/src/video/dxr3/SDL_dxr3events.c 2002-12-29 09:10:13.000000000 -0800
@@ -0,0 +1,234 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Sam Lantinga
+ [EMAIL PROTECTED]
+*/
+
+#ifdef SAVE_RCSID
+static char rcsid =
+ "@(#) $Id: SDL_dxr3events.c,v 1.3 2002/03/06 11:23:03 slouken Exp $";
+#endif
+
+/* Being a dxr3 driver, there's no event stream. We just define stubs for
+ most of the API. */
+
+#include "SDL.h"
+#include "SDL_sysevents.h"
+#include "SDL_keysym.h"
+#include "SDL_events_c.h"
+#include "SDL_dxr3video.h"
+#include "SDL_dxr3events_c.h"
+
+#include <time.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+int DXR3_OpenKeyboard(SDL_VideoDevice *vdev)
+{
+ struct SDL_PrivateVideoData *data = vdev->hidden;
+ struct termios tio_new;
+
+// fprintf(stderr,"DXR3_OpenKeyboard() called.\n");
+
+ ioctl(0,TCGETS,&data->tio_orig);
+
+ memcpy(&tio_new,&data->tio_orig,sizeof(struct termios));
+ tio_new.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
+ tio_new.c_cc[VMIN] = 1;
+ tio_new.c_cc[VTIME] = 0;
+
+ ioctl(0,TCSETS,&tio_new);
+
+ return 0;
+}
+
+void DXR3_CloseKeyboard(SDL_VideoDevice *vdev)
+{
+ struct SDL_PrivateVideoData *data = vdev->hidden;
+
+// fprintf(stderr,"DXR3_CloseKeyboard() called.\n");
+
+ ioctl(0,TCSETS,&data->tio_orig);
+
+ if ( data->fd_keyboard >= 0 ) {
+ /* not necessary... */
+ /* close(data->fd_keyboard); */
+ }
+ data->fd_keyboard = -1;
+}
+
+#ifdef axa
+static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym)
+{
+// fprintf(stderr,"TranslateKey() called.\n");
+ /* Set the keysym information */
+ keysym->scancode = scancode;
+ keysym->sym = scancode; // keymap[scancode];
+ keysym->mod = KMOD_NONE;
+
+ /* If UNICODE is on, get the UNICODE value for the key */
+ keysym->unicode = 0;
+ if ( SDL_TranslateUNICODE ) {
+ int map;
+ SDLMod modstate;
+
+ modstate = SDL_GetModState();
+ map = 0;
+ if ( modstate & KMOD_SHIFT ) {
+ map |= (1<<KG_SHIFT);
+ }
+ if ( modstate & KMOD_CTRL ) {
+ map |= (1<<KG_CTRL);
+ }
+ if ( modstate & KMOD_ALT ) {
+ map |= (1<<KG_ALT);
+ }
+ if ( modstate & KMOD_MODE ) {
+ map |= (1<<KG_ALTGR);
+ }
+ if ( KTYP(vga_keymap[map][scancode]) == KT_LETTER ) {
+ if ( modstate & KMOD_CAPS ) {
+ map ^= (1<<KG_SHIFT);
+ }
+ }
+ if ( KTYP(vga_keymap[map][scancode]) == KT_PAD ) {
+ if ( modstate & KMOD_NUM ) {
+ keysym->unicode=KVAL(vga_keymap[map][scancode]);
+ }
+ } else {
+ keysym->unicode = KVAL(vga_keymap[map][scancode]);
+ }
+ }
+ return(keysym);
+}
+#endif
+
+static void handle_keyboard(SDL_VideoDevice *vdev)
+{
+ struct SDL_PrivateVideoData *data = vdev->hidden;
+
+ unsigned char keybuf[BUFSIZ];
+ int i, nread;
+ SDL_keysym keysym;
+
+ struct timespec ts;
+ ts.tv_sec = 0;
+ ts.tv_nsec = 50*1000;
+
+// fprintf(stderr,"handle_keyboard() in.\n");
+
+ nread = read(data->fd_keyboard, keybuf, BUFSIZ);
+ i = 0;
+ while( i < nread) {
+
+
+ memset(&keysym, 0, sizeof(keysym));
+ keysym.mod = KMOD_NONE;
+ keysym.unicode = 0;
+
+ if( (nread-i) >= 3 ) {
+ if(keybuf[i] == 27 && keybuf[i+1] == 91) {
+ switch( keybuf[i+2] ) {
+ case 68: {
+ keysym.sym = SDLK_LEFT;
+ break;
+ }
+ case 67: {
+ keysym.sym = SDLK_RIGHT;
+ break;
+ }
+ case 65: {
+ keysym.sym = SDLK_UP;
+ break;
+ }
+ case 66: {
+ keysym.sym = SDLK_DOWN;
+ break;
+ }
+ default: {
+ printf("unknow key: %d\n",keybuf[i+2]);
+ break;
+ }
+ }
+ data->posted += SDL_PrivateKeyboard(SDL_PRESSED, &keysym);
+ data->posted += SDL_PrivateKeyboard(SDL_RELEASED, &keysym);
+ i += 3;
+ continue;
+ }
+ }
+ switch( keybuf[i] ) {
+ case 10:
+ keysym.sym = SDLK_RETURN;
+ break;
+ default:
+ keysym.sym = keybuf[i];
+ break;
+
+ }
+// printf("key pressed: %d\n",keysym.sym);
+
+ i += 1;
+ data->posted += SDL_PrivateKeyboard(SDL_PRESSED, &keysym);
+ data->posted += SDL_PrivateKeyboard(SDL_RELEASED, &keysym);
+// nanosleep(&ts,NULL);
+ }
+
+// fprintf(stderr,"handle_keyboard() out.\n");
+}
+
+void DXR3_PumpEvents(SDL_VideoDevice *vdev)
+{
+ struct SDL_PrivateVideoData *data = vdev->hidden;
+
+ fd_set fdset;
+ int max_fd;
+ static struct timeval zero;
+
+// fprintf(stderr,"DXR3_PumpEvents() in.\n");
+
+ do {
+ data->posted = 0;
+
+ FD_ZERO(&fdset);
+ max_fd = 0;
+ if ( data->fd_keyboard >= 0 ) {
+ FD_SET(data->fd_keyboard, &fdset);
+ if ( max_fd < data->fd_keyboard ) {
+ max_fd = data->fd_keyboard;
+ }
+ }
+ if ( select(max_fd+1, &fdset, NULL, NULL, &zero) > 0 ) {
+ if ( data->fd_keyboard >= 0 ) {
+ if ( FD_ISSET(data->fd_keyboard, &fdset) ) {
+ handle_keyboard(vdev);
+ }
+ }
+ }
+ } while ( data->posted );
+// fprintf(stderr,"DXR3_PumpEvents() out.\n");
+}
+
+void DXR3_InitOSKeymap(SDL_VideoDevice *vdev)
+{
+ /* do nothing. */
+}
+
+/* end of SDL_dxr3events.c ... */
+
--- /dev/null 2002-11-18 10:54:08.000000000 -0800
+++ SDL-1.2.5/src/video/dxr3/SDL_dxr3events_c.h 2002-12-29 09:10:59.000000000 -0800
@@ -0,0 +1,39 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Sam Lantinga
+ [EMAIL PROTECTED]
+*/
+
+#ifdef SAVE_RCSID
+static char rcsid =
+ "@(#) $Id: SDL_dxr3events_c.h,v 1.3 2002/03/06 11:23:03 slouken Exp $";
+#endif
+
+#include "SDL_dxr3video.h"
+
+/* Variables and functions exported by SDL_sysevents.c to other parts
+ of the native video subsystem (SDL_sysvideo.c)
+*/
+extern void DXR3_InitOSKeymap(SDL_VideoDevice *vdev);
+extern void DXR3_PumpEvents(SDL_VideoDevice *vdev);
+extern int DXR3_OpenKeyboard(SDL_VideoDevice *vdev);
+extern void DXR3_CloseKeyboard(SDL_VideoDevice *vdev);
+
+/* end of SDL_dxr3events_c.h ... */
+
--- /dev/null 2002-11-18 10:54:08.000000000 -0800
+++ SDL-1.2.5/src/video/dxr3/SDL_dxr3mouse.c 2002-12-29 06:58:58.000000000 -0800
@@ -0,0 +1,40 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Sam Lantinga
+ [EMAIL PROTECTED]
+*/
+
+#ifdef SAVE_RCSID
+static char rcsid =
+ "@(#) $Id: SDL_dxr3mouse.c,v 1.3 2002/03/06 11:23:03 slouken Exp $";
+#endif
+
+#include <stdio.h>
+
+#include "SDL_error.h"
+#include "SDL_mouse.h"
+#include "SDL_events_c.h"
+
+#include "SDL_dxr3mouse_c.h"
+
+
+/* The implementation dependent data for the window manager cursor */
+struct WMcursor {
+ int unused;
+};
--- /dev/null 2002-11-18 10:54:08.000000000 -0800
+++ SDL-1.2.5/src/video/dxr3/SDL_dxr3mouse_c.h 2002-12-29 06:58:58.000000000 -0800
@@ -0,0 +1,30 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Sam Lantinga
+ [EMAIL PROTECTED]
+*/
+
+#ifdef SAVE_RCSID
+static char rcsid =
+ "@(#) $Id: SDL_dxr3mouse_c.h,v 1.3 2002/03/06 11:23:03 slouken Exp $";
+#endif
+
+#include "SDL_dxr3video.h"
+
+/* Functions to be exported */
--- /dev/null 2002-11-18 10:54:08.000000000 -0800
+++ SDL-1.2.5/src/video/dxr3/SDL_dxr3video.c 2002-12-29 10:32:16.000000000 -0800
@@ -0,0 +1,433 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Sam Lantinga
+ [EMAIL PROTECTED]
+*/
+
+#ifdef SAVE_RCSID
+static char rcsid =
+ "@(#) $Id: SDL_dxr3video.c,v 1.6 2002/03/06 11:23:03 slouken Exp $";
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <linux/em8300.h>
+
+#include "SDL.h"
+#include "SDL_error.h"
+#include "SDL_video.h"
+#include "SDL_mouse.h"
+#include "SDL_sysvideo.h"
+#include "SDL_pixels_c.h"
+#include "SDL_events_c.h"
+
+#include "SDL_dxr3video.h"
+#include "SDL_dxr3events_c.h"
+#include "SDL_dxr3mouse_c.h"
+
+#define DXR3VID_DRIVER_NAME "dxr3"
+
+/* Initialization/Query functions */
+static int DXR3_VideoInit(SDL_VideoDevice *vdev, SDL_PixelFormat *vformat);
+static SDL_Rect **DXR3_ListModes(SDL_VideoDevice *vdev, SDL_PixelFormat *format,
Uint32 flags);
+static SDL_Surface *DXR3_SetVideoMode(SDL_VideoDevice *vdev, SDL_Surface *current,
int width, int height, int bpp, Uint32 flags);
+static int DXR3_SetColors(SDL_VideoDevice *vdev, int firstcolor, int ncolors,
SDL_Color *colors);
+static void DXR3_VideoQuit(SDL_VideoDevice *vdev);
+
+/* Hardware surface functions */
+static int DXR3_AllocHWSurface(SDL_VideoDevice *vdev, SDL_Surface *surface);
+static int DXR3_LockHWSurface(SDL_VideoDevice *vdev, SDL_Surface *surface);
+static void DXR3_UnlockHWSurface(SDL_VideoDevice *vdev, SDL_Surface *surface);
+static void DXR3_FreeHWSurface(SDL_VideoDevice *vdev, SDL_Surface *surface);
+
+/* etc. */
+static void DXR3_UpdateRects(SDL_VideoDevice *vdev, int numrects, SDL_Rect *rects);
+
+
+const char *devname_v = "/dev/em8300_mv-0";
+const char *devname_c = "/dev/em8300-0";
+
+#define OUTBUF_SIZE 300000
+
+#define MAX_WIDTH 720
+#define MAX_HEIGHT 576
+
+/* DXR3 driver bootstrap functions */
+
+static int DXR3_Available(void)
+{
+ const char *envr = getenv("SDL_VIDEODRIVER");
+
+ if (envr && !strcmp(envr, DXR3VID_DRIVER_NAME))
+ return 1;
+
+ return 0;
+}
+
+static void DXR3_DeleteDevice(SDL_VideoDevice *device)
+{
+ free(device->hidden);
+ device->hidden = NULL;
+ free(device);
+}
+
+static SDL_VideoDevice *DXR3_CreateDevice(int devindex)
+{
+ SDL_VideoDevice *device;
+
+ /* Initialize all variables that we clean on shutdown */
+ device = malloc(sizeof(SDL_VideoDevice));
+ if (!device)
+ return NULL;
+ memset(device, 0, sizeof(*device));
+
+ device->hidden = malloc((sizeof(*device->hidden)));
+ if (!device->hidden) {
+ free(device);
+ return NULL;
+ }
+ memset(device->hidden, 0, sizeof(*device->hidden));
+
+ /* Set the function pointers */
+ device->VideoInit = DXR3_VideoInit;
+ device->ListModes = DXR3_ListModes;
+ device->SetVideoMode = DXR3_SetVideoMode;
+ device->CreateYUVOverlay = NULL;
+ device->SetColors = DXR3_SetColors;
+ device->UpdateRects = DXR3_UpdateRects;
+ device->VideoQuit = DXR3_VideoQuit;
+ device->AllocHWSurface = DXR3_AllocHWSurface;
+ device->CheckHWBlit = NULL;
+ device->FillHWRect = NULL;
+ device->SetHWColorKey = NULL;
+ device->SetHWAlpha = NULL;
+ device->LockHWSurface = DXR3_LockHWSurface;
+ device->UnlockHWSurface = DXR3_UnlockHWSurface;
+ device->FlipHWSurface = NULL;
+ device->FreeHWSurface = DXR3_FreeHWSurface;
+ device->SetCaption = NULL;
+ device->SetIcon = NULL;
+ device->IconifyWindow = NULL;
+ device->GrabInput = NULL;
+ device->GetWMInfo = NULL;
+ device->InitOSKeymap = DXR3_InitOSKeymap;
+ device->PumpEvents = DXR3_PumpEvents;
+
+ device->free = DXR3_DeleteDevice;
+
+ return device;
+}
+
+VideoBootStrap DXR3_bootstrap = {
+ DXR3VID_DRIVER_NAME,
+ "SDL dxr3 video driver",
+ DXR3_Available,
+ DXR3_CreateDevice
+};
+
+
+int DXR3_VideoInit(SDL_VideoDevice *vdev, SDL_PixelFormat *vformat)
+{
+ struct SDL_PrivateVideoData *data = vdev->hidden;
+
+ fprintf(stderr, "WARNING: You are using the SDL dxr3 video driver!\n");
+
+ /* Determine the screen depth (use default 8-bit depth) */
+ /* we change this during the SDL_SetVideoMode implementation... */
+ vformat->BitsPerPixel = 8;
+ vformat->BytesPerPixel = 1;
+
+ /* fixme: 0 means stdin */
+ data->fd_keyboard = 0;
+
+ if (DXR3_OpenKeyboard(vdev) < 0) {
+ DXR3_VideoQuit(vdev);
+ return -1;
+ }
+
+ /* We're done! */
+ return 0;
+}
+
+SDL_Rect **DXR3_ListModes(SDL_VideoDevice *vdev, SDL_PixelFormat *format,
+ Uint32 flags)
+{
+ return (SDL_Rect **) -1;
+}
+
+SDL_Surface *DXR3_SetVideoMode(SDL_VideoDevice *vdev, SDL_Surface *current,
+ int width, int height, int bpp, Uint32 flags)
+{
+ struct SDL_PrivateVideoData *data = vdev->hidden;
+ em8300_register_t reg;
+ int ioval = 0;
+ int tmp1, tmp2;
+
+ if (vdev->hidden->buffer)
+ free(vdev->hidden->buffer);
+
+ vdev->hidden->buffer = malloc(width * height * (bpp / 8));
+ if (!vdev->hidden->buffer) {
+ SDL_SetError("Couldn't allocate buffer for requested mode");
+ return NULL;
+ }
+
+ memset(vdev->hidden->buffer, 0, width * height * (bpp / 8));
+
+ /* Allocate the new pixel format for the screen */
+ if (!SDL_ReallocFormat(current, bpp, 0, 0, 0, 0)) {
+ SDL_SetError("Couldn't allocate new pixel format for requested mode");
+ goto err_buffer;
+ }
+
+ /* Set up the new mode framebuffer */
+ current->flags = flags & SDL_FULLSCREEN;
+ current->w = width;
+ current->h = height;
+
+ /* quick hack */
+ if (width > MAX_WIDTH) {
+ fprintf(stderr, "WARNING: width (%d) out of bounds. cropping to %d
pixels!\n", width, MAX_WIDTH);
+ width = MAX_WIDTH;
+ }
+ if (height > MAX_HEIGHT ) {
+ fprintf(stderr, "WARNING: height (%d) out of bounds. cropping to %d
pixels!\n", height, MAX_HEIGHT);
+ height = MAX_HEIGHT;
+ }
+
+ vdev->hidden->w = width;
+ vdev->hidden->h = height;
+ current->pitch = width * (bpp / 8);
+ current->pixels = vdev->hidden->buffer;
+
+ /* Open and set up the dxr3 */
+ data->fd_video = open(devname_v, O_WRONLY | O_NONBLOCK);
+ if (data->fd_video < 0) {
+ SDL_SetError("Couldn't open video part of dxr3.");
+ goto err_buffer;
+ }
+
+ data->fd_control = open(devname_c, O_WRONLY | O_NONBLOCK);
+ if (data->fd_control < 0) {
+ SDL_SetError("Couldn't open control part of dxr3.");
+ goto err_control;
+ }
+
+ /* Set the playmode to play (just in case another app has set it to something
else) */
+ ioval = EM8300_PLAYMODE_PLAY;
+ if (ioctl(data->fd_control, EM8300_IOCTL_SET_PLAYMODE, &ioval) < 0) {
+ SDL_SetError("Couldn't set playmode of dxr3.");
+ goto err_set_play;
+ }
+
+ /* Start em8300 prebuffering and sync engine */
+ reg.microcode_register = 1;
+ reg.reg = 0;
+ reg.val = MVCOMMAND_SYNC;
+ if (ioctl(data->fd_control, EM8300_IOCTL_WRITEREG, ®)) {
+ SDL_SetError("Couldn't EM8300_IOCTL_WRITEREG (dxr3).");
+ goto err_set_play;
+ }
+
+ /* Clean buffer by syncing it */
+ ioval = EM8300_SUBDEVICE_VIDEO;
+ ioctl(data->fd_control, EM8300_IOCTL_FLUSH, &ioval);
+ ioval = EM8300_SUBDEVICE_AUDIO;
+ ioctl(data->fd_control, EM8300_IOCTL_FLUSH, &ioval);
+
+ fsync(data->fd_video);
+
+ tmp1 = abs(height - ((width / 4) * 3));
+ tmp2 = abs(height - (int)(width / 2.35));
+ if (tmp1 < tmp2)
+ ioval = EM8300_ASPECTRATIO_4_3;
+ else
+ ioval = EM8300_ASPECTRATIO_16_9;
+ ioctl(data->fd_control, EM8300_IOCTL_SET_ASPECTRATIO, &ioval);
+
+ data->outbuf = malloc(OUTBUF_SIZE);
+ if (!data->outbuf) {
+ SDL_SetError("malloc() failed (dxr3).");
+ goto err_set_play;
+ }
+
+ data->picture_yuv = malloc((width * height * 3) / 2);
+ if (!data->picture_yuv) {
+ SDL_SetError("malloc() failed (dxr3).");
+ goto err_outbuf;
+ }
+
+ avcodec_init();
+ avcodec_register_all();
+
+ /* fix me: error handling */
+ data->codec = avcodec_find_encoder(CODEC_ID_MPEG1VIDEO);
+ if (!data->codec)
+ goto err_outbuf;
+
+ data->c = avcodec_alloc_context();
+ if (!data->c)
+ goto err_outbuf;
+
+ data->picture = avcodec_alloc_frame();
+ if (!data->picture)
+ goto err_alloc_frame;
+
+ data->c->bit_rate = 1000000;
+ data->c->width = width;
+ data->c->height = height;
+
+ data->c->frame_rate = 25 * FRAME_RATE_BASE;
+ data->c->gop_size = 1;
+ data->c->flags = CODEC_FLAG_QSCALE;
+
+ if (avcodec_open(data->c, data->codec) < 0)
+ goto err_avc_open;
+
+ data->picture->data[0] = data->picture_yuv;
+ data->picture->data[1] = data->picture->data[0] + width * height;
+ data->picture->data[2] = data->picture->data[1] + (width * height / 4);
+
+ data->picture->linesize[0] = width;
+ data->picture->linesize[1] = width / 2;
+ data->picture->linesize[2] = width / 2;
+
+ data->picture->quality = 2;
+
+ /* We're done */
+ return current;
+
+err_avc_open:
+ free(data->picture);
+ data->picture = NULL;
+err_alloc_frame:
+ free(data->c);
+ data->c = NULL;
+err_outbuf:
+ free(data->outbuf);
+ data->outbuf = NULL;
+err_set_play:
+ close(data->fd_control);
+ data->fd_control = -1;
+err_control:
+ close(data->fd_video);
+ data->fd_video = -1;
+err_buffer:
+ free(vdev->hidden->buffer);
+ vdev->hidden->buffer = NULL;
+ return NULL;
+}
+
+/* We don't actually allow hardware surfaces other than the main one */
+static int DXR3_AllocHWSurface(SDL_VideoDevice *vdev, SDL_Surface *surface)
+{
+ return -1;
+}
+
+static void DXR3_FreeHWSurface(SDL_VideoDevice *vdev, SDL_Surface *surface)
+{
+}
+
+/* We need to wait for vertical retrace on page flipped displays */
+static int DXR3_LockHWSurface(SDL_VideoDevice *vdev, SDL_Surface *surface)
+{
+ return 0;
+}
+
+static void DXR3_UnlockHWSurface(SDL_VideoDevice *vdev, SDL_Surface *surface)
+{
+}
+
+static void DXR3_UpdateRects(SDL_VideoDevice *vdev, int numrects,
+ SDL_Rect *rects)
+{
+ struct SDL_PrivateVideoData *data = vdev->hidden;
+ AVPicture dst, src;
+ int size;
+
+ if (data->picture_yuv) {
+ dst.data[0] = data->picture->data[0];
+ dst.data[1] = data->picture->data[1];
+ dst.data[2] = data->picture->data[2];
+ src.data[0] = data->buffer;
+ img_convert(&dst, PIX_FMT_YUV420P, &src, PIX_FMT_BGRA32,
data->c->width, data->c->height);
+
+ size = avcodec_encode_video(data->c, data->outbuf, OUTBUF_SIZE,
data->picture);
+ if (data->outbuf[size - 1] != 0xb7) {
+ /* add sequence end code */
+ data->outbuf[size] = 0x00;
+ data->outbuf[size + 1] = 0x00;
+ data->outbuf[size + 2] = 0x01;
+ data->outbuf[size + 3] = 0xb7;
+ size += 4;
+ }
+
+ write(data->fd_video, data->outbuf, size);
+ }
+}
+
+int DXR3_SetColors(SDL_VideoDevice *vdev, int firstcolor, int ncolors,
+ SDL_Color *colors)
+{
+ /* do nothing of note. */
+ return 1;
+}
+
+/* Note: If we are terminated, this could be called in the middle of
+ another SDL video routine -- notably UpdateRects.
+*/
+void DXR3_VideoQuit(SDL_VideoDevice *vdev)
+{
+ struct SDL_PrivateVideoData *data = vdev->hidden;
+
+ if (vdev->screen->pixels) {
+ free(vdev->screen->pixels);
+ vdev->screen->pixels = NULL;
+ }
+
+ /* DXR3 cleanup */
+ if (data->fd_video != -1) {
+ close(data->fd_video);
+ data->fd_video = -1;
+ }
+ if (data->fd_control != -1) {
+ close(data->fd_control);
+ data->fd_control = -1;
+ }
+
+ /* avcodec clean up */
+ if (data->picture_yuv) {
+ free(data->picture_yuv);
+ data->picture_yuv = 0;
+ }
+ if (data->outbuf) {
+ free(data->outbuf);
+ data->outbuf = 0;
+ }
+
+ DXR3_CloseKeyboard(vdev);
+}
--- /dev/null 2002-11-18 10:54:08.000000000 -0800
+++ SDL-1.2.5/src/video/dxr3/SDL_dxr3video.h 2002-12-29 09:09:01.000000000 -0800
@@ -0,0 +1,61 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Sam Lantinga
+ [EMAIL PROTECTED]
+*/
+
+#ifdef SAVE_RCSID
+static char rcsid =
+ "@(#) $Id: SDL_dxr3video.h,v 1.3 2002/03/06 11:23:03 slouken Exp $";
+#endif
+
+#ifndef _SDL_dxr3video_h
+#define _SDL_dxr3video_h
+
+#include <unistd.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/termios.h>
+
+#include <avcodec.h>
+
+#include "SDL_mouse.h"
+#include "SDL_sysvideo.h"
+#include "SDL_mutex.h"
+
+/* Private display data */
+
+struct SDL_PrivateVideoData {
+ int w, h;
+ UINT8 *buffer;
+
+ AVCodec *codec;
+ AVCodecContext *c;
+ AVFrame *picture;
+ UINT8 *picture_yuv;
+ UINT8 *outbuf;
+
+ int fd_video;
+ int fd_control;
+ struct termios tio_orig;
+ int fd_keyboard;
+ int posted;
+};
+
+#endif /* _SDL_dxr3video_h */
--- /usr/local/SDL-1.2.5/src/video/Makefile.am 2002-10-06 11:47:20.000000000 -0700
+++ SDL-1.2.5/src/video/Makefile.am 2002-12-29 06:58:58.000000000 -0800
@@ -5,7 +5,7 @@
# Define which subdirectories need to be built
SUBDIRS = @VIDEO_SUBDIRS@
-DIST_SUBDIRS = dummy x11 dga nanox fbcon directfb vgl svga ggi aalib \
+DIST_SUBDIRS = dxr3 dummy x11 dga nanox fbcon directfb vgl svga ggi aalib \
wincommon windib windx5 \
maccommon macdsp macrom quartz \
bwindow ps2gs photon cybergfx epoc picogui \
--- /usr/local/SDL-1.2.5/src/video/SDL_sysvideo.h 2002-10-05 09:50:56.000000000
-0700
+++ SDL-1.2.5/src/video/SDL_sysvideo.h 2002-12-29 06:58:58.000000000 -0800
@@ -394,6 +394,9 @@
#ifdef ENABLE_DUMMYVIDEO
extern VideoBootStrap DUMMY_bootstrap;
#endif
+#ifdef ENABLE_DXR3VIDEO
+extern VideoBootStrap DXR3_bootstrap;
+#endif
#ifdef ENABLE_XBIOS
extern VideoBootStrap XBIOS_bootstrap;
#endif
--- /usr/local/SDL-1.2.5/src/video/SDL_video.c 2002-10-05 09:50:56.000000000 -0700
+++ SDL-1.2.5/src/video/SDL_video.c 2002-12-29 06:58:58.000000000 -0800
@@ -105,6 +105,9 @@
#ifdef ENABLE_DUMMYVIDEO
&DUMMY_bootstrap,
#endif
+#ifdef ENABLE_DXR3VIDEO
+ &DXR3_bootstrap,
+#endif
#ifdef ENABLE_XBIOS
&XBIOS_bootstrap,
#endif