changeset 13026:ac2713aff2a7

Reorganized init/unint so that fixed-vo works.
author syrjala
date Sun, 15 Aug 2004 00:12:34 +0000
parents 9af70c5ff267
children 1b340f237bad
files libvo/vo_dfbmga.c
diffstat 1 files changed, 80 insertions(+), 78 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_dfbmga.c	Sat Aug 14 21:59:02 2004 +0000
+++ b/libvo/vo_dfbmga.c	Sun Aug 15 00:12:34 2004 +0000
@@ -58,6 +58,7 @@
  */
 static IDirectFB *dfb;
 
+static IDirectFBDisplayLayer *primary;
 static IDirectFBDisplayLayer *bes;
 static IDirectFBDisplayLayer *crtc2;
 static IDirectFBDisplayLayer *spic;
@@ -68,9 +69,11 @@
 static IDirectFBSurface *bufs[3];
 
 static IDirectFBSurface *frame;
+static IDirectFBSurface *subframe;
+
 static IDirectFBSurface *besframe;
 static IDirectFBSurface *c2frame;
-static IDirectFBSurface *subframe;
+static IDirectFBSurface *spicframe;
 
 static DFBSurfacePixelFormat frame_format;
 static DFBSurfacePixelFormat subframe_format;
@@ -225,11 +228,6 @@
 {
      DFBResult res;
 
-     bes = NULL;
-     crtc2 = NULL;
-     keyboard = NULL;
-     buffer = NULL;
-
      /* Some defaults */
      use_bes = 0;
      use_crtc2 = 1;
@@ -422,6 +420,26 @@
           }
 
      if (use_bes) {
+          struct layer_enum l = {
+               "FBDev Primary Layer",
+               &primary,
+               DFB_UNSUPPORTED
+          };
+          dfb->EnumDisplayLayers( dfb, get_layer_by_name, &l );
+          if (l.res != DFB_OK) {
+               mp_msg( MSGT_VO, MSGL_ERR, "vo_dfbmga: Can't get primary layer - %s\n",
+                       DirectFBErrorString( l.res ) );
+               return -1;
+          }
+          if ((res = primary->SetCooperativeLevel( primary, DLSCL_EXCLUSIVE )) != DFB_OK) {
+               mp_msg( MSGT_VO, MSGL_ERR, "Can't get exclusive access to primary layer - %s\n",
+                       DirectFBErrorString( res ) );
+               return -1;
+          }
+          use_input = 1;
+     }
+
+     if (use_bes) {
           DFBDisplayLayerConfig      dlc;
           DFBDisplayLayerConfigFlags failed;
           struct layer_enum l = {
@@ -489,6 +507,32 @@
      return 0;
 }
 
+static void release_config( void )
+{
+     if (spicframe)
+          spicframe->Release( spicframe );
+     if (spic)
+          spic->Release( spic );
+     if (c2frame)
+          c2frame->Release( c2frame );
+     if (besframe)
+          besframe->Release( besframe );
+     if (bufs[0])
+          bufs[0]->Release( bufs[0] );
+     if (bufs[1])
+          bufs[1]->Release( bufs[1] );
+     if (bufs[2])
+          bufs[2]->Release( bufs[2] );
+     
+     spicframe = NULL;
+     spic = NULL;
+     c2frame = NULL;
+     besframe = NULL;
+     bufs[0] = NULL;
+     bufs[1] = NULL;
+     bufs[2] = NULL;
+}
+
 static uint32_t
 config( uint32_t width, uint32_t height,
         uint32_t d_width, uint32_t d_height,
@@ -504,12 +548,8 @@
      uint32_t out_width;
      uint32_t out_height;
 
-     besframe = NULL;
-     c2frame = NULL;
-     spic = NULL;
-     subframe = NULL;
-     bufs[0] = bufs[1] = bufs[2] = NULL;
-     
+     release_config();
+
      in_width  = width;
      in_height = height;
 
@@ -559,31 +599,10 @@
       * BES
       */
      if (use_bes) {
-          IDirectFBDisplayLayer *primary;
-          DFBDisplayLayerConfig pdlc;
-          struct layer_enum l = {
-               "FBDev Primary Layer",
-               &primary,
-               DFB_UNSUPPORTED
-          };
-          dfb->EnumDisplayLayers( dfb, get_layer_by_name, &l );
-          if (l.res != DFB_OK) {
-               mp_msg( MSGT_VO, MSGL_ERR, "vo_dfbmga: Can't get primary layer - %s\n",
-                       DirectFBErrorString( l.res ) );
-               return -1;
-          }
-          if ((res = primary->GetConfiguration( primary, &pdlc )) != DFB_OK) {
-               mp_msg( MSGT_VO, MSGL_ERR,
-                       "vo_dfbmga: Can't get primary layer configuration - %s!\n",
-                       DirectFBErrorString( res ) );
-               return -1;
-          }
-          primary->Release( primary );
-
-          aspect_save_screenres( pdlc.width, pdlc.height );
+          aspect_save_screenres( 0x10000, 0x10000 );
           aspect( &out_width, &out_height, A_ZOOM );
-          besrect.x = (pdlc.width - out_width) * in_width / pdlc.width / 2;
-          besrect.y = (pdlc.height - out_height) * in_height / pdlc.height / 2;
+          besrect.x = (0x10000 - out_width) * in_width / 0x10000 / 2;
+          besrect.y = (0x10000 - out_height) * in_height / 0x10000 / 2;
           besrect.w = in_width;
           besrect.h = in_height;
 
@@ -779,9 +798,9 @@
                return -1;
           }
 
-          spic->GetSurface( spic, &subframe );
+          spic->GetSurface( spic, &spicframe );
 
-          subframe->GetPalette( subframe, &palette );
+          spicframe->GetPalette( spicframe, &palette );
           color.a = 0xff;
           for (i = 0; i < 16; i++) {
                color.r = i * 17;
@@ -791,15 +810,18 @@
           }
           palette->Release( palette );
 
-          subframe->Clear( subframe, 0, 0, 0, 0 );
-          subframe->Flip( subframe, NULL, 0 );
-          subframe->Clear( subframe, 0, 0, 0, 0 );
-          subframe->Flip( subframe, NULL, 0 );
-          subframe->Clear( subframe, 0, 0, 0, 0 );
+          spicframe->Clear( spicframe, 0, 0, 0, 0 );
+          spicframe->Flip( spicframe, NULL, 0 );
+          spicframe->Clear( spicframe, 0, 0, 0, 0 );
+          spicframe->Flip( spicframe, NULL, 0 );
+          spicframe->Clear( spicframe, 0, 0, 0, 0 );
 
           mp_msg( MSGT_VO, MSGL_INFO, "vo_dfbmga: Sub-picture layer using %s buffering\n",
                   dlc.buffermode == DLBM_TRIPLE ? "triple" :
                   dlc.buffermode == DLBM_BACKVIDEO ? "double" : "single" );
+
+          subframe = spicframe;
+          subrect = NULL;
      } else if (use_crtc2) {
           /* Draw OSD to CRTC2 surface */
           subframe = c2frame;
@@ -1107,47 +1129,27 @@
 static void
 uninit( void )
 {
+     release_config();
+
      if (buffer)
           buffer->Release( buffer );
      if (keyboard)
           keyboard->Release( keyboard );
+     if (crtc2)
+          crtc2->Release( crtc2 );
+     if (bes)
+          bes->Release( bes );
+     if (primary)
+          primary->Release( primary );
+     if (dfb)
+          dfb->Release( dfb );
+
      buffer = NULL;
      keyboard = NULL;
-
-     while (num_bufs--) {
-          frame = bufs[num_bufs];
-          if (frame)
-               frame->Release( frame );
-          bufs[num_bufs] = NULL;
-     }
-     if (bes) {
-          if (besframe)
-               besframe->Release( besframe );
-          bes->SetOpacity( bes, 0 );
-          bes->Release( bes );
-          besframe = NULL;
-          bes = NULL;
-     }
-     if (crtc2) {
-          if (c2frame)
-               c2frame->Release( c2frame );
-          crtc2->SetOpacity( crtc2, 0 );
-          crtc2->Release( crtc2 );
-          c2frame = NULL;
-          crtc2 = NULL;
-     }
-     if (spic) {
-          if (subframe)
-               subframe->Release( subframe );
-          spic->SetOpacity( spic, 0 );
-          spic->Release( spic );
-          subframe = NULL;
-          spic = NULL;
-     }
-     if (dfb) {
-          dfb->Release( dfb );
-          dfb = NULL;
-     }
+     crtc2 = NULL;
+     bes = NULL;
+     primary = NULL;
+     dfb = NULL;
 }
 
 static uint32_t