DirectFB - Home of the pragmatist Roadmap


[directfb-dev] Re: [PATCH] G450/G550 detection for CRTC2
Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[directfb-dev] Re: [PATCH] G450/G550 detection for CRTC2



On Sat, Dec 21, 2002 at 02:59:40PM -0500, a40e8119bbddbe7b3d281db117f19b32@interlinx.bc.ca wrote:
> On Sat, Dec 21, 2002 at 07:49:59PM +0200, Ville Syrjälä wrote:
> > XDirectFB on 1st head and mplayer on 2nd.
> 
> Awesome!  That is what I will be doing, if I get another G400.  What
> resolution are you using on head 1?

1600x1200

> Oh?  Is there an easy way to tell (i.e. mplayer debugging switch) what
> kind of frame is being processed?

I'm not aware of such a switch. You can look at mpi->type in get_image().
It will be MP_IMGTYPE_IPB for B-frames if the codec supports this dr
method.

> > I'm not sure if I ever posted the fix to mplayer-dev-eng. I'll have to
> > check.
> 
> Or you could just send me your vo_dfbmga.

It was such a mess currently that I just had to clean it up :) Too many
unfinished experiments... I've attached a patch againgst the latest cvs
mplayer. The patch has my pthread vsync stuff included too but I left it
disabled. The code is fully functional though so it's safe to enable it.

> > But if I remember corretly you didn't use direct rendering (-dr)
> > so the bug shouldn't affect you.
> 
> Isn't direct rendering the default?

No. It can cause OSD corrution on some vo drivers. vo_dfbmga doesn't draw
the OSD to the buffers used for decoding so we're immune. You can get some
cool effects if you change the code to do this. Try it it's fun ;)

-- 
Ville Syrjälä
syrjala@sci.fi
http://www.sci.fi/~syrjala/
--- /home/villes/cvs/video/main/libvo/vo_dfbmga.c	Tue Dec  3 23:49:46 2002
+++ vo_dfbmga.c	Sun Dec 22 19:37:26 2002
@@ -1,5 +1,5 @@
 /*
-   MPlayer video driver for DirectFB / Matrox G400
+   MPlayer video driver for DirectFB / Matrox G400/G450/G550
 
    Copyright (C) 2002 Ville Syrjala <syrjala@sci.fi>
 
@@ -22,6 +22,19 @@
    Boston, MA 02111-1307, USA.
 */
 
+/* Use vsync thread stuff */
+// #define USE_THREADS
+
+#ifdef USE_THREADS
+#include <pthread.h>
+#include <signal.h>
+static pthread_t flip_thread;
+static pthread_cond_t flip_cond    = PTHREAD_COND_INITIALIZER;
+static pthread_cond_t vsync_cond   = PTHREAD_COND_INITIALIZER;
+static pthread_mutex_t flip_mutex  = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t vsync_mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
 /* directfb includes */
 #include <directfb.h>
 
@@ -48,12 +61,8 @@
 
 #include "aspect.h"
 
-#ifndef min
-#define min(x,y) (((x)<(y))?(x):(y))
-#endif
-
 static vo_info_t info = {
-     "DirectFB / Matrox G400",
+     "DirectFB / Matrox G400/G450/G550",
      "dfbmga",
      "Ville Syrjala <syrjala@sci.fi>",
      ""
@@ -97,12 +106,13 @@
 static unsigned int subframe_pixel_size;
 
 static int inited = 0;
+static int blit_done;
+static int stretch;
 
-static int stretch = 0;
-
-static int use_bes   = 0;
-static int use_crtc2 = 1;
-static int use_spic  = 1;
+static int use_bes;
+static int use_crtc2;
+static int use_spic;
+static int use_input;
 
 static int osd_changed;
 static int osd_dirty;
@@ -185,9 +195,48 @@
      }
 }
 
+struct layer_enum
+{
+     const char             *name;
+     IDirectFBDisplayLayer **layer;
+     DFBResult               res;
+};
+
+static DFBEnumerationResult
+get_layer_by_name( DFBDisplayLayerID           id,
+                   DFBDisplayLayerDescription  desc,
+                   void                       *data )
+{
+     struct layer_enum *l = (struct layer_enum *) data;
+
+#if DIRECTFBVERSION >= 916
+     /* We have desc.name so use it */
+     if (!strcmp( l->name, desc.name ))
+          if ((l->res = dfb->GetDisplayLayer( dfb, id, l->layer )) == DFB_OK)
+               return DFENUM_CANCEL;
+#else
+     /* Fake it according to id */
+     if ((id == 1 && !strcmp( l->name, "Matrox Backend Scaler" )) ||
+         (id == 2 && !strcmp( l->name, "Matrox CRTC2" )) ||
+         (id == 3 && !strcmp( l->name, "Matrox CRTC2 Sub-Picture" )))
+          if ((l->res = dfb->GetDisplayLayer( dfb, id, l->layer )) == DFB_OK)
+               return DFENUM_CANCEL;
+#endif
+
+     return DFENUM_OK;
+}
+
 static uint32_t
 preinit( const char *arg )
 {
+     DFBResult res;
+
+     /* Default values */
+     use_bes   = 0;
+     use_crtc2 = 1;
+     use_spic  = 1;
+     use_input = 1;
+
      if (vo_subdevice) {
           while (*vo_subdevice != '\0') {
                if (!strncmp(vo_subdevice, "bes", 3)) {
@@ -199,6 +248,9 @@
                } else if (!strncmp(vo_subdevice, "nospic", 6)) {
                     use_spic = 0;
                     vo_subdevice += 6;
+               } else if (!strncmp(vo_subdevice, "noinput", 7)) {
+                    use_input = 0;
+                    vo_subdevice += 7;
                } else
                     vo_subdevice++;
           }
@@ -216,7 +268,7 @@
                fb_dev_name = "/dev/fb0";
           DirectFBSetOption( "fbdev", fb_dev_name );
           DirectFBSetOption( "no-cursor", "" );
-          DirectFBSetOption( "bg-color", "00000000" );
+          DirectFBSetOption( "bg-color", "000000" );
 
           if (DirectFBCreate( &dfb ) != DFB_OK)
                return -1;
@@ -225,27 +277,69 @@
      }
 
      if (use_bes) {
-          if (dfb->GetDisplayLayer( dfb, 1, &bes ) != DFB_OK)
+          struct layer_enum l = {
+               "Matrox Backend Scaler",
+               &bes,
+               DFB_UNSUPPORTED
+          };
+          dfb->EnumDisplayLayers( dfb, get_layer_by_name, &l );
+          if (l.res != DFB_OK) {
+               fprintf( stderr, "vo_dfbmga: Can't get BES layer - %s\n",
+                        DirectFBErrorString( l.res ) );
                return -1;
+          }
           bes->SetCooperativeLevel( bes, DLSCL_EXCLUSIVE );
           bes->SetOpacity( bes, 0 );
      }
 
      if (use_crtc2) {
-          if (dfb->GetDisplayLayer( dfb, 2, &crtc2 ) != DFB_OK)
+          struct layer_enum l = {
+               "Matrox CRTC2",
+               &crtc2,
+               DFB_UNSUPPORTED
+          };
+          dfb->EnumDisplayLayers( dfb, get_layer_by_name, &l );
+          if (l.res != DFB_OK) {
+               fprintf( stderr, "vo_dfbmga: Can't get CRTC2 layer - %s\n",
+                        DirectFBErrorString( l.res ) );
                return -1;
+          }
           crtc2->SetCooperativeLevel( crtc2, DLSCL_EXCLUSIVE );
           crtc2->SetOpacity( crtc2, 0 );
      }
 
-     if (dfb->GetInputDevice( dfb, DIDID_KEYBOARD, &keyboard ) != DFB_OK)
-          return -1;
-     keyboard->CreateEventBuffer( keyboard, &buffer );
-     buffer->Reset( buffer );
+     if (use_input) {
+          if ((res = dfb->GetInputDevice( dfb, DIDID_KEYBOARD, &keyboard )) != DFB_OK) {
+               fprintf( stderr, "Can't get keyboard - %s\n",
+                        DirectFBErrorString( res ) );
+               return -1;
+          }
+          keyboard->CreateEventBuffer( keyboard, &buffer );
+          buffer->Reset( buffer );
+     }
 
      return 0;
 }
 
+#ifdef USE_THREADS
+static void *flip_func( void *unused )
+{
+     sigset_t signals;
+
+     sigfillset( &signals );
+     pthread_sigmask( SIG_BLOCK, &signals, NULL );
+
+     while (1) {
+          pthread_mutex_lock( &vsync_mutex );
+          pthread_cond_signal( &vsync_cond );
+          pthread_mutex_unlock( &vsync_mutex );
+
+          pthread_cond_wait( &flip_cond, &flip_mutex );
+          c2frame->Flip( c2frame, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : 0 );
+     }
+}
+#endif
+
 static uint32_t
 config( uint32_t width, uint32_t height,
         uint32_t d_width, uint32_t d_height,
@@ -253,6 +347,8 @@
         char *title,
 	uint32_t format )
 {
+     DFBResult res;
+
      DFBDisplayLayerConfig      dlc;
      DFBDisplayLayerConfigFlags failed;
 
@@ -274,8 +370,10 @@
           dlc.height      = in_height;
           dlc.buffermode  = DLBM_BACKVIDEO;
 
-          if (bes->TestConfiguration( bes, &dlc, &failed ) != DFB_OK)
+          if (bes->TestConfiguration( bes, &dlc, &failed ) != DFB_OK) {
+               fprintf( stderr, "vo_dfbmga: Invalid BES configuration!\n" );
                return -1;
+          }
           bes->SetConfiguration( bes, &dlc );
           bes->GetSurface( bes, &frame );
 
@@ -286,10 +384,15 @@
                                   (1.0f - (float) out_height / 10000.0f) / 2.0f,
                                   (float) out_width  / 10000.0f,
                                   (float) out_height / 10000.0f );
+
+          frame->Clear( frame, 0, 0, 0, 0xff );
+          frame->Flip( frame, NULL, 0 );
+          frame->Clear( frame, 0, 0, 0, 0xff );
+
           bufs[0] = frame;
           num_bufs = 1;
      } else {
-          /* Draw to a temporary surface */
+          /* Draw to an offscreen surface */
           DFBSurfaceDescription dsc;
 
           dsc.flags       = DSDESC_WIDTH | DSDESC_HEIGHT |
@@ -299,8 +402,10 @@
           dsc.pixelformat = dlc.pixelformat;
 
           for (num_bufs = 0; num_bufs < 3; num_bufs++) {
-               if (dfb->CreateSurface( dfb, &dsc, &bufs[num_bufs] ) != DFB_OK) {
-                    if (num_bufs == 0)
+               if ((res = dfb->CreateSurface( dfb, &dsc, &bufs[num_bufs] ) != DFB_OK))
+                    if (num_bufs == 0) {
+                         fprintf( stderr, "vo_dfbmga: Can't create any surfaces - %s\n",
+                                  DirectFBErrorString( res ) );
                          return -1;
                }
           }
@@ -310,8 +415,9 @@
      }
 
      if (use_crtc2) {
-          dlc.flags      = DLCONF_PIXELFORMAT | DLCONF_BUFFERMODE;
+          dlc.flags      = DLCONF_PIXELFORMAT | DLCONF_BUFFERMODE | DLCONF_OPTIONS;
           dlc.buffermode = DLBM_BACKVIDEO;
+          dlc.options    = DLOP_FLICKER_FILTERING;
 
           switch (dlc.pixelformat) {
           case DSPF_I420:
@@ -330,8 +436,10 @@
                use_spic = 0;
           }
 
-          if (crtc2->TestConfiguration( crtc2, &dlc, &failed ) != DFB_OK)
+          if (crtc2->TestConfiguration( crtc2, &dlc, &failed ) != DFB_OK) {
+               fprintf( stderr, "vo_dfbmga: Invalid CRTC2 configuration!\n" );
                return -1;
+          }
           crtc2->SetConfiguration( crtc2, &dlc );
           crtc2->GetSurface( crtc2, &c2frame );
 
@@ -350,7 +458,7 @@
                out_height = screen_height;
 
           aspect_save_screenres( out_width, out_height );
-          aspect( &out_width, &out_height, (fullscreen & 0x01) ? A_ZOOM : A_NOZOOM );
+          aspect( &out_width, &out_height, (fullscreen & VOFLAG_FULLSCREEN) ? A_ZOOM : A_NOZOOM );
 
           if (in_width != out_width ||
               in_height != out_height)
@@ -363,9 +471,9 @@
           drect.w = out_width;
           drect.h = out_height;
 
-          c2frame->Clear( c2frame, 0, 0, 0, 0 );
+          c2frame->Clear( c2frame, 0, 0, 0, 0xff );
           c2frame->Flip( c2frame, NULL, 0 );
-          c2frame->Clear( c2frame, 0, 0, 0, 0 );
+          c2frame->Clear( c2frame, 0, 0, 0, 0xff );
 
           printf( "vo_dfbmga: CRTC2 surface %dx%d %s\n", dlc.width, dlc.height, pixelformat_name( dlc.pixelformat ) );
      } else {
@@ -387,22 +495,33 @@
           DFBColor          color;
           int               i;
 
-          if (dfb->GetDisplayLayer( dfb, 3, &spic ) != DFB_OK)
+          struct layer_enum l = {
+               "Matrox CRTC2 Sub-Picture",
+               &spic,
+               DFB_UNSUPPORTED
+          };
+          dfb->EnumDisplayLayers( dfb, get_layer_by_name, &l );
+          if (l.res != DFB_OK) {
+               fprintf( stderr, "vo_dfbmga: Can't get sub-picture layer - %s\n",
+                        DirectFBErrorString( l.res ) );
                return -1;
+          }
           spic->SetCooperativeLevel( spic, DLSCL_EXCLUSIVE );
           spic->SetOpacity( spic, 0 );
 
           dlc.flags       = DLCONF_PIXELFORMAT | DLCONF_BUFFERMODE;
           dlc.pixelformat = DSPF_LUT8;
           dlc.buffermode  = DLBM_BACKVIDEO;
-          if (spic->TestConfiguration( spic, &dlc, &failed ) != DFB_OK)
+          if (spic->TestConfiguration( spic, &dlc, &failed ) != DFB_OK) {
+               fprintf( stderr, "vo_dfbmga: Invalid sub-picture configuration!\n" );
                return -1;
+          }
           spic->SetConfiguration( spic, &dlc );
 
           spic->GetSurface( spic, &subframe );
 
           subframe->GetPalette( subframe, &palette );
-          color.a = 0;
+          color.a = 0xff;
           for (i = 0; i < 16; i++) {
                color.r = i * 17;
                color.g = i * 17;
@@ -411,9 +530,9 @@
           }
           palette->Release( palette );
 
-          subframe->Clear( subframe, 0, 0, 0, 0 );
+          subframe->Clear( subframe, 0, 0, 0, 0xff );
           subframe->Flip( subframe, NULL, 0 );
-          subframe->Clear( subframe, 0, 0, 0, 0 );
+          subframe->Clear( subframe, 0, 0, 0, 0xff );
      } else if (use_crtc2) {
           /* Draw OSD to CRTC2 surface */
           subframe = c2frame;
@@ -440,6 +559,15 @@
 
      osd_dirty = 0;
      osd_current = 1;
+     blit_done = 0;
+
+#ifdef USE_THREADS
+     if (use_crtc2) {
+          pthread_mutex_lock( &flip_mutex );
+          pthread_mutex_lock( &vsync_mutex );
+          pthread_create( &flip_thread, NULL, flip_func, NULL );
+     }
+#endif
 
      return 0;
 }
@@ -514,7 +642,7 @@
                osd_dirty |= osd_current;
      }
 
-     if (subframe->Lock( subframe, DSLF_WRITE, &dst, &pitch ) != DFB_OK)
+     if (subframe->Lock( subframe, DSLF_READ | DSLF_WRITE, &dst, &pitch ) != DFB_OK)
           return;
 
      switch (subframe_format) {
@@ -578,13 +706,10 @@
      void *dst;
      int pitch;
 
-     if (vo_directrendering)
-          frame->Unlock( frame );
-
      if (frame->Lock( frame, DSLF_WRITE, &dst, &pitch ) != DFB_OK)
           return VO_FALSE;
 
-     memcpy_pic( dst + pitch * y + x, src[0],
+     mem2agpcpy_pic( dst + pitch * y + x, src[0],
                  w, h, pitch, stride[0] );
 
      dst += pitch * in_height;
@@ -594,19 +719,19 @@
      pitch /= 2;
 
      if (frame_format == DSPF_I420 )
-          memcpy_pic( dst + pitch * y + x, src[1],
+          mem2agpcpy_pic( dst + pitch * y + x, src[1],
                       w, h, pitch, stride[1] );
      else 
-          memcpy_pic( dst + pitch * y + x, src[2],
+          mem2agpcpy_pic( dst + pitch * y + x, src[2],
                       w, h, pitch, stride[2] );
 
      dst += pitch * in_height / 2;
 
      if (frame_format == DSPF_I420 )
-          memcpy_pic( dst + pitch * y + x, src[2],
+          mem2agpcpy_pic( dst + pitch * y + x, src[2],
                       w, h, pitch, stride[2] );
      else
-          memcpy_pic( dst + pitch * y + x, src[1],
+          mem2agpcpy_pic( dst + pitch * y + x, src[1],
                       w, h, pitch, stride[1] );
 
      frame->Unlock( frame );
@@ -614,20 +739,39 @@
      return VO_TRUE;
 }
 
+static void blit_to_screen( void )
+{
+     /* Flip BES */
+     if (use_bes)
+          frame->Flip( frame, NULL, 0 );
+
+     c2frame->SetBlittingFlags( c2frame, DSBLIT_NOFX );
+
+#ifdef USE_THREADS
+     pthread_cond_wait( &vsync_cond, &vsync_mutex );
+#endif
+
+     /* Blit from offscreen/BES to CRTC2 */
+     if (stretch)
+          c2frame->StretchBlit( c2frame, frame, NULL, &drect );
+     else
+          c2frame->Blit( c2frame, frame, NULL, drect.x, drect.y );
+}
+
 static void
 draw_osd( void )
 {
-     if (vo_directrendering)
-          frame->Unlock( frame );
+     frame = bufs[current_buf];
+     frame->Unlock( frame );
 
      osd_changed = vo_osd_changed( 0 );
 
      if (osd_dirty & osd_current) {
           if (use_spic) {
-               subframe->Clear( subframe, 0, 0, 0, 0 );
+               subframe->Clear( subframe, 0, 0, 0, 0xff );
           } else if (use_crtc2) {
                /* Clear black bars around the picture */
-               subframe->SetColor( subframe, 0, 0, 0, 0 );
+               subframe->SetColor( subframe, 0, 0, 0, 0xff );
                subframe->FillRectangle( subframe,
                                         0, 0,
                                         screen_width, drect.y );
@@ -644,18 +788,8 @@
           osd_dirty &= ~osd_current;
      }
 
-     if (use_crtc2) {
-          /* Flip BES */
-          if (use_bes)
-               frame->Flip( frame, NULL, 0 );
-
-          /* Blit from BES/temp to CRTC2 */
-          c2frame->SetBlittingFlags( c2frame, DSBLIT_NOFX );
-          if (stretch)
-               c2frame->StretchBlit( c2frame, frame, NULL, &drect );
-          else
-               c2frame->Blit( c2frame, frame, NULL, drect.x, drect.y );
-     }
+     if (use_crtc2)
+          blit_to_screen();
 
      vo_draw_text( sub_width, sub_height, draw_alpha );
 
@@ -663,29 +797,52 @@
           subframe->Flip( subframe, NULL, 0 );
           osd_current ^= 3;
      }
+     blit_done = 1;
 }
 
 static void
 flip_page( void )
 {
-     if (!use_crtc2) {
-          /* Flip BES */
-          frame->Flip( frame, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : 0 );
-     } else {
-          /* Flip CRTC2 */
+     frame = bufs[current_buf];
+     frame->Unlock( frame );
+
+     if (use_crtc2) {
+          if (!blit_done)
+               blit_to_screen();
+
+#ifdef USE_THREADS
+          pthread_mutex_lock( &flip_mutex );
+          pthread_cond_signal( &flip_cond );
+          pthread_mutex_unlock( &flip_mutex );
+#else
           c2frame->Flip( c2frame, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : 0 );
-          if (!use_spic)
-               osd_current ^= 3;
-     }
+#endif
+     } else
+          frame->Flip( frame, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : 0 );
 
-     current_buf = 0;
+     if (!use_spic)
+          osd_current ^= 3;
+
+     current_buf = vo_directrendering ? 0 : (current_buf+1) % num_bufs;
+     blit_done = 0;
 }
 
 static void
 uninit( void )
 {
-     buffer->Release( buffer );
-     keyboard->Release( keyboard );
+#ifdef USE_THREADS
+     if (use_crtc2) {
+          pthread_mutex_unlock( &vsync_mutex );
+          pthread_cancel( flip_thread );
+          pthread_join( flip_thread, NULL );
+          pthread_mutex_unlock( &flip_mutex );
+     }
+#endif
+
+     if (use_input) {
+          buffer->Release( buffer );
+          keyboard->Release( keyboard );
+     }
 
      while (num_bufs--) {
           frame = bufs[num_bufs];
@@ -717,6 +874,7 @@
 static uint32_t
 get_image( mp_image_t *mpi )
 {
+     int buf = current_buf;
      void *dst;
      int pitch;
 
@@ -727,8 +885,6 @@
 
      if (mpi->flags & MP_IMGFLAG_READABLE &&
          (mpi->type == MP_IMGTYPE_IPB || mpi->type == MP_IMGTYPE_IP)) {
-          int buf = current_buf;
-
           if (num_bufs < 2)
                return VO_FALSE;
 
@@ -741,13 +897,12 @@
 
           if (mpi->type == MP_IMGTYPE_IPB)
                buf++;
-
-          current_buf = buf;
-          frame = bufs[current_buf];
      }
+     frame = bufs[buf];
+     frame->Unlock( frame );
 
-     if (frame->Lock( frame, DSLF_WRITE | (mpi->flags & MP_IMGFLAG_READABLE ? DSLF_READ : 0),
-                      &dst, &pitch ) != DFB_OK)
+     /* Always use DSLF_READ to preserve the system memory instance */
+     if (frame->Lock( frame, DSLF_WRITE | DSLF_READ, &dst, &pitch ) != DFB_OK)
           return VO_FALSE;
 
      if ((mpi->width == pitch) ||
@@ -770,6 +925,8 @@
           }
 
           mpi->flags |= MP_IMGFLAG_DIRECT;
+          mpi->priv = (void*) buf;
+          current_buf = buf;
 
           return VO_TRUE;
      }
@@ -784,7 +941,12 @@
 static uint32_t
 draw_image( mp_image_t *mpi )
 {
-     if (mpi->flags & (MP_IMGFLAG_DIRECT | MP_IMGFLAG_DRAW_CALLBACK))
+     if (mpi->flags & MP_IMGFLAG_DIRECT) {
+          current_buf = (int) mpi->priv;
+          return VO_TRUE;
+     }
+
+     if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK)
           return VO_TRUE;
 
      if (mpi->flags & MP_IMGFLAG_PLANAR)
@@ -796,7 +958,7 @@
 
           if (frame->Lock( frame, DSLF_WRITE, &dst, &pitch ) != DFB_OK)
                return VO_FALSE;
-          memcpy_pic( dst, mpi->planes[0],
+          mem2agpcpy_pic( dst, mpi->planes[0],
                       mpi->w * (mpi->bpp / 8), mpi->h,
                       pitch, mpi->stride[0] );
           frame->Unlock( frame );
@@ -924,9 +1086,15 @@
 {
      DFBInputEvent event;
 
-     if (buffer->GetEvent( buffer, DFB_EVENT( &event )) == DFB_OK) {
-          if (event.type == DIET_KEYPRESS) {
-               switch (event.key_symbol) {
+     if (!use_input)
+          return;
+
+     if (buffer->GetEvent( buffer, DFB_EVENT( &event ) ) != DFB_OK)
+          return;
+
+     if (event.clazz == DFEC_INPUT &&
+         event.type == DIET_KEYPRESS) {
+          switch (event.key_symbol) {
                case DIKS_ESCAPE:
                     mplayer_put_key( 'q' );
                     break;
@@ -962,7 +1130,6 @@
                     break;
                default:
                     mplayer_put_key( event.key_symbol );
-               }
           }
      }
 

Home | Main Index | Thread Index


directfb.org / Development / Old Archives