changeset 27590:4c4389f2aba2

Add CRTC1 support.
author syrjala
date Mon, 15 Sep 2008 20:39:03 +0000
parents 4a0064f2424f
children 5ab1614e3f0a
files libvo/vo_dfbmga.c
diffstat 1 files changed, 112 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_dfbmga.c	Mon Sep 15 20:35:05 2008 +0000
+++ b/libvo/vo_dfbmga.c	Mon Sep 15 20:39:03 2008 +0000
@@ -72,6 +72,7 @@
 static IDirectFBSurface *subframe;
 
 static IDirectFBSurface *besframe;
+static IDirectFBSurface *c1frame;
 static IDirectFBSurface *c2frame;
 static IDirectFBSurface *spicframe;
 
@@ -79,6 +80,7 @@
 static DFBSurfacePixelFormat subframe_format;
 
 static DFBRectangle besrect;
+static DFBRectangle c1rect;
 static DFBRectangle c2rect;
 static DFBRectangle *subrect;
 
@@ -87,9 +89,11 @@
 static IDirectFBEventBuffer  *buffer;
 
 static int blit_done;
+static int c1stretch;
 static int stretch;
 
 static int use_bes;
+static int use_crtc1;
 static int use_crtc2;
 static int use_spic;
 static int use_input;
@@ -231,6 +235,7 @@
 
      /* Some defaults */
      use_bes = 0;
+     use_crtc1 = 0;
      use_crtc2 = 1;
      use_spic = 1;
      field_parity = -1;
@@ -254,6 +259,10 @@
                     use_bes = !opt_no;
                     vo_subdevice += 3;
                     opt_no = 0;
+               } else if (!strncmp(vo_subdevice, "crtc1", 5)) {
+                    use_crtc1 = !opt_no;
+                    vo_subdevice += 5;
+                    opt_no = 0;
                } else if (!strncmp(vo_subdevice, "crtc2", 5)) {
                     use_crtc2 = !opt_no;
                     vo_subdevice += 5;
@@ -358,6 +367,7 @@
                        "Example: mplayer -vo dfbmga:nocrtc2:bes:buffermode=single\n"
                        "\nOptions (use 'no' prefix to disable):\n"
                        "  bes    Use Backend Scaler\n"
+                       "  crtc1  Use CRTC1\n"
                        "  crtc2  Use CRTC2\n"
                        "  spic   Use hardware sub-picture for OSD\n"
                        "  input  Use DirectFB for keyboard input\n"
@@ -378,10 +388,14 @@
                return -1;
           }
      }
-     if (!use_bes && !use_crtc2) {
+     if (!use_bes && !use_crtc1 && !use_crtc2) {
 	  mp_msg( MSGT_VO, MSGL_ERR, "vo_dfbmga: No output selected\n" );
           return -1;
      }
+     if (use_bes && use_crtc1) {
+	  mp_msg( MSGT_VO, MSGL_ERR, "vo_dfbmga: Both BES and CRTC1 outputs selected\n" );
+          return -1;
+     }
 
           if ((res = DirectFBInit( NULL, NULL )) != DFB_OK) {
                mp_msg( MSGT_VO, MSGL_ERR,
@@ -419,7 +433,7 @@
                return -1;
           }
 
-     if (use_bes) {
+     if (use_crtc1 || use_bes) {
           struct layer_enum l = {
                "FBDev Primary Layer",
                &primary,
@@ -554,6 +568,8 @@
           spic->Release( spic );
      if (c2frame)
           c2frame->Release( c2frame );
+     if (c1frame)
+          c1frame->Release( c1frame );
      if (besframe)
           besframe->Release( besframe );
      if (bufs[0])
@@ -566,6 +582,7 @@
      spicframe = NULL;
      spic = NULL;
      c2frame = NULL;
+     c1frame = NULL;
      besframe = NULL;
      bufs[0] = NULL;
      bufs[1] = NULL;
@@ -685,6 +702,63 @@
      }
 
      /*
+      * CRTC1
+      */
+     if (use_crtc1) {
+          dlc.flags      = DLCONF_BUFFERMODE;
+          dlc.buffermode = buffermode;
+
+          if ((res = primary->TestConfiguration( primary, &dlc, &failed )) != DFB_OK) {
+               mp_msg( MSGT_VO, MSGL_ERR,
+                       "vo_dfbmga: Invalid CRTC1 configuration - %s!\n",
+                       DirectFBErrorString( res ) );
+               return -1;
+          }
+          if ((res = primary->SetConfiguration( primary, &dlc )) != DFB_OK) {
+               mp_msg( MSGT_VO, MSGL_ERR,
+                       "vo_dfbmga: CRTC1 configuration failed - %s!\n",
+                       DirectFBErrorString( res ) );
+               return -1;
+          }
+          if ((res = primary->GetConfiguration( primary, &dlc )) != DFB_OK) {
+               mp_msg( MSGT_VO, MSGL_ERR,
+                       "vo_dfbmga: Getting CRTC1 configuration failed - %s!\n",
+                       DirectFBErrorString( res ) );
+               return -1;
+          }
+
+          primary->GetSurface( primary, &c1frame );
+          c1frame->SetBlittingFlags( c1frame, DSBLIT_NOFX );
+          c1frame->SetColor( c1frame, 0, 0, 0, 0xff );
+
+          c1frame->GetSize( c1frame, &screen_width, &screen_height );
+
+          aspect_save_screenres( screen_width, screen_height );
+          aspect( &out_width, &out_height, (flags & VOFLAG_FULLSCREEN) ? A_ZOOM : A_NOZOOM );
+
+          if (in_width != out_width || in_height != out_height)
+               c1stretch = 1;
+          else
+               c1stretch = 0;
+
+          c1rect.x = (screen_width  - out_width)  / 2;
+          c1rect.y = (screen_height - out_height) / 2;
+          c1rect.w = out_width;
+          c1rect.h = out_height;
+
+          c1frame->Clear( c1frame, 0, 0, 0, 0xff );
+          c1frame->Flip( c1frame, NULL, 0 );
+          c1frame->Clear( c1frame, 0, 0, 0, 0xff );
+          c1frame->Flip( c1frame, NULL, 0 );
+          c1frame->Clear( c1frame, 0, 0, 0, 0xff );
+
+          mp_msg( MSGT_VO, MSGL_INFO, "vo_dfbmga: CRTC1 using %s buffering\n",
+                  dlc.buffermode == DLBM_TRIPLE ? "triple" :
+                  dlc.buffermode == DLBM_BACKVIDEO ? "double" : "single" );
+          mp_msg( MSGT_VO, MSGL_INFO, "vo_dfbmga: CRTC1 surface %dx%d %s\n", screen_width, screen_height, pixelformat_name( dlc.pixelformat ) );
+     }
+
+     /*
       * CRTC2
       */
      if (use_crtc2) {
@@ -865,6 +939,10 @@
           /* Draw OSD to CRTC2 surface */
           subframe = c2frame;
           subrect = &c2rect;
+     } else if (use_crtc1) {
+          /* Draw OSD to CRTC1 surface */
+          subframe = c1frame;
+          subrect = &c1rect;
      } else {
           /* Draw OSD to BES surface */
           subframe = besframe;
@@ -876,7 +954,8 @@
      mp_msg( MSGT_VO, MSGL_INFO, "vo_dfbmga: Sub-picture surface %dx%d %s (%s)\n",
              sub_width, sub_height,
              pixelformat_name( subframe_format ),
-             use_crtc2 ? (use_spic ? "Sub-picture layer" : "CRTC2") : "BES" );
+             use_crtc2 ? (use_spic ? "Sub-picture layer" : "CRTC2") :
+             use_crtc1 ? "CRTC1" : "BES" );
 
      osd_dirty = 0;
      osd_current = 1;
@@ -889,21 +968,28 @@
 query_format( uint32_t format )
 {
      switch (format) {
+          case IMGFMT_YV12:
+          case IMGFMT_I420:
+          case IMGFMT_IYUV:
+               if (is_g200 || use_crtc1)
+                    return 0;
+               break;
           case IMGFMT_BGR32:
           case IMGFMT_BGR16:
           case IMGFMT_BGR15:
+               if (is_g200 && use_bes)
+                    return 0;
+               break;
           case IMGFMT_UYVY:
-          case IMGFMT_YV12:
-          case IMGFMT_I420:
-          case IMGFMT_IYUV:
                if (is_g200)
                     return 0;
+               break;
           case IMGFMT_YUY2:
                break;
 #if DIRECTFBVERSION > DFB_VERSION(0,9,21)
           case IMGFMT_NV12:
           case IMGFMT_NV21:
-               if (!use_bes || use_crtc2)
+               if (use_crtc1 || use_crtc2)
                     return 0;
                break;
 #endif
@@ -1096,6 +1182,18 @@
           srect = &besrect;
      }
 
+     if (use_crtc1) {
+#if DIRECTFBVERSION > DFB_VERSION(0,9,15)
+          if (vo_vsync && !flipping)
+               primary->WaitForSync( primary );
+#endif
+
+          if (c1stretch)
+               c1frame->StretchBlit( c1frame, blitsrc, srect, &c1rect );
+          else
+               c1frame->Blit( c1frame, blitsrc, srect, c1rect.x, c1rect.y );
+     }
+
      if (use_crtc2) {
 #if DIRECTFBVERSION > DFB_VERSION(0,9,15)
           if (vo_vsync && !flipping)
@@ -1161,7 +1259,9 @@
      if (flipping) {
           if (use_crtc2)
                c2frame->Flip( c2frame, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : DSFLIP_ONSYNC );
-          else
+          if (use_crtc1)
+               c1frame->Flip( c1frame, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : DSFLIP_ONSYNC );
+          if (use_bes)
                besframe->Flip( besframe, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : DSFLIP_ONSYNC );
 
           if (!use_spic) {
@@ -1334,6 +1434,8 @@
      /* Prefer CRTC2 over BES */
      if (use_crtc2)
           res = crtc2->SetColorAdjustment( crtc2, &ca );
+     else if (use_crtc1)
+          res = primary->SetColorAdjustment( primary, &ca );
      else
           res = bes->SetColorAdjustment( bes, &ca );
 
@@ -1353,6 +1455,8 @@
      /* Prefer CRTC2 over BES */
      if (use_crtc2)
           res = crtc2->GetColorAdjustment( crtc2, &ca );
+     else if (use_crtc1)
+          res = primary->GetColorAdjustment( primary, &ca );
      else
           res = bes->GetColorAdjustment( bes, &ca );