changeset 22461:c54ad95f852a

Factor out some duplicated code in vo_xv and vo_xvmc
author reimar
date Tue, 06 Mar 2007 15:34:54 +0000
parents fa2b5e300c5a
children adc2bfb6dcaf
files libvo/vo_xv.c libvo/vo_xvmc.c
diffstat 2 files changed, 45 insertions(+), 100 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_xv.c	Tue Mar 06 14:15:37 2007 +0000
+++ b/libvo/vo_xv.c	Tue Mar 06 15:34:54 2007 +0000
@@ -43,6 +43,8 @@
 #include "Gui/interface.h"
 #endif
 
+#include "libavutil/common.h"
+
 static vo_info_t info = {
     "X11/Xv",
     "xv",
@@ -89,7 +91,6 @@
 
 static Window mRoot;
 static uint32_t drwX, drwY, drwBorderWidth, drwDepth;
-static uint32_t dwidth, dheight;
 static uint32_t max_width = 0, max_height = 0; // zero means: not set
 
 static void (*draw_alpha_fnc) (int x0, int y0, int w, int h,
@@ -141,6 +142,23 @@
 
 static void deallocate_xvimage(int foo);
 
+static void calc_drwXY(uint32_t *drwX, uint32_t *drwY) {
+  *drwX = *drwY = 0;
+  aspect(&vo_dwidth, &vo_dheight, A_NOZOOM);
+  if (vo_fs) {
+    aspect(&vo_dwidth, &vo_dheight, A_ZOOM);
+    vo_dwidth = FFMIN(vo_dwidth, vo_screenwidth);
+    vo_dheight = FFMIN(vo_dheight, vo_screenheight);
+    *drwX = (vo_screenwidth - vo_dwidth) / 2;
+    *drwY = (vo_screenheight - vo_dheight) / 2;
+    mp_msg(MSGT_VO, MSGL_V, "[xv-fs] dx: %d dy: %d dw: %d dh: %d\n",
+           *drwX, *drwY, vo_dwidth, vo_dheight);
+  } else if (WinID == 0) {
+    *drwX = vo_dx;
+    *drwY = vo_dy;
+  }
+}
+
 /*
  * connect to server, create and map window,
  * allocate colors and (shared) memory
@@ -242,23 +260,6 @@
             aspect_save_screenres(modeline_width, modeline_height);
         } else
 #endif
-        if (vo_fs)
-        {
-#ifdef X11_FULLSCREEN
-            /* this code replaces X11_FULLSCREEN hack in mplayer.c
-             * aspect() is available through aspect.h for all vos.
-             * besides zooming should only be done with -zoom,
-             * but I leave the old -fs behaviour so users don't get
-             * irritated for now (and send lots o' mails ;) ::atmos
-             */
-
-            aspect(&d_width, &d_height, A_ZOOM);
-#endif
-
-        }
-//   dwidth=d_width; dheight=d_height; //XXX: what are the copy vars used for?
-        vo_dwidth = d_width;
-        vo_dheight = d_height;
         hint.flags = PPosition | PSize /* | PBaseSize */ ;
         hint.base_width = hint.width;
         hint.base_height = hint.height;
@@ -299,12 +300,7 @@
                              &drwBorderWidth, &drwDepth);
                 if (vo_dwidth <= 0) vo_dwidth = d_width;
                 if (vo_dheight <= 0) vo_dheight = d_height;
-                drwX = drwY = 0; // coordinates need to be local to the window
                 aspect_save_prescale(vo_dwidth, vo_dheight);
-            } else
-            {
-                drwX = vo_dx;
-                drwY = vo_dy;
             }
         } else if (vo_window == None)
         {
@@ -400,25 +396,8 @@
     set_gamma_correction();
 #endif
 
-    aspect(&vo_dwidth, &vo_dheight, A_NOZOOM);
-    if (((flags & VOFLAG_FULLSCREEN) && (WinID <= 0)) || vo_fs)
-    {
-        aspect(&vo_dwidth, &vo_dheight, A_ZOOM);
-        drwX =
-            (vo_screenwidth -
-             (vo_dwidth >
-              vo_screenwidth ? vo_screenwidth : vo_dwidth)) / 2;
-        drwY =
-            (vo_screenheight -
-             (vo_dheight >
-              vo_screenheight ? vo_screenheight : vo_dheight)) / 2;
-        vo_dwidth =
-            (vo_dwidth > vo_screenwidth ? vo_screenwidth : vo_dwidth);
-        vo_dheight =
-            (vo_dheight > vo_screenheight ? vo_screenheight : vo_dheight);
-        mp_msg(MSGT_VO, MSGL_V, "[xv-fs] dx: %d dy: %d dw: %d dh: %d\n",
-               drwX, drwY, vo_dwidth, vo_dheight);
-    }
+    if ((flags & VOFLAG_FULLSCREEN) && WinID <= 0) vo_fs = 1;
+    calc_drwXY(&drwX, &drwY);
 
     panscan_calc();
     
@@ -557,25 +536,7 @@
         mp_msg(MSGT_VO, MSGL_V, "[xv] dx: %d dy: %d dw: %d dh: %d\n", drwX,
                drwY, vo_dwidth, vo_dheight);
 
-        aspect(&dwidth, &dheight, A_NOZOOM);
-        if (vo_fs)
-        {
-            aspect(&dwidth, &dheight, A_ZOOM);
-            drwX =
-                (vo_screenwidth -
-                 (dwidth > vo_screenwidth ? vo_screenwidth : dwidth)) / 2;
-            drwY =
-                (vo_screenheight -
-                 (dheight >
-                  vo_screenheight ? vo_screenheight : dheight)) / 2;
-            vo_dwidth =
-                (dwidth > vo_screenwidth ? vo_screenwidth : dwidth);
-            vo_dheight =
-                (dheight > vo_screenheight ? vo_screenheight : dheight);
-            mp_msg(MSGT_VO, MSGL_V,
-                   "[xv-fs] dx: %d dy: %d dw: %d dh: %d\n", drwX, drwY,
-                   vo_dwidth, vo_dheight);
-        }
+        calc_drwXY(&drwX, &drwY);
     }
 
     if (e & VO_EVENT_EXPOSE || e & VO_EVENT_RESIZE)
--- a/libvo/vo_xvmc.c	Tue Mar 06 14:15:37 2007 +0000
+++ b/libvo/vo_xvmc.c	Tue Mar 06 15:34:54 2007 +0000
@@ -36,6 +36,8 @@
 #include "Gui/interface.h"
 #endif
 
+#include "libavutil/common.h"
+
 //no chanse xinerama to be suported in near future
 #undef HAVE_XINERAMA
 
@@ -421,6 +423,23 @@
    return 0;
 }
 
+static void calc_drwXY(uint32_t *drwX, uint32_t *drwY) {
+  *drwX = *drwY = 0;
+  aspect(&vo_dwidth, &vo_dheight, A_NOZOOM);
+  if (vo_fs) {
+    aspect(&vo_dwidth, &vo_dheight, A_ZOOM);
+    vo_dwidth = FFMIN(vo_dwidth, vo_screenwidth);
+    vo_dheight = FFMIN(vo_dheight, vo_screenheight);
+    *drwX = (vo_screenwidth - vo_dwidth) / 2;
+    *drwY = (vo_screenheight - vo_dheight) / 2;
+    mp_msg(MSGT_VO, MSGL_V, "[xvmc-fs] dx: %d dy: %d dw: %d dh: %d\n",
+           *drwX, *drwY, vo_dwidth, vo_dheight);
+  } else if (WinID == 0) {
+    *drwX = vo_dx;
+    *drwY = vo_dy;
+  }
+}
+
 static int config(uint32_t width, uint32_t height,
 		       uint32_t d_width, uint32_t d_height,
 		       uint32_t flags, char *title, uint32_t format){
@@ -644,21 +663,6 @@
       }
       else
 #endif
-      if ( vo_fs )
-      {
-#ifdef X11_FULLSCREEN
-     /* this code replaces X11_FULLSCREEN hack in mplayer.c
-      * aspect() is available through aspect.h for all vos.
-      * besides zooming should only be done with -zoom,
-      * but I leave the old -fs behaviour so users don't get
-      * irritated for now (and send lots o' mails ;) ::atmos
-      */
-
-         aspect(&d_width,&d_height,A_ZOOM);
-#endif
-
-      }
-   vo_dwidth=d_width; vo_dheight=d_height;
    hint.flags = PPosition | PSize /* | PBaseSize */;
    hint.base_width = hint.width; hint.base_height = hint.height;
    XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), &attribs);
@@ -685,9 +689,8 @@
          XGetGeometry(mDisplay, vo_window, &mRoot,
                       &drwX, &drwY, &vo_dwidth, &vo_dheight,
                       &drwBorderWidth, &drwDepth);
-         drwX = drwY = 0; // coordinates need to be local to the window
          aspect_save_prescale(vo_dwidth, vo_dheight);
-      } else { drwX=vo_dx; drwY=vo_dy; }
+      }
    } else 
       if ( vo_window == None ){
          vo_window = XCreateWindow(mDisplay, mRootWin,
@@ -733,16 +736,8 @@
 #endif
    }
 
-   aspect(&vo_dwidth,&vo_dheight,A_NOZOOM);
-   if ( (( flags&VOFLAG_FULLSCREEN )&&( WinID <= 0 )) || vo_fs )
-   {
-      aspect(&vo_dwidth,&vo_dheight,A_ZOOM);
-      drwX=( vo_screenwidth - (vo_dwidth > vo_screenwidth?vo_screenwidth:vo_dwidth) ) / 2;
-      drwY=( vo_screenheight - (vo_dheight > vo_screenheight?vo_screenheight:vo_dheight) ) / 2;
-      vo_dwidth=(vo_dwidth > vo_screenwidth?vo_screenwidth:vo_dwidth);
-      vo_dheight=(vo_dheight > vo_screenheight?vo_screenheight:vo_dheight);
-      mp_msg(MSGT_VO,MSGL_V, "[xvmc-fs] dx: %d dy: %d dw: %d dh: %d\n",drwX,drwY,vo_dwidth,vo_dheight );
-   }
+   if ((flags & VOFLAG_FULLSCREEN) && WinID <= 0) vo_fs = 1;
+   calc_drwXY(&drwX, &drwY);
 
    panscan_calc();
 
@@ -1099,7 +1094,6 @@
 }
 
 static void check_events(void){
-int dwidth,dheight;
 Window mRoot;
 uint32_t drwBorderWidth,drwDepth;
 
@@ -1110,20 +1104,10 @@
 
       XGetGeometry( mDisplay,vo_window,&mRoot,&drwX,&drwY,&vo_dwidth,&vo_dheight,
                    &drwBorderWidth,&drwDepth );
-      drwX = drwY = 0;
       mp_msg(MSGT_VO,MSGL_V, "[xvmc] dx: %d dy: %d dw: %d dh: %d\n",drwX,drwY,
               vo_dwidth,vo_dheight );
 
-      aspect(&dwidth,&dheight,A_NOZOOM);
-      if ( vo_fs )
-      {
-         aspect(&dwidth,&dheight,A_ZOOM);
-         drwX=( vo_screenwidth - (dwidth > vo_screenwidth?vo_screenwidth:dwidth) ) / 2;
-         drwY=( vo_screenheight - (dheight > vo_screenheight?vo_screenheight:dheight) ) / 2;
-         vo_dwidth=(dwidth > vo_screenwidth?vo_screenwidth:dwidth);
-         vo_dheight=(dheight > vo_screenheight?vo_screenheight:dheight);
-         mp_msg(MSGT_VO,MSGL_V, "[xvmc-fs] dx: %d dy: %d dw: %d dh: %d\n",drwX,drwY,vo_dwidth,vo_dheight );
-      }
+      calc_drwXY(&drwX, &drwY);
    }
    if ( e & VO_EVENT_EXPOSE )
    {