From 791b680a9fa66087cfe29e945ce2b9cdd64876ac Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 10 Jul 2006 17:14:16 +0000 Subject: [PATCH] * Revive the aspect ratio patches (for screens rotated through Xrandr). svn path=/nixpkgs/trunk/; revision=5672 --- pkgs/applications/video/MPlayer/default.nix | 5 + .../video/MPlayer/mplayer-aspect.patch | 96 +++++++++++++++ .../video/MPlayer/mplayer-pivot.patch | 112 ++++++++++++++++++ 3 files changed, 213 insertions(+) create mode 100644 pkgs/applications/video/MPlayer/mplayer-aspect.patch create mode 100644 pkgs/applications/video/MPlayer/mplayer-pivot.patch diff --git a/pkgs/applications/video/MPlayer/default.nix b/pkgs/applications/video/MPlayer/default.nix index 2a94f3f22f8..e956548dcbd 100644 --- a/pkgs/applications/video/MPlayer/default.nix +++ b/pkgs/applications/video/MPlayer/default.nix @@ -40,4 +40,9 @@ stdenv.mkDerivation { ]; configureFlags = if cacaSupport then "--enable-caca" else "--disable-caca"; + + # These fix MPlayer's aspect ratio when run in a screen rotated with + # Xrandr. + # See: http://itdp.de/~itdp/html/mplayer-dev-eng/2005-08/msg00427.html + patches = [./mplayer-aspect.patch ./mplayer-pivot.patch]; } diff --git a/pkgs/applications/video/MPlayer/mplayer-aspect.patch b/pkgs/applications/video/MPlayer/mplayer-aspect.patch new file mode 100644 index 00000000000..7e7dedaa2bf --- /dev/null +++ b/pkgs/applications/video/MPlayer/mplayer-aspect.patch @@ -0,0 +1,96 @@ +diff -rc MPlayer-1.0pre8-orig/libvo/aspect.c MPlayer-1.0pre8/libvo/aspect.c +*** MPlayer-1.0pre8-orig/libvo/aspect.c 2006-06-11 20:35:43.000000000 +0200 +--- MPlayer-1.0pre8/libvo/aspect.c 2006-07-10 18:55:11.000000000 +0200 +*************** +*** 11,16 **** +--- 11,19 ---- + #include + #endif + ++ int vo_physical_width = 0; ++ int vo_physical_height = 0; ++ + int vo_panscan_x = 0; + int vo_panscan_y = 0; + float vo_panscan_amount = 0; +*************** +*** 18,24 **** + + #include "video_out.h" + +! float monitor_aspect=4.0/3.0; + float monitor_pixel_aspect=0; + extern float movie_aspect; + +--- 21,27 ---- + + #include "video_out.h" + +! float monitor_aspect=-1.0f; + float monitor_pixel_aspect=0; + extern float movie_aspect; + +*************** +*** 48,53 **** +--- 51,68 ---- + aspdat.preh = preh; + } + ++ static void init_monitor_aspect( void ) ++ { ++ if (monitor_aspect != -1.0f) return; ++ if (vo_physical_width == 0 || vo_physical_height == 0) { ++ // if there's no other indication, assume square pixels ++ vo_physical_width = aspdat.scrw; ++ vo_physical_height = aspdat.scrh; ++ } ++ mp_msg(MSGT_VO,MSGL_V,"\naspect: monitor aspect detected %d:%d\n", vo_physical_width, vo_physical_height); ++ monitor_aspect = 1.0f * vo_physical_width / vo_physical_height; ++ } ++ + void aspect_save_screenres(int scrw, int scrh){ + #ifdef ASPECT_DEBUG + printf("aspect_save_screenres %dx%d \n",scrw,scrh); +*************** +*** 56,61 **** +--- 71,77 ---- + aspdat.scrh = scrh; + if (monitor_pixel_aspect) + monitor_aspect = monitor_pixel_aspect * scrw / scrh; ++ init_monitor_aspect(); // now is a good time + } + + /* aspect is called with the source resolution and the +diff -rc MPlayer-1.0pre8-orig/libvo/aspect.h MPlayer-1.0pre8/libvo/aspect.h +*** MPlayer-1.0pre8-orig/libvo/aspect.h 2006-06-11 20:35:43.000000000 +0200 +--- MPlayer-1.0pre8/libvo/aspect.h 2006-07-10 18:52:04.000000000 +0200 +*************** +*** 2,7 **** +--- 2,10 ---- + #define __ASPECT_H + /* Stuff for correct aspect scaling. */ + ++ extern int vo_physical_width; ++ extern int vo_physical_height; ++ + extern int vo_panscan_x; + extern int vo_panscan_y; + extern float vo_panscan_amount; +diff -rc MPlayer-1.0pre8-orig/libvo/x11_common.c MPlayer-1.0pre8/libvo/x11_common.c +*** MPlayer-1.0pre8-orig/libvo/x11_common.c 2006-06-11 20:35:43.000000000 +0200 +--- MPlayer-1.0pre8/libvo/x11_common.c 2006-07-10 18:52:04.000000000 +0200 +*************** +*** 463,468 **** +--- 463,474 ---- + if (!vo_screenheight) + vo_screenheight = DisplayHeight(mDisplay, mScreen); + } ++ if (vo_physical_width == 0) { ++ vo_physical_width = DisplayWidthMM(mDisplay, mScreen); ++ } ++ if (vo_physical_height == 0) { ++ vo_physical_height = DisplayHeightMM(mDisplay, mScreen); ++ } + // get color depth (from root window, or the best visual): + XGetWindowAttributes(mDisplay, mRootWin, &attribs); + depth = attribs.depth; diff --git a/pkgs/applications/video/MPlayer/mplayer-pivot.patch b/pkgs/applications/video/MPlayer/mplayer-pivot.patch new file mode 100644 index 00000000000..33afa32a009 --- /dev/null +++ b/pkgs/applications/video/MPlayer/mplayer-pivot.patch @@ -0,0 +1,112 @@ +--- MPlayer/configure.orig 2005-08-21 23:47:47.000000000 +0200 ++++ MPlayer/configure 2005-08-21 23:55:02.000000000 +0200 +@@ -162,6 +162,7 @@ + --enable-lircc enable LIRCCD (LIRC client daemon) input [autodetect] + --enable-joystick enable joystick support [disable] + --disable-vm disable support X video mode extensions [autodetect] ++ --disable-randr disable support for X resize and rotate extension [autodetect] + --disable-xf86keysym disable support for 'multimedia' keys [autodetect] + --disable-tv disable TV Interface (tv/dvb grabbers) [enable] + --disable-tv-v4l disable Video4Linux TV Interface support [autodetect] +@@ -252,6 +253,7 @@ + --enable-xv build with Xv render support for X 4.x [autodetect] + --enable-xvmc build with XvMC acceleration for X 4.x [disable] + --enable-vm build with XF86VidMode support for X11 [autodetect] ++ --enable-randr build with XRandR support for X11 [autodetect] + --enable-xinerama build with Xinerama support for X11 [autodetect] + --enable-x11 build with X11 render support [autodetect] + --enable-fbdev build with FBDev render support [autodetect] +@@ -1351,6 +1353,7 @@ + _mga=auto + _xmga=auto + _vm=auto ++_randr=auto + _xf86keysym=auto + _mlib=auto + _sgiaudio=auto +@@ -1562,6 +1565,8 @@ + --disable-xmga) _xmga=no ;; + --enable-vm) _vm=yes ;; + --disable-vm) _vm=no ;; ++ --enable-randr) _randr=yes ;; ++ --disable-randr) _randr=no ;; + --enable-xf86keysym) _xf86keysym=yes ;; + --disable-xf86keysym) _xf86keysym=no ;; + --enable-mlib) _mlib=yes ;; +@@ -3603,6 +3608,25 @@ + fi + echores "$_vm" + ++# X Resize, Rotate and Reflect extension ++echocheck "Xrandr" ++if test "$_x11" = yes && test "$_randr" = auto; then ++ cat > $TMPC < ++#include ++int main(void) { (void) XRRQueryExtension(0, 0, 0); return 0; } ++EOF ++ _randr=no ++ cc_check $_inc_x11 -lXrandr $_ld_x11 && _randr=yes ++fi ++if test "$_randr" = yes ; then ++ _def_randr='#define HAVE_XRANDR 1' ++ _ld_randr='-lXrandr' ++else ++ _def_randr='#undef HAVE_XRANDR' ++fi ++echores "$_randr" ++ + # Check for the presence of special keycodes, like audio control buttons + # that XFree86 might have. Used to be bundled with the xf86vm check, but + # has nothing to do with xf86vm and XFree 3.x has xf86vm but does NOT +@@ -6762,7 +6786,7 @@ + SLIBSUF=.so + + # video output +-X_LIB = $_ld_gl $_ld_dga $_ld_xv $_ld_xvmc $_ld_vm $_ld_xinerama $_ld_x11 $_ld_sock ++X_LIB = $_ld_gl $_ld_dga $_ld_xv $_ld_xvmc $_ld_vm $_ld_randr $_ld_xinerama $_ld_x11 $_ld_sock + GGI_LIB = $_ld_ggi + MLIB_LIB = $_ld_mlib + MLIB_INC = $_inc_mlib +@@ -7465,6 +7489,7 @@ + $_def_xv + $_def_xvmc + $_def_vm ++$_def_randr + $_def_xf86keysym + $_def_xinerama + $_def_gl +--- MPlayer/libvo/x11_common.c.orig 2005-08-21 23:56:20.000000000 +0200 ++++ MPlayer/libvo/x11_common.c 2005-08-22 00:05:17.000000000 +0200 +@@ -39,6 +39,10 @@ + #include + #endif + ++#ifdef HAVE_XRANDR ++#include ++#endif ++ + #ifdef HAVE_XF86XK + #include + #endif +@@ -434,6 +438,20 @@ + int clock; + + XF86VidModeGetModeLine(mDisplay, mScreen, &clock, &modeline); ++#ifdef HAVE_XRANDR ++ { ++ Rotation current_rotation; ++ ++ XRRRotations(mDisplay, mScreen, ¤t_rotation); ++ if ((current_rotation&RR_Rotate_90) != 0 || ++ (current_rotation&RR_Rotate_270) != 0) { ++ unsigned short tmp; ++ tmp = modeline.hdisplay; ++ modeline.hdisplay = modeline.vdisplay; ++ modeline.vdisplay = tmp; ++ } ++ } ++#endif + if (!vo_screenwidth) + vo_screenwidth = modeline.hdisplay; + if (!vo_screenheight)