[SCM] mplayer packaging branch, master.unstripped, updated. upstream.unstripped/1.0rc2+svn20090303-unstripped-61-gda95605

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Thu Jun 4 08:32:46 UTC 2009


The following commit has been merged in the master.unstripped branch:
commit 4075dc02287dfb90525540f173a52f009e6dcd82
Author: Reinhard Tartler <siretart at tauware.de>
Date:   Thu Jun 4 10:05:15 2009 +0200

    Imported Upstream version 1.0~rc3+svn20090426-unstripped

diff --git a/.svnrevision b/.svnrevision
index 1cfc21a..d52047d 100644
--- a/.svnrevision
+++ b/.svnrevision
@@ -1 +1 @@
-28799
+29237
diff --git a/AUTHORS b/AUTHORS
index c54371a..99f52fa 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -808,7 +808,7 @@ Ulion <ulion2002 gmail.com>
 Urpala, Uoti (uau) <uoti.urpala at pp1.inet.fi>
     * A/V sync fixes
 
-Vajna, Miklós (VMiklos) <mamajom at axelero.hu>
+Vajna, Miklós (VMiklos) <vmiklos at frugalware.org>
     * TOOLS/divx2svcd author
     * TOOLS/ directory documentation
 
diff --git a/Changelog b/Changelog
index c0fe56d..7ced40d 100644
--- a/Changelog
+++ b/Changelog
@@ -1,8 +1,8 @@
 MPlayer (1.0)
 
-  rc3: "StillAlive" March 1, 2009
+  rc3: "BikeshedCounter" March 27, 2009
     Decoders:
-    * support for X8 frame (fixes "J-type picture is not supported" for WMV2)
+    * support for X8 frames (fixes "J-type picture is not supported" for WMV2)
     * support for DTS WAV/DTS-CD passthrough by ad_hwac3
     * Apple's raw YUV2 in MOV
     * LATM over LOAS AAC decoding via internal libfaad2
@@ -10,15 +10,15 @@ MPlayer (1.0)
       EA Maxis XA ADPCM audio, RL2 video, Beam Software SIFF video, V.Flash PTX video
     * AVOption support for libavcodec-based decoders
     * use lavc ADPCM codecs by default
-    * support for progressive jpeg in ffmjpeg
-    * ACDSystems mjpeg (ACDV) via binary DLL and lavc
+    * support for progressive JPEG in ffmjpeg
+    * ACDSystems MJPEG (ACDV) via binary DLL and lavc
     * SIF1 via binary DLL
     * wincam screen capture (WCMV) via binary DLL
-    * Creative Labs Video Blaster Webcam mjpeg (CJPG) via binary DLL and ijpg library
-    * kensington webcam (AJPG,ABYR) via binary DLL
+    * Creative Labs Video Blaster Webcam MJPEG (CJPG) via binary DLL and ijpg library
+    * kensington webcam (AJPG, ABYR) via binary DLL
     * centre for wavelets (wavc) via binary DLL
-    * GeoVision Advanced MPEG-4 (GMP4,GM40) via binary DLL
-    * Xiricam jpg from Veo PC Camera (XJPG) via binary DLL
+    * GeoVision Advanced MPEG-4 (GMP4, GM40) via binary DLL
+    * Xiricam JPEG from Veo PC Camera (XJPG) via binary DLL
     * WorldConnect Wavelet Video (SMSV) via binary DLL
     * VDOWave 3 advanced (VDO3,VDOM,VDOW) via binary DLL
     * VoxWare MetaVoice (format 0x0074) via binary DLL
@@ -37,6 +37,7 @@ MPlayer (1.0)
     * Brooktree YUV 4:1:1 Raw (Y41P) via binary DLL
     * many rare/obscure fourccs for known formats added
     * lower priority for binary Linux rv3040 codecs due to bugs
+    * remove native NuppelVideo decoder, use lavc instead
 
     Demuxers:
     * -lavfdopts cryptokey allows decrypting MXF and ASF files
@@ -55,6 +56,7 @@ MPlayer (1.0)
     * support seeking in multirate RealMedia files
     * FLAC speedup in lavf demuxer
     * MNG demuxer
+    * remove native NuppelVideo demuxer, use lavf demuxer instead
 
     Filters:
     * vf_ow new overcomplete wavelet denoiser
@@ -85,7 +87,7 @@ MPlayer (1.0)
     * Linux Media Labs MPEG-4 (LMLM4) demuxer
     * AVM2 (Flash 9) SWF muxer
     * QT variant of IMA ADPCM encoder
-    * Ipod/Iphone compatible mp4 muxer
+    * iPod/iPhone compatible MP4 muxer
     * Mimic decoder
     * MSN TCP Webcam stream demuxer
     * RL2 demuxer / decoder
@@ -122,7 +124,7 @@ MPlayer (1.0)
     * NC (NC4600) cameras file demuxer
     * MXF D-10 muxer
     * Generic metadata API
-    * H.264 speedup and PAFF decoding (install Yasm for faster H264 decoding)
+    * H.264 speedup and PAFF decoding (install Yasm for faster H.264 decoding)
     * correctly decode more of the H.264 conformance testsuite
     * VC-1/WMV3 decoder speedup
     * VP3 decoder speedup
@@ -139,13 +141,14 @@ MPlayer (1.0)
     * replace PolypAudio by PulseAudio (-ao pulse)
     * add force-pbo suboption for faster output in vo_gl
     * add Nintendo Wii/GameCube video driver (-vo wii)
-    * VIDIX driver for SuperH Mobile VEU hardware block.
+    * VIDIX driver for SuperH Mobile VEU hardware block
     * support -border on vo_gl/gl2 in x11
-    * Direct3D Windows video output driver added.
+    * Direct3D Windows video output driver added
     * factorize code in vo_wii
-    * removed unnecessary code from vo x11, xv, xvmc
+    * remove unnecessary code from vo x11, xv, xvmc
     * add OS/2 DART audio driver (-ao dart)
     * add VDPAU video output
+    * add OS/2 KVA video driver (-vo kva)
 
     MEncoder:
     * check for system-wide configuration file in MEncoder
@@ -163,20 +166,27 @@ MPlayer (1.0)
     * add options to disable some or all configuration files
     * support for DOS-style file:///x:/path paths
     * some new slave commands (check DOCS/tech/slave.txt)
-    * libass fixes and updates to match VSFilter renderer
     * libdvdcss updated to 1.2.10, now same as upstream version
     * fix -endchapter support again for -dump* options
-    * add startup volume option
+    * add startup audio volume option
+    * add option to disable default key binds
+    * change default OSD and subtitle font size to a smaller default
+
+    libass:
+    * various fixes and updates to match VSFilter renderer
+    * support \blur tag and ScaledBordersAndShadow property
+    * fractional arguments and subpixel accuracy
+    * keep positions when pan-and-scan is used
 
     Ports:
     * small crash with vo_macosx fixed
     * AC3/DTS passthrough for ao_macosx
     * fix frozen OSD on Mac OS X
     * vo_gl now works with -wid and nVidia drivers on Windows (this is a hack)
-    * VIDIX on SuperH.
+    * VIDIX on SuperH
     * workarounds for AltiVec on Apple gcc 3.3 on Mac OS X dropped
     * vo_macosx can now be compiled in 64-bits mode
-    * allow multiple MPlayer instances w/ vo_macosx using buffer_name
+    * allow multiple MPlayer instances with vo_macosx using buffer_name
     * OpenGL support for unmodified MinGW64
 
     SWScaler:
diff --git a/Copyright b/Copyright
index 47ae48b..7c3faac 100644
--- a/Copyright
+++ b/Copyright
@@ -8,23 +8,25 @@ notices can be found in the file headers. Furthermore, MPlayer includes code
 from several external sources:
 
 Name:       FFmpeg
-Version:    Subversion HEAD
-Homepage:   http://www.ffmpeg.org
+Version:    0.5
+URL:        http://www.ffmpeg.org
 Directory:  libavcodec, libavformat, libavutil, libpostproc
 Copyright:  Many, see individual files for copyright notices.
 License:    GNU Lesser General Public License, some parts GNU General Public
             License, GNU General Public License when combined
 
+
 Name:       FAAD2
 Version:    2.1 beta (20040915 CVS snapshot) + fixes and portability patches
-Homepage:   http://www.audiocoding.com
+URL:        http://www.audiocoding.com
 Directory:  libfaad2
 Copyright:  2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
 License:    GNU General Public License
 
+
 Name:       GSM 06.10 library
 Version:    patchlevel 10
-Homepage:   http://kbs.cs.tu-berlin.de/~jutta/toast.html
+URL:        http://kbs.cs.tu-berlin.de/~jutta/toast.html
 Directory:  libmpcodecs/native/
 Copyright:  1992 by Jutta Degener and Carsten Bormann, TU Berlin
 License:    permissive, see libmpcodecs/native/xa_gsm.c
@@ -32,7 +34,7 @@ License:    permissive, see libmpcodecs/native/xa_gsm.c
 
 Name:       liba52
 Version:    0.7.4 + patches
-Homepage:   http://liba52.sourceforge.net/
+URL:        http://liba52.sourceforge.net/
 Directory:  liba52
 Copyright:  1999-2000 Aaron Holtzman <aholtzma at ess.engr.uvic.ca>
             2000-2001 Michel Lespinasse <walken at zoy.org>
@@ -41,28 +43,41 @@ Copyright:  1999-2000 Aaron Holtzman <aholtzma at ess.engr.uvic.ca>
             2004 Romain Dolbeau <romain at dolbeau.org>
 License:    GNU General Public License
 
+
 Name:       libdvdcss
 Version:    1.2.10
-Homepage:   http://developers.videolan.org/libdvdcss/
+URL:        http://developers.videolan.org/libdvdcss/
 Directory:  libdvdcss
 Copyright:  1998-2008 VideoLAN
 License:    GNU General Public License
 
+
 Name:       libdvdread
-Version:    0.9.7 + patches
-Homepage:   http://www.dtek.chalmers.se/groups/dvd/development.shtml
-Directory:  libdvdread
+Version:    Subversion HEAD
+URL:        svn://svn.mplayerhq.hu/dvdnav/trunk/libdvdread/src
+Directory:  libdvdread4
 Copyright:  1998, 1999 Eric Smith <eric at brouhaha.com>
             1999 Christian Wolff for convergence integrated media
-            2000-2001 Billy Biggs <vektor at dumbterm.net>,
+            2000-2004 Billy Biggs <vektor at dumbterm.net>,
             2001-2002 Samuel Hocevar <sam at zoy.org>,
-            2000-2003 Björn Englund <d4bjorn at dtek.chalmers.se>,
-            2000-2003 HÃ¥kan Hjort <d95hjort at dtek.chalmers.se>
+            2000-2004 Björn Englund <d4bjorn at dtek.chalmers.se>,
+            2000-2004 HÃ¥kan Hjort <d95hjort at dtek.chalmers.se>
 License:    GNU General Public License
 
+
+Name:       libdvdnav
+Version:    Subversion HEAD from
+URL:        svn://svn.mplayerhq.hu/dvdnav/trunk/libdvdnav/src
+Directory:  libdvdnav
+Copyright:  2000, 2001 Martin Norbäck, Håkan Hjort
+            2000-2004 Rich Wareham <richwareham at users.sourceforge.net>
+            2001-2004 the dvdnav project
+License:    GNU General Public License
+
+
 Name:       libmpeg2
 Version:    0.5.1 + patches
-Homepage:   http://libmpeg2.sourceforge.net/
+URL:        http://libmpeg2.sourceforge.net/
 Directory:  libmpeg2
 Copyright:  1999-2000 Aaron Holtzman <aholtzma at ess.engr.uvic.ca>
             2000-2004 Michel Lespinasse <walken at zoy.org>
@@ -72,25 +87,28 @@ Copyright:  1999-2000 Aaron Holtzman <aholtzma at ess.engr.uvic.ca>
             2003 Peter Gubanov <peter at elecard.net.ru>
 License:    GNU General Public License
 
+
 Name:       mpg123
 Version:    0.59s + significant changes
-Homepage:   http://www.mpg123.de/
+URL:        http://www.mpg123.de/
 Directory:  mp3lib
 Copyright:  1995-1999 by Michael Hipp
             2004 Romain Dolbeau <romain at dolbeau.org>
             2006 Zuxy Meng <zuxy.meng at gmail.com
 License:    GNU General Public License
 
+
 Name:       Tremor
 Version:    1.0 + parts CVS from December 2004 + patches
-Homepage:   http://xiph.org/
+URL:        http://xiph.org/
 Directory:  tremor
 Copyright:  1994-2002, Xiph.org Foundation http://www.xiph.org/
 License:    BSD-like, see tremor/COPYING
 
+
 Name:       avifile DLL loader
 Version:    0.47 + patches + CVS updates
-Homepage:   http://avifile.sourceforge.net/
+URL:        http://avifile.sourceforge.net/
 Directory:  loader/
 Copyright:  1993 Robert J. Amstadt
             1994 Eric Youndale & Erik Bos
@@ -101,68 +119,77 @@ Copyright:  1993 Robert J. Amstadt
             2000-2001 Eugene Kuznetsov (divx at euro.ru)
 License:    GNU General Public License
 
+
 Name:       dvbstream
 Version:    0.4.3-pre3 (CVS checkout)
-Homepage:   http://sourceforge.net/projects/dvbtools/
+URL:        http://sourceforge.net/projects/dvbtools/
 Directory:  stream/dvbin.h stream/rtp.[ch] stream/stream_dvb.c
 Copyright:  2001-2002 Dave Chapman <dave at dchapman.com>
 License:    GNU General Public License
 
+
 Name:       librtsp
 Version:    xine CVS 2003/04/10 + patches
-Homepage:   http://www.xinehq.de
+URL:        http://www.xinehq.de
 Directory:  stream/librtsp/
 Copyright:  2000-2002 the xine project
 License:    GNU General Public License
 
+
 Name:       realrtsp
 Version:    xine CVS 2003/04/17 + patches
-Homepage:   http://www.xinehq.de
+URL:        http://www.xinehq.de
 Directory:  stream/realrtsp/
 Copyright:  2002 the xine project
 License:    GNU General Public License
 
+
 Name:       pnm protocol implementation
 Version:    xine CVS 2002/12/26 + patches
-Homepage:   http://www.xinehq.de
+URL:        http://www.xinehq.de
 Directory:  stream/pnm.[ch]
 Copyright:  2000-2002 the xine project
 License:    GNU General Public License
 
+
 Name:       id3edit
 Version:    1.9 + patches
-Homepage:   http://id3edit.sourceforge.net/
+URL:        http://id3edit.sourceforge.net/
 Directory:  libmpdemux/genres.h
 Copyright:  2001 Jason Carter
 License:    GNU General Public License
 
+
 Name:       FreeSDP
 Version:    0.4.1
-Homepage:   https://savannah.nongnu.org/projects/freesdp/
+URL:        https://savannah.nongnu.org/projects/freesdp/
 Directory:  stream/freesdp/
 Copyright:  2001-2003 Federico Montesino Pouzols <fedemp at suidzer0.org>
 License:    GNU General Public License
 
+
 Name:       MJPEG Tools
 Version:    post 2001-12-03 release or CVS snapshot
-Homepage:   http://mjpeg.sourceforge.net/
+URL:        http://mjpeg.sourceforge.net/
 Directory:  libmpdemux/yuv4mpeg*
 Copyright:  2001 Matthew J. Marjanovic <maddog at mir.com>
             2001 Andrew Stevens <andrew.stevens at philips.com>
 License:    GNU General Public License
 
+
 Name:       NuppelVideo / RTJPEG
 Version:    0.52a + patches
-Homepage:   http://web.archive.org/web/20060219034716/http://frost.htu.tuwien.ac.at/~roman/nuppelvideo/
-Directory:  libmpcodecs/native/rtjpegn.[ch] libmpdemux/nuppelvideo.h
+URL:        http://web.archive.org/web/20060219034716/http://frost.htu.tuwien.ac.at/~roman/nuppelvideo/
+Directory:  libmpcodecs/native/rtjpegn.[ch]
 Copyright:  1998 Justin Schoeman (justin at suntiger.ee.up.ac.za)
             1998, 1999 Joerg Walter <trouble at moes.pmnet.uni-oldenburg.de>
             1999 Wim Taymans <wim.taymans at tvd.be>
 License:    GNU General Public License
 
+
 Name:       ReactOS
 Version:    r25937
-Homepage:   http://www.reactos.org/
+URL:        http://www.reactos.org/
 Directory:  vidix/dhahelperwin/ntverp.h vidix/dhahelperwin/common.ver
 Copyright:  Alex Ionescu (alex.ionescu at reactos.org)
 License:    GNU General Public License
diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1
index 7add7d3..33a006b 100644
--- a/DOCS/man/en/mplayer.1
+++ b/DOCS/man/en/mplayer.1
@@ -1,4 +1,4 @@
-.\" $Revision: 28788 $
+.\" $Revision: 29059 $
 .\" MPlayer (C) 2000-2009 MPlayer Team
 .\" This man page was/is done by Gabucino, Diego Biurrun, Jonas Jermann
 .
@@ -31,7 +31,7 @@
 .\" Title
 .\" --------------------------------------------------------------------------
 .
-.TH MPlayer 1 "2009-01-05" "The MPlayer Project" "The Movie Player"
+.TH MPlayer 1 "2009-03-25" "The MPlayer Project" "The Movie Player"
 .
 .SH NAME
 mplayer  \- movie player
@@ -904,7 +904,7 @@ i.e.\& using the shell.
 MPlayer uses this command without any checking, it is your responsibility
 to ensure it does not cause security problems (e.g.\& make sure to use full
 paths if "." is in your path like on Windows).
-It also only works when playing video (i.e. not with \-novideo but works with \-vo null).
+It also only works when playing video (i.e.\& not with \-novideo but works with \-vo null).
 .sp 1
 This can be "misused" to disable screensavers that do not support the proper
 X API (also see \-stop\-xscreensaver).
@@ -960,6 +960,8 @@ Device to be used for Apple IR Remote (default is autodetected, Linux only).
 Delay in milliseconds before we start to autorepeat a key (0 to disable).
 .IPs ar-rate
 Number of key presses to generate per second on autorepeat.
+.IPs (no)default-bindings
+Use the key bindings that MPlayer ships with by default.
 .IPs keylist
 Prints all keys that can be bound to commands.
 .IPs cmdlist
@@ -1131,6 +1133,8 @@ by a newline (\\n) from stdin.
 .I NOTE:
 See \-input cmdlist for a list of slave commands and DOCS/tech/slave.txt
 for their description.
+Also, this is not intended to disable other inputs, e.g.\& via the video window,
+use some other method like \-input nodefault\-binds:conf=/dev/null for that.
 .
 .TP
 .B \-softsleep
@@ -2249,14 +2253,14 @@ Use this if commas in subtitles are shown at the start of a sentence
 instead of at the end.
 .
 .TP
-.B \-font <path to font.desc file>
+.B \-font <path to font.desc file, path to font (FreeType), font pattern (Fontconfig)>
 Search for the OSD/\:SUB fonts in an alternative directory (default for normal
 fonts: ~/\:.mplayer/\:font/\:font.desc, default for FreeType fonts:
 ~/.mplayer/\:subfont.ttf).
 .br
 .I NOTE:
 With FreeType, this option determines the path to the text font file.
-With fontconfig, this option determines the fontconfig font name.
+With Fontconfig, this option determines the Fontconfig font pattern.
 .sp 1
 .I EXAMPLE:
 .PD 0
@@ -2266,6 +2270,8 @@ With fontconfig, this option determines the fontconfig font name.
 \-font ~/\:.mplayer/\:arialuni.ttf
 .br
 \-font 'Bitstream Vera Sans'
+.br
+\-font 'Bitstream Vera Sans:style=Bold'
 .RE
 .PD 1
 .
@@ -2504,8 +2510,8 @@ Currently useless.
 Same as \-audiofile, but for subtitle streams (OggDS?).
 .
 .TP
-.B \-subfont <filename> (FreeType only)
-Sets the subtitle font.
+.B \-subfont <path to font (FreeType), font pattern (Fontconfig)> (FreeType only)
+Sets the subtitle font (see \-font).
 If no \-subfont is given, \-font is used.
 .
 .TP
@@ -3219,7 +3225,7 @@ Use at your own risk!
 Change the range of the pan-and-scan functionality (default: 1).
 Positive values mean multiples of the default range.
 Negative numbers mean you can zoom in up to a factor of \-panscanrange+1.
-E.g. \-panscanrange \-3 allows a zoom factor of up to 4.
+E.g.\& \-panscanrange \-3 allows a zoom factor of up to 4.
 This feature is experimental.
 Do not report bugs unless you are using \-vo gl.
 .
@@ -3446,7 +3452,7 @@ For positive values, apply a sharpening algorithm to the video,
 for negative values a blurring algorithm (default: 0).
 .IPs denoise=<0\-1>
 Apply a noise reduction algorithm to the video (default: 0, no noise reduction).
-.IPs deint=<0\-3>
+.IPs deint=<0\-4>
 Chooses the deinterlacer (default: 0).
 All modes > 0 respect \-field\-dominance.
 .RSss
@@ -3455,16 +3461,21 @@ No deinterlacing.
 .IPs 1
 Show only first field, similar to \-vf field.
 .IPs 2
-Bob deinterlacing (current fallback for advanced deinterlacers).
+Bob deinterlacing, similar to \-vf tfields=1.
 .IPs 3
-Motion adaptive temporal deinterlacing (not yet working).
+Motion adaptive temporal deinterlacing.
+May lead to A/V desync with slow video hardware and/or high resolution.
 This is the default if "D" is used to enable deinterlacing.
 .IPs 4
-Motion adaptive temporal deinterlacing with edge-guided spatial interpolation
-(not yet working).
+Motion adaptive temporal deinterlacing with edge-guided spatial interpolation.
+Needs fast video hardware.
 .RE
+.IPs chroma\-deint
+Makes temporal deinterlacers operate both on luma and chroma (default).
+Use nochroma\-deint to solely use luma and speed up advanced deinterlacing.
+Useful with slow video memory.
 .IPs pullup
-Try to apply inverse telecine, needs temporal deinterlacing.
+Try to apply inverse telecine, needs motion adaptive temporal deinterlacing.
 .RE
 .PD 1 
 .
@@ -3587,6 +3598,23 @@ Try this option if you have display problems.
 .PD 1
 .
 .TP
+.B kva (OS/2 only)
+Video output driver that uses the libkva interface.
+.PD 0
+.RSs
+.IPs snap
+Force SNAP mode.
+.IPs wo
+Force WarpOverlay! mode.
+.IPs dive
+Force DIVE mode.
+.IPs (no)t23
+Enable/disable workaround for T23 laptop (default: \-not23).
+Try to enable this option if your video card supports upscaling only.
+.RE
+.PD 1
+.
+.TP
 .B quartz (Mac OS X only)
 Mac OS X Quartz video output driver.
 Under some circumstances, it might be more efficient to force a
@@ -10026,7 +10054,7 @@ Lower values allow the quantizer value to jump around more,
 higher values force it to vary more smoothly.
 cplx_blur ensures that each I-frame has quality comparable to the following
 P-frames, and ensures that alternating high and low complexity frames
-(e.g. low fps animation) do not waste bits on fluctuating quantizer.
+(e.g.\& low fps animation) do not waste bits on fluctuating quantizer.
 .
 .TP
 .B qblur=<0\-99> (two pass only)
diff --git a/DOCS/man/fr/mplayer.1 b/DOCS/man/fr/mplayer.1
index 3ed5ea9..4c2ce46 100644
--- a/DOCS/man/fr/mplayer.1
+++ b/DOCS/man/fr/mplayer.1
@@ -1,4 +1,4 @@
-.\" synced with r28788
+.\" synced with r28958
 .\" Encoding: iso-8859-1
 .\" MPlayer (C) 2000-2009 MPlayer Team
 .\" The English man page was/is done by Gabucino, Diego Biurrun, Jonas Jermann
@@ -946,7 +946,8 @@ MPlayer utilise cette commande sans aucune sorte de v
 donc de votre responsablité qu'elle ne pose pas de problème de sécurité
 (c-à-d que vous devriez spécifier le chemin absolu, surtout si "." est dans
 le chemin de recherche $PATH, comme c'est le cas sous Windows).
-Cela fonctionne aussi lors de la lecture d'une vidéo (c-à-d. que ça ne fonctionne pas avec \-novideo alors que ça fonctionne avec \-vo null).
+Cela fonctionne aussi lors de la lecture d'une vidéo (c-à-d.\& que ça ne
+fonctionne pas avec \-novideo alors que ça fonctionne avec \-vo null).
 .sp 1
 Ceci peut être "détourné" pour désactiver un économiseur d'écran ne gérant par
 l'API de X prévu à cet effet (voir aussi \-stop\-xscreensaver).
@@ -1009,6 +1010,8 @@ d'une touche
 (0 pour désactiver).
 .IPs ar-rate
 Combien de frappes par seconde pendant la répétition automatique.
+.IPs (no)default-bindings
+Répond aux touches de contrôle par défaut de MPlayer.
 .IPs keylist
 Affiche toutes les touches pouvant être attachées.
 .IPs cmdlist
@@ -1193,6 +1196,9 @@ commandes s
 .I NOTE\ :
 Voir \-input cmdlist pour une liste des commandes esclaves, et
 DOCS/tech/slave.txt pour leur description.
+De plus, cette option n'est pas vouée à désactiver les autres entrées,
+comme via la fenêtre vidéo\ ; pour cela, utilisez d'autres méthodes, comme
+\-input nodefault\-binds:conf=/dev/null.
 .
 .TP
 .B \-softsleep
@@ -2354,14 +2360,14 @@ les sous-titres.
 phrases au lieu de la fin.
 .
 .TP
-.B \-font <chemin vers le fichier font.desc>
+.B \-font <chemin vers le fichier font.desc, la police (FreeType), motif de police (Fontconfig)>
 Recherche les polices OSD/\:SUB dans un répertoire particulier
 (par défaut pour les polices normales: ~/\:.mplayer/\:font/\:font.desc,
 pour les polices FreeType: ~/.mplayer/\:subfont.ttf).
 .br
 .I NOTE:
 Avec FreeType, cette option détermine le chemin vers le fichier de polices.
-Avec Fontconfig, cette option détermine le nom de police fontconfig.
+Avec Fontconfig, cette option détermine le motif de police Fontconfig.
 .sp 1
 .I EXEMPLE:
 .PD 0
@@ -2370,7 +2376,9 @@ Avec Fontconfig, cette option d
 .br
 \-font ~/\:.mplayer/\:arialuni.ttf
 .br
-\-font 'Bitstream Vera Sans'
+\-font 'Bitstream Vera Sans:style'
+.br
+\-font 'Bitstream Vera Sans:style=Bold'
 .RE
 .PD 1
 .
@@ -2615,8 +2623,8 @@ Inutile actuellement.
 Identique à \-audiofile, mais pour les flux de sous-titres (OggDS ?).
 .
 .TP
-.B \-subfont <filename> (FreeType uniquement)
-Spécifie la police des sous-titres.
+.B \-subfont <chemin vers la police (FreeType), motif de police (Fontconfig)> (FreeType uniquement)
+Spécifie la police des sous-titres (voir \-font).
 Si \-subfont n'est pas spécifié, \-font est utilisé.
 .
 .TP
@@ -3637,9 +3645,12 @@ d
 .IPs denoise=<0\-1>
 Applique à la vidéo un filtre de réduction de bruit (par défaut\ : 0, pas de
 réduction de bruit)
-.IPs deint=<0\-3>
+.IPs deint=<0\-4>
 Sélectionne un désentrelaceur (par défaut\ : 0)
 Tous les modes > 0 respectent \-field\-dominance.
+.br
+.I NOTE\ :
+Les valeurs > 2 retardent la sortie vidéo d'une image.
 .RSss
 .IPs 0
 pas de désentrelacement
@@ -3768,6 +3779,24 @@ Essayez cette option si vous avez des probl
 .PD 1
 .
 .TP
+.B kva (OS/2 uniquement)
+Pilote de sortie vidéo utilisant l'interface libkva.
+.PD 0
+.RSs
+.IPs snap
+Force le mode SNAP.
+.IPs wo
+Force le mode WarpOverlay!.
+.IPs dive
+Force le mode DIVE.
+.IPs (no)t23
+Active le contournement pour les bugs de l'ordinateur portable T23.
+Essayez d'activer cette option si votre carte vidéo ne gère que
+l'agrandissement d'image (upscaling).
+.RE
+.PD 1
+.
+.TP
 .B quartz (Mac OS X uniquement)
 Pilote de sortie vidéo Quartz pour Mac OS X.
 Dans certains cas, il est préférable de forcer le format de sortie packed YUV,
@@ -10572,7 +10601,7 @@ Des valeurs plus faibles permettent au quantum de plus changer d'une
 trame à l'autre, des valeurs plus hautes forcent une variation plus douce.
 cplx_blur permet de s'assurer que chaque trame-I ait une qualité comparable
 aux trames-P suivantes, et garantit qu'une alternance de trames à complexité
-forte et faible (par exemple un dessin animé dont la cadence d'animation est
+forte et faible (par ex.\& un dessin animé dont la cadence d'animation est
 faible) ne gâche pas de bits en faisant fluctuer les quantum.
 .
 .TP
diff --git a/DOCS/man/hu/mplayer.1 b/DOCS/man/hu/mplayer.1
index e0af69e..d5a206d 100644
--- a/DOCS/man/hu/mplayer.1
+++ b/DOCS/man/hu/mplayer.1
@@ -1,4 +1,4 @@
-.\" Synced with r28775
+.\" Synced with r28991
 .\" MPlayer (C) 2000-2009 MPlayer Team
 .\" Ezt a man oldalt Gabucino, Diego Biurrun és Jonas Jermann készíti/készítette
 .\" Karbantartó: Gabrov
@@ -33,7 +33,7 @@
 .\" Név
 .\" --------------------------------------------------------------------------
 .
-.TH MPlayer 1 "2009. 03. 01." "MPlayer Project" "A film lejátszó"
+.TH MPlayer 1 "2009. 03. 19." "MPlayer Project" "A film lejátszó"
 .
 .SH NÉV
 mplayer  \- film lejátszó
@@ -161,7 +161,7 @@ Van X11, Xv, DGA, OpenGL, SVGAlib, fbdev, AAlib, libcaca, DirectFB,
 Quartz, Mac OS X CoreVideo támogatás, de használhatod a GGI, SDL (és ennek összes
 vezérlõje), VESA (minden VESA-kompatibilis kártyán, még X11 nélkül is), néhány
 alacsony szintû, kártyaspecifikus vezérlõ (Matroxhoz, 3dfx-hez és ATI-hoz) és
-pár hardveeres MPEG dekódoló lap, mint pl. a Siemens DVB, Hauppauge PVR (IVTV),
+pár hardveeres MPEG dekódoló lap, mint pl.\& a Siemens DVB, Hauppauge PVR (IVTV),
 DXR2 és DXR3/\:Hollywood+ támogatását is. A legtöbbjük tudja a szoftveres és
 harderes nagyítást, így a filmjeidet teljes képernyõs módban élvezheted.
 .PP
@@ -572,7 +572,7 @@ spuaa=20
 .SH "PROFILOK"
 A különbözõ konfigurációjú történõ munka megkönnyítésére profilokat lehet
 definiálni a konfigurációs fájlokban.
-Egy profil a négyzetes zárójelbe tett nevével kezdõdik, pl. '[en-profilom]'.
+Egy profil a négyzetes zárójelbe tett nevével kezdõdik, pl.\& '[en-profilom]'.
 Az összes ezutáni opció a profil része lesz.
 A leírás (melyet a \-profile help mutat) a profile-desc opcióval adható meg.
 A profil befejezéséhez kezdj egy újat vagy használd a 'default' profil nevet
@@ -644,7 +644,7 @@ Ki
 A konzol üzeneteket a megadott kódlapra konvertálja (alapértelmezett: automatikus
 felismerés).
 A szöveg a a configure \-\-charset opciójával megadott kódolású lesz.
-Beállíthatod "noconv"-ra is a konvertálás teljes letiltásához (pl. ha
+Beállíthatod "noconv"-ra is a konvertálás teljes letiltásához (pl.\& ha
 problémáid vannak az iconv-val).
 .br
 .I MEGJEGYZÉS:
@@ -905,6 +905,7 @@ seg
 Az MPlayer ezt a parancsot ellenõrzés nélkül használja, a te felelõsséged,
 hogy ne okozzon biztonsági problémát (pl.\& gyõzõdj meg róla, hogy teljes elérési
 utakat használsz, ha a "." benne van az elérési utadban, mint Windows alatt).
+Csak videó lejátszás közben mûködik (pl.\& a \-novideo kapcsolóval nem, de \-vo null mellett igen).
 .sp 1
 Ezt "ki lehet használni" az olyan képernyõvédõ letiltásához, amely nem
 támogatja ehhez a megfelelõ X API-kat (lásd még \-stop\-xscreensaver).
@@ -957,6 +958,8 @@ Az Apple IR t
 Egy gomb automatikus ismétlése elõtti késleltetés miliszekundumban (0: kikapcsolás).
 .IPs ar-rate
 Billentyû/másodperc érték megadása autorepeat használata esetén.
+.IPs (no)default-bindings
+Az alapértelmezetten MPlayerbe épített billentyû-hozzárendeléseket használja.
 .IPs keylist
 Az összes használható billentyû listájának kiírása.
 .IPs cmdlist
@@ -1049,7 +1052,7 @@ Kikapcsolja az AppleIR t
 Megtiltja az MPlayernek a billentyûzet események olvasását a standard
 input-ról. Hasznos, ha a standard input-ról olvasol be adatot.
 Ez automatikusan engedélyezõdik, ha \- van a parancssorban.
-Vannak esetek, amikor kézzel kell beállítanod, pl. \&
+Vannak esetek, amikor kézzel kell beállítanod, pl.\&
 ha megnyitod a /dev/\:stdin -t (vagy a rendszereden az ennek megfelelõt),
 lejátszási listában használod az stdin-t vagy késõbb akarsz olvastatni
 az stdin-rõl a loadfile vagy loadlist szolga parancsok segítségével.
@@ -1133,6 +1136,8 @@ parancsokat olvas az stdin-r
 .I MEGJEGYZÉS:
 A \-input cmdlist kapcsoló kilistázza a szolga módban használható parancsokat,
 a DOCS/tech/slave.txt fájlban megtalálod a leírásukat.
+Ez nem a többi, pl.\& a videó ablakon keresztül érkezõ input letiltására készült,
+arra használj mást, mint a \-input nodefault\-binds:conf=/dev/null.
 .
 .TP
 .B \-softsleep
@@ -1248,7 +1253,7 @@ A lej
 Ha léptetést kell végezni az aktuális pozícióból a cache méretének
 <százalék>-kal megadott részén belüli pozícióba, az MPlayer
 megvárja, hogy a cache feltöltõdjön addig a pozícióig
-egy folyamban történõ ugrás helyett (alapértelmezett: 50). 
+egy folyamban történõ ugrás helyett (alapértelmezett: 50).
 .
 .TP
 .B \-cdda <opció1:opció2> (csak CDDA)
@@ -1299,7 +1304,7 @@ Lej
 Az MPlayer megmondja a dekódernek hogy annyi csatornán dekódoljon,
 amennyit ez az opció megad.
 Innentõl a dekóderen múlik ennek teljesítése.
-Ez akkor fontos ha AC-3-as hanggal ellátott videót nézel (pl. DVD).
+Ez akkor fontos ha AC-3-as hanggal ellátott videót nézel (pl.\& DVD).
 Ebben alapértelmezésként a liba52 dekódol és lemixeli az audiót a kért
 számú csatornára.
 A kimeneti csatornák dekódolt csatornák számától független, direkt
@@ -1416,7 +1421,7 @@ v
 .TP
 .B \-dvd\-device <eszköz elérési útja> (csak DVD)
 Megadja a DVD eszközt vagy .iso fájlnevet (alapértelmezett: /dev/\:dvd).
-Megadhatsz egy könyvtárat is, ami egy elõzõleg DVD-rõl (pl. vobcopy-val)
+Megadhatsz egy könyvtárat is, ami egy elõzõleg DVD-rõl (pl.\& vobcopy-val)
 lemásolt fájlokat tartalmaz.
 .
 .TP
@@ -1478,7 +1483,7 @@ Az indexet a MEncoderrel lehet maradand
 .br
 .I MEGJEGYZÉS:
 Értelemszerûen ez az opció csak akkor használható ha a média tekerhetõ
-(tehát pl. stdin-nel, pipe-al nem).
+(tehát pl.\& stdin-nel, pipe-al nem).
 .
 .TP
 .B \-fps <lebegõpontos érték>
@@ -1505,7 +1510,7 @@ Hasznos hib
 .br
 .I MEGJEGYZÉS:
 Értelemszerûen ez az opció csak akkor használható ha a média tekerhetõ
-(tehát pl. stdin-nel, pipe-al nem).
+(tehát pl.\& stdin-nel, pipe-al nem).
 .
 .TP
 .B \-noidx
@@ -1636,7 +1641,7 @@ cbr: Konstans BitR
 .REss
 .IPs vpeak=<érték>
 Megadja a videó kódolási bitrátájának csúcsértékét Mbps-ben
-(csak VBR kódolásnál hasznos, alapértelmezett: 9.6). 
+(csak VBR kódolásnál hasznos, alapértelmezett: 9.6).
 .IPs fmt=<érték>
 Kiválasztja a kódoláshoz használt MPEG formátumot:
 .RSss
@@ -2257,14 +2262,14 @@ Akkor haszn
 és nem a végén.
 .
 .TP
-.B \-font <útvonal a font.desc fájlhoz>
+.B \-font <útvonal a font.desc fájlhoz, útvonal a betûtípushoz (FreeType), betûtípus minta (Fontconfig)>
 Az OSD/\:SUB betûtipusok megadott könyvtárban történõ keresése
 (normál fontoknál alapértelmezett:
 ~/\:.mplayer/\:font/\:font.desc, FreeType fontokhoz: ~/.mplayer/\:subfont.ttf).
 .br
 .I MEGJEGYZÉS:
 FreeType-pal ez az opció a szöveges betûtípus fájlok elérési útját határozza meg.
-A fontconfig-gal ez az opció a fontconfig betûtípus nevét határozza meg.
+A fontconfig-gal ez az opció a Fontconfig betûtípus mintáját határozza meg.
 .sp 1
 .I PÉLDA:
 .PD 0
@@ -2274,6 +2279,8 @@ A fontconfig-gal ez az opci
 \-font ~/\:.mplayer/\:arialuni.ttf
 .br
 \-font 'Bitstream Vera Sans'
+.br
+\-font 'Bitstream Vera Sans:style=Bold'
 .RE
 .PD 1
 .
@@ -2513,9 +2520,9 @@ Jelenleg haszontalan.
 Ugyan az, mint az \-audiofile, de felirat folyamokra (OggDS?).
 .
 .TP
-.B \-subfont <fájlnév> (csak FreeType)
-Beállítja a felirat betûtípusát.
-Ha nincs megafva a \-subfont, a \-font lesz használva.
+.B \-subfont <útvonal a betûtípushoz (FreeType), betûtípus minta (Fontconfig)> (csak FreeType)
+Beállítja a felirat betûtípusát (lásd \-font).
+Ha nincs megadva a \-subfont, a \-font lesz használva.
 .
 .TP
 .B \-subfont\-autoscale <0\-3> (csak FreeType)
@@ -2647,13 +2654,13 @@ Az OSS opci
 .B vol, pcm, line.
 Az opciók teljes listájához lásd a SOUND_DEVICE_NAMES-t a
 /usr/\:include/\:linux/\:soundcard.h fájlban.
-ALSA-hoz használhatod a neveket, amiket pl. az \& alsamixer
+ALSA-hoz használhatod a neveket, amiket pl.\& az \& alsamixer
 megjelenít, úgy mint
 .B Master, Line, PCM.
 .br
 .I MEGJEGYZÉS:
 Az ALSA mixer csatorna neveit egy szám követi, amit a <név,szám> formában
-kell megadni, pl.\& ha a csatorna neve 'PCM 1' az alsamixer-ben, 
+kell megadni, pl.\& ha a csatorna neve 'PCM 1' az alsamixer-ben,
 akkor
 .BR PCM,1 .
 .
@@ -3229,7 +3236,7 @@ Csak saj
 Megváltoztatja a pan-and-scan funkcionalítás tartományát (alapértelmezett: 1).
 A pozitív értékek az alapértelmezett tartomány többszörösét jelentik.
 A negatív számok azt jelentik, hogy \-panscanrange+1 faktorig tudsz nagyítani.
-Pl. \-panscanrange \-3 4-es nagyítási faktort enged.
+Pl.\& \-panscanrange \-3 4-es nagyítási faktort enged.
 Ez a képesség még kísérleti.
 Ne jelents hibákat, hacsak nem \-vo gl-t használsz.
 .
@@ -3458,25 +3465,36 @@ Pozit
 negatív értékekkel pedig elmosást (alapértelmezett: 0).
 .IPs denoise=<0\-1>
 Egy zajcsökkentõ algoritmust alkalmaz a videóra (alapértelmezett: 0, nincs zajcsökkentés).
-.IPs deint=<0\-3>
+.IPs deint=<0\-4>
 Kiválasztja a deinterlacer-t (alapértelmezett: 0).
+Minden mód > 0 figyelembe veszi a \-field\-dominance kapcsolót.
+.br
+.I MEGJEGYZÉS:
+A > 2 értékek késleltetik a videó kimenetet egy képkockával.
 .RSss
 .IPs 0
 Nincs deinterlace.
 .IPs 1
-Csak egy mezõt mutat, hasonló a \-vf field kapcsolóhoz.
+Csak az elsõ mezõt mutatja, hasonló a \-vf field kapcsolóhoz.
 .IPs 2
-Bob deinterlace (jelenleg erre lép vissz a fejlettebb deinterlacer-ekrõl).
+Bob deinterlace, hasonló a \-vf tfields=1 kapcsolóhoz.
 .IPs 3
-Mozgás adaptív idõbeli deinterlace (még nem mûködik).
+Mozgás adaptív idõbeli deinterlace.
+A/V deszinkronizációt okozhat lassú videó hardveren és/vagy nagy felbontásnál.
 Ez az alapértelmezett, ha a "D" gombbal engedélyezhetõ a deinterlacing.
 .IPs 4
-Mozgás adaptív idõbeli deinterlace él-vezérelt térbeli interpolációval (még nem mûködik).
-.RE
+Mozgás adaptív idõbeli deinterlace él-vezérelt térbeli interpolációval.
+Gyors videó hardver kell hozzá.
+.RE
+.IPs chroma\-deint
+Az idõbeli deinterlacer-ek mind a fényerõsségen, mint a telítettségen változtatnak (alapértelmezett).
+Használd a nochroma\-deint kapcsolót, ha csak a fényerõsséget akarod változtatni és gyorsítani
+szeretnél a fejlett deinterlacing-en.
+Hasznos lassú videó memóriánál.
 .IPs pullup
 Inverz telecine-t próbál alkalmazni, idõbeli deinterlace kell hozzá.
 .RE
-.PD 1 
+.PD 1
 .
 .TP
 .B xvmc (csak X11 \-vc ffmpeg12mc kapcsolóval)
@@ -3599,10 +3617,27 @@ Pr
 .PD 1
 .
 .TP
+.B kva (csak OS/2)
+Kimeneti videó vezérlõ, ami a libkva interfészt használja.
+.PD 0
+.RSs
+.IPs snap
+Kényszeríti a SNAP módot.
+.IPs wo
+Kényszeríti a WarpOverlay! módot.
+.IPs dive
+Kényszeríti a DIVE módot.
+.IPs (no)t23
+Engedélyezi/letiltja a T23 laptopokra vonatkozó kódot (alapértelmezett: \-not23).
+Próbáld meg engedélyezni ezt az opciót, ha a videó kártyád csak a felméretezést támogatja.
+.RE
+.PD 1
+.
+.TP
 .B quartz (csak Mac OS X)
 Mac OS X Quartz kimeneti videó vezérlõ.
 Bizonyos esetekben hatékonyabb lehet egy csomagolt YUV kimeneti
-formátum kényszerítése, pl. a \& \-vf format=yuy2 kapcsolóval.
+formátum kényszerítése, pl.\& a \& \-vf format=yuy2 kapcsolóval.
 .PD 0
 .RSs
 .IPs device_id=<szám>
@@ -3935,7 +3970,7 @@ Ez a vez
 .RSs
 .IPs <aleszköz>
 Explicit kiválasztja a használni kívánt Blinkenlights aleszköz vezérlõt.
-Valami olyasmi, mint pl. arcade:host=localhost:2323 vagy
+Valami olyasmi, mint pl.\& arcade:host=localhost:2323 vagy
 hdl:file=name1,file=name2.
 Meg kell adnod az aleszközt.
 .RE
@@ -4159,7 +4194,7 @@ Kimeneti vide
 .RSs
 .IPs card=<1\-4>
 Megadja a használandó eszköz számát, ha több, mint egy kimeneti DVB kártya van
-(csak V3 API, mint pl. az 1.x.y sorozatú vezérlõk).
+(csak V3 API, mint pl.\& az 1.x.y sorozatú vezérlõk).
 Ha nincs megadva, az MPlayer megkeresi az elsõ használható kártyát.
 .IPs <fájlnév>
 kimeneti fájl neve (alapértelmezett: ./grab.mpg).
@@ -4635,7 +4670,7 @@ A <kihagy
 .br
 none: Soha ne hagyja ki.
 .br
-default: Hagyja ki, ha a feldolgozási lépés haszontalan (pl. 0 méretû csomag AVI-ban).
+default: Hagyja ki, ha a feldolgozási lépés haszontalan (pl.\& 0 méretû csomag AVI-ban).
 .br
 nonref: Hagyja ki a nem referencia kockákat (pl.\& nem lesz felhasználva
 másik kocka dekódolásánál, a hiba nem tud "tovább épülni").
@@ -4886,7 +4921,7 @@ Kikapcsolja a k
 .TP
 .B "\-zoom\ \ "
 A szoftveres méretezést engedélyezi, ha használható.
-Ez olyan kimeneti vezérlõkkel (mint pl. x11, fbdev) is engedélyezi a méretezést,
+Ez olyan kimeneti vezérlõkkel (mint pl.\& x11, fbdev) is engedélyezi a méretezést,
 melyekben nincs támogatás a hardveres méretezéshez, vagy az MPlayer letiltja a
 méretezést teljesítménybeli indokok miatt.
 .
@@ -5312,7 +5347,7 @@ ha sz
 .
 .TP
 .B surround[=késleltetés]
-Dekódoló mátrix kódolású térhatású hanghoz, mint pl. a Dolby Surround-hoz.
+Dekódoló mátrix kódolású térhatású hanghoz, mint pl.\& a Dolby Surround-hoz.
 Sok két csatornás audióval rendelkezõ fájl tartalmaz mátrixos térhatású
 hangot. Legalább négy csatornát támogató hangkártya kell hozzá.
 .PD 0
@@ -5924,7 +5959,7 @@ A haszn
 .PD 0
 .RSs
 .IPs <fourcc>
-formátum név mint pl. rgb15, bgr24, yv12, stb. (alapértelmezett: yuy2)
+formátum név mint pl.\& rgb15, bgr24, yv12, stb. (alapértelmezett: yuy2)
 .RE
 .PD 1
 .
@@ -5940,7 +5975,7 @@ Az el
 .PD 0
 .RSs
 .IPs <fourcc>
-formátum név, mint pl. rgb15, bgr24, yv12, stb. (alapértelmezett: yv12)
+formátum név, mint pl.\& rgb15, bgr24, yv12, stb. (alapértelmezett: yv12)
 .RE
 .PD 1
 .
@@ -6158,7 +6193,7 @@ Kvant
 kvantálási paraméter (QP) változtató szûrõ
 .RSs
 .IPs <egyenlet>
-valamilyen egyenlet, pl. "2+2*sin(PI*qp)"
+valamilyen egyenlet, pl.\& "2+2*sin(PI*qp)"
 .RE
 .
 .TP
@@ -7946,7 +7981,7 @@ maxim
 .B mblmin=<0.01\-255.0>
 Minimális makroblokk-szintû Lagrange szorzó a ratecontrol-hoz
 (alapértelmezett: 2.0).
-Ez a paraméter az adaptív kvantálási opciókat érinti, mint pl. a
+Ez a paraméter az adaptív kvantálási opciókat érinti, mint pl.\& a
 qprd, lumi_mask, stb..
 .RE
 .
@@ -8187,7 +8222,7 @@ N l
 elvégzi: elõször elolvassa a statisztika fájlt, majd felülírja.
 Ajánlott a divx2pass.log elmentése, mielõtt ezt megtennéd, ha esély van rá,
 hogy meg kell szakítanod a MEncoder-t.
-Használhatod mindegyik kódolási opciót, kivéve a nagyon CPU-igényeseket, pl. "qns".
+Használhatod mindegyik kódolási opciót, kivéve a nagyon CPU-igényeseket, pl.\& "qns".
 .br
 Ezt a lépést újra és újra lefuttathatod a kódolás finomítása érdekében.
 Minden következõ lépés felhasználja az elõzõ lépés statisztikáit a továbblépéshez.
@@ -9121,7 +9156,7 @@ Zajcs
 0\-600 a hasznos tartomány egy átlagos tartalom esetén, de lehet, hogy kicsit feljebb
 kell vinned, ha nagyon zajos az anyagod (alapértelmezett: 0).
 Mivel kicsi hatása van a sebességre, inkább ezt ajánlott használni, mint a
-zajszûrést a videó szûrõknél, pl. denoise3d vagy hqdn3d-vel.
+zajszûrést a videó szûrõknél, pl.\& denoise3d vagy hqdn3d-vel.
 .
 .TP
 .B qns=<0\-3>
@@ -9546,7 +9581,7 @@ utols
 .TP
 .B (no)packed
 Ez az opció a kocka-sorrendbeli gondokat oldja meg konténer formátumokba,
-pl. AVI-ba történõ kódoláskor, ami nem tud megbírkózni a nem sorrendben
+pl.\& AVI-ba történõ kódoláskor, ami nem tud megbírkózni a nem sorrendben
 lévõ kockákkal. A gyakorlatban a legtöbb dekódoló (mind szoftveres, mind
 hardveres) saját maga is tudja kezelni a kocka-sorrendet és összezavarodhat,
 ha ez az opció be van kapcsolva, így nyugodtan kikapcsolva hagyhatod,
@@ -9584,7 +9619,7 @@ Az igazi CBR-t nagyon neh
 A videó anyagtól függõen a bitráta változhat és ezt nehéz elõre megjósolni.
 Ezért az Xvid egy átlagoló periódust használ, ami alatt garantálja a megadott
 bitmennyiséget (minusz egy kis variáció).
-Ez a beállítás megadja a "kockák számát", amikre vonatkoztatva az Xvid 
+Ez a beállítás megadja a "kockák számát", amikre vonatkoztatva az Xvid
 átlagol és megpróbálja elérni a CBR-t.
 .
 .TP
@@ -10046,7 +10081,7 @@ Az alacsonyabb 
 a magasabb értékek finomabb váltásokra kényszerítik.
 A cplx_blur biztosítja, hogy minden I-kocka minõsége összehasonlítható
 az õt követõ P-kockával és hogy a váltakozó nagy és kicsi komplexitású
-kockák (pl. alacsony fps-û animáció) nem vesztegetnek biteket egy
+kockák (pl.\& alacsony fps-û animáció) nem vesztegetnek biteket egy
 ingadozó kvantálóval.
 .
 .TP
@@ -10282,7 +10317,7 @@ Ink
 .B (no)fast_pskip
 A P-kockák korai skip detektálásának végrehajtása (alapértelmezett: bekapcsolva).
 Ez általában javítja a sebességet, de néha a kevésbé részletes
-területeken (pl. ég) mellékhatásokat okoz.
+területeken (pl.\& ég) mellékhatásokat okoz.
 .
 .TP
 .B (no)dct_decimate
@@ -10299,7 +10334,7 @@ Zajcs
 100\-1000 a használandó tartomány egy átlagos tartalomnál, de a nagyon zajos
 tartalomnál kicsit felnyomhatod (alapértelmezett: 0).
 Tekintve, hogy kicsi a befolyása a sebességre, inkább ez a preferálandó a
-zajcsökkentésnél a videó szûrõkkel, mint pl. a denoise3d-vel vagy hqdn3d-vel
+zajcsökkentésnél a videó szûrõkkel, mint pl.\& a denoise3d-vel vagy hqdn3d-vel
 történõ zajcsökkentés helyett.
 .
 .TP
@@ -10401,7 +10436,7 @@ a sz
 .B (no)global_header
 Az SPS és a PPS csak egyszer fog megjelenni, a bitfolyam elején
 (alapértelmezett: letiltva).
-Néhány lejátszó, mint pl. a Sony PSP, igényli ezt az opciót.
+Néhány lejátszó, mint pl.\& a Sony PSP, igényli ezt az opciót.
 Alapértelmezésként az SPS és a PPS minden IDR kocka elõtt ismétlõdik.
 .
 .TP
@@ -10482,7 +10517,7 @@ A bin
 .
 .TP
 .B compdata=<fájl>
-A codec beállításokat tartalmazó fájl neve (pl. firstpass.mcf), melyet a vfw2menc készített.
+A codec beállításokat tartalmazó fájl neve (pl.\& firstpass.mcf), melyet a vfw2menc készített.
 .
 .
 .SS MPEG muxer (\-mpegopts)
@@ -11163,7 +11198,7 @@ you can directly play it via cdda:// without setting format, hwac3 or hwdts.
 mplayer \-rawaudio format=0xff \-demuxer rawaudio \-af pan=2:.32:.32:.39:.06:.06:.39:.17:-.17:-.17:.17:.33:.33 adts_he-aac160_51.aac
 .fi
 .br
-Egy kicsit játszadoznod kell a pan értékekkel (pl. felszorozni az értékeket) a
+Egy kicsit játszadoznod kell a pan értékekkel (pl.\& felszorozni az értékeket) a
 hangerõ növeléséhez vagy a kattogás elkerüléséhez.
 .
 .PP
diff --git a/DOCS/man/ru/mplayer.1 b/DOCS/man/ru/mplayer.1
index 0f56c6d..d719820 100644
--- a/DOCS/man/ru/mplayer.1
+++ b/DOCS/man/ru/mplayer.1
@@ -2,7 +2,7 @@
 .\" This man page was/is done by Gabucino, Diego Biurrun, Jonas Jermann
 .\" Translated by Vladimir Voroshilov <voroshil at gmail.com>
 .\" Encoding: koi8-r
-.\" synced with r28788
+.\" synced with r28991
 .
 .\" --------------------------------------------------------------------------
 .\" ïÐÒÅÄÅÌÅÎÉÑ ÍÁËÒÏÓÏ×
@@ -863,7 +863,7 @@ MPlayer 
 ÂÅÚÏÐÁÓÎÏÓÔÉ ÌÅÖÉÔ ÐÏÄ ÷ÁÛÅÊ ÏÔ×ÅÔÓÔ×ÅÎÎÏÓÔØÀ (× ÞÁÓÔÎÏÓÔÉ, ÕÂÅÄÉÔÅÓØ,
 ÞÔÏ ÉÓÐÏÌØÚÕÀÔÓÑ ÐÏÌÎÙÅ ÐÕÔÉ, ÅÓÌÉ "." ÐÒÉÓÕÔÓÔ×ÕÅÔ × ×ÁÛÅÍ ÐÕÔÉ,
 ÎÁÐÒÉÍÅÒ, ËÁË × Windows).
-ëÏÍÁÎÄÁ ÒÁÂÏÔÁÅÔ ÔÏÌØËÏ ÐÒÉ ×ÏÓÐÒÏÉÚ×ÅÄÅÎÉÉ ×ÉÄÅÏ (Ô.Å. ÒÁÂÏÔÁÅÔ Ó
+ëÏÍÁÎÄÁ ÒÁÂÏÔÁÅÔ ÔÏÌØËÏ ÐÒÉ ×ÏÓÐÒÏÉÚ×ÅÄÅÎÉÉ ×ÉÄÅÏ (Ô.Å.\& ÒÁÂÏÔÁÅÔ Ó
 \-vo null, ÎÏ ÎÅ Ó \-novideo).
 .sp 1
 å£ ÍÏÖÎÏ ÐÒÉÍÅÎÑÔØ ÄÌÑ "ÎÅÐÒÁ×ÉÌØÎÏÇÏ" ÏÔËÌÀÞÅÎÉÑ ÈÒÁÎÉÔÅÌÅÊ
@@ -922,6 +922,8 @@ mplayer \-heartbeat\-cmd "gnome\-screensaver\-command \-p" file
 úÁÄÅÒÖËÁ × ÍÉÌÌÉÓÅËÕÎÄÁÈ ÐÅÒÅÄ ÎÁÞÁÌÏÍ Á×ÔÏÐÏ×ÔÏÒÁ (0 ÄÌÑ ÏÔËÌÀÞÅÎÉÑ).
 .IPs ar\-rate
 ëÏÌÉÞÅÓÔ×Ï ËÌÁ×ÉÛ × ÓÅËÕÎÄÕ, ÇÅÎÅÒÉÒÕÅÍÙÈ ÐÒÉ Á×ÔÏÐÏ×ÔÏÒÅ.
+.IPs (no)default-bindings
+éÓÐÏÌØÚÏ×ÁÔØ ÐÒÉ×ÑÚËÉ ËÌÁ×ÉÛ, ÐÏÓÔÁ×ÌÑÅÍÙÅ Ó MPlayer ÐÏ ÕÍÏÌÞÁÎÉÀ.
 .IPs keylist
 ÷Ù×ÏÄÉÔ ×ÓÅ ËÌÁ×ÉÛÉ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ÎÁÚÎÁÞÉÔØ ËÏÍÁÎÄÁÍ.
 .IPs cmdlist
@@ -1085,17 +1087,18 @@ FIXME: 
 .
 .TP
 .B \-slave (ÓÍÏÔÒÉÔÅ ÔÁËÖÅ \-input)
-÷ËÌÀÞÁÅÔ "ÒÁÂÓËÉÊ" ÒÅÖÉÍ, × ËÏÔÏÒÏÍ MPlayer ÒÁÂÏÔÁÅÔ × ËÁÞÅÓÔ×Å ÂÜËÜÎÄÁ Ë ÄÒÕÇÉÍ ÐÒÏÇÒÁÍÍÁÍ.
+÷ËÌÀÞÁÅÔ ×ÅÄÏÍÙÊ ÒÅÖÉÍ, × ËÏÔÏÒÏÍ MPlayer ÒÁÂÏÔÁÅÔ × ËÁÞÅÓÔ×Å ÂÜËÜÎÄÁ Ë ÄÒÕÇÉÍ ÐÒÏÇÒÁÍÍÁÍ.
 ÷ÍÅÓÔÏ ÐÅÒÅÈ×ÁÔÁ ÓÏÂÙÔÉÊ ËÌÁ×ÉÁÔÕÒÙ, MPlayer ÂÕÄÅÔ ÞÉÔÁÔØ ÓÏ ÓÔÁÎÄÁÒÔÎÏÇÏ ×ÈÏÄÁ ËÏÍÁÎÄÙ,
 ÒÁÚÄÅÌÅÎÎÙÅ ÓÉÍ×ÏÌÏÍ ÎÏ×ÏÊ ÓÔÒÏËÉ (\\n).
 .br
 .I úáíåþáîéå:
 óÍÏÔÒÉÔÅ ÓÐÉÓÏË ÜÔÉÈ ËÏÍÁÎÄ × \-input cmdlist É ÏÐÉÓÁÎÉÑ × DOCS/tech/slave.txt.
+üÔÁ ÏÐÃÉÑ ÎÅ ÐÒÅÄÎÁÚÎÁÞÅÎÁ ÄÌÑ ÏÔËÌÀÞÅÎÉÑ ÄÒÕÇÉÈ ÉÓÔÏÞÎÉËÏ× ××ÏÄÁ,
+ÎÁÐÒÉÍÅÒ ÐÒÉ ÐÏÍÏÝÉ ÏËÎÁ ×ÉÄÅÏ; ÄÌÑ ÄÁÎÎÙÈ ÃÅÌÅÊ ÉÓÐÏÌØÚÕÊÔÅ ÉÎÙÅ
+ÓÐÏÓÏÂÙ, ÎÁÐÒÉÍÅÒ, \-input nodefault\-binds:conf=/dev/null.
 .
 .TP
 .B \-softsleep
-.\" FIXME is translation correct?
-.\" Time frames by repeatedly checking the current time instead of asking the
 õÓÔÁÎÁ×ÌÉ×ÁÅÔ ÔÁÊÍÉÎÇ ËÁÄÒÏ×, ÐÏÓÔÏÑÎÎÏ ÐÒÏ×ÅÒÑÑ ÔÅËÕÝÅÅ ×ÒÅÍÑ, ×ÍÅÓÔÏ ÐÒÏÓØÂÙ
 ÑÄÒÕ ÐÒÏÂÕÖÄÁÔØ MPlayer × ÎÕÖÎÙÊ ÍÏÍÅÎÔ.
 ðÏÌÅÚÎÏ, ÅÓÌÉ ÔÁÊÍÅÒ ×ÁÛÅÇÏ ÑÄÒÁ ÎÅÔÏÞÅÎ É ×Ù ÎÅ ÍÏÖÅÔÅ ÉÓÐÏÌØÚÏ×ÁÔØ RTC.
@@ -2217,14 +2220,14 @@ SubViewer (SRT).
 ×ÍÅÓÔÏ ÉÈ ËÏÎÃÁ.
 .
 .TP
-.B \-font <ÐÕÔØ Ë ÆÁÊÌÕ font.desc>
+.B \-font <ÐÕÔØ Ë ÆÁÊÌÕ font.desc, ÐÕÔØ Ë ÛÒÉÆÔÕ (FreeType), ÎÁÚ×ÁÎÉÅ ÛÒÉÆÔÁ (Fontconfig))>
 éÝÅÔ OSD/\:SUB ÛÒÉÆÔÙ × ÄÒÕÇÏÍ ËÁÔÁÌÏÇÅ (ÐÏ ÕÍÏÌÞÁÎÉÀ ÄÌÑ ÏÂÙÞÎÙÈ
 ÛÒÉÆÔÏ×: ~/\:.mplayer/\:font/\:font.desc, ÐÏ ÕÍÏÌÞÁÎÉÀ ÄÌÑ FreeType ÛÒÉÆÔÏ×:
 ~/.mplayer/\:subfont.ttf).
 .br
 .I úáíåþáîéå:
 ó FreeType, ÜÔÁ ÏÐÃÉÑ ÏÐÒÅÄÅÌÑÅÔ ÐÕÔØ Ë ÆÁÊÌÕ ÛÒÉÆÔÁ ÔÅËÓÔÁ.
-ó fontconfig, ÜÔÁ ÏÐÃÉÑ ÏÐÒÅÄÅÌÑÅÔ ÎÁÚ×ÁÎÉÅ ÛÒÉÆÔÁ fontconfig.
+ó Fontconfig, ÜÔÁ ÏÐÃÉÑ ÏÐÒÅÄÅÌÑÅÔ ÎÁÚ×ÁÎÉÅ ÛÒÉÆÔÁ fontconfig.
 .sp 1
 .I ðòéíåò:
 .PD 0
@@ -2234,6 +2237,8 @@ SubViewer (SRT).
 \-font ~/\:.mplayer/\:arialuni.ttf
 .br
 \-font 'Bitstream Vera Sans'
+.br
+\-font 'Bitstream Vera Sans:style=Bold'
 .RE
 .PD 1
 .
@@ -2475,8 +2480,8 @@ cp1250, 
 ôÏ ÖÅ, ÞÔÏ É \-audiofile, ÎÏ ÄÌÑ ÐÏÔÏËÁ ÓÕÂÔÉÔÒÏ× (OggDS?).
 .
 .TP
-.B \-subfont <ÉÍÑ ÆÁÊÌÁ> (ÔÏÌØËÏ FreeType)
-õÓÔÁÎÁ×ÌÉ×ÁÅÔ ÛÒÉÆÔ ÓÕÂÔÉÔÒÏ×.
+.B \-subfont <ÉÍÑ ÆÁÊÌÁ (FreeType), ÎÁÚ×ÁÎÉÅ ÛÒÉÆÔÁ (Fontconfig)> (ÔÏÌØËÏ FreeType)
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ÛÒÉÆÔ ÓÕÂÔÉÔÒÏ× (ÓÍ. \-font).
 åÓÌÉ ÏÐÃÉÑ \-subfont ÎÅ ÕËÁÚÁÎÁ, ÉÓÐÏÌØÚÕÅÔÓÑ \-font.
 .
 .TP
@@ -3427,25 +3432,35 @@ XResetScreenSaver API, 
 .IPs denoise=<0\-1>
 ðÒÉÍÅÎÑÅÔ Ë ×ÉÄÅÏ ÁÌÇÏÒÉÔÍ ÕÍÅÎØÛÅÎÉÀ ÛÕÍÁ (ÐÏ ÕÍÏÌÞÁÎÉÀ: 0, ÎÅÔ
 ÕÍÅÎØÛÅÎÉÑ ÛÕÍÁ).
-.IPs deint=<0\-3>
+.IPs deint=<0\-4>
 ÷ÙÂÉÒÁÅÔ ÄÅÉÎÔÅÒÌÅÊÓÅÒ (ÐÏ ÕÍÏÌÞÁÎÉÀ: 0).
 ÷ÓÅ ÒÅÖÉÍÙ > 0 ÕÞÉÔÙ×ÁÀÔ \-field\-dominance.
+.br
+.I úáíåþáîéå:
+úÎÁÞÅÎÉÑ > 2 ÚÁÄÅÒÖÉ×ÁÀÔ ×Ù×ÏÄ ×ÉÄÅÏ ÎÁ ÏÄÉÎ ËÁÄÒ.
 .RSss
 .IPs 0
 îÅÔ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇÁ.
 .IPs 1
 ïÔÏÂÒÁÖÁÅÔ ÔÏÌØËÏ ÐÅÒ×ÏÅ ÐÏÌÅ, ÁÎÁÌÏÇÉÞÎÏ \-vf field.
 .IPs 2
-Bob ÄÅÉÎÔÅÒÌÅÊÓÉÎÇ (ÔÅËÕÝÉÊ ÚÁÐÁÓÎÏÊ ×ÁÒÉÁÎÔ ÄÌÑ ÐÅÒÅÄÏ×ÙÈ
-ÄÅÉÎÔÅÒÌÅÊÓÅÒÏ×).
+Bob ÄÅÉÎÔÅÒÌÅÊÓÉÎÇ, ÁÎÁÌÏÇÉÞÎÏ \-vf tfields=1.
 .IPs 3
-áÄÁÐÔÉ×ÎÙÊ ÐÏ Ä×ÉÖÅÎÉÀ ×ÒÅÍÅÎÎÏÊ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇ (ÅÝ£ ÎÅ ÒÁÂÏÔÁÅÔ).
+áÄÁÐÔÉ×ÎÙÊ ÐÏ Ä×ÉÖÅÎÉÀ ×ÒÅÍÅÎÎÏÊ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇ.
+íÏÖÅÔ ÐÒÉ×ÅÓÔÉ Ë ÄÅÓÉÎÈÒÏÎÉÚÁÃÉÉ ÁÕÄÉÏ É ×ÉÄÅÏ ÎÁ ÓÌÁÂÏÊ ×ÉÄÅÏ
+ËÁÒÔÅ É/ÉÌÉ ×ÙÓÏËÏÍ ÒÁÚÒÅÛÅÎÉÉ.
 üÔÏ ÚÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÅÓÌÉ ËÌÁ×ÉÛÁ "D" ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ
 ×ËÌÀÞÅÎÉÑ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇÁ.
 .IPs 4
 áÄÁÐÔÉ×ÎÙÊ ÐÏ Ä×ÉÖÅÎÉÀ ×ÒÅÍÅÎÎÏÊ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇ Ó ÕÐÒÁ×ÌÑÅÍÏÊ ÐÏ
-ËÒÁÑÍ ÐÒÏÓÔÒÁÎÓÔ×ÅÎÎÏÊ ÉÎÔÅÒÐÏÌÑÃÉÅÊ (ÅÝ£ ÎÅ ÒÁÂÏÔÁÅÔ).
-.RE
+ËÒÁÑÍ ÐÒÏÓÔÒÁÎÓÔ×ÅÎÎÏÊ ÉÎÔÅÒÐÏÌÑÃÉÅÊ. ôÒÅÂÕÅÔ ÂÙÓÔÒÏÊ ×ÉÄÅÏ ËÁÒÔÙ.
+.RE
+.IPs chroma\-deint
+ðÏÚ×ÏÌÑÅÔ ×ÒÅÍÅÎÎÙÍ ÄÅÉÎÔÅÒÌÅÊÓÅÒÁÍ ÏÐÅÒÉÒÏ×ÁÔØ ËÁË ÑÒËÏÓÔÎÏÊ, ÔÁË
+É Ã×ÅÔÎÏÓÔÎÏÊ ËÏÍÐÏÎÅÎÔÁÍÉ (ÐÏ ÕÍÏÌÞÁÎÉÀ).
+éÓÐÏÌØÚÕÊÔÅ nochroma\-deint ÄÌÑ ÏÐÅÒÉÒÏ×ÁÎÉÑ ÔÏÌØËÏ Ã×ÅÔÎÏÓÔÎÏÊ
+ËÏÍÐÏÎÅÎÔÏÊ É ÕÓËÏÒÅÎÉÑ ÕÓÏ×ÅÒÛÅÎÓÔ×Ï×ÁÎÎÏÇÏ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇÁ.
+ðÏÌÅÚÎÏ Ó ÍÅÄÌÅÎÎÏÊ ×ÉÄÅÏ ÐÁÍÑÔØÀ.
 .IPs pullup
 ðÒÏÂÕÅÔ ÐÒÉÍÅÎÉÔØ ÏÂÒÁÔÎÙÊ ÔÅÌÅÓÉÎ, ÎÕÖÄÁÅÔÓÑ ×Ï ×ÒÅÍÅÎÎÏÍ
 ÄÅÉÎÔÅÒÌÅÊÓÉÎÇÅ.
@@ -3578,6 +3593,24 @@ Windows 
 .PD 1
 .
 .TP
+.B kva (ÔÏÌØËÏ OS/2)
+äÒÁÊ×ÅÒ ×Ù×ÏÄÁ ×ÉÄÅÏ, ÉÓÐÏÌØÚÕÀÝÉÊ ÉÎÔÅÒÆÅÊÓ libkva.
+.PD 0
+.RSs
+.IPs snap
+æÏÒÓÉÒÕÅÔ ÒÅÖÉÍ SNAP.
+.IPs wo
+æÏÒÓÉÒÕÅÔ ÒÅÖÉÍ WarpOverlay!.
+.IPs dive
+æÏÒÓÉÒÕÅÔ ÒÅÖÉÍ DIVE.
+.IPs (no)t23
+÷ËÌÀÞÁÅÔ/×ÙËÌÀÞÁÅÔ ÏÂÈÏÄÎÏÅ ÒÅÛÅÎÉÅ ÄÌÑ ÎÏÕÔÂÕËÁ T23 (ÐÏ ÕÍÏÌÞÁÎÉÀ: \-not23).
+ðÏÐÒÏÂÕÊÔÅ ×ËÌÀÞÉÔØ ÄÁÎÎÕÀ ÏÐÃÉÀ, ÅÓÌÉ ÷ÁÛÁ ×ÉÄÅÏËÁÒÔÁ ÐÏÄÄÅÒÖÉ×ÁÅÔ
+ÔÏÌØËÏ ÒÁÓÔÑÖÅÎÉÅ.
+.RE
+.PD 1
+.
+.TP
 .B quartz (ÔÏÌØËÏ Mac OS X)
 äÒÁÊ×ÅÒ ×Ù×ÏÄÁ ×ÉÄÅÏ Mac OS X Quartz.
 ÷ ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁÑÈ, ÆÏÒÓÉÒÏ×ÁÎÉÅ ÐÁËÏ×ÁÎÎÏÇÏ ×ÙÈÏÄÎÏÇÏ ÆÏÒÍÁÔÁ YUV Ó,
@@ -4001,7 +4034,7 @@ MPEG 
 OSD (ÐÏ ÕÍÏÌÞÁÎÉÀ: ÏÔËÌÀÞÅÎÏ).
 .IPs (no)crtc2
 ÷ËÌÀÞÁÅÔ TV\-×ÙÈÏÄ ÎÁ ×ÔÏÒÏÊ "ÇÏÌÏ×Å" (ÐÏ ÕÍÏÌÞÁÎÉÀ: ×ËÌÀÞÅÎÏ).
-ëÁÞÅÓÔ×Ï ×Ù×ÏÄÁ ÕÄÉ×ÉÔÅÌØÎÏÅ, Ô.Ë. ÜÔÏ ÐÏÌÎÏÓÔØÀ ÞÅÒÅÓÓÔÒÏÞÎÏÅ
+ëÁÞÅÓÔ×Ï ×Ù×ÏÄÁ ÕÄÉ×ÉÔÅÌØÎÏÅ, Ô.Ë.\& ÜÔÏ ÐÏÌÎÏÓÔØÀ ÞÅÒÅÓÓÔÒÏÞÎÏÅ
 ÉÚÏÂÒÁÖÅÎÉÅ Ó ÐÒÁ×ÉÌØÎÏÊ ÓÉÎÈÒÏÎÉÚÁÃÉÅÊ ËÁÖÄÏÇÏ ÞÅÔÎÏÇÏ/\:ÎÅÞÅÔÎÏÇÏ ÐÏÌÑ.
 .IPs tvnorm=pal|ntsc|auto
 õÓÔÁÎÏ×ÉÔ TV ÓÔÁÎÄÁÒÔ Matrox ËÁÒÔÙ ÂÅÚ ÎÅÏÂÈÏÄÉÍÏÓÔÉ
@@ -4222,7 +4255,7 @@ iTVC16),  (Hauppauge WinTV PVR\-150/250/350/500).
 .sp 1
 .I úáíåþáîéå:
 åÓÌÉ ×Ù ÎÅ ÕËÁÚÙ×ÁÅÔÅ ÎÉËÁËÉÈ ÏÐÃÉÊ, ÔÏ ×Ù×ÏÄ ÂÕÄÅÔ ÐÒÏÇÒÅÓÓÉ×ÎÙÍ
-(Ô.Å. ÎÅÞÅÒÅÓÓÔÒÏÞÎÙÍ).
+(Ô.Å.\& ÎÅÞÅÒÅÓÓÔÒÏÞÎÙÍ).
 .RE
 .
 .TP
@@ -6011,7 +6044,7 @@ spal:    768x576 (PAL 
 ðÏÄÆÉÌØÔÒÙ ÄÏÌÖÎÙ ÂÙÔØ ÏÔÄÅÌÅÎÙ '/', É ÍÏÇÕÔ ÂÙÔØ ÏÔËÌÀÞÅÎÙ ÕËÁÚÁÎÉÅÍ
 ÐÅÒÅÄ ÎÉÍÉ '\-'.
 ëÁÖÄÙÊ ÐÏÄÆÉÌØÔÒ É ÎÅËÏÔÏÒÙÅ ÏÐÃÉÉ ÉÍÅÀÔ ËÁË ËÏÒÏÔËÏÅ, ÔÁË É ÄÌÉÎÎÏÅ
-ÎÁÚ×ÁÎÉÅ, ËÏÔÏÒÙÅ ÐÏÌÎÏÓÔØÀ ×ÚÁÉÍÏÚÁÍÅÎÑÅÍÙ, Ô.Å. dr/dering \- ÜÔÏ
+ÎÁÚ×ÁÎÉÅ, ËÏÔÏÒÙÅ ÐÏÌÎÏÓÔØÀ ×ÚÁÉÍÏÚÁÍÅÎÑÅÍÙ, Ô.Å.\& dr/dering \- ÜÔÏ
 ÏÄÎÏ É ÔÏ ÖÅ.
 .\" FIXME is translation correct? scope = ÇÒÁÎÉÃÙ ÄÅÊÓÔ×ÉÑ
 ÷ÓÅ ÐÏÄÆÉÌØÔÒÙ ÉÍÅÀÔ ÏÂÝÉÅ ÏÐÃÉÉ, ÏÐÒÅÄÅÌÑÀÝÉÅ ÇÒÁÎÉÃÙ ÄÅÊÓÔ×ÉÑ:
diff --git a/DOCS/man/zh_CN/mplayer.1 b/DOCS/man/zh_CN/mplayer.1
index faea37c..fdebb45 100644
--- a/DOCS/man/zh_CN/mplayer.1
+++ b/DOCS/man/zh_CN/mplayer.1
@@ -1,4 +1,4 @@
-.\" sync with en/mplayer.1 r28745
+.\" sync with en/mplayer.1 r28991
 .\" Encoding: UTF-8
 .\" Reminder of hard terms which need better/final solution later: 
 .\"   /capture; playtree in parent list; colorkey; retrace; desync; downmix;
@@ -862,6 +862,7 @@ xv, xvidix 和 dfbmga。
 .I 注意:
 MPlayer 执行此命令时不加以检查,所以你有责任确保该命令不造成任何安全问题(例
 如,如果“.”就像在 Windows 中那样是在你的路径中,则确保使用完整路径)。
+并且该选项只有在播放视频时有效(即没有使用 \-novideo,但可以使用 \-vo null)。
 .sp 1
 该选项可能被“误用”以禁用不提供对于适当的 X API 接口的支持的屏幕保护程序。
 如果你觉得这太复杂了,请要求屏幕保护程序的作者提供对于适当的 X API 的支持。
@@ -910,6 +911,8 @@ mplayer \-heartbeat\-cmd "gnome\-screensaver\-command \-p" file
 在开始自动重复一个键之前等待多少毫秒 (0 代表停用)。
 .IPs ar-rate
 自动重复数是每秒重复多少次按键。
+.IPs (no)default-bindings
+默认情况下使用 MPlayer 自带的键位设置。
 .IPs keylist
 列出所有可以被绑定于命令的键。
 .IPs cmdlist
@@ -1074,6 +1077,8 @@ MPlayer 从标准输入读取以新行 (\\n) 分隔开的命令行,
 .br
 .I 注意:
 请参见 \-input cmdlist 的命令列表和 DOCS/tech/slave.txt 中的描述。
+另外,该选项并非用来禁用其它的输入,例如通过视频窗口。要使用其它方法实现那种效果,例如 
+\-input nodefault\-binds:conf=/dev/null。
 .
 .TP
 .B \-softsleep
@@ -2096,14 +2101,14 @@ SSA/ASS 提供器能在那里放置字幕 (与 \-ass\-use\-margins 组合用)。
 如果字幕中的逗号显示在句首而不是在句尾, 就使用它。
 .
 .TP
-.B \-font <文件 font.desc 的路径> 
+.B \-font <文件 font.desc 的路径,字体(FreeType)的路径,字体样式(Fontconfig)的路径> 
 在别的目录中寻找 OSD/\:SUB 字体(
 默认的普通字体为: ~/\:.mplayer/\:font/\:font.desc, 
 默认的 FreeType 字体为: ~/.mplayer/\:subfont.ttf)。
 .br
 .I 注意:
 对于 FreeType, 此选项决定文本字体文件的路径。
-对于 fontconfig, 此选项决定 fontconfig 的字体名称。
+对于 Fontconfig, 此选项决定 Fontconfig 的字体名称。
 .sp 1
 .I 示例:
 .PD 0
@@ -2113,6 +2118,8 @@ SSA/ASS 提供器能在那里放置字幕 (与 \-ass\-use\-margins 组合用)。
 \-font ~/\:.mplayer/\:arialuni.ttf
 .br
 \-font 'Bitstream Vera Sans'
+.br
+\-font 'Bitstream Vera Sans:style=Bold'
 .RE
 .PD 1
 .
@@ -2333,9 +2340,9 @@ CC 字幕到目前为止还没有在其它地区码的 DVD 中发现。
 与 \-audiofile 一样, 但用于字幕流(OggDS?)。
 .
 .TP
-.B \-subfont <文件名>(仅用于FreeType字体)
-设置字幕字体。
-如果没有给出\-subfont,则使用\-font。
+.B \-subfont <字体(FreeType)的路径,字体样式(Fontconfig)的路径>(仅用于 FreeType 字体)
+设置字幕字体(参见 \-font)。
+如果没有给出 \-subfont,则使用 \-font。
 .
 .TP
 .B \-subfont\-autoscale <0\-3> (仅用于 FreeType)
@@ -2647,6 +2654,18 @@ DirectX DirectSound 音频输出驱动
 .PD 1
 .
 .TP
+.B dart(仅适用于 OS/2)
+OS/2 DART 音频输出驱动
+.PD 0
+.RSs
+.IPs (no)share
+以共享或独占模式打开 DART 输出。
+.IPs bufsize=<大小>
+将缓冲大小设为<大小>,单位为采样数(默认值:2048)。
+.RE
+.PD 1
+.
+.TP
 .B dxr2 (也请参见 \-dxr2) (仅用于 DXR2)
 Creative DXR2 专用的输出驱动
 .
@@ -3211,22 +3230,31 @@ Supported by the gl, gl2, x11, and xv video output drivers.
 使用负数值时,则应用模糊算法(默认值:0)。
 .IPs denoise=<0\-1>
 将一种消除噪点的算法应用于视频画面(默认值:0,不消除噪点)。
-.IPs deint=<0\-3>
+.IPs deint=<0\-4>
 选择反隔行扫描模式的算法(默认值:0)。
+所有大于 0 的模式服从 \-field\-dominance 选项的设置。
+.br
+.I 注意:
+大于 2 的值将使视频输出延后一帧。
 .RSss
 .IPs 0
 不反隔行扫描。
 .IPs 1
-只显示一个隔行扫描域,与 \-vf field 作用相类似。
+只显示第一个隔行扫描域,与 \-vf field 作用相类似。
 .IPs 2
-跳跃式反隔行扫描(当前高级反隔行扫描算法的退化形式)。
+跳跃式反隔行扫描,与 \-vf tfields=1 作用相类似。
 .IPs 3
-适应运动画面的瞬间反隔行扫描(还未实现)。
+适应运动画面的瞬间反隔行扫描。
+可能在低性能视频硬件和/或高分辨率的情况下导致音视频不同步。
 这是当“D”用于开启反隔行扫描时的默认值。
 .IPs 4
-采用边缘导向空间插值算法的适应运动画面的瞬间反隔行扫描
-(还未实现)。
+采用边缘导向空间插值算法的适应运动画面的瞬间反隔行扫描。
+需要高性能的视频硬件。
 .RE
+.IPs chroma\-deint
+使瞬间反隔行扫描算法同时作用于亮度和色度通道上(默认值)。
+使用 nochroma\-deint 以使其仅作用于亮度通道,从而加速高级反隔行扫描算法。
+对于低速显存很有用。
 .IPs pullup
 尝试应用反电视电影模式,需要瞬间反隔行扫描。
 .RE
@@ -3341,6 +3369,23 @@ VIDIX 的 Windows 前台
 .PD 1
 .
 .TP
+.B kva(仅适用于 OS/2)
+使用 libkva 接口的视频输出驱动。
+.PD 0
+.RSs
+.IPs snap
+强制使用 SNAP 模式。
+.IPs wo
+强制使用 WarpOverlay! 模式。
+.IPs dive
+强制使用 DIVE 模式。
+.IPs (no)t23
+启用/禁用解决 T23 笔记本问题的变通模式(默认值:\-not23)。
+如果你的显卡仅支持画面放大输出,尝试开启这个选项。
+.RE
+.PD 1
+.
+.TP
 .B quartz (仅用于 Mac OS X)
 Mac OS X Quartz 视频输出驱动。
 在某些情况下, 锁定打包 YUV 输出格式, 如: \-vf format=yuy2, 可能更有效。
diff --git a/DOCS/tech/MAINTAINERS b/DOCS/tech/MAINTAINERS
index 087d566..68b0768 100644
--- a/DOCS/tech/MAINTAINERS
+++ b/DOCS/tech/MAINTAINERS
@@ -116,7 +116,6 @@ demuxers:
     * demux_rtp* - Ross Finlayson
     * demux_mpg and demux_ts - Nico Sabbi
     * demux_mpc.c - Reimar Döffinger
-    * demux_nuv.c - Reimar Döffinger
 
 muxers:
     * muxer_lavf.c - Michael Niedermayer
diff --git a/DOCS/tech/binary-packaging.txt b/DOCS/tech/binary-packaging.txt
index 71a1929..9d85237 100644
--- a/DOCS/tech/binary-packaging.txt
+++ b/DOCS/tech/binary-packaging.txt
@@ -52,14 +52,13 @@ the following features MUST be included in any official binary package:
   - XAnim codecs support (*)
 
 * general:
-  - default font
   - FreeType fonts support
   - HTML documentation
   - large file support
   - man page(s)
 
 * input/demuxers:
-  - DVD(mpdvdkit2)
+  - DVD(libdvdread4/libdvdnav)
   - streaming
   - Matroska(internal)
   - (S)VCD
@@ -108,10 +107,10 @@ for Red Hat and Fedora RPMs I am using FHS-compliant paths:
 /etc/mplayer/                   system-wide configs
 /usr/bin/                       binaries
 /usr/lib/codecs/                binary codecs
+/usr/lib64/codecs/              binary codecs on 64bit Linux
 /usr/share/doc/mplayer-version/ docs
 /usr/share/man/man1/            man page
 /usr/share/man/XX/man1/         translated man page
-/usr/share/mplayer/font/        fonts
 /usr/share/mplayer/skins/       GUI skins
 
 You MUST NOT include the codecs.conf file in your package. It is useful
@@ -134,12 +133,9 @@ mplayer          contains MPlayer binary without GUI (mplayer),
                  config files, man pages and documentation;
                  required by mplayer-gui
 mplayer-codecs-* contain binary codecs available from MPlayer's site
-mplayer-font-*   contain various bitmap fonts for OSD (obsolete)
 mplayer-gui      contains MPlayer binary with GUI (gmplayer);
                  contains default skin (Blue)
 mplayer-skin-*   contain various MPlayer GUI skins
-mplayer-vidix    contains VIDIX support library for MPlayer
-mplayer-vidix-*  contain VIDIX drivers for specific cards, one per package
 
 There is no strict policy for now, just use your common sense.
 
diff --git a/DOCS/tech/codecs-in.html b/DOCS/tech/codecs-in.html
index c4b29aa..488512d 100644
--- a/DOCS/tech/codecs-in.html
+++ b/DOCS/tech/codecs-in.html
@@ -6,19 +6,15 @@
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 </head>
 <body text="#000000" link="#666666" vlink="#666666" alink="#666666">
-<table width=750 border="0">
-  <tr>
-    <td align="right">
-      <p>&nbsp;</p>
 
-      <p><b>Status of codecs support</b></p>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <p><a href="#vc">Video codecs</a><br><a href="#ac">Audio codecs</a><br></p>
-    </td>
-  </tr>
+<h1>Status of codecs support</h1>
+
+<ul>
+  <li><a href="#vc">Video codecs</a></li>
+  <li><a href="#ac">Audio codecs</a></li>
+</ul>
+
+<table width=750 border="0">
   <tr>
     <td align="center">
       <b><font face="Verdana, Arial, Helvetica, sans-serif" size="5"><a name="vc">Video codecs:</a></font></b><br><br>
@@ -31,7 +27,7 @@
         <tr>
           <td width=150 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codec name</font></b></td>
           <td width=70 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">fourcc</font></b></td>
-          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codecfile</font></b></td>
+          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">driver name</font></b></td>
           <td width=40 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">out</font></b></td>
           <td align=center colspan=2><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">comments</font></b></td>
         </tr>
@@ -51,8 +47,8 @@
         <tr>
           <td width=150 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codec name</font></b></td>
           <td width=70 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">fourcc</font></b></td>
-          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codecfile</font></b></td>
-          <td colspan=3 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">problem</font></b></td>
+          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">driver name</font></b></td>
+          <td colspan=3 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">comments</font></b></td>
         </tr>
 <!-- %4 -->
         <tr>
@@ -69,8 +65,8 @@
         <tr>
           <td width=150 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codec name</font></b></td>
           <td width=70 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">fourcc</font></b></td>
-          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codecfile</font></b></td>
-          <td colspan=3 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">problem</font></b></td>
+          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">driver name</font></b></td>
+          <td colspan=3 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">comments</font></b></td>
         </tr>
 <!-- %2 -->
         <tr>
@@ -87,8 +83,8 @@
         <tr>
           <td width=150 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codec name</font></b></td>
           <td width=70 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">fourcc</font></b></td>
-          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codecfile</font></b></td>
-          <td colspan=3 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">problem</font></b></td>
+          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">driver name</font></b></td>
+          <td colspan=3 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">comments</font></b></td>
         </tr>
 <!-- %3 -->
         <tr>
@@ -111,7 +107,7 @@
         <tr>
           <td width=150 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codec name</font></b></td>
           <td width=70 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">format</font></b></td>
-          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codecfile</font></b></td>
+          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">driver name</font></b></td>
           <td align=center colspan=3><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">comments</font></b></td>
         </tr>
 <!-- %5 -->
@@ -129,8 +125,8 @@
         <tr>
           <td width=150 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codec name</font></b></td>
           <td width=70 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">format</font></b></td>
-          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codecfile</font></b></td>
-          <td colspan=3 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">problem</font></b></td>
+          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">driver name</font></b></td>
+          <td colspan=3 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">comments</font></b></td>
         </tr>
 <!-- %9 -->
         <tr>
@@ -147,8 +143,8 @@
         <tr>
           <td width=150 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codec name</font></b></td>
           <td width=70 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">format</font></b></td>
-          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codecfile</font></b></td>
-          <td colspan=3 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">problem</font></b></td>
+          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">driver name</font></b></td>
+          <td colspan=3 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">comments</font></b></td>
         </tr>
 <!-- %7 -->
         <tr>
@@ -165,8 +161,8 @@
         <tr>
           <td width=150 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codec name</font></b></td>
           <td width=70 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">format</font></b></td>
-          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">codecfile</font></b></td>
-          <td colspan=3 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">problem</font></b></td>
+          <td width=120 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">driver name</font></b></td>
+          <td colspan=3 align=center><b><font color="#AAAAAA" face="Verdana, Arial, Helvetica, sans-serif" size="2">comments</font></b></td>
         </tr>
 <!-- %8 -->
         <tr>
diff --git a/DOCS/tech/mingw-crosscompile.txt b/DOCS/tech/mingw-crosscompile.txt
new file mode 100644
index 0000000..e4e2dbe
--- /dev/null
+++ b/DOCS/tech/mingw-crosscompile.txt
@@ -0,0 +1,32 @@
+Due to a lack of Windows developers, it is a good idea to allow Linux
+developers to do at least some basic check of their code.
+This HOWTO explains how to set up MinGW cross-compilation under Debian.
+
+First, you need to install the "mingw32" package and get a MPlayer SVN
+checkout.
+
+Next, you need quite a lot of dependencies. Since this is for testing and
+not actually use, the easiest way is to use this package:
+http://natsuki.mplayerhq.hu/~reimar/mpl_mingw32.tar.bz2
+NOTE that this is likely to be quite out-dated and might include packages
+with security issues, so do not use it to build binaries for real use.
+
+After extracting this package into the MPlayer source-tree, 
+you only need to run the included linux-mingw.sh to configure (it just runs
+./configure --host-cc=cc --target=i686-mingw32msvc --cc=i586-mingw32msvc-cc
+--windres=i586-mingw32msvc-windres --ranlib=i586-mingw32msvc-ranlib
+--with-extraincdir="$PWD/osdep/mingw32"
+--with-extralibdir="$PWD/osdep/mingw32"
+--with-freetype-config="$PWD/osdep/mingw32/ftconf") and then run make.
+
+You should be able to run the generated binary with Wine, if you want to.
+
+The steps as command-lines:
+
+sudo apt-get install mingw32
+svn co svn://svn.mplayerhq.hu/mplayer/trunk MPlayer-mingw
+cd MPlayer-mingw
+wget http://natsuki.mplayerhq.hu/~reimar/mpl_mingw32.tar.bz2
+tar -xjf mpl_mingw32.tar.bz2
+sh linux-mingw.sh
+make
diff --git a/DOCS/tech/release-howto.txt b/DOCS/tech/release-howto.txt
index 5cf0fef..b490f80 100644
--- a/DOCS/tech/release-howto.txt
+++ b/DOCS/tech/release-howto.txt
@@ -15,17 +15,12 @@ preparations:
 
 create the release tree:
 - tag Subversion with release name
+- Add a VERSION file with the release version to the root of the source tree.
 - update release.sh script with version number
 ***the following steps are done automatically by release.sh script***
 - checkout the mplayer src tree
 - check out FFmpeg subdirs
 - remove obsolete DOCS translations, help files
-- replace version.sh with this (change version number too...):
-
-============
-#!/bin/sh
-echo "#define VERSION \"1.0pre5-$1 \"" > version.h
-============
 
 - build the HTML docs from XML sources, then clean up:
     make html-chunked; make releaseclean
@@ -38,9 +33,9 @@ release the tree:
 ***end of part done by release.sh**
 
 test it (download to your local machine, extract, compile, run)
- - compilers: gcc 3, gcc 2.95, mingw, cygwin
+ - compilers: gcc 4.x, gcc 3.x, gcc 2.95, MinGW, Cygwin
  - architectures: PPC, AMD64, x86 with MMX[2], SSE[2], 3DNow
- - OS: Linux, BSD, Windows, MacOS X
+ - OS: Linux, BSD, Windows, Mac OS X
 
 copy to FTP:
     cp MPlayer-0.90rc5.tar.bz2 /home/ftp/MPlayer/releases/
diff --git a/DOCS/tech/slave.txt b/DOCS/tech/slave.txt
index 2ad276d..df23826 100644
--- a/DOCS/tech/slave.txt
+++ b/DOCS/tech/slave.txt
@@ -30,6 +30,8 @@ As a temporary hack, there is also the _experimental_ "pausing_keep_force "
 prefix, with which MPlayer will not exit the pause loop at all.
 Like this you can avoid the "frame stepping" effect of "pausing_keep "
 but most commands will either not work at all or behave in unexpected ways.
+For "set_mouse_pos" and "key_down_event", "pausing_keep_force" is the default
+since other values do not make much sense for them.
 
 
 Available commands ('mplayer -input cmdlist' will print a list):
diff --git a/DOCS/tech/svn-howto.txt b/DOCS/tech/svn-howto.txt
index ee93f9e..126e809 100644
--- a/DOCS/tech/svn-howto.txt
+++ b/DOCS/tech/svn-howto.txt
@@ -36,8 +36,8 @@ I. BASICS:
 
 0. Get Subversion:
 
-  The MPlayer project server runs Subversion 1.4. For optimal compatibility
-  you should use version 1.4 or later.
+  The MPlayer project server runs Subversion 1.5. For optimal compatibility
+  you should use version 1.5 or later.
 
 
 1. Checking out the source tree:
diff --git a/DOCS/tech/win32-codec-howto.txt b/DOCS/tech/win32-codec-howto.txt
index 81dfafc..e6a684d 100644
--- a/DOCS/tech/win32-codec-howto.txt
+++ b/DOCS/tech/win32-codec-howto.txt
@@ -13,10 +13,10 @@ If you want to add a codec yourself, read DOCS/tech/codecs.conf.txt.
 
 
 
-VFW codecs
+VfW codecs
 ~~~~~~~~~~
 
-VFW (Video for Windows) is the old video API for Windows. Its codecs have
+VfW (Video for Windows) is the old video API for Windows. Its codecs have
 the '.dll' or (rarely) '.drv' extension.  If MPlayer fails at playing your
 AVI with this kind of message:
 
@@ -25,17 +25,36 @@ Cannot find codec matching selected -vo and video format 0x55594648.
 
 It means your AVI is encoded with a codec which has the HFYU fourcc (HFYU =
 HuffYUV codec, DIV3 = DivX Low Motion, etc.). Now that you know this, you
-have to find out which DLL Windows loads in order to play this file. In our
-case, the 'system.ini' contains this information in a line that reads:
+have to find out which DLL Windows loads in order to play this file.
+You can find the VfW codec by searching the internet for e.g. VIDC.HFYU.
+
+In our case, the 'system.ini' also contains this information in a line that reads:
 
 VIDC.HFYU=huffyuv.dll
 
-So you need the 'huffyuv.dll' file. Note that the audio codecs are
-specified by the MSACM prefix:
+So you need the 'huffyuv.dll' file.
+
+
+
+ACM Codecs:
+~~~~~~~~~~~~
+MPlayer may fail at playing the audio in your file with this message:
+
+Cannot find codec for audio format 0x55.
+Read DOCS/HTML/en/codecs.html!
+Audio: no sound
+
+MPlayer calls this the TwoCC format identifier. From the TwoCC list we find:
+
+0x0055 MPEG-1 Layer 3 (MP3)
+
+If you are lucky, you can then just search the internet for "codec acm"
+e.g. "mp3 acm". Or if the codec is already installed on Windows,
+it will show up in the system.ini as:
 
 msacm.l3acm=L3codeca.acm
 
-This is the MP3 codec.
+Note that the audio codecs are specified by the MSACM prefix:
 
 
 
@@ -53,7 +72,7 @@ New Method:
 
 Using Microsoft GraphEdit (fast)
 
-- Get GraphEdit from either DirectX SDK or doom9.
+- Get GraphEdit from the Microsoft SDK, DirectX SDK or doom9.
 - Start 'graphedit.exe'.
 - From the menu select "Graph -> Insert Filters".
 - Expand item "DirectShow Filters".
@@ -86,3 +105,15 @@ Take a deep breath and start searching the registry...
 
 If searching fails, try enabling all the checkboxes. You may have
 false hits, but you may get lucky...
+
+
+
+Tips:
+~~~~~~~
+If you get an error loading a new codec, it may need some more files to work.
+Start the filemon utility before loading MPlayer to find out which DLLs are
+trying to be loaded.
+
+Your codec may load some external DLL libraries. If the codec is already
+installed in Windows, run listdlls wmplayer.exe while Windows Media
+Player is playing your file to find out which.
diff --git a/DOCS/xml/configure b/DOCS/xml/configure
index a61f564..a15cdec 100755
--- a/DOCS/xml/configure
+++ b/DOCS/xml/configure
@@ -186,11 +186,13 @@ then
   if test -z "$_fake_chunk_xsl"
   then
     echo "Found xsltproc. If it works, it's probably the best choice."
+    # HACK: xslt always need a target file if a doctype is set
+    _xsltcommand="OUTPUT=\"\$1\"; if test -d \"\$OUTPUT\" ; then OUTPUT=\"\$OUTPUT/dummy.html\" ; fi;"
     if test -n "$_catalog"
     then
-      _xsltcommand="xsltproc --catalogs -o \$1 \$2 \$3"
+      _xsltcommand="$_xsltcommand xsltproc --catalogs -o \$OUTPUT \$2 \$3"
     else
-      _xsltcommand="xsltproc -o \$1 \$2 \$3"
+      _xsltcommand="$_xsltcommand xsltproc -o \$OUTPUT \$2 \$3"
     fi
   else
     echo "Found xsltproc but no stylesheets on your system."
diff --git a/DOCS/xml/en/encoding-guide.xml b/DOCS/xml/en/encoding-guide.xml
index 4acc840..1be8519 100644
--- a/DOCS/xml/en/encoding-guide.xml
+++ b/DOCS/xml/en/encoding-guide.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- $Revision: 28510 $ -->
+<!-- $Revision: 28984 $ -->
 <chapter id="encoding-guide">
 <title>Encoding with <application>MEncoder</application></title>
 
@@ -357,7 +357,7 @@ practice, this means a value high enough so that it poses no limit, like
 10000Kbit.) With no real restriction on bitrate, the result is that
 the codec will use the lowest
 possible quantizer for each macroblock (as specified by
-<option>vqmin</option> for 
+<option>vqmin</option> for
 <systemitem class="library">libavcodec</systemitem>, which is 2 by default).
 As soon as you specify a
 low enough bitrate that the codec
@@ -1327,7 +1327,7 @@ With these things in mind, here is our first example:
 mencoder <replaceable>capture.avi</replaceable> -mc 0 -oac lavc -ovc lavc -lavcopts \
     vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224
 </screen>
-Note the <option>ilme</option> and <option>ildct</option> options. 
+Note the <option>ilme</option> and <option>ildct</option> options.
 </para>
 </sect2>
 
@@ -1421,7 +1421,7 @@ which widely depend on personal taste and technical constraints.
   bugs which have not yet been noticed and which can ruin an encode.
   This is simply the tradeoff for using bleeding-edge technology.
   </para>
-  
+
   <para>
   What is more, beginning to use a new codec requires that you spend some
   time becoming familiar with its options, so that you know what
@@ -1453,13 +1453,13 @@ which widely depend on personal taste and technical constraints.
   However, they may have some very advanced options that, if enabled,
   will make the encode really slow for marginal gains.
   </para>
-  
+
   <para>
   If you are after blazing speed you should stick around the default
   settings of the video codec (although you should still try the other
   options which are mentioned in other sections of this guide).
   </para>
-  
+
   <para>
   You may also consider choosing a codec which can do multi-threaded
   processing, though this is only useful for users of machines with
@@ -1605,7 +1605,7 @@ will encode <replaceable>destination_sound.wav</replaceable> with
 the encoding quality 1, which is roughly equivalent to 80Kb/s, and
 is the minimum quality at which you should encode if you care about
 quality.
-Please note that <application>MEncoder</application> currently cannot 
+Please note that <application>MEncoder</application> currently cannot
 mux Vorbis audio tracks
 into the output file because it only supports AVI and MPEG
 containers as an output, each of which may lead to audio/video
@@ -1773,7 +1773,7 @@ only cover its usage.
 </para>
 
 <para>
-Probably the easiest way to get started with Matroska is to use 
+Probably the easiest way to get started with Matroska is to use
 <application>MMG</application>, the graphical frontend shipped with
 <application>mkvtoolnix</application>, and follow the
 <ulink url="http://www.bunkus.org/videotools/mkvtoolnix/doc/mkvmerge-gui.html">guide to mkvmerge GUI (mmg)</ulink>
@@ -2240,7 +2240,7 @@ will be 24000/1001 frames per second.
   accurate method available for encoding both telecine and
   "mixed progressive and telecine".
   <screen>
-mencoder dvd://1 -oac copy -vf pullup,softskip 
+mencoder dvd://1 -oac copy -vf pullup,softskip
     -ovc lavc -ofps 24000/1001<!--
   --></screen>
 </para></listitem>
@@ -4006,7 +4006,7 @@ random differences in the achieved bitrate.
   This option is for choosing the motion estimation search method.
   Altering this option provides a straightforward quality-vs-speed
   tradeoff. <option>me=dia</option> is only a few percent faster than
-  the default search, at a cost of under 0.1dB global PSNR. The 
+  the default search, at a cost of under 0.1dB global PSNR. The
   default setting (<option>me=hex</option>) is a reasonable tradeoff
   between speed and quality. <option>me=umh</option> gains a little under
   0.1dB global PSNR, with a speed penalty that varies depending on
@@ -4235,7 +4235,7 @@ random differences in the achieved bitrate.
   (understanding that there are diminishing returns which may become
   vanishingly low, or even zero). The video stream will still have seekable
   points as long as there are some scene changes.
-</para></listitem> 
+</para></listitem>
 <listitem>
   <para>
   <emphasis role="bold">deblock</emphasis>:
@@ -4551,17 +4551,17 @@ and other options. This is known to work on x86 on both *NIX and Windows.
 </para>
 <para>
 First you must build the <application>vfw2menc</application> program.
-It is located in the <filename class="directory">TOOLS</filename> subdirectory 
+It is located in the <filename class="directory">TOOLS</filename> subdirectory
 of the MPlayer source tree.
 To build on Linux, this can be done using <application>Wine</application>:
 <screen>winegcc vfw2menc.c -o vfw2menc -lwinmm -lole32</screen>
 
-To build on Windows in <application>MinGW</application> or 
+To build on Windows in <application>MinGW</application> or
 <application>Cygwin</application> use:
 <screen>gcc vfw2menc.c -o vfw2menc.exe -lwinmm -lole32</screen>
 
 To build on <application>MSVC</application> you will need getopt.
-Getopt can be found in the original <application>vfw2menc</application> 
+Getopt can be found in the original <application>vfw2menc</application>
 archive available at:
 The <ulink url="http://oss.netfarm.it/mplayer-win32.php">MPlayer on win32</ulink> project.
 </para>
@@ -4571,13 +4571,13 @@ Below is an example with the VP6 codec.
 <screen>
 vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 </screen>
-This will open the VP6 codec dialog window. 
+This will open the VP6 codec dialog window.
 Repeat this step for the second pass
 and use <option>-s <replaceable>secondpass.mcf</replaceable></option>.
 </para>
 </informalexample>
 <para>
-Windows users can use 
+Windows users can use
 <option>-xvfwopts codec=vp6vfw.dll:compdata=dialog</option> to have
 the codec dialog display before encoding starts.
 </para>
@@ -4882,11 +4882,11 @@ mp4creator -optimize narnia.mp4</screen>
 <para>
   If you want to add tags to your video that show up in iTunes, you can use
   <ulink url="http://atomicparsley.sourceforge.net/">AtomicParsley</ulink>.
-  
+
   <screen>AtomicParsley narnia.mp4 --metaEnema --title "The Chronicles of Narnia" --year 2005 --stik Movie --freefree --overWrite</screen>
 
   The <option>--metaEnema</option> option removes any existing metadata
-  (<application>mp4creator</application> inserts its name in the 
+  (<application>mp4creator</application> inserts its name in the
   "encoding tool" tag), and <option>--freefree</option> reclaims the
   space from the deleted metadata.
   The <option>--stik</option> option sets the type of video (such as Movie
@@ -4954,7 +4954,7 @@ compliant.
 <tbody>
 <row>
   <entry>NTSC DVD</entry>
-  <entry>720x480, 704x480, 352x480, 352x240</entry> 
+  <entry>720x480, 704x480, 352x480, 352x240</entry>
   <entry>MPEG-2</entry>
   <entry>9800 kbps</entry>
   <entry>48000 Hz</entry>
@@ -4967,7 +4967,7 @@ compliant.
   <entry>NTSC DVD</entry>
   <entry>352x240<footnote id='fn-rare-resolutions'><para>
   These resolutions are rarely used for DVDs because
-  they are fairly low quality.</para></footnote></entry> 
+  they are fairly low quality.</para></footnote></entry>
   <entry>MPEG-1</entry>
   <entry>1856 kbps</entry>
   <entry>48000 Hz</entry>
@@ -5062,7 +5062,7 @@ highly bitrate-starved and require effort to obtain acceptable quality.
 <title>GOP Size Constraints</title>
 
 <para>
-DVD, VCD, and SVCD also constrain you to relatively low 
+DVD, VCD, and SVCD also constrain you to relatively low
 GOP (Group of Pictures) sizes.
 For 30 fps material the largest allowed GOP size is 18.
 For 25 or 24 fps, the maximum is 15.
@@ -5078,7 +5078,7 @@ The GOP size is set using the <option>keyint</option> option.
 VCD video is required to be CBR at 1152 kbps.
 This highly limiting constraint also comes along with an extremely low vbv
 buffer size of 327 kilobits.
-SVCD allows varying video bitrates up to 2500 kbps, and a somewhat less 
+SVCD allows varying video bitrates up to 2500 kbps, and a somewhat less
 restrictive vbv buffer size of 917 kilobits is allowed.
 DVD video bitrates may range anywhere up to 9800 kbps (though typical
 bitrates are about half that), and the vbv buffer size is 1835 kilobits.
@@ -5125,7 +5125,7 @@ DVD (with timestamps on every frame, if possible):
 <para>
 DVD with NTSC Pullup:
 <screen>-of mpeg -mpegopts format=dvd:tsaf:telecine -ofps 24000/1001</screen>
-This allows 24000/1001 fps progressive content to be encoded at 30000/1001 
+This allows 24000/1001 fps progressive content to be encoded at 30000/1001
 fps whilst maintaining DVD-compliance.
 </para>
 
@@ -5191,7 +5191,7 @@ or in the manual page.
 <para>
 If the audio sample rate in the original file is not the same as
 required by the target format, sample rate conversion is required.
-This is achieved using the <option>-srate</option> option and 
+This is achieved using the <option>-srate</option> option and
 the <option>-af lavcresample</option> audio filter together.
 </para>
 
@@ -5259,7 +5259,7 @@ or DVD:
   Used to set the GOP size.
   18 for 30fps material, or 15 for 25/24 fps material.
   Commercial producers seem to prefer keyframe intervals of 12.
-  It is possible to make this much larger and still retain compatibility 
+  It is possible to make this much larger and still retain compatibility
   with most players.
   A <option>keyint</option> of 25 should never cause any problems.
 </para></listitem>
diff --git a/DOCS/xml/en/mencoder.xml b/DOCS/xml/en/mencoder.xml
index c5f7607..074df6d 100644
--- a/DOCS/xml/en/mencoder.xml
+++ b/DOCS/xml/en/mencoder.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- $Revision: 27843 $ -->
+<!-- $Revision: 29001 $ -->
 <chapter id="mencoder">
 <title>Basic usage of <application>MEncoder</application></title>
 
@@ -608,7 +608,7 @@ mencoder mf://<replaceable>frame001.jpg,frame002.jpg</replaceable> -mf w=800:h=6
 Creating an MPEG-4 file from explicit list of JPEG files (list.txt in current
 directory contains the list of files to use as source, one per line):
 <screen>
-mencoder mf://<replaceable>@list.txt</replaceable> -mf w=800:h=600:fps=25:type=jpg \ 
+mencoder mf://<replaceable>@list.txt</replaceable> -mf w=800:h=600:fps=25:type=jpg \
     -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o <replaceable>output.avi</replaceable>
 </screen>
 </para>
diff --git a/DOCS/xml/en/tvinput.xml b/DOCS/xml/en/tvinput.xml
index 945c148..ad91fbd 100644
--- a/DOCS/xml/en/tvinput.xml
+++ b/DOCS/xml/en/tvinput.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- $Revision: 27815 $ -->
+<!-- $Revision: 29001 $ -->
 <chapter id="tv">
 <title>TV</title>
 
@@ -52,7 +52,7 @@ Here are just a few tips:
 <listitem><para>
   Choose some sane image dimensions. The dimensions of the resulting image
   should be divisible by 16.
-</para></listitem> 
+</para></listitem>
 <listitem>
   <para>
   If you capture the video with the vertical resolution higher than half
@@ -88,7 +88,7 @@ Here are just a few tips:
   time. If you have a large capture buffer, <application>MEncoder</application>
   can survive an overload for few seconds but nothing more. It's better to
   turn off the 3D OpenGL screensavers and similar stuff.
-</para></listitem> 
+</para></listitem>
 <listitem><para>
   Don't mess with the system clock. <application>MEncoder</application> uses the
   system clock for doing A/V sync. If you adjust the system clock (especially
@@ -118,7 +118,7 @@ Here are just a few tips:
   <filename>linux/Documentation/sound/btaudio</filename> file (in the kernel
   tree, not <application>MPlayer</application>'s) for some instructions on using
   this driver.
-</para></listitem> 
+</para></listitem>
 <listitem><para>
   If <application>MEncoder</application> cannot open the audio device, make
   sure that it is really available. There can be some trouble with the sound
@@ -251,7 +251,7 @@ Here is an example for Russian:
 </row>
 <row>
   <entry>C</entry>
-  <entry>Cycle through teletext rendering modes (opaque, transparent, inverted opaque, 
+  <entry>Cycle through teletext rendering modes (opaque, transparent, inverted opaque,
   inverted transparent</entry>
 </row>
 <row>
diff --git a/DOCS/xml/en/usage.xml b/DOCS/xml/en/usage.xml
index 84b4e19..a03829b 100644
--- a/DOCS/xml/en/usage.xml
+++ b/DOCS/xml/en/usage.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- $Revision: 28532 $ -->
+<!-- $Revision: 29001 $ -->
 <chapter id="usage">
 <title>Usage</title>
 
@@ -602,11 +602,11 @@ is specified.
 <title>MPEG audio Passthrough</title>
 
 <para>
-Digital TV transmissions (such as DVB and ATSC) and some DVDs usually have 
+Digital TV transmissions (such as DVB and ATSC) and some DVDs usually have
 MPEG audio streams (in particular MP2).
-Some MPEG hardware decoders such as full-featured DVB cards and DXR2 
-adapters can natively decode this format. 
-<application>MPlayer</application> can be configured to relay the audio data 
+Some MPEG hardware decoders such as full-featured DVB cards and DXR2
+adapters can natively decode this format.
+<application>MPlayer</application> can be configured to relay the audio data
 without decoding it.
 </para>
 
diff --git a/DOCS/xml/en/video.xml b/DOCS/xml/en/video.xml
index 198e5cc..84f353b 100644
--- a/DOCS/xml/en/video.xml
+++ b/DOCS/xml/en/video.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- $Revision: 27770 $ -->
+<!-- $Revision: 29001 $ -->
 <chapter id="video">
 <title>Video output devices</title>
 
@@ -2007,7 +2007,7 @@ the native OSD feature of DVB cards.
 <application>MPlayer</application> supports hardware accelerated playback
 with the Creative DXR2 card.
 </para>
-  
+
 <para>
 First of all you will need properly installed DXR2 drivers. You can find
 the drivers and installation instructions at the
diff --git a/DOCS/xml/html-common.xsl b/DOCS/xml/html-common.xsl
index dc3cb14..d803b3d 100644
--- a/DOCS/xml/html-common.xsl
+++ b/DOCS/xml/html-common.xsl
@@ -2,7 +2,9 @@
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                 version="1.0">
 
-<xsl:output method="html" indent="no"/>
+<xsl:output method="html" indent="no"
+            doctype-system="http://www.w3.org/TR/html4/loose.dtd"
+            doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/>
  
 <!-- **************
      Set parameters
diff --git a/DOCS/xml/hu/cd-dvd.xml b/DOCS/xml/hu/cd-dvd.xml
index c109c90..02887e4 100644
--- a/DOCS/xml/hu/cd-dvd.xml
+++ b/DOCS/xml/hu/cd-dvd.xml
@@ -167,7 +167,7 @@ nevezett értelmetlen korlátozást.
 Szégyen, hogy a DVD meghajtókat arra kényszerítik, hogy a hat különböző
 régióból, amire a világot felosztották, csak az egyikben gyártott lemezeket
 fogadják el. Hogy egy asztal körül ülő pár ember hogy állhatott elő egy ilyen
-ötlettel és hogyan várhatják el, hogy a 21. században elfogadnak egy ilyen 
+ötlettel és hogyan várhatják el, hogy a 21. században elfogadnak egy ilyen
 ötletet, az minden képzeletet felülmúl.
 </para>
 
diff --git a/DOCS/xml/hu/documentation.xml b/DOCS/xml/hu/documentation.xml
index bf35629..83838c3 100644
--- a/DOCS/xml/hu/documentation.xml
+++ b/DOCS/xml/hu/documentation.xml
@@ -63,7 +63,7 @@ Az <application>MPlayer</application> egy Linuxon működő videolejátszó (fut
 számos más Unix-on és nem-x86 processzorokon is, lásd <xref linkend="ports"/>).
 Le tudja játszani a legtöbb MPEG, VOB, AVI, Ogg/OGM, VIVO, ASF/WMA/WMV, QT/MOV/MP4,
 FLI, RM, NuppelVideo, yuv4mpeg, FILM, RoQ, PVA, és Matroska file-t, és ezekhez
-felsorakoztat jónéhány natív, XAnim, RealPlayer és Win32 DLL codecet. Nézhetsz vele 
+felsorakoztat jónéhány natív, XAnim, RealPlayer és Win32 DLL codecet. Nézhetsz vele
 Video CD-t, SVCD-t, DVD-t, 3ivx, RealMedia, Sorenson, Theora
 és MPEG-4 (DivX) filmet is. Az <application>MPlayer</application>
 másik nagy előnye a megjelenítési módok széles választékában rejlik.
@@ -73,7 +73,7 @@ az SDL/GGI drivereit is), és néhány alacsony szintű kártyaspecifikus vezér
 (Matrox, 3dfx, Radeon, Mach64, Permedia3) is használható!
 Legtöbbjük támogat szoftveres vagy hardveres nagyítást, így a teljesképernyős
 mód is elérhető. Az <application>MPlayer</application> támogat továbbá hardveres
-MPEG kártyákkal történő dekódolást/megjelenítést, így például a 
+MPEG kártyákkal történő dekódolást/megjelenítést, így például a
 <link linkend="dvb">DVB</link> és <link linkend="dxr3">DXR3/Hollywood+</link>
 kártyákon!
 És még nem is szóltam a szép, élsímított, árnyékolt feliratozásról
diff --git a/DOCS/xml/hu/encoding-guide.xml b/DOCS/xml/hu/encoding-guide.xml
index e675f7b..434c7a4 100644
--- a/DOCS/xml/hu/encoding-guide.xml
+++ b/DOCS/xml/hu/encoding-guide.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- synced with r28510 -->
+<!-- synced with r28984 -->
 <chapter id="encoding-guide">
 <title>Kódolás a <application>MEncoder</application>rel</title>
 
@@ -1429,13 +1429,13 @@ a személyes igények és a technikai korlátok határoznak meg.
   Azonban van néhány nagyon fejlett opció, amit ha engedélyezel, nagyon
   nagy mértékben lelassítják a kódolást csekély javulást produkálva.
   </para>
-  
+
   <para>
   Ha a fantasztikus sebességet keresed, a codec alapértelmezett beállításai
   körül nézelődj (azonban így is ajánlott kipróbálni egyéb opciókat,
   amiket ezen leírás más fejezetei említenek).
   </para>
-  
+
   <para>
   Megfontolandó olyan codec-et választani, ami több-szálas módban
   dolgozza fel a forrást, azonban ez csak a több processzoros géppel
@@ -1681,7 +1681,7 @@ megy.
 </para>
 
 <para>
-Ezen hatalmas hátrány mellett az AVI-nak a következő fő korlátai vannak:  
+Ezen hatalmas hátrány mellett az AVI-nak a következő fő korlátai vannak:
 </para>
 
 <orderedlist>
@@ -2364,7 +2364,7 @@ Az időtartam/hely alapján kell döntened.
 </listitem>
 
 <listitem><formalpara>
-  <title>A kódolási paraméterekről és a minőségről:</title>  
+  <title>A kódolási paraméterekről és a minőségről:</title>
   <para>
   Csak mert itt javasoltam az <option>mbd=2</option>-t, nem jelenti
   azt, hogy máshol ne lehetne használni. A <option>trell</option>-lel
@@ -3902,7 +3902,7 @@ elért bitráta különbségből adódik.
   globális PSNR növelést jelent, változó 15%-33%-os sebességveszteség árán.
   Mivel a kódolási idő vs. minőség arány eléggé rossz, csak akkor ajánlott
   használni, ha minden egyes bit fontos és a kódolási idő nem számít.
-  </para>  
+  </para>
 </listitem>
 <listitem>
   <para>
@@ -3954,7 +3954,7 @@ elért bitráta különbségből adódik.
   Ezek legtöbbször ritka, szélsőséges esetek, de ha teljesen biztos
   akarsz lenni, gondolkozz el rajta, hogy van-e a videódban teljes
   képernyős ismétlődő, csillogó minta vagy nagyon nagy ideiglenes
-  elzáródás, ami kikényszeríthet egy I-kockát. 
+  elzáródás, ami kikényszeríthet egy I-kockát.
   Az első lépés <option>frameref</option>-jét úgy állítsd be, hogy
   elég nagy legyen ahhoz, hogy tartalmazza a villódzási ciklust
   (vagy az elzárást). Például ha a jelenet oda-vissza ugrál két kép
@@ -4197,7 +4197,7 @@ elért bitráta különbségből adódik.
   azt, hogy egyre csökkenő hasznot hoz, mely végül szinte észrevehetetlenül
   kicsi vagy akár nulla lesz). A videó folyam még így is fog tartalmazni
   kereshető pontokat, amíg van benne jelenet váltás.
-</para></listitem> 
+</para></listitem>
 <listitem>
   <para>
   <emphasis role="bold">deblock</emphasis>:
@@ -4255,7 +4255,7 @@ elért bitráta különbségből adódik.
   Ez <emphasis role="bold">még</emphasis> nem igazolja a deblocking
   szűrő erősségének csökkentését.
   Általában jobb zajminőséget érhetsz el az utófeldolgozással.
-  Ha a H.264 kódolásod túl foltos vagy maszatos, próbáld meg 
+  Ha a H.264 kódolásod túl foltos vagy maszatos, próbáld meg
   lejátszani a <option>-vf noise</option> kapcsolóval.
   A <option>-vf noise=8a:4a</option>-nak a gyenge mellékhatásokat
   el kell tüntetnie.
@@ -4409,7 +4409,7 @@ opciókat, ha a codec hibázik vagy rossz kimenetet ad.
   <entry>jp2avi.dll</entry>
   <entry>ImagePower MJPEG2000 (IPJ2)</entry>
   <entry>d860a11766da0d0ea064672c6833768b</entry>
-  <entry><option>-vf flip</option></entry>  
+  <entry><option>-vf flip</option></entry>
 </row>
 <row>
   <entry>m3jp2k32.dll</entry>
@@ -4845,7 +4845,7 @@ mp4creator -optimize narnia.mp4</screen>
 <para>
   Ha tag-eket akarsz hozzáfűzni a videódhoz, amiket az iTunes megjelnít, használhatod az
   <ulink url="http://atomicparsley.sourceforge.net/">AtomicParsley</ulink>-t.
-  
+
   <screen>AtomicParsley narnia.mp4 --metaEnema --title "The Chronicles of Narnia" --year 2005 --stik Movie --freefree --overWrite</screen>
 
   A <option>--metaEnema</option> opció eltávolít minden meglévő metadata-t
@@ -4879,7 +4879,7 @@ mp4creator -optimize narnia.mp4</screen>
 A <application>MEncoder</application> képes VCD, SCVD és DVD formátumú
 MPEG fájlok létrehozására a
 <systemitem class="library">libavcodec</systemitem> könyvtár segítségével.
-Ezek a fájlok a 
+Ezek a fájlok a
 <ulink url="http://www.gnu.org/software/vcdimager/vcdimager.html">vcdimager</ulink>-rel
 vagy a
 <ulink url="http://dvdauthor.sourceforge.net/">dvdauthor</ulink>-ral
@@ -4918,7 +4918,7 @@ legyen.
 <tbody>
 <row>
   <entry>NTSC DVD</entry>
-  <entry>720x480, 704x480, 352x480, 352x240</entry> 
+  <entry>720x480, 704x480, 352x480, 352x240</entry>
   <entry>MPEG-2</entry>
   <entry>9800 kbps</entry>
   <entry>48000 Hz</entry>
@@ -4931,7 +4931,7 @@ legyen.
   <entry>NTSC DVD</entry>
   <entry>352x240<footnote id='fn-rare-resolutions'><para>
   Ezek a felbontások ritkán használatosak a DVD-ken, mert elég
-  alacsony minőségűek.</para></footnote></entry>         
+  alacsony minőségűek.</para></footnote></entry>
   <entry>MPEG-1</entry>
   <entry>1856 kbps</entry>
   <entry>48000 Hz</entry>
diff --git a/DOCS/xml/hu/faq.xml b/DOCS/xml/hu/faq.xml
index caafd6d..45d30c3 100644
--- a/DOCS/xml/hu/faq.xml
+++ b/DOCS/xml/hu/faq.xml
@@ -466,7 +466,7 @@ Letöltöttem egy videót egy P2P hálózatról és nem megy!
 </para></question>
 <answer><para>
 A fájlod valószínűleg sérült vagy fake. Ha egy ismerőstől kaptad és ő
-azt mondja, hogy működik, hasonlítsd össze az 
+azt mondja, hogy működik, hasonlítsd össze az
 <application>md5sum</application> hash-eket.
 </para></answer>
 </qandaentry>
diff --git a/DOCS/xml/hu/mencoder.xml b/DOCS/xml/hu/mencoder.xml
index 6bce44c..2b429d6 100644
--- a/DOCS/xml/hu/mencoder.xml
+++ b/DOCS/xml/hu/mencoder.xml
@@ -373,7 +373,7 @@ mencoder dvd://2 -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell:vpass=2 \
 
 <para>
 A <application>MEncoder</application> támogatja a Sony PSP videó formátumába
-történő kódolást, de a PSP szoftverének változatától függően különböző 
+történő kódolást, de a PSP szoftverének változatától függően különböző
 korlátok vannak.
 Nyugodt lehetsz, ha a következő korlátokat figyelembe veszed:
 <itemizedlist>
@@ -610,7 +610,7 @@ mencoder mf://<replaceable>frame001.jpg,frame002.jpg</replaceable> -mf w=800:h=6
 Egy MPEG-4 fájl létrehozása JPEG fájlok explicit listájából (az aktuális könyvtárban
 lévő lista.txt tartalmazza a forrásként felhasználandó fájlokat, soronként egyet):
 <screen>
-mencoder mf://<replaceable>@lista.txt</replaceable> -mf w=800:h=600:fps=25:type=jpg \ 
+mencoder mf://<replaceable>@lista.txt</replaceable> -mf w=800:h=600:fps=25:type=jpg \
 	-ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o <replaceable>kimenet.avi</replaceable>
 </screen>
 </para>
diff --git a/DOCS/xml/hu/ports.xml b/DOCS/xml/hu/ports.xml
index 18452fb..2a52ae9 100644
--- a/DOCS/xml/hu/ports.xml
+++ b/DOCS/xml/hu/ports.xml
@@ -527,7 +527,7 @@ levelezési listát is segítéségért és a legfrissebb információkért.
 A hivatalos Windows-os binárisok megtalálhatóak a
 <ulink url="http://www.mplayerhq.hu/design7/dload.html">letöltési oldalon</ulink>.
 A külső forrásból származó telepítő csomagokat és egyszerű GUI frontend-eket
-összegyűjtöttük a 
+összegyűjtöttük a
 <ulink url="http://www.mplayerhq.hu/design7/projects.html#windows">kapcsolódó projektek oldal</ulink>
 Windows-os részében.
 </para>
@@ -616,7 +616,7 @@ is segíthet. Ha a lejátszás szaggatott, próbáld meg a
 <option>-autosync 100</option> opciót. Ha ezek közül bármelyik segít, írd
 be a konfigurációs fájlodba.
 </para>
-  
+
 <note>
 <para>
 Ha Pentium 4-ed van és fagyásokat tapasztalsz a RealPlayer
@@ -670,7 +670,7 @@ alaphelyzetben nincs benne a <application>MinGW</application>-ben.
 Állítsd be a <option>--prefix=/mingw</option> kapcsolóval és
 telepítsd, mielőtt az <application>MPlayer</application>t fordítanád.
 </para>
-  
+
 <para>
 Az <application>MPlayer</application> és a szükséges függvénykönyvtárak
 elkészítésének módját elolvashatod az
@@ -824,7 +824,7 @@ Lehet, hogy szerkesztened kell a <filename>config.mak</filename> fájlt és
 <para>
 Folytasd a
 <screen>make</screen>
-paranccsal, majd menj a mplayerosx könyvtárba és írd be 
+paranccsal, majd menj a mplayerosx könyvtárba és írd be
 <screen>make dist</screen>
 Ez egy tömörített <systemitem>.dmg</systemitem> archívot hoz létre
 egy használatra kész binárissal.
diff --git a/DOCS/xml/hu/skin.xml b/DOCS/xml/hu/skin.xml
index 71f95ef..cfbb458 100644
--- a/DOCS/xml/hu/skin.xml
+++ b/DOCS/xml/hu/skin.xml
@@ -92,13 +92,13 @@ aktiválható).
   és <emphasis>címkék</emphasis>.
   Minden egyes elemnek meg kell adnod a pozícióját és a méretét.
   </para>
-  
+
   <para>
   Egy <emphasis role="bold">gomb</emphasis>nak három állása van (lenyomott,
   felengedett, letiltott), így a képe függőlegesen három részre van osztva.
   Lásd a <link linkend="skin-button">gomb</link> elemet a részletekért.
   </para>
-  
+
   <para>
   Egy <emphasis role="bold">potmeter</emphasis>nek (főként a kereső sáv és a
   hangerő/balansz állító) bármennyi fázisa lehet a képének egymás alatti
@@ -106,7 +106,7 @@ aktiválható).
   <link linkend="skin-hpotmeter">hpotmeter</link>t és
   <link linkend="skin-potmeter">potmeter</link>t a részletekért.
   </para>
-  
+
   <para>
   A <emphasis role="bold">címkék</emphasis> egy kicsit különlegesek: A
   megrajzolásukhoz szükséges karaktereket egy kép fájlból nyerjük és
@@ -781,7 +781,7 @@ Ahol az <literal><replaceable>image</replaceable></literal> a betűhöz használ
 kép fájl neve (nem kell megadnod a kiterjesztést).
 <anchor id="skin-font-char"/>
 <programlisting>"char" = X, Y, width, height</programlisting>
-Itt az <literal>X</literal> és az <literal>Y</literal> a 
+Itt az <literal>X</literal> és az <literal>Y</literal> a
 <literal>char</literal> karakter pozícióját adja meg a képen (<literal>0,0</literal>
 a bal felső sarok). A <literal>width</literal> és a <literal>height</literal>
 a karakter méretei pixelben.
diff --git a/DOCS/xml/hu/video.xml b/DOCS/xml/hu/video.xml
index f6055a9..7f1d109 100644
--- a/DOCS/xml/hu/video.xml
+++ b/DOCS/xml/hu/video.xml
@@ -2020,7 +2020,7 @@ lejátszást a Creative DXR2 kártyával.
 
 <para>
 Mindenek előtt megfelelően telepített DXR2 vezérlő kell. A vezérlőt és
-a telepítési útmutatót megtalálhatod a 
+a telepítési útmutatót megtalálhatod a
 <ulink url="http://dxr2.sf.net/">DXR2 Resource Center</ulink> oldalán.
 </para>
 
diff --git a/DOCS/xml/ru/encoding-guide.xml b/DOCS/xml/ru/encoding-guide.xml
index 1f8024f..e7200d6 100644
--- a/DOCS/xml/ru/encoding-guide.xml
+++ b/DOCS/xml/ru/encoding-guide.xml
@@ -7,17 +7,17 @@
 <title>Создание высококачественного MPEG-4 ("DivX") рипа из DVD фильма</title>
 
 <para>
-Одним часто задаваемым вопросом является "Как мне сделать рип самого высокого 
+Одним часто задаваемым вопросом является "Как мне сделать рип самого высокого
 качества для заданного размера?". Другой вопрос "Как мне создать DVD рип с самым
-высоким возможным качеством? Я не беспокоюсь о размере файла, мне нужно лишь 
+высоким возможным качеством? Я не беспокоюсь о размере файла, мне нужно лишь
 наилучшее качество.".
 </para>
 
 <para>
 Последний вопрос, похоже, отчасти неверно сформулирован. В конце концов, если
-Вы не беспокоитесь о размере файла, почему бы просто не скопировать весь MPEG-2 
+Вы не беспокоитесь о размере файла, почему бы просто не скопировать весь MPEG-2
 видео поток с DVD? Конечно, Ваш AVI файл будет занимать около 5GB,
-но если Вы желаете наилучшее качество и не волнуетесь о размере, то это, 
+но если Вы желаете наилучшее качество и не волнуетесь о размере, то это,
 несомненно, лучшее решение.
 </para>
 
@@ -38,7 +38,7 @@
 </para>
 
 <para>
-Если это кажется для Вас слишком сложным, то Вам, пожалуй, следует использовать 
+Если это кажется для Вас слишком сложным, то Вам, пожалуй, следует использовать
 один из многочисленных неплохих фронтендов, указанных в
 <ulink url="http://www.mplayerhq.hu/design7/projects.html#mencoder_frontends">разделе MEncoder</ulink>
 нашей страницы родственных проектов.
@@ -59,8 +59,8 @@
 <para>
 Первым и наиболее важным шагом перед кодированием должно быть определение
 типа содержимого, с которым Вы работаете.
-Если источником Ваших исходных материалов является DVD или 
-широковещательное/кабельное/спутниковое TV, оно будет содержаться в одном из 
+Если источником Ваших исходных материалов является DVD или
+широковещательное/кабельное/спутниковое TV, оно будет содержаться в одном из
 двух форматов: NTSC для Северной Америки и Японии, PAL для Европы и т.д..
 Однако, важно понимать, что это только форматирование для показа на
 телевидении, и оно часто
@@ -69,7 +69,7 @@
 Опыт показывает, что NTSC материал существенно более сложен для кодирования,
 т.к. в нём содержится больше элементов, которые нужно идентифицировать.
 Для проведения удачного кодирования, Вам необходимо знать исходный формат.
-Отказ от принятия этого во внимание приведёт к различным дефектам в Вашем 
+Отказ от принятия этого во внимание приведёт к различным дефектам в Вашем
 кодировании, включая безобразные гребешки (артефакты чересстрочной развёртки)
 и повторяющиеся или даже потерянные кадры.
 Кроме ухудшения картинки, артефакты так же уменьшают эффективность кодирования:
@@ -80,7 +80,7 @@
 <sect3 id="menc-feat-dvd-mpeg4-preparing-encode-fps">
 <title>Определение кадровой частоты источника</title>
 <para>
-Вот список, содержащий общие типы исходных материалов, где они, 
+Вот список, содержащий общие типы исходных материалов, где они,
 преимущественно, встречаются и их свойства:
 </para>
 
@@ -110,7 +110,7 @@
   В других отношениях аналогично PAL.
 </para></listitem>
 <listitem><para>
-  <emphasis role="bold">Анимация</emphasis>: Обычно рисуется на 24 fps, 
+  <emphasis role="bold">Анимация</emphasis>: Обычно рисуется на 24 fps,
   но также существуют разновидности со смешанной кадровой частотой.
 </para></listitem>
 <listitem><para>
@@ -119,7 +119,7 @@
   24 и 30 кадров в секунду типичны для NTSC, и 25 fps типично для PAL.
 </para></listitem>
 <listitem><para>
-  <emphasis role="bold">Старый фильм</emphasis>: Различные низкие 
+  <emphasis role="bold">Старый фильм</emphasis>: Различные низкие
   кадровые частоты.
 </para></listitem>
 </itemizedlist>
@@ -146,18 +146,18 @@
 <emphasis role="bold">Любой</emphasis> фильм, подготовленный для
 просмотра на телевидении (включая DVD), преобразуется в формат,
 основанный на полях.
-<!-- FIXME: Существует ли лучший *краткий* (1-2 слова) перевод для 
-  терминов pulldown и telecine? В литературе, которую я нашёл, 
-  используют или указанные мной, по сути дела, транслитерации, 
+<!-- FIXME: Существует ли лучший *краткий* (1-2 слова) перевод для
+  терминов pulldown и telecine? В литературе, которую я нашёл,
+  используют или указанные мной, по сути дела, транслитерации,
   или так и оставляют английские названия.
   А точный перевод можно выполнить только целым предложением
-  (т.е. определением), что совершенно неуместно в контексте 
+  (т.е. определением), что совершенно неуместно в контексте
   данного документа, где эти термины часто встречаются. -->
-Различные методы, с помощью которых это может быть сделано, совокупно 
-называются "телесин" (англ. telecine), одним из вариантов которого 
+Различные методы, с помощью которых это может быть сделано, совокупно
+называются "телесин" (англ. telecine), одним из вариантов которого
 является отвратительный NTSC "3:2 пулдаун" (англ. pulldown).
-За исключением случаев, когда формат исходного материала был 
-также основан на полях (и с такой же частотой полей), Вы получите 
+За исключением случаев, когда формат исходного материала был
+также основан на полях (и с такой же частотой полей), Вы получите
 фильм в формате отличном от исходного.
 </para>
 
@@ -165,14 +165,14 @@
 <title>Существует несколько общих типов пулдауна:</title>
 <listitem><para>
   <emphasis role="bold">PAL 2:2 пулдаун</emphasis>: Наилучший из всех.
-  Каждый кадр показывается за время длительности двух полей путем 
+  Каждый кадр показывается за время длительности двух полей путем
   извлечения чётных и нечётных строк и их попеременного показа.
   Если в исходном материале 24 fps, то это ускоряет воспроизведение фильма
   на 4%.
 </para></listitem>
 <listitem><para>
   <emphasis role="bold">PAL 2:2:2:2:2:2:2:2:2:2:2:3 пулдаун</emphasis>:
-  Каждый 12-й кадр показывается за время длительности трёх полей, 
+  Каждый 12-й кадр показывается за время длительности трёх полей,
   вместо двух.
   Это помогает избежать проблемы 4%-го ускорения, но делает обращение
   процесса существенно более сложным.
@@ -183,7 +183,7 @@
   <emphasis role="bold">NTSC 3:2 телесин</emphasis>: Кадры показываются
   попеременно за время длительности 3-х полей или 2-х полей.
   Это даёт частоту полей в 2.5 раза больше исходной частоты кадров.
-  Результат также очень незначительно замедляется от 60 до 60000/1001 
+  Результат также очень незначительно замедляется от 60 до 60000/1001
   полей в секунду для поддержания частоты полей NTSC.
 </para></listitem>
 <listitem><para>
@@ -205,19 +205,19 @@
 </para>
 
 <para>
-Когда видео находится на DVD, последовательные пары полей 
+Когда видео находится на DVD, последовательные пары полей
 группируются как кадр, даже если они не предназначены для
 одновременного отображения.
 Стандарт MPEG-2, используемый на DVD и цифровом TV предоставляет
 возможность одновременно кодировать исходные кадры с построчной
-развёрткой и сохранять число полей, в течении которых кадр 
+развёрткой и сохранять число полей, в течении которых кадр
 должен быть показан, в его заголовке.
 Если был использован такой метод, фильм часто будет называться
 как "мягкий телесин", т.к. процесс только указывает DVD-плееру
 о необходимости применения пулдауна к фильму, не изменяя при этом
 сам фильм.
 Этот случай существенно предпочтителен, т.к. он может быть легко обращён
-(в действительности, проигнорирован) кодером и т.к. он сохраняет 
+(в действительности, проигнорирован) кодером и т.к. он сохраняет
 максимальное качество.
 Однако, многие широковещательные и DVD студии не используют
 надлежащую технологию кодирования и вместо этого производят
@@ -226,28 +226,28 @@
 </para>
 
 <para>
-Порядок действия в таких случаях будет описан 
+Порядок действия в таких случаях будет описан
 <link linkend="menc-feat-telecine">позже в данном руководстве</link>.
-Сейчас мы дадим Вам несколько советов по идентификации типа 
+Сейчас мы дадим Вам несколько советов по идентификации типа
 материала, с которым Вы работаете:
 </para>
 
 <itemizedlist>
-<title>Области NTSC:</title>
+<title>Регионы NTSC:</title>
 <listitem><para>
-  Если при просмотре Вашего фильма <application>MPlayer</application> 
+  Если при просмотре Вашего фильма <application>MPlayer</application>
   выводит, что частота кадров была изменена до 24000/1001 и она
   никогда не меняется обратно, то это почти наверняка содержимое
-  с построчной развёрткой, которое было подвергнуто 
+  с построчной развёрткой, которое было подвергнуто
   "мягкому телесину".
 </para></listitem>
 <listitem><para>
-  Если <application>MPlayer</application> отображает попеременные 
-  переключения частоты кадров между 24000/1001 и 30000/1001, и Вы 
+  Если <application>MPlayer</application> отображает попеременные
+  переключения частоты кадров между 24000/1001 и 30000/1001, и Вы
   иногда видите "гребешки", есть несколько возможностей.
-  Сегменты с 24000/1001 fps почти наверняка являются "мягко 
+  Сегменты с 24000/1001 fps почти наверняка являются "мягко
   телесиненным" содержимым с построчной развёрткой, но части с
-  30000/1001 fps могут быть как "жёстко телесиненым" содержимым 
+  30000/1001 fps могут быть как "жёстко телесиненым" содержимым
   с 24000/1001 fps, так и NTSC видео с 60000/1001 полями в секунду.
   Используйте два нижеследующих руководства для определения того,
   с каким случаем Вы имеете дело.
@@ -255,7 +255,7 @@
 <listitem><para>
   Если <application>MPlayer</application> никогда не показывает
   изменения кадровой частоты и каждый отдельный кадр, где есть
-  движение, оказывается гребёнкой, Ваш фильм есть NTSC видео с 
+  движение, оказывается гребёнкой, Ваш фильм есть NTSC видео с
   60000/1001 полями в секунду.
 </para></listitem>
 <listitem><para>
@@ -267,7 +267,7 @@
 </itemizedlist>
 
 <itemizedlist>
-<title>Области PAL:</title>
+<title>Регионы PAL:</title>
 <listitem><para>
   Если Вы не видите никакой гребёнки, Ваш фильм есть 2:2 пулдаун.
 </para></listitem>
@@ -276,18 +276,18 @@
   Ваш фильм представляет собой 2:2:2:2:2:2:2:2:2:2:2:3 пулдаун.
 </para></listitem>
 <listitem><para>
-  Если Вы всегда видите гребёнки во время движения, значит Ваш 
+  Если Вы всегда видите гребёнки во время движения, значит Ваш
   фильм является PAL видео с 50 полями в секунду.
 </para></listitem>
 </itemizedlist>
 
 <note><title>Подсказка:</title>
 <para>
-  <application>MPlayer</application> может замедлить воспроизведение 
+  <application>MPlayer</application> может замедлить воспроизведение
   фильма с опцией -speed или воспроизводить его покадрово.
-  Попробуйте использовать опцию <option>-speed 0.2</option> для 
-  очень медленного просмотра фильма или несколько раз нажмите
-  клавишу "<keycap>.</keycap>" для воспроизведения одного кадра 
+  Попробуйте использовать опцию <option>-speed 0.2</option> для
+  очень медленного просмотра фильма или нажимайте
+  клавишу "<keycap>.</keycap>" для воспроизведения одного кадра
   за раз и идетнифицируйте образец, если не можете его увидеть на
   полной скорости.
 </para>
@@ -298,7 +298,7 @@
 <!-- ********** -->
 
 <sect2 id="menc-feat-dvd-mpeg4-2pass">
-<title>Постоянный квантователь против многопроходности</title>
+<title>Постоянный квантователь в сравнении с многопроходностью</title>
 
 <para>
 Возможно кодировать Ваш фильм, широко варьируя качество.
@@ -310,7 +310,7 @@
 </para>
 
 <para>
-Есть три подхода при кодировании видео: постоянный битпоток (CBR), 
+Есть три подхода при кодировании видео: постоянный битпоток (CBR),
 постоянный квантователь и многопроходность (ABR или усреднённый битпоток).
 </para>
 
@@ -322,8 +322,8 @@
 Однако, в таких простых режимах как CBR кодеры не знают загруженность
 битпотока в последующих сценах и т.о. не могут превысить затребованный
 битпоток для больших промежутков времени.
-Более продвинутые режимы, такие как многопроходный режим, могут
-учитывать статистику предыдущих проходов; это решает проблему, 
+Более совершенные режимы, такие как многопроходный режим, могут
+учитывать статистику предыдущих проходов; это решает проблему,
 упомянутую выше.
 </para>
 
@@ -346,10 +346,10 @@
 В каждом из этих режимов видеокодек (такой как
 <systemitem class="library">libavcodec</systemitem>)
 разбивает видеокадр на макроблоки размером 16х16 пикселей и потом
-применяет квантователь к каждому макроблоку. Чем меньше квантоваль, 
+применяет квантователь к каждому макроблоку. Чем меньше квантоваль,
 тем лучше качество и выше битпоток.
 Метод, используемый видео кодером для определения того, какой
-квантователь использовать для данного макроблока, варьируется и 
+квантователь использовать для данного макроблока, варьируется и
 подлежит тонкой настройке. (Это крайнее упрощение реального
 процесса, но основная концепция полезна для понимания.)
 </para>
@@ -361,7 +361,7 @@
 Если Вас действительно не волнует размер файла, Вы можете также
 использовать CBR и указать бесконечный битпоток. (На практике это
 означает значение, достаточно большое для обозначения отсутствия
-предела, например, 10000 Кбит.) В результате, без реального ограничения 
+предела, например, 10000 Кбит.) В результате, без реального ограничения
 битпотока, кодек использует наименьший возможный квантователь для
 каждого макроблока (как указано опцией
 <option>vqmin</option> для
@@ -371,27 +371,26 @@
 испортите качество Вашего видео.
 Чтобы избежать этого, Вам, вероятно, придётся уменьшить размеры
 Вашего видео, согласно методу, описанному далее в этом руководстве.
-В общих чертах, Вам следует избегать CBR совсем, если Вы заботитесь
-о качестве.
+В общем, Вам следует избегать CBR совсем, если Вы заботитесь о качестве.
 </para>
 
 <para>
 С постоянным квантователем кодек использует для всех макроблоков
 один и тот же квантователь, указанный в опции
-<option>vqscale</option> (для 
+<option>vqscale</option> (для
 <systemitem class="library">libavcodec</systemitem>).
-Если Вы хотите рип наивысшего возможного качества, снова не взирая 
+Если Вы хотите рип наивысшего возможного качества, снова не взирая
 на битпоток, Вы можете использовать
 <option>vqscale=2</option>.
-Это приведёт к тому же битпотоку и PSNR (пику отношения сигнала к шуму), 
-что и CBR с 
-<option>vbitrate</option>=бесконечности и значением по умолчанию 
+Это приведёт к тому же битпотоку и PSNR (пику отношения сигнала к шуму),
+что и CBR с
+<option>vbitrate</option>=бесконечности и значением по умолчанию
 <option>vqmin</option>, равным 2.
 </para>
 
 <para>
 Проблема с постоянным квантованием заключается в том, что кодек использует
-заданный квантователь вне зависимости от того, требуется это для 
+заданный квантователь вне зависимости от того, требуется это для
 макроблока или нет. То есть возможно использование большего квантователя
 для макроблока без ухудшения видимого качества. Зачем тратить биты на
 излишне низкий квантователь? У Вашего процессора есть столько тактов,
@@ -400,13 +399,13 @@
 </para>
 
 <para>
-При двупроходном кодировании первый проход создаст рип фильма так, 
+При двупроходном кодировании первый проход создаст рип фильма так,
 как будто это был CBR, но сохранит лог свойств для каждого кадра.
 Эта информация затем будет использована во время второго прохода
 для принятия интеллектуальных решений о том, какой квантователь
-следует использовать. Во время быстрого движения или сцен с 
-высокой детализацией с большой вероятностью будут использованы 
-бОльшие квантователи, а во время медленного движения или сцен
+следует использовать. Во время быстрого движения или сцен с
+высокой детализацией с большой вероятностью будут использованы
+б<emphasis>о</emphasis>льшие квантователи, а во время медленного движения или сцен
 с низкой детализацией &mdash; меньшие.
 Обычно количество движения играет существенно более важную роль,
 чем количество деталей.
@@ -417,7 +416,7 @@
 Если Вы используете <option>vqscale=3</option>, то Вы не получаете
 рип наивысшего качества. Предположим, Вы делаете рип DVD, используя
 <option>vqscale=3</option>, результат получается 1800 Кбит.
-Если Вы сделаете двупроходное кодирование с 
+Если Вы сделаете двупроходное кодирование с
 <option>vbitrate=1800</option>, получившееся видео будет обладать
 <emphasis role="bold">лучшим качеством</emphasis> для
 <emphasis role="bold">того же битпотока</emphasis>.
@@ -446,8 +445,8 @@
 <para>
 Если Вашей целью является определённый размер, Вам нужно как-нибудь
 вычислить битпоток. Но перед этим, Вам нужно знать, сколько места
-нужно зарезервировать по аудио дорожку(и), так что Вам необходимо 
-<link linkend="menc-feat-dvd-mpeg4-audio">извлечь их</link> сперва.
+нужно зарезервировать по аудио дорожку(и), так что Вам необходимо
+сперва <link linkend="menc-feat-dvd-mpeg4-audio">извлечь их</link>.
 Вы можете рассчитать битпоток с помощью следующей формулы:
 <systemitem>битпоток = (конечный_размер_в_МБайт - размер_звука_в_МБайт) *
 1024 * 1024 / длительность_в_секундах * 8 / 1000</systemitem>.
@@ -465,14 +464,14 @@
 
 <para>
 Из-за особенностей MPEG-подобного сжатия, существуют различные
-ограничения, которым Вы должны следовать для достижения 
+ограничения, которым Вы должны следовать для достижения
 максимального качества.
 MPEG разбивает видео на квадраты 16х16, называемые макроблоками.
 Каждый макроблок состоит из 4 блоков 8х8 с информацией о люме
 (интенсивности) и двух блоков 8х8 с информацией о хроме (цвете)
 половинного разрешения (один для красно-бирюзовой оси и другой
 для жёлто-голубой оси).
-Даже если ширина и высота Вашего фильма не кратны 16, кодер 
+Даже если ширина и высота Вашего фильма не кратны 16, кодер
 всё равно использует нужное количество макроблоков 16х16 для покрытия
 всей области картинки, дополнительная область будет впустую потрачена.
 Так что в интересах максимизации качества при фиксированном размере
@@ -481,8 +480,8 @@ MPEG разбивает видео на квадраты 16х16, называе
 
 <para>
 У большинства DVD также есть определённое подобие чёрных полос на
-краях. Если Вы их оставите, это может 
-<emphasis role="bold">сильно</emphasis> повредить качество 
+краях. Если Вы их оставите, это может
+<emphasis role="bold">сильно</emphasis> повредить качество
 несколькими путями.
 </para>
 
@@ -490,7 +489,7 @@ MPEG разбивает видео на квадраты 16х16, называе
 <listitem>
   <para>
   MPEG-подобное сжатие очень чувствительно к преобразованиям
-  частотных интервалов, в частности, к дискретному косинусному 
+  частотных интервалов, в частности, к дискретному косинусному
   преобразованию (DCT), которое аналогично преобразованию Фурье.
   Этот вид сжатия эффективен для представления образов и сглаженных
   переходов, но у него возникают проблемы с острыми краями.
@@ -504,22 +503,22 @@ MPEG разбивает видео на квадраты 16х16, называе
   возникает только в случае попадания острого края внутрь блока.
   Если Ваши чёрные поля возникают точно на границах, кратных 16
   пикселям, это не проблема.
-  Однако, чёрные полосы на DVD редко хорошо расположены, так что 
-  на практике Вам всегда придётся усекать стороны для избежания 
-  этих проблем. 
+  Однако, чёрные полосы на DVD редко хорошо расположены, так что
+  на практике Вам всегда придётся усекать стороны для избежания
+  этих проблем.
   </para>
 </listitem>
 </orderedlist>
 
 <para>
-В дополнение к преобразованиям частотных интервалов, MPEG-подобное 
-сжатие использует векторы движения для отображения изменений от 
+В дополнение к преобразованиям частотных интервалов, MPEG-подобное
+сжатие использует векторы движения для отображения изменений от
 одного кадра к другому. Векторы движения, естественно, работают
 существенно менее эффективно для новых объектов, идущих от
 краёв картинки, поскольку они отсутствуют в предыдущих кадрах.
 Пока картинка простирается вплоть до края кодируемой области,
 у векторов движения не возникает проблем с движением объектов
-за пределы картинки. Однако, при наличии черных полей 
+за пределы картинки. Однако, при наличии черных полей
 могут возникнуть проблемы:
 </para>
 
@@ -529,13 +528,13 @@ MPEG разбивает видео на квадраты 16х16, называе
   Для каждого макроблока MPEG-подобное сжатие сохраняет вектор,
   определяющий какая часть предыдущего кадра должна быть скопирована
   в этот макроблок как основа для предсказания следующего кадра.
-  Кодированию подлежит только оставшаяся разность. Если макроблок 
+  Кодированию подлежит только оставшаяся разность. Если макроблок
   простирается до края картинки и содержит часть чёрной полосы,
   то векторы движения других частей картинки перепишут чёрную полосу.
-  Это означает, что много битов нужно потратить либо на повторное 
-  чернение переписанной полосы, либо (что более вероятно) вектор 
-  движения не будет использован вовсе и все изменения для этого 
-  макроблока будут явно кодированы. Другими словами, эффективность 
+  Это означает, что много битов нужно потратить либо на повторное
+  чернение переписанной полосы, либо (что более вероятно) вектор
+  движения не будет использован вовсе и все изменения для этого
+  макроблока будут явно кодированы. Так или иначе, эффективность
   кодирования существенно уменьшается.
   </para>
 
@@ -547,22 +546,22 @@ MPEG разбивает видео на квадраты 16х16, называе
 
 <listitem>
   <para>
-  Наконец, предположим, что у нас есть находящийся внутри картинки 
+  Наконец, предположим, что у нас есть находящийся внутри картинки
   макроблок и объект движется в этот блок от края изображения.
-  MPEG-подобное кодирование не может сказать "скопируй ту часть, 
+  MPEG-подобное кодирование не может сказать "скопируй ту часть,
   что внутри картинки, но не чёрную полосу". Так что чёрная полоса
-  также будет скопирована внутрь, в результате чего масса битов 
+  также будет скопирована внутрь, в результате чего масса битов
   будет потрачена на кодирование части изображения, которое должно
   быть на месте полосы.
   </para>
 
   <para>
   Для случаев, когда всё изображение движется к краю кодируемой
-  области, у MPEG есть специальные оптимизации для многократного
-  копирования пикселей на край картинки, когда вектор движения
-  идёт извне области кодирования. Эта возможность становится 
-  бесполезной, если у фильма есть чёрные полосы. В отличии от 
-  случаев 1 и 2, выравнивание границ до кратности 16 здесь 
+  области, у MPEG есть специальные оптимизации для повторяющегося
+  копирования пикселей к краю картинки, когда вектор движения
+  идёт извне области кодирования. Эта возможность становится
+  бесполезной, если у фильма есть чёрные полосы. В отличии от
+  случаев 1 и 2, выравнивание границ до кратности 16 здесь
   не поможет.
   </para>
 </listitem>
@@ -575,9 +574,9 @@ MPEG разбивает видео на квадраты 16х16, называе
 </orderedlist>
 
 <para>
-Благодаря всем этим причинам, рекомендуется полностью урезать 
+Благодаря всем этим причинам, рекомендуется полностью урезать
 чёрные полосы. Более того, если есть области шумов/искажений
-на краях картинки, то их урезание также поспособствует улучшению 
+на краях картинки, то их урезание также поспособствует улучшению
 качества кодирования. Видеофилы, желающие сохранить оригинал как
 можно более точно, могут возражать против такого усечения; но
 если Вы не планируете кодировать при постоянном квантователе,
@@ -593,7 +592,7 @@ MPEG разбивает видео на квадраты 16х16, называе
 
 <para>
 Вспомните из предыдущего раздела, что конечный размер картинки,
-подлежащей кодированию, должен быть кратен 16 (как высота, так 
+подлежащей кодированию, должен быть кратен 16 (как высота, так
 и ширина). Это может быть достигнуто усечением, масштабированием
 или комбинацией того и другого.
 </para>
@@ -601,11 +600,11 @@ MPEG разбивает видео на квадраты 16х16, называе
 <para>
 Есть несколько рекомендаций для усечения, которым необходимо следовать
 для избежания повреждения фильма.
-Обычный формат YUV, 4:2:0, сохраняет хрому (информацию о цвете)
-половинной дискретизации, т.е. хрома сохраняется в два раза реже
-в каждом направлении, чем люма (информация об интенсивности).
+Обычный формат YUV, 4:2:0, сохраняет цветность (информацию о цвете)
+половинной дискретизации, т.е. цветность сохраняется в два раза реже
+в каждом направлении, чем яркостность (информация об интенсивности).
 Рассмотрите следующую диаграмму, где L обозначает точки дискретизации
-люмы и C &mdash; хромы.
+яркостности и C &mdash; цветности.
 </para>
 
 <informaltable>
@@ -685,15 +684,15 @@ MPEG разбивает видео на квадраты 16х16, называе
 Как Вы видите, строки и столбцы изображения естественным образом
 идут в парах. Поэтому смещения и размеры усечения
 <emphasis>должны</emphasis> быть чётными числами.
-Иначе хрома перестанет правильно соответствовать люме.
+Иначе цветность перестанет правильно соответствовать яркостности.
 Теоретически возможно усечение с нечётными смещениями, но оно
-потребует преобразования хромы, что потенциально является
+потребует переквантования цветности, что потенциально является
 операцией с потерей качества и не поддерживается фильтром
 усечения сторон crop.
 </para>
 
 <para>
-Более того, видео с чересстрочной развёрткой дискретизируется 
+Более того, видео с чересстрочной развёрткой дискретизируется
 следующим образом:
 </para>
 
@@ -941,7 +940,7 @@ MPEG разбивает видео на квадраты 16х16, называе
 </para>
 
 <para>
-Естественные разрешения DVD составляют 720x480 для NTSC и 720x576 
+Естественные разрешения DVD составляют 720x480 для NTSC и 720x576
 для PAL, но существует флаг соотношения сторон, который указывает
 является ли видео полноэкранным (4:3) или широкоэкранным (16:9).
 Многие (если не большинство) широкоэкранных DVD не точно соответствуют
@@ -951,14 +950,14 @@ MPEG разбивает видео на квадраты 16х16, называе
 
 <para>
 <application>MPlayer</application> предоставляет фильтр обнаружения
-усечения, который определяет прямоугольник, до которго нужно усечь 
+усечения, который определяет прямоугольник, до которго нужно усечь
 (<option>-vf cropdetect</option>).
 Запустите <application>MPlayer</application> с
 <option>-vf cropdetect</option> и он выдаст настройки
 усечения для удаления полей.
-С целью получения точных параметров усечения, Вы должны проигрывать 
-фильм достаточно долго для того, чтоб была использована вся область 
-изображения. 
+С целью получения точных параметров усечения, Вы должны проигрывать
+фильм достаточно долго для того, чтоб была использована вся область
+изображения.
 </para>
 
 <para>
@@ -966,18 +965,17 @@ MPEG разбивает видео на квадраты 16х16, называе
 <application>MPlayer</application>, используя командную строку,
 выведенную <option>cropdetect</option>, и подстройте прямоугольник
 при необходимости.
-Фильтр <option>rectangle</option> может быть полезен, позволив 
+Фильтр <option>rectangle</option> может быть полезен, позволив
 Вам интерактивно менять прямоугольник усечения для Вашего фильма.
 Не забывайте следовать указанным выше руководствам по делимости,
-чтобы не испортить выравнивание хромы.
+чтобы не испортить выравнивание цветности.
 </para>
 
 <para>
 В ряде случаев масштабирование может быть нежелательным.
 Масштабирование по вертикальному направлению затруднено для
 чересстрочного видео, и если Вы хотите сохранить чересстрочность,
-Вам в большинстве случаев будет необходимо воздерживаться от 
-масштабирования. 
+Вам, как правило, будет необходимо воздерживаться от масштабирования.
 Если Вы не будете масштабировать, но всё ещё желаете размеры,
 кратные 16, то Вам придётся проводить излишнее усечение.
 Не проводите неполное усечение, поскольку чёрные полосы очень
@@ -986,24 +984,22 @@ MPEG разбивает видео на квадраты 16х16, называе
 
 <para>
 Поскольку MPEG-4 использует макроблоки 16х16, Вы должны убедиться,
-что каждое измерение кодируемого видео кратно 16; иначе Вы ухудшите 
-качество, особенно на малых битпотоках. Вы можете сделать это, 
-округлив ширину и высоту прямоугольника усечения до ближайшего 
+что каждое измерение кодируемого видео кратно 16; иначе Вы ухудшите
+качество, особенно на малых битпотоках. Вы можете сделать это,
+округлив ширину и высоту прямоугольника усечения до ближайшего
 меньшего целого, кратного 16.
-Учитывая установленное ранее, при усечении Вы можете захотеть увеличить
-смещение по Y на половину разности старой и новой высоты, так что
-полученное видео будет браться из центра кадра.
-  
+Как указано выше, при усечении Вам необходимо увеличить смещение по
+Y на половину разности старой и новой высоты, так что полученное
+видео будет браться из центра кадра.
 И из-за способа дискретизации DVD видео, убедитесь, что смещение
-есть чётное число. (Фактически, возьмите за правило никогда не 
+есть чётное число. (Фактически, возьмите за правило никогда не
 использовать нечётные величины для любых параметров усечения или
 масштабирования видео.) Если Вы беспокоитесь из-за нескольких
 излишне отброшенных битов, возможно, Вы предпочтёте взамен
 масштабировать видео. Мы рассмотрим это ниже в нашем примере.
-
 В действительности, Вы можете доверить фильтру
 <option>cropdetect</option> сделать для Вас всё вышеупомянутое,
-т.к. у него есть необязательный параметр округления 
+т.к. у него есть необязательный параметр округления
 <option>round</option>, равный 16 по умолчанию.
 </para>
 
@@ -1015,13 +1011,13 @@ MPEG разбивает видео на квадраты 16х16, называе
 
 <para>
 После всего выше сказанного и сделанного, Вы, вероятно, получите
-видео не точно формата 1:85.1 или 2.35:1, а с чем-то близким 
-к этому.  Вы можете вычислить новый коэффициент соотношения 
-сторон вручную, но <application>MEncoder</application> 
+видео не точно формата 1:85.1 или 2.35:1, а с чем-то близким
+к этому.  Вы можете вычислить новый коэффициент соотношения
+сторон вручную, но <application>MEncoder</application>
 предоставляет опцию для <systemitem class="library">libavcodec</systemitem>,
 называемую <option>autoaspect</option>, которая сделает это для
-Вас. Ни в коем случае не увеличивайте размер этого видео с целью 
-квадратизации пикселей, если Вы не желаете впустую потратить 
+Вас. Ни в коем случае не увеличивайте размер этого видео с целью
+квадратизации пикселей, если Вы не желаете впустую потратить
 место на жёстком диске.
 Масштабирование должно выполняться при воспроизведении, и плеер
 использует коэффициент соотношения сторон, сохранённый в AVI, для
@@ -1038,12 +1034,12 @@ MPEG разбивает видео на квадраты 16х16, называе
 
 <para>
 Если Вы не собираетесь кодировать в режиме постоянного квантователя,
-Вам нужно выбрать битпоток. 
+Вам нужно выбрать битпоток.
 Понятие битпотока очень просто: это среднее число битов, которые
 будут использованы для сохранения Вашего фильма, в секунду.
 Обычно битпоток измеряется в килобитах (1000 бит) в секунду.
-Размер Вашего фильма на диске есть битпоток, умноженный на 
-длительность фильма, плюс небольшие накладные расходы 
+Размер Вашего фильма на диске есть битпоток, умноженный на
+длительность фильма, плюс небольшие накладные расходы
 (см. раздел
 <link linkend="menc-feat-dvd-mpeg4-muxing-avi-limitations">контейнер AVI</link>
 для примера).
@@ -1054,9 +1050,9 @@ MPEG разбивает видео на квадраты 16х16, называе
 
 <para>
 Битпоток изменяется <emphasis role="bold">не</emphasis>
-пропорционально разрешению. 
-То есть файл разрешением 320х240 с 200 кбит/сек не будет 
-того же качества, что этот же фильм разрешением 640х480 
+пропорционально разрешению.
+То есть файл разрешением 320х240 с 200 кбит/сек не будет
+того же качества, что этот же фильм разрешением 640х480
 и 800 кбит/сек!
 Для этого есть две причины:
 <orderedlist>
@@ -1065,19 +1061,19 @@ MPEG разбивает видео на квадраты 16х16, называе
   замечаете MPEG артефакты, если они больше!
   Артефакты возникают на масштабе блоков (8х8).
   Ваш глаз не увидит ошибки в 4800 маленьких блоков так же
-  легко, как и в 1200 больших блоков (предполагая 
+  легко, как и в 1200 больших блоков (предполагая
   масштабирование обоих фильмов на полный экран).
 </para></listitem>
 <listitem><para>
-  <emphasis role="bold">Теоретическая</emphasis>: Когда Вы 
+  <emphasis role="bold">Теоретическая</emphasis>: Когда Вы
   уменьшаете размер изображения, но продолжаете использовать
-  блоки того же размера (8х8) для пространственных частотных 
+  блоки того же размера (8х8) для пространственных частотных
   преобразований, Вы перемещаете больше данных в высокочастотные
   полосы. Грубо говоря, каждый пиксель содержит больше деталей,
   чем раньше.
-  Так что несмотря на то, что Ваша картинка с уменьшенным 
+  Так что несмотря на то, что Ваша картинка с уменьшенным
   масштабом содержит 1/4 информации в пространственных направлениях,
-  она всё ещё может содержать большУю часть информации в 
+  она всё ещё может содержать большУю часть информации в
   частотных интервалах (предполагая, что высокие частоты были
   не использованы в оригинальном 640х480 изображении).
 </para></listitem>
@@ -1086,7 +1082,7 @@ MPEG разбивает видео на квадраты 16х16, называе
 
 <para>
 Последние руководства рекомендовали выбор битпотока и разрешения,
-основываясь на приближении "бит на пиксель", но это обычно не 
+основываясь на приближении "бит на пиксель", но это обычно не
 верно из-за упомянутых выше причин.
 Похоже, лучшей оценкой является рост битпотока пропорционально
 квадратному корню разрешения, так что 320х240 и 400 кбит/сек
@@ -1107,7 +1103,7 @@ MPEG разбивает видео на квадраты 16х16, называе
 <title>Расчёт разрешения</title>
 
 <para>
-Следующие шаги помогут Вам рассчитать разрешение для Вашего 
+Следующие шаги помогут Вам рассчитать разрешение для Вашего
 кодирования без слишком сильного искажения видео, учитывая
 несколько видов информации об исходном видео.
 Прежде всего, Вам необходимо рассчитать коэффициент соотношения
@@ -1142,21 +1138,21 @@ CQ соответствует числу битов на пиксель и на
 Грубо говоря, чем больше CQ, тем меньше вероятность увидеть
 артефакты кодирования.
 Однако, если у Вас есть заданный размер для Вашего фильма
-(например, 1 или 2 CD), есть ограниченное общее число битов, 
-которые Вы можете потратить; поэтому важно найти хороший 
+(например, 1 или 2 CD), есть ограниченное общее число битов,
+которые Вы можете потратить; поэтому важно найти хороший
 компромисс между сжимаемостью и качеством.
 </para>
 
 <para>
 CQ зависит от битпотока, эффективности видеокодека и разрешения фильма.
 Обычно, в целях увеличения CQ, Вам нужно будет уменьшить размер
-фильма, при условии, что битпоток, вычисленный как функция конечного 
+фильма, при условии, что битпоток, вычисленный как функция конечного
 размера, и длина фильма постоянны.
 С MPEG-4 ASP кодеками, такими как <systemitem class="library">Xvid</systemitem>
-и <systemitem class="library">libavcodec</systemitem>, CQ 
+и <systemitem class="library">libavcodec</systemitem>, CQ
 меньше 0.18 обычно приводит к изображению с большим числом
 сегментов "квадратиками", из-за недостаточного числа битов для
-кодирования информации в каждом макроблоке. 
+кодирования информации в каждом макроблоке.
 (MPEG4, как и многие другие кодеки, группирует пиксели в блоки по
 несколько пикселей для сжатия изображения; если битов не хватает,
 границы этих блоков заметны.)
@@ -1169,17 +1165,17 @@ CQ зависит от битпотока, эффективности видео
 <link linkend="menc-feat-xvid-example-settings"><systemitem class="library">Xvid</systemitem></link>
 должны сделать возможным получение того же качества с CQ в диапазоне
 от 0.18 до 0.20 для рипа на 1 CD и 0.24-0.26 для рипа на 2 CD.
-Используя MPEG-4 AVC кодеки, такие как 
+Используя MPEG-4 AVC кодеки, такие как
 <systemitem class="library">x264</systemitem>, Вы можете использовать
 CQ в диапазоне от 0.14 до 0.16 со стандартными опциями кодирования
-и должны суметь достичь таких низких значений, как 0.10 - 0.12
+и должны суметь достичь таких низких значений, как 0.10 &mdash; 0.12
 с помощью
 <link linkend="menc-feat-x264-example-settings">продвинутых опций кодирования <systemitem class="library">x264</systemitem></link>.
 </para>
 
 <para>
 Пожалуйста, обратите внимание, что CQ &mdash; лишь показательная величина,
-т.к. она зависит от кодируемого содержимого; CQ 0.18 может хорошо 
+т.к. она зависит от кодируемого содержимого; CQ 0.18 может хорошо
 смотреться для Бергмана (Bergman), в отличии от такого фильма как
 Матрица (The Matrix), содержащего много сцен с быстрым движением.
 С другой стороны, бесполезно увеличивать CQ выше 0.30, т.к. Вы
@@ -1199,7 +1195,7 @@ CQ в диапазоне от 0.14 до 0.16 со стандартными оп
 <para>
 Изучение использования видео фильтров <application>MEncoder</application>
 важно для получения хороших результатов кодирования.
-Вся обработка видео выполняется посредством фильтров: усечение, 
+Вся обработка видео выполняется посредством фильтров: усечение,
 масштабирование, подстройка цвета, удаление шума, увеличение
 чёткости, деинтерлейс (преобразование видео из чересстрочной
 развёртки в построчную), телесин, обратный телесин и удаление
@@ -1215,7 +1211,7 @@ CQ в диапазоне от 0.14 до 0.16 со стандартными оп
 
 <screen>-vf фильтр1=опции,фильтр2=опции,...</screen>
 
-Большинство фильтров используют численные значения опций, 
+Большинство фильтров используют численные значения опций,
 разделённые двоеточиями, но синтаксис этих параметров различается
 у разных фильтров, так что читайте мануал для детальной
 информации о фильтрах, которые Вы желаете использовать.
@@ -1227,7 +1223,7 @@ CQ в диапазоне от 0.14 до 0.16 со стандартными оп
 
 <screen>-vf crop=688:464:12:4,scale=640:464</screen>
 
-сперва усечёт область изображения до 688х464 с верхним левым 
+сперва усечёт область изображения до 688х464 с верхним левым
 углом (12,4), а затем масштабирует результат до 640х464.
 </para>
 
@@ -1236,29 +1232,29 @@ CQ в диапазоне от 0.14 до 0.16 со стандартными оп
 рядом с ним) с целью получения преимущества от использования
 информации после видеодекодера, которая будет потеряна или
 искажена другими фильтрами.
-Важнейшими примерами являются: <option>pp</option> (постобработка, 
+Важнейшими примерами являются: <option>pp</option> (постобработка,
 только при выполнении операций удаления блочной сегментации
 (deblocking) или увеличения чёткости краёв (deringing)),
 <option>spp</option> (другой фильтр постобработки, служащий для
 удаления артефактов MPEG), <option>pullup</option> (обратный
-телесин), и <option>softpulldown</option> (для преобразования 
+телесин), и <option>softpulldown</option> (для преобразования
 мягкого телесина в жёсткий).
 </para>
 
 <para>
-В общем случае, Вам следует делать настолько мало фильтрации, 
+В общем случае, Вам следует делать настолько мало фильтрации,
 насколько это возможно, для того чтоб остаться близко к оригинальному
 DVD источнику. Усечение часто необходимо (как описано выше), но
-избегайте масштабирования видео. Несмотря на то, что уменьшение 
-размера иногда предпочтительно использованию бОльших 
-квантователей, нужно избегать и того, и другого: помните, 
+избегайте масштабирования видео. Несмотря на то, что уменьшение
+размера иногда предпочтительно использованию бОльших
+квантователей, нужно избегать и того, и другого: помните,
 что мы с самого начала решили обменять биты на качество.
 </para>
 
 <para>
 Также не корректируйте гамму, контрастность, яркость и т.п.. То,
 что хорошо выглядит на Вашем мониторе, может плохо выглядеть
-на других. Эти коррекции должны выполняться только при 
+на других. Эти коррекции должны выполняться только при
 воспроизведении.
 </para>
 
@@ -1269,11 +1265,11 @@ DVD источнику. Усечение часто необходимо (как
 Ещё раз, причиной этому является то, что этим битам можно найти
 лучшее применение: зачем тратить их, кодируя шум, если Вы просто
 можете вернуть этот шум в процессе воспроизведения?
-Увеличение параметров для <option>hqdn3d</option> дополнительно 
+Увеличение параметров для <option>hqdn3d</option> дополнительно
 улучшит сжимаемость, но увеличив значения слишком сильно, Вы рискуете
-ухудшить различимость изображения. 
-Рекомендованные выше значения (<option>2:1:2</option>) слегка 
-консервативны; не бойтесь экспериментировать с более высокими 
+ухудшить различимость изображения.
+Рекомендованные выше значения (<option>2:1:2</option>) слегка
+консервативны; не бойтесь экспериментировать с более высокими
 значениями и самостоятельно оценивать результаты.
 </para>
 </sect2>
@@ -1284,9 +1280,9 @@ DVD источнику. Усечение часто необходимо (как
 <title>Чересстрочная развёртка и телесин</title>
 
 <para>
-Почти все фильмы снимаются при 24 fps [кадр/сек]. Поскольку 
+Почти все фильмы снимаются при 24 fps [кадр/сек]. Поскольку
 в NTSC используется 30000/1001 fps, нужно выполнить некоторую
-обработку для такого 24 fps видео, чтобы оно корректно 
+обработку для такого 24 fps видео, чтобы оно корректно
 воспроизводилось при кадровой частоте NTSC. Этот процесс называется
 3:2 пулдаун, обычно называемый телесин (поскольку пулдаун часто
 применяется в процессе показа телевизионного фильма, англ. telecine);
@@ -1303,13 +1299,13 @@ DVD источнику. Усечение часто необходимо (как
 воспроизводится слегка быстрее, но если Вы не пришелец, то,
 вероятно, не заметите разницы.
 У большинства PAL DVD аудио скорректировано по высоте звука так,
-что, воспроизводясь при 25 fps, оно звучит нормально, несмотря на 
-то, что аудиодорожка (и, следовательно, весь фильм) проигрываются 
+что, воспроизводясь при 25 fps, оно звучит нормально, несмотря на
+то, что аудиодорожка (и, следовательно, весь фильм) проигрываются
 на 4% быстрее, чем NTSC DVD.
 </para>
 
 <para>
-Поскольку видео на PAL DVD не переделывается, Вам не стоит 
+Поскольку видео на PAL DVD не переделывается, Вам не стоит
 беспокоится о частоте кадров. У источника 25 fps и у Вашего
 рипа будет 25 fps. Однако, если Вы делаете рип NTSC DVD фильма,
 Вам, быть может, придётся выполнить обратный телесин.
@@ -1317,7 +1313,7 @@ DVD источнику. Усечение часто необходимо (как
 
 <para>
 Для фильмов, снятых на 24 fps, видео на NTSC DVD идёт либо с телесином
-30000/1001, либо с построчной развёрткой 24000/1001 fps и 
+30000/1001, либо с построчной развёрткой 24000/1001 fps и
 предназначается для телесина на лету с помощью DVD плеера.
 С другой стороны, TV сериалы идут обычно только с чересстрочной развёрткой,
 но без телесина. Это не строгое правило: есть сериалы с
@@ -1349,14 +1345,14 @@ pullup,softskip</option>.
 
 <para>
 Если Вы желаете кодировать фильм с чересстрочной развёрткой
-(NTSC или PAL видео), Вам нужно решить, будете ли Вы его 
+(NTSC или PAL видео), Вам нужно решить, будете ли Вы его
 преобразовывать в построчную развёртку или нет.
-Хотя такое преобразование (деинтерлейс) сделает Ваш фильм 
+Хотя такое преобразование (деинтерлейс) сделает Ваш фильм
 пригодным для дисплеев с построчной развёрткой, таких как
 компьютерные мониторы и проекторы, это будет иметь свою цену:
-частота полей уменьшится вдвое от 50 или 60000/1001 до 25 или 
-30000/1001 поля в секунду, и примерно половина информации в 
-Вашем фильме будет потеряна в сценах со значительным движением. 
+частота полей уменьшится вдвое от 50 или 60000/1001 до 25 или
+30000/1001 поля в секунду, и примерно половина информации в
+Вашем фильме будет потеряна в сценах со значительным движением.
 </para>
 
 <para>
@@ -1364,9 +1360,9 @@ pullup,softskip</option>.
 не рекомендуется делать деинтерлейс. Вы всегда можете преобразовать
 развёртку фильма в процессе воспроизведения (при воспроизведении
 на устройствах с построчной развёрткой).
-Мощность современных компьютеров вынуждает плееры использовать 
+Мощность современных компьютеров вынуждает плееры использовать
 фильтр деинтерлейса, что слегка ухудшает качество изображения.
-Но плееры будущего будут способны имитировать дисплей TV с 
+Но плееры будущего будут способны имитировать дисплей TV с
 чересстрочной развёрткой, выполняя деинтерлейс на полной частоте
 полей и интерполируя 50 или 60000/1001 кадров в секунду для
 чересстрочного видео.
@@ -1385,8 +1381,8 @@ pullup,softskip</option>.
   чересстрочной развёртки.
 </para></listitem>
 <listitem><para>
-  Фильтры постобработки и удаления шума могут не работать как 
-  ожидается, только если Вы особо не позаботитесь об их 
+  Фильтры постобработки и удаления шума могут не работать как
+  ожидается, только если Вы особо не позаботитесь об их
   применении к одному полю за раз, иначе они могут
   повредить видео при неверном использовании.
 </para></listitem>
@@ -1398,7 +1394,7 @@ pullup,softskip</option>.
 mencoder <replaceable>захват.avi</replaceable> -mc 0 -oac lavc -ovc lavc -lavcopts \
 vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224
 </screen>
-Обратите внимание на опции <option>ilme</option> и <option>ildct</option>. 
+Обратите внимание на опции <option>ilme</option> и <option>ildct</option>.
 </para>
 </sect2>
 
@@ -1411,12 +1407,12 @@ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224
 Алгоритмы аудио/видео (A/V) синхронизации <application>MEncoder</application>
 были разработаны с целью восстановления файлов с повреждённой
 синхронизацией.
-Однако, в ряде случаев они могут привести к ненужному пропуску 
+Однако, в ряде случаев они могут привести к ненужному пропуску
 или повторению кадров и, возможно, к лёгкой A/V рассинхронизации
-корректных входных данных (конечно, проблемы A/V синхронизации 
+корректных входных данных (конечно, проблемы A/V синхронизации
 возникают только при обработке или копировании аудиотрека при
 кодировании видео, что настоятельно рекомендуется).
-Поэтому Вы можете переключиться на базовую A/V синхронизацию 
+Поэтому Вы можете переключиться на базовую A/V синхронизацию
 с помощью опции <option>-mc 0</option> или разместить это в
 конфигурационном файле <systemitem>~/.mplayer/mencoder</systemitem>,
 если Вы работаете только с хорошими источниками (DVD, TV-захват,
@@ -1425,13 +1421,13 @@ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224
 </para>
 
 <para>
-Если Вы хотите дополнительно защититься от странных пропусков 
+Если Вы хотите дополнительно защититься от странных пропусков
 и повторений кадров, Вы можете одновременно использовать опции
 <option>-mc 0</option> и <option>-noskip</option>.
-Это предотвратит <emphasis>любую</emphasis> A/V коррекцию, и 
+Это предотвратит <emphasis>любую</emphasis> A/V коррекцию, и
 будет копировать кадры один в один, так что Вы не сможете это
 использовать, если будете применять какие-либо фильтры, которые
-непредсказуемо добавляют или отбрасывают кадры, либо если у 
+непредсказуемо добавляют или отбрасывают кадры, либо если у
 Вашего входного файла переменный битопоток!
 Поэтому использование <option>-noskip</option> в общем случае не
 рекомендуется.
@@ -1442,7 +1438,7 @@ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224
 поддерживаемое <application>MEncoder</application>, вызывало
 A/V рассинхронизацию.
 Это наверняка произойдёт при использовании совместно с некоторыми
-фильтрами, поэтому сейчас <emphasis>не</emphasis> рекомендуется 
+фильтрами, поэтому сейчас <emphasis>не</emphasis> рекомендуется
 использовать трёхпроходный аудио режим.
 Эта возможность оставлена только для совместимости и для опытных
 пользователей, понимающих когда это безопасно, а когда нет.
@@ -1453,7 +1449,7 @@ A/V рассинхронизацию.
 <para>
 Также были сообщения об A/V рассинхронизации при кодировании
 со стандартного ввода (stdin) с помощью <application>MEncoder</application>.
-Не делайте этого! Всегда взамен используйте файл или CD/DVD и т.п. 
+Не делайте этого! Всегда взамен используйте файл или CD/DVD и т.п.
 устройство.
 </para>
 </sect2>
@@ -1464,7 +1460,7 @@ A/V рассинхронизацию.
 <title>Выбор видеокодека</title>
 
 <para>
-То, какой видеокодек лучше выбрать, зависит от нескольких 
+То, какой видеокодек лучше выбрать, зависит от нескольких
 факторов, таких как размер, качество, устойчивость к ошибкам,
 практичность и распространённость, многие из которых сильно
 зависят от личных предпочтений и технических ограничений.
@@ -1473,13 +1469,13 @@ A/V рассинхронизацию.
 <listitem>
   <para>
   <emphasis role="bold">Эффективность сжатия</emphasis>:
-  Достаточно очевидно, что большинство кодеков нового поколения 
+  Достаточно очевидно, что большинство кодеков нового поколения
   разработаны для увеличения качества и степени сжатия.
   Поэтому, авторы данного руководства и многие другие люди полагают,
   что Вы не можете ошибиться
   <footnote id='fn-menc-feat-dvd-mpeg4-codec-cpu'><para>
-   Несмотря на это, будьте осторожны: для декодирования MPEG-4 AVC 
-   видео с DVD разрешением необходима быстрая машина (например, 
+   Несмотря на это, будьте осторожны: для декодирования MPEG-4 AVC
+   видео с DVD разрешением необходима быстрая машина (например,
    Pentium 4 свыше 1.5 ГГц или Pentium M свыше 1 ГГц).
   </para></footnote>,
   выбирая MPEG-4 AVC кодеки (например,
@@ -1487,24 +1483,24 @@ A/V рассинхронизацию.
   вместо таких MPEG-4 ASP кодеков, как
   <systemitem class="library">libavcodec</systemitem> MPEG-4 или
   <systemitem class="library">Xvid</systemitem>.
-  (Опытные разработчики кодеков могут быть заинтересованы в 
+  (Опытные разработчики кодеков могут быть заинтересованы в
   ознакомлении с точкой зрения Михаэля Нидермайера (Michael
   Niedermayer)
   "<ulink url="http://guru.multimedia.cx/?p=10">почему MPEG4-ASP отстой</ulink>".)
   Аналогично, Вы должны получить лучшее качество с MPEG-4 ASP, по
   сравнению с MPEG-2 кодеками.
   </para>
-  
+
   <para>
-  Однако, новые кодеки, находящиеся в интенсивной разработке, 
-  могут страдать от ещё не замеченных ошибок, которые могут 
-  испортить кодирование. Просто это плата за использование 
+  Однако, новые кодеки, находящиеся в интенсивной разработке,
+  могут страдать от ещё не замеченных ошибок, которые могут
+  испортить кодирование. Просто это плата за использование
   передовых технологий.
   </para>
-  
+
   <para>
   Более существенно то, что для начала использования нового кодека
-  необходимо потратить время на изучение его опций так, чтобы Вы 
+  необходимо потратить время на изучение его опций так, чтобы Вы
   знали, что нужно подстраивать для достижения заданного качества
   изображения.
   </para>
@@ -1512,10 +1508,10 @@ A/V рассинхронизацию.
 
 <listitem><para>
   <emphasis role="bold">Аппаратная совместимость</emphasis>:
-  Обычно необходимо длительное время для включения поддержки 
+  Обычно необходимо длительное время для включения поддержки
   последних видеокодеков в автономные видеоплееры.
-  В итоге, большинство поддерживает только MPEG-1 (наподобие 
-  VCD, XVCD и KVCD), MPEG-2 (например, DVD, SVCD и KVCD) и MPEG-4 
+  В итоге, большинство поддерживает только MPEG-1 (наподобие
+  VCD, XVCD и KVCD), MPEG-2 (например, DVD, SVCD и KVCD) и MPEG-4
   ASP (например, DivX,
   <systemitem class="library">libavcodec</systemitem> LMP4 и
   <systemitem class="library">Xvid</systemitem>)
@@ -1529,34 +1525,34 @@ A/V рассинхронизацию.
   <emphasis role="bold">Лучшее соотношение качества и времени кодирования</emphasis>:
   Кодеки, уже использующиеся определённое время (например,
   <systemitem class="library">libavcodec</systemitem> MPEG-4 и
-  <systemitem class="library">Xvid</systemitem>) обычно сильно 
-  оптимизированы всевозможными остроумными алгоритмами и 
+  <systemitem class="library">Xvid</systemitem>) обычно сильно
+  оптимизированы всевозможными остроумными алгоритмами и
   ассемблерным SIMD кодом. Поэтому они обладают тенденцией
   достижения лучшего соотношения качества к времени кодирования.
   Однако, у них могут быть некоторые очень продвинутые опции,
   которые, будучи включенными, сделают кодирование очень медленным
   ради несущественного выигрыша.
   </para>
-  
+
   <para>
-  Если Вам нужна высокая скорость, примерно придерживайтесь настроек 
+  Если Вам нужна высокая скорость, примерно придерживайтесь настроек
   видеокодека по умолчанию (хотя Вам стоит попробовать другие опции,
-  упоминаемые в иных разделах данного руководства). 
+  упоминаемые в иных разделах данного руководства).
   </para>
-  
+
   <para>
-  Вы так же можете рассмотреть вариант использования многопоточного 
+  Вы так же можете рассмотреть вариант использования многопоточного
   кодека, хотя это полезно только для пользователей машин с
   несколькими процессорами.
   <systemitem class="library">libavcodec</systemitem> MPEG-4 позволяет
   это, но выигрыш в скорости ограничен и есть небольшой отрицательный
   эффект для качества картинки.
   Многопоточное кодирование <systemitem class="library">Xvid</systemitem>,
-  включаемое опцией <option>threads</option>, может использоваться для 
+  включаемое опцией <option>threads</option>, может использоваться для
   ускорения кодирования (на примерно 40-60% в типичных случаях)
   с небольшим ухудшением картинки или вообще без него.
-  <systemitem class="library">x264</systemitem> также позволяет 
-  многопоточное кодирование, что обычно ускоряет процесс на 94% 
+  <systemitem class="library">x264</systemitem> также позволяет
+  многопоточное кодирование, что обычно ускоряет процесс на 94%
   для каждого CPU ядра с уменьшением PSNR от 0.005 дБ до 0.01 дБ при типичных
   настройках.
   </para>
@@ -1565,21 +1561,21 @@ A/V рассинхронизацию.
 <listitem>
   <para>
   <emphasis role="bold">Личные предпочтения</emphasis>:
-  Здесь всё становится почти неразумным: из-за тех же причин, по 
+  Здесь всё становится почти неразумным: из-за тех же причин, по
   которым одни придерживаются DivX&nbsp;3 в течении лет, в то время
   как новые кодеки уже творят чудеса, другие люди предпочитают
   <systemitem class="library">Xvid</systemitem> или
   <systemitem class="library">libavcodec</systemitem> MPEG-4
   использованию <systemitem class="library">x264</systemitem>.
   </para>
-  
+
   <para>
-  Вам нужно принимать решение самостоятельно; не слушайте советов 
+  Вам нужно принимать решение самостоятельно; не слушайте советов
   людей, признающих только один кодек.
   Сделайте несколько образцов клипов из искомых источников и
   сравните разные опции кодирования и кодеки, с целью выбора
   того, что Вам наиболее подходит.
-  Лучший кодек &mdash; это тот, которым Вы сами овладели, и 
+  Лучший кодек &mdash; это тот, которым Вы сами овладели, и
   который выглядит лучше всего для Ваших глаз на Вашем дисплее
   <footnote id='fn-menc-feat-dvd-mpeg4-codec-playback'><para>
   Один и тот же результат кодирования может не выглядеть таким же
@@ -1604,30 +1600,30 @@ A/V рассинхронизацию.
 <title>Аудио</title>
 
 <para>
-Аудио &mdash; это гораздо более простая проблема: если Вы 
+Аудио &mdash; это гораздо более простая проблема: если Вы
 беспокоитесь о качестве, просто оставьте всё как есть.
-Даже потоки AC-3 5.1 не более чем 448 Кбит/с и они стоят каждого 
-бита. Вы можете соблазниться перекодированием аудио в 
-высококачественный Vorbis (он же ogg формат), но лишь то, что 
+Даже потоки AC-3 5.1 не более чем 448 Кбит/с и они стоят каждого
+бита. Вы можете соблазниться перекодированием аудио в
+высококачественный Vorbis (он же ogg формат), но лишь то, что
 у Вас сегодня нет A/V приёмника для пропускания AC-3, не означает,
-что у Вас не будет его завтра. Для жизнеспособности Ваших DVD 
+что у Вас не будет его завтра. Для жизнеспособности Ваших DVD
 рипов в будущем, сохраняйте поток AC-3.
-Вы можете сохранить поток AC-3, копируя его непосредственно в 
+Вы можете сохранить поток AC-3, копируя его непосредственно в
 видеопоток <link linkend="menc-feat-mpeg4">в процессе кодирования</link>.
-Вы также можете извлечь AC-3 поток с целью мультиплексирования его 
+Вы также можете извлечь AC-3 поток с целью мультиплексирования его
 в контейнеры наподобие NUT или Matroska (Матрёшка).
 <screen>
 mplayer <replaceable>файл_источника.vob</replaceable> -aid 129 -dumpaudio -dumpfile <replaceable>звук.ac3</replaceable></screen>
 сохранит в файл <replaceable>звук.ac3</replaceable> аудиодорожку
 с номером 129 из файла
 <replaceable>файл_источника.vob</replaceable> (Обратите внимание:
-DVD VOB файлы обычно используют нумерацию аудио, отличную от 
+DVD VOB файлы обычно используют нумерацию аудио, отличную от
 стандартной, что означает, что аудиодорожка VOB 129 &mdash; это вторая
 аудиодорожка файла).
 </para>
 
 <para>
-Но иногда у Вас действительно нет иного выбора, чем далее сжимать 
+Но иногда у Вас действительно нет иного выбора, чем далее сжимать
 звук для того, чтоб больше битов могло быть потрачено на видео.
 Большинство людей предпочитают сжимать звук с помощью MP3 или
 Vorbis аудиокодеков.
@@ -1637,7 +1633,7 @@ Vorbis аудиокодеков.
 
 <para>
 <emphasis>Не</emphasis> используйте <option>-nosound</option> при
-кодировании файла с аудио, даже если позже Вы будете отдельно 
+кодировании файла с аудио, даже если позже Вы будете отдельно
 кодировать и мультеплексировать аудио.
 Хотя это может работать в идеальных случаях, использование
 <option>-nosound</option> обычно скрывает ряд проблем в Ваших
@@ -1649,46 +1645,46 @@ Vorbis аудиокодеков.
 </para>
 
 <para>
-Вам необходимо обработать звук с помощью 
-<application>MEncoder</application>. 
-Например, Вы можете копировать исходную звуковую дорожку в 
+Вам необходимо обработать звук с помощью
+<application>MEncoder</application>.
+Например, Вы можете копировать исходную звуковую дорожку в
 процессе кодирования с помощью <option>-oac copy</option> или
 преобразовать её в "лёгкий" 4 кГц моно WAV PCM с помощью
 <option>-oac pcm -channels 1 -srate 4000</option>.
-Иначе, в ряде случаев, будет создаваться видео файл, 
+Иначе, в ряде случаев, будет создаваться видео файл,
 рассинхронизированный с аудио.
 Такие случаи происходят, когда число кадров видео исходного файла
 не совпадает с полной длиной кадров аудио, или когда были
-разрывы/сшивания потока, где появились пропущенные или излишние 
+разрывы/сшивания потока, где появились пропущенные или излишние
 аудиокадры.
 Правильным решением подобных проблем является вставка тишины или
 усечение аудио в таких точках.
 Однако, <application>MPlayer</application> не может это сделать
 и если Вы демультиплексируете AC-3 аудио и кодируете его отдельным
 приложением (или создаёте дамп в PCM с помощью
-<application>MPlayer</application>), сшивания останутся 
+<application>MPlayer</application>), сшивания останутся
 нескорректированными и единственный испособ их исправить &mdash;
 пропускать/дублировать видеокадры в местах сшивки.
-Пока <application>MEncoder</application> видит аудио при 
+Пока <application>MEncoder</application> видит аудио при
 кодировании видео, он может выполнять этот пропуск/дублирование
 (что обычно не вызывыет проблем, т.к. происходит при полностью
 чёрных кадрах или при смене сцен), но если
 <application>MEncoder</application> не доступно аудио, он просто
 будет обрабатывать все кадры "как есть" и они не будут совпадать
-с окончательным аудиопотоком, когда Вы, например, объедините 
+с окончательным аудиопотоком, когда Вы, например, объедините
 аудио и видео дорожки в Matroska файл.
 </para>
 
 <para>
-Прежде всего, Вам необходимо преобразовать DVD звук в WAV файл, 
-который может использоваться аудиокодеком в качестве входных 
+Прежде всего, Вам необходимо преобразовать DVD звук в WAV файл,
+который может использоваться аудиокодеком в качестве входных
 данных. Например:
 <screen>
-mplayer <replaceable>исходный_файл.vob</replaceable> -ao pcm:file=<replaceable>звук.wav</replaceable> 
+mplayer <replaceable>исходный_файл.vob</replaceable> -ao pcm:file=<replaceable>звук.wav</replaceable>
     -vc dummy -aid 1 -vo null
 </screen>
 сохранит вторую аудиодорожку из файла
-<replaceable>исходный_файл.vob</replaceable> в файл 
+<replaceable>исходный_файл.vob</replaceable> в файл
 <replaceable>звук.wav</replaceable>.
 Возможно, Вы захотите нормализовать звук перед кодированием,
 поскольку аудиодорожки DVD обычно записываются с маленькой
@@ -1699,14 +1695,14 @@ mplayer <replaceable>исходный_файл.vob</replaceable> -ao pcm:file=<r
 делает то же самое.
 Вы можете сжать в Vorbis или MP3. Например:
 <screen>oggenc -q1 <replaceable>звук.wav</replaceable></screen>
-кодирует <replaceable>звук.wav</replaceable> с качеством 1, 
+кодирует <replaceable>звук.wav</replaceable> с качеством 1,
 что примерно эквивалентно 80 Кб/с и является минимальным качеством,
 при котором Вам нужно кодировать, если Вы заботитесь о качестве.
-Пожалуйста, обратите внимание, что <application>MEncoder</application> 
-на данный момент не поддерживает мультиплексирование аудиопотоков 
+Пожалуйста, обратите внимание, что <application>MEncoder</application>
+на данный момент не поддерживает мультиплексирование аудиопотоков
 Vorbis в выходной файл, поскольку он поддерживает только AVI и
-MPEG контейнеры для выходных файлов, использование каждого из 
-которых может привести к проблемам A/V синхронизации с 
+MPEG контейнеры для выходных файлов, использование каждого из
+которых может привести к проблемам A/V синхронизации с
 некоторыми плеерами, в случае когда AVI файл содержит VBR
 аудиопотоки наподобие Vorbis.
 Не беспокойтесь, в данном документе будет рассказано как Вы
@@ -1721,8 +1717,8 @@ MPEG контейнеры для выходных файлов, использо
 
 <para>
 Теперь, после того как Вы кодировали видео, скорее всего, Вы
-захотите мультиплексировать его с одним или несколькими 
-аудиопотоками в такие видео контейнеры как AVI, MPEG, 
+захотите мультиплексировать его с одним или несколькими
+аудиопотоками в такие видео контейнеры как AVI, MPEG,
 Matroska или NUT.
 На данный момент встроенная поддержка вывода аудио и видео в
 <application>MEncoder</application> есть только для форматов
@@ -1741,7 +1737,7 @@ mencoder -oac copy -ovc copy -o <replaceable>выходной_фильм.avi</re
 </para>
 
 <para>
-<application>MEncoder</application> 
+<application>MEncoder</application>
 обладает экспериментальной поддержкой
 <systemitem class="library">libavformat</systemitem> &mdash;
 библиотеки из проекта FFmpeg, поддерживающей мультиплексирование
@@ -1754,12 +1750,12 @@ mencoder -oac copy -ovc copy -o <replaceable>выходной_фильм.asf</re
 </screen>
 Это сделает то же самое, что и предыдущий пример, но выходным
 контейнером будет ASF.
-Пожалуйста, обратите внимание, что эта поддержка весьма 
+Пожалуйста, обратите внимание, что эта поддержка весьма
 экспериментальна (но становится лучше c каждым днём), и будет
-работать только в случае компиляции <application>MPlayer</application> 
-с включенной поддержкой  
-<systemitem class="library">libavformat</systemitem> (что означает, 
-что в большинстве случаев бинарная версия из пакетов не будет 
+работать только в случае компиляции <application>MPlayer</application>
+с включенной поддержкой
+<systemitem class="library">libavformat</systemitem> (что означает,
+что в большинстве случаев бинарная версия из пакетов не будет
 работать).
 </para>
 
@@ -1769,25 +1765,25 @@ mencoder -oac copy -ovc copy -o <replaceable>выходной_фильм.asf</re
 
 <para>
 Вы можете столкнуться с некоторыми серьёзными проблемами A/V
-синхронизации при попытке мультиплексирования Вашего видео 
+синхронизации при попытке мультиплексирования Вашего видео
 с некоторыми аудиодорожками, где, как бы Вы не подбирали задержку
 аудио, никогда не получается правильная синхронизация.
 Это может происходить при использовании некоторых видеофильтров,
 пропускающих или дублирующих некоторые кадры, например фильтров
 обратного телесина.
-Настоятельно рекомендуется добавлять видеофильтр 
+Настоятельно рекомендуется добавлять видеофильтр
 <option>harddup</option> в конце цепочки фильтров для избежания
 подобных проблем.
 </para>
 
 <para>
-Без опции <option>harddup</option>, в случае когда 
-<application>MEncoder</application> хочет дублировать кадр, он 
-полагается на то, что мультиплексор расположит отметку в 
+Без опции <option>harddup</option>, в случае когда
+<application>MEncoder</application> хочет дублировать кадр, он
+полагается на то, что мультиплексор расположит отметку в
 контейнере таким образом, что последний кадр будет повторен для
 достижения синхронизации без реальной записи кадра.
 С опцией <option>harddup</option>, <application>MEncoder</application>
-вместо этого просто ещё раз поместит последний кадр в цепочку 
+вместо этого просто ещё раз поместит последний кадр в цепочку
 фильтров.
 Это означает, что кодер получит <emphasis>точно</emphasis>
 такой же кадр дважды и сожмёт его.
@@ -1797,12 +1793,12 @@ mencoder -oac copy -ovc copy -o <replaceable>выходной_фильм.asf</re
 </para>
 
 <para>
-Также у Вас может не быть иного выбора, как использовать 
-<option>harddup</option> с форматами контейнеров, которые 
-не слишком плотно связаны с 
-<application>MEncoder</application>, например, с форматами, 
-поддерживаемыми с помощью 
-<systemitem class="library">libavformat</systemitem>, 
+Также у Вас может не быть иного выбора, как использовать
+<option>harddup</option> с форматами контейнеров, которые
+не слишком плотно связаны с
+<application>MEncoder</application>, например, с форматами,
+поддерживаемыми с помощью
+<systemitem class="library">libavformat</systemitem>,
 которые могут не поддерживать дублирование кадров на уровне
 контейнера.
 </para>
@@ -1813,7 +1809,7 @@ mencoder -oac copy -ovc copy -o <replaceable>выходной_фильм.asf</re
 <title>Ограничения контейнера AVI</title>
 
 <para>
-Хотя это самый широко распространённый формат контейнера после 
+Хотя это самый широко распространённый формат контейнера после
 MPEG-1,  он также обладает некоторыми существенными недостатками.
 Пожалуй, они наиболее очевидны в его избыточности.
 Для каждой цепочки AVI файла теряется 24 байта на заголовки и
@@ -1832,7 +1828,7 @@ MPEG-1,  он также обладает некоторыми существе
 <orderedlist>
 <listitem><para>
   Может быть сохранено только содержимое с фиксированной частотой
-  кадров. В частности, это особенно ограничивает, когда Ваш 
+  кадров. В частности, это особенно ограничивает, когда Ваш
   исходный материал смешанного содержимого: например, является
   смесью NTSC видео и киноматериала.
   В действительности, есть хаки, позволяющие сохранять содержимое
@@ -1843,7 +1839,7 @@ MPEG-1,  он также обладает некоторыми существе
   Аудио в AVI файлах должно быть или с постоянным битпотоком (CBR)
   или с постоянным размером кадра (т.е. все кадры декодируются
   в одно и то же число выборок).
-  К сожалению, самый эффективный кодек, Vorbis, не удовлетворяет 
+  К сожалению, самый эффективный кодек, Vorbis, не удовлетворяет
   ни одному из данных требований.
   Поэтому, если Вы планируете сохранять Ваш фильм в AVI, Вы должны
   использовать менее эффективный кодек, такой как MP3 или AC-3.
@@ -1859,7 +1855,7 @@ Vorbis кодирование.
 инструмент, который Вы используете для кодирования.
 Однако, возможно использовать <application>MEncoder</application>
 только для кодирования видео и затем использовать внешние
-утилиты для кодирования аудио и мультиплексирования его в 
+утилиты для кодирования аудио и мультиплексирования его в
 контейнер другого формата.
 </para>
 </sect3>
@@ -1874,10 +1870,10 @@ Matroska &mdash; это свободный, открытый стандарт ф
 продвинутых возможностей, которые старые контейнеры (наподобие
 AVI) не поддерживают.
 Например, Matroska поддерживает аудиосодержимое с переменным
-битпотоком (VBR), переменные частоты кадров (VFR), разделы, 
+битпотоком (VBR), переменные частоты кадров (VFR), разделы,
 файловые вложения, код обнаружения ошибок (EDC) и современные
-A/V кодеки, такие как "Продвинутое Аудио Кодирование" ("Advanced 
-Audio Coding", AAC), "Vorbis" или "MPEG-4 AVC" (H.264), также 
+A/V кодеки, такие как "Продвинутое Аудио Кодирование" ("Advanced
+Audio Coding", AAC), "Vorbis" или "MPEG-4 AVC" (H.264), также
 не поддерживаемые AVI.
 </para>
 
@@ -1885,7 +1881,7 @@ Audio Coding", AAC), "Vorbis" или "MPEG-4 AVC" (H.264), также
 Утилиты, необходимые для создания Matroska файлов, сообща
 называются <application>mkvtoolnix</application>, и доступны
 для большинства Unix платформ, так же как и для Window$.
-Поскольку Matroska &mdash; открытый формат, Вы можете найти 
+Поскольку Matroska &mdash; открытый формат, Вы можете найти
 иные утилиты, которые лучше Вам подходят, но поскольку
 <application>mkvtoolnix</application> &mdash; наиболее общие
 и поддерживаются самой командой разработчиков Matroska, мы
@@ -1894,8 +1890,8 @@ Audio Coding", AAC), "Vorbis" или "MPEG-4 AVC" (H.264), также
 
 <para>
 Возможно, самым простым способом начать использовать Matroska
-является использование <application>MMG</application>, 
-графической оболочки, поставляемой с 
+является использование <application>MMG</application>,
+графической оболочки, поставляемой с
 <application>mkvtoolnix</application>. Следуйте
 <ulink url="http://www.bunkus.org/videotools/mkvtoolnix/doc/mkvmerge-gui.html">руководству к mkvmerge GUI (mmg)</ulink>.
 </para>
@@ -1912,7 +1908,7 @@ mkvmerge -o <replaceable>выходной_файл.mkv</replaceable> <replaceabl
 файл <replaceable>выходной_файл.mkv</replaceable>.
 Как было отмечено ранее, Matroska способна реализовать гораздо
 большее, например, множественные аудиодорожки (включая тонкую
-настройку аудио/видео синхронизации), разделы, субтитры, 
+настройку аудио/видео синхронизации), разделы, субтитры,
 разбиение и т.д..
 Пожалуйста, обратитесь к документации на эти приложения для
 деталей.
@@ -1933,7 +1929,7 @@ mkvmerge -o <replaceable>выходной_файл.mkv</replaceable> <replaceabl
 <formalpara>
 <title>Что такое телесин?</title>
 <para>
-Если Вы не понимаете многое из того, что здесь написано, 
+Если Вы не понимаете многое из того, что здесь написано,
 прочтите
 <ulink url="http://en.wikipedia.org/wiki/Telecine">статью Википедии о телесине</ulink>.
 Это понятное и разумно обширное описание того, что такое
@@ -1944,29 +1940,29 @@ mkvmerge -o <replaceable>выходной_файл.mkv</replaceable> <replaceabl
 <title>Замечание о числах.</title>
 <para>
 Многие документы, включая указанную выше статью, ссылаются
-на количество полей в секунду 59.94 для NTSC видео и 
-соответствующие кадровые частоты 29.97 (для подверженного 
+на количество полей в секунду 59.94 для NTSC видео и
+соответствующие кадровые частоты 29.97 (для подверженного
 телесину и чересстрочного видео) и 23.976 (для построчного).
 Для простоты в ряде статей эти числа даже округляются до 60, 30
 и 24 соответственно.
 </para></formalpara>
 
 <para>
-Строго говоря, все эти числа являются аппроксимациями. 
-Чёрно-белое NTSC видео было точно с 60 полями в секунду, но 
+Строго говоря, все эти числа являются аппроксимациями.
+Чёрно-белое NTSC видео было точно с 60 полями в секунду, но
 позже была выбрана частота 60000/1001 для адаптации цветовой
-информации с одновременным сохранением совместимости с чёрно-белым 
-телевидением. 
+информации с одновременным сохранением совместимости с чёрно-белым
+телевидением.
 Цифровое NTSC видео (такое как на DVD) также с 60000/1001
 полями в секунду. Отсюда возникла кадровая частота 30000/1001
-кадр/сек для чересстрочного и телесиненного видео; построчное 
+кадр/сек для чересстрочного и телесиненного видео; построчное
 видео идёт с 24000/1001 кадр/сек.
 </para>
 
 <para>
 Старые версии документации <application>MEncoder</application>
 и много архивных сообщений из списков рассылки ссылаются на
-59.94, 29.97 и 23.976. Вся документация <application>MEncoder</application> 
+59.94, 29.97 и 23.976. Вся документация <application>MEncoder</application>
 была обновлена для использования дробных значений, и Вам так же
 следует их использовать.
 </para>
@@ -1980,26 +1976,26 @@ mkvmerge -o <replaceable>выходной_файл.mkv</replaceable> <replaceabl
 <title>Как используется телесин.</title>
 <para>
 Всё видео, предназначенное для просмотра на NTSC телевидении
-должно быть с 60000/1001 полями в секунду. Фильмы, сделанные 
+должно быть с 60000/1001 полями в секунду. Фильмы, сделанные
 для показа на TV часто снимаются непосредственно при 60000/1001
-полей в секунду, но большинство кино снимается на 24 или 
-24000/1001 кадрах в секунду. В процессе создания DVD с 
+полей в секунду, но большинство кино снимается на 24 или
+24000/1001 кадрах в секунду. В процессе создания DVD с
 кинофильмом, видео преобразуется для телевидения с помощью
 процесса, называемого телесин.
 </para></formalpara>
 
 <para>
-В действительности, видео никогда не хранится на DVD с 
+В действительности, видео никогда не хранится на DVD с
 60000/1001 полями в секунду. Для видео, оригинально являющегося
-60000/1001, каждая пара полей объединяется для формирования 
+60000/1001, каждая пара полей объединяется для формирования
 кадра, приводя к 30000/1001 кадрам в секунду. Затем аппаратные
 DVD плееры читают флаг, включенный в видеопоток, для определения
-того какие, чётные или нечётные строки должны формировать первый 
+того какие, чётные или нечётные строки должны формировать первый
 кадр.
 </para>
 
 <para>
-Обычно, содержимое с частотой кадров 24000/1001 остаётся 
+Обычно, содержимое с частотой кадров 24000/1001 остаётся
 неизменным при кодировании на DVD и DVD плеер должен выполнить
 телесин на лету. Однако, иногда видео подвергается телесину
 <emphasis>до</emphasis> записи на DVD; и хотя оно изначально
@@ -2009,11 +2005,11 @@ DVD плееры читают флаг, включенный в видеопот
 </para>
 
 <para>
-При рассмотрении отдельных кадров, полученных из 60000/1001 
-полей в секунду, телесиненных или наоборот, чересстрочная 
-развёртка чётко видна в случае, если есть какое-либо движение, 
-поскольку одно поле (скажем, с чётными номерами строк) 
-отображает момент времени на 1/(60000/1001) секунды позже, чем 
+При рассмотрении отдельных кадров, полученных из 60000/1001
+полей в секунду, телесиненных или наоборот, чересстрочная
+развёртка чётко видна в случае, если есть какое-либо движение,
+поскольку одно поле (скажем, с чётными номерами строк)
+отображает момент времени на 1/(60000/1001) секунды позже, чем
 другое поле. Воспроизведение чересстрочного видео на компьютере
 выглядит скверно по двум причинам: монитор обладает более высоким
 разрешением и видео показывается покадрово, вместо отображения по
@@ -2026,20 +2022,20 @@ DVD плееры читают флаг, включенный в видеопот
 Этот раздел применим только к NTSC DVD, а не к PAL.
 </para></listitem>
 <listitem><para>
-Примеры командных строк <application>MEncoder</application> 
-в данном разделе <emphasis role="bold">не</emphasis> 
+Примеры командных строк <application>MEncoder</application>
+в данном разделе <emphasis role="bold">не</emphasis>
 предназначены для реального использования. Они просто являются
-минимально необходимым требованием для кодирования 
+минимально необходимым требованием для кодирования
 соответствующей категории видео. То, как сделать хорошие DVD
-рипы или тонко настроить 
-<systemitem class="library">libavcodec</systemitem> для 
-достижения максимального качества, не входит в рамки данного 
+рипы или тонко настроить
+<systemitem class="library">libavcodec</systemitem> для
+достижения максимального качества, не входит в рамки данного
 раздела; обратитесь к другим разделам
 <link linkend="encoding-guide">Руководства по кодированию
 с MEncoder</link>.
 </para></listitem>
 <listitem><para>
-Есть несколько сносок, специфичных для данного руководства, 
+Есть несколько сносок, специфичных для данного руководства,
 обозначенных следующим образом:
   <link linkend="menc-feat-telecine-footnotes">[1]</link>
 </para></listitem>
@@ -2057,8 +2053,8 @@ DVD плееры читают флаг, включенный в видеопот
 </para>
 
 <para>
-При воспроизведении DVD с построчной развёрткой в 
-<application>MPlayer</application>, <application>MPlayer</application> 
+При воспроизведении DVD с построчной развёрткой в
+<application>MPlayer</application>, <application>MPlayer</application>
 выведет следующую строку при начале воспроизведения фильма:
 
 <screen>demux_mpg: обнаружено 24000/1001 кадра/сек NTSC содержимое с построчной развёрткой,
@@ -2071,11 +2067,11 @@ DVD плееры читают флаг, включенный в видеопот
 
 <para>
 При просмотре видео с построчной развёрткой Вы не должны никогда
-наблюдать чересстрочность. Однако, будьте осторожны, поскольку 
-иногда есть небольшая примесь телесина там, где Вы этого не 
-ожидаете. Мной наблюдались DVD с TV-шоу, у которых была одна 
+наблюдать чересстрочность. Однако, будьте осторожны, поскольку
+иногда есть небольшая примесь телесина там, где Вы этого не
+ожидаете. Мной наблюдались DVD с TV-шоу, у которых была одна
 секунда телесина при каждой смене сцен или в случайных на вид
-местах. Однажды я видел DVD, у которого одна половина была с 
+местах. Однажды я видел DVD, у которого одна половина была с
 построчной развёрткой, а вторая &mdash; телесиненной. Если Вы
 желаете быть <emphasis>действительно</emphasis> уверенными,
 Вы можете просканировать весь фильм:
@@ -2084,24 +2080,24 @@ DVD плееры читают флаг, включенный в видеопот
 
 Использование <option>-benchmark</option> позволяет
 <application>MPlayer</application> воспроизводить фильм столь
-быстро, сколь это возможно; тем не менее, в зависимости от 
-Вашего железа, это может занять некоторое время. Всякий раз, 
+быстро, сколь это возможно; тем не менее, в зависимости от
+Вашего железа, это может занять некоторое время. Всякий раз,
 когда demux_mpg будет сообщать об изменении частоты кадров,
 строка прямо над сообщением покажет Вам время, при котором
 произошло изменение.
 </para>
 
 <para>
-Иногда видео на DVD с построчной развёрткой называют 
+Иногда видео на DVD с построчной развёрткой называют
 &quot;мягким телесином&quot;, поскольку предполагается, что
-телесин будет выполнен DVD плеером. 
+телесин будет выполнен DVD плеером.
 </para>
 </sect3>
 
 <sect3 id="menc-feat-telecine-ident-telecined">
 <title>Телесин</title>
 <para>
-Телесиненное видео изначально снимается на 24000/1001 кадр/сек, 
+Телесиненное видео изначально снимается на 24000/1001 кадр/сек,
 но подвергается телесину <emphasis>до</emphasis> записи на DVD.
 </para>
 
@@ -2113,7 +2109,7 @@ DVD плееры читают флаг, включенный в видеопот
 
 <para>
 При просмотре телесиненного видео, Вы будете видеть "мерцающие"
-артефакты чересстрочной развёртки: они будут многократно 
+артефакты чересстрочной развёртки: они будут многократно
 повторяться и исчезать.
 Вы можете детально это рассмотреть следующим образом:
 <orderedlist>
@@ -2128,15 +2124,15 @@ DVD плееры читают флаг, включенный в видеопот
   вперёд.
   </para></listitem>
 <listitem><para>
-  Наблюдайте за последовательностью кадров с чересстрочной и 
-  построчной развёрткой. Если Вы видите следующую структуру: 
+  Наблюдайте за последовательностью кадров с чересстрочной и
+  построчной развёрткой. Если Вы видите следующую структуру:
   ЧЧЧПП,ЧЧЧПП,ЧЧЧПП,... (где Ч &mdash; чересстрочные, а П &mdash;
-  построчные кадры), значит видео телесиненное. Если Вы 
+  построчные кадры), значит видео телесиненное. Если Вы
   наблюдаете иную структуру, видео может быть телесиненным,
   используя какой-либо нестандартный метод;
-  <application>MEncoder</application> не может преобразовать 
+  <application>MEncoder</application> не может преобразовать
   без потерь нестандартный телесин в построчную развёртку.
-  Если Вы не видите вообще никакой структуры, значит наиболее 
+  Если Вы не видите вообще никакой структуры, значит наиболее
   вероятно, что видео с чересстрочной развёрткой.
   </para></listitem>
 </orderedlist>
@@ -2150,8 +2146,8 @@ DVD плееры читают флаг, включенный в видеопот
 
 <para>
 Другой способ выяснить, был Ваш источник подвержен телесину или нет, заключается
-в воспроизведении исходного материала с опциями командной строки 
-<option>-vf pullup</option> и <option>-v</option>, чтобы увидеть, как 
+в воспроизведении исходного материала с опциями командной строки
+<option>-vf pullup</option> и <option>-v</option>, чтобы увидеть, как
 <option>pullup</option> сопоставляет кадры.
 Если источник был телесиненным, Вы должны увидеть в консоли 3:2 структуру с
 чередующимися <systemitem>0+.1.+2</systemitem> и <systemitem>0++1</systemitem>.
@@ -2198,15 +2194,15 @@ DVD плееры читают флаг, включенный в видеопот
 
 <para>
 Когда <application>MPlayer</application> воспроизводит эту категорию, он будет
-(как правило, периодически) переключаться между "30000/1001 кадров/сек NTSC 
-содержимым" и "24000/1001 кадра/сек NTSC содержимым с построчной развёрткой". 
-Смотрите конец вывода <application>MPlayer</application>, чтобы увидеть 
+(как правило, периодически) переключаться между "30000/1001 кадров/сек NTSC
+содержимым" и "24000/1001 кадра/сек NTSC содержимым с построчной развёрткой".
+Смотрите конец вывода <application>MPlayer</application>, чтобы увидеть
 эти сообщения.
 </para>
 
 <para>
-Вам следует проверить разделы с "30000/1001 кадров/сек NTSC содержимым", 
-чтобы убедиться, что видео действительно телесиненное, а не просто 
+Вам следует проверить разделы с "30000/1001 кадров/сек NTSC содержимым",
+чтобы убедиться, что видео действительно телесиненное, а не просто
 чересстрочное.
 </para>
 </sect3>
@@ -2221,8 +2217,8 @@ DVD плееры читают флаг, включенный в видеопот
 </para>
 
 <para>
-Эта категория выглядит также, как и "смешанные построчная развертка и телесин", 
-до тех пор, пока не проверите разделы 30000/1001 кадр/сек и не увидите, 
+Эта категория выглядит также, как и "смешанные построчная развертка и телесин",
+до тех пор, пока не проверите разделы 30000/1001 кадр/сек и не увидите,
 что структура телесина отсутствует.
 </para>
 </sect3>
@@ -2234,9 +2230,9 @@ DVD плееры читают флаг, включенный в видеопот
 <title>Как кодировать каждую категорию</title>
 
 <para>
-Как уже было сказано выше, последующие примеры командных строк 
-<application>MEncoder</application> <emphasis role="bold">не</emphasis> означают, 
-что надо использовать именно их; они всего лишь примеры минимального набора параметров 
+Как уже было сказано выше, последующие примеры командных строк
+<application>MEncoder</application> <emphasis role="bold">не</emphasis> означают,
+что надо использовать именно их; они всего лишь примеры минимального набора параметров
 для правильного кодирования каждой категории.
 </para>
 
@@ -2246,8 +2242,8 @@ DVD плееры читают флаг, включенный в видеопот
 
 <para>
 Видео с построчной разверткой не требует специальной обработки для кодирования.
-Единственный нужный Вам для уверенности параметр &mdash; это 
-<option>-ofps 24000/1001</option>. 
+Единственный нужный Вам для уверенности параметр &mdash; это
+<option>-ofps 24000/1001</option>.
 В противном случае <application>MEncoder</application> будет пытаться кодировать
 с 30000/1001 кадрами в секунду и создаст дублирующиеся кадры.
 </para>
@@ -2274,7 +2270,7 @@ DVD плееры читают флаг, включенный в видеопот
 Телесин может быть обращён для получения оригинального 24000/1001 содержимого
 при помощи процесса, называемого обратный телесин.
 <application>MPlayer</application> содержит несколько фильтров для выполнения
-этого; лучший из них, <option>pullup</option> описан в разделе 
+этого; лучший из них, <option>pullup</option> описан в разделе
 <link linkend="menc-feat-telecine-encode-mixedpt">смешанные построчная развертка
 и телесин</link>.
 </para>
@@ -2285,10 +2281,10 @@ DVD плееры читают флаг, включенный в видеопот
 <title>Чересстрочная развертка</title>
 
 <para>
-На практике в большинстве случаев невозможно получить полностью построчное 
+На практике в большинстве случаев невозможно получить полностью построчное
 видео из чересстрочного содержимого.
 Единственный способ сделать это без потери половины вертикального разрешения
-- это удвоить частоту кадров и попытаться "угадать", что должно составить 
+- это удвоить частоту кадров и попытаться "угадать", что должно составить
 соответствующие линии каждого поля (этот способ имеет недостатки, смотрите метод
 3).
 </para>
@@ -2299,7 +2295,7 @@ DVD плееры читают флаг, включенный в видеопот
   кодировщика хорошо сжимать, но <systemitem class="library">libavcodec</systemitem>
   имеет два параметра специально для чуть лучшего сохранения чересстрочного
   видео: <option>ildct</option> и <option>ilme</option>. К тому же, настоятельно
-  рекомендуется использовать 
+  рекомендуется использовать
   <option>mbd=2</option><link linkend="menc-feat-telecine-footnotes">[2]</link>,
   потому что при этом макроблоки в местах без движения будут кодированы как
   нечересстрочные. Имейте в виду, что <option>-ofps</option> здесь НЕ нужна.
@@ -2307,15 +2303,15 @@ DVD плееры читают флаг, включенный в видеопот
 </para></listitem>
 <listitem><para>
   Используйте фильтр деинтерлейсинга перед кодированием. Существует несколько
-  таких фильтров на выбор, каждый имеет свои преимущества и недостатки. 
+  таких фильтров на выбор, каждый имеет свои преимущества и недостатки.
   Обратитесь к <option>mplayer -pphelp</option> и <option>mplayer -vf help</option>
-  для определения доступных (grep по "deint"), прочтите 
+  для определения доступных (grep по "deint"), прочтите
   <ulink url="http://guru.multimedia.cx/deinterlacing-filters/">Сравнение
   фильтров деинтерлейсинга</ulink> Майкла Нидермайера (Michael Niedermayer),
   и поищите в <ulink url="http://www.mplayerhq.hu/design7/mailing_lists.html">
   списках рассылки MPlayer</ulink>, чтобы найти множество обсуждений различных
   фильтров.
-  И опять, частота кадров не меняется, поэтому никаких <option>-ofps</option>. 
+  И опять, частота кадров не меняется, поэтому никаких <option>-ofps</option>.
   к тому же деинтерлейсинг следует производить после обрезания
   <link linkend="menc-feat-telecine-footnotes">[1]</link> и до масштабирования.
   <screen>mencoder dvd://1 -oac copy -vf yadif -ovc lavc</screen>
@@ -2323,23 +2319,23 @@ DVD плееры читают флаг, включенный в видеопот
 <listitem><para>
   К сожалению, эта опция сбоит с <application>MEncoder</application>; она должна
   хорошо работать с <application>MEncoder G2</application>, но его пока нет. Вы
-  можете столкнуться с крахами. Как бы то ни было, назначение опции 
+  можете столкнуться с крахами. Как бы то ни было, назначение опции
   <option> -vf tfields</option> &mdash; создать полный кадр из каждого поля, что
   делает частоту кадров равной 60000/1001. Преимущество этого подхода в том, что
   никакие данные не теряются; однако, т.к. каждый кадр получается только из одного
-  поля, недостающие строки должны как-то интерполироваться. 
-  
+  поля, недостающие строки должны как-то интерполироваться.
+
   Не существует очень хороших методов
   генерации недостающих данных, поэтому результат будет выглядеть несколько похожим
   на применение некоторых фильтров деинтерлейсинга. Генерация недостающих строк также создает
   другие проблемы, просто потому что количество данных удваивается.
   Таким образом, для сохранения качества требуются более высокие значения
-  битпотока, и больше ресурсов процессора используется как для 
+  битпотока, и больше ресурсов процессора используется как для
   кодирования, так и для декодирования. <option>tfields</option> имеет
   несколько различных опций, определяющих способ создания недостающих строк
   каждого кадра. Если выбрали этот способ, обратитесь к руководству и выберите
   ту опцию, которая лучше подходит для Вашего материала. Имейте в виду, что при
-  использовании <option>tfields</option> Вы 
+  использовании <option>tfields</option> Вы
   <emphasis role="bold">должны</emphasis> указать как <option>-fps</option>, так
   и <option>-ofps</option>, установив им значение, равное удвоенной частоте
   исходного материала.
@@ -2352,8 +2348,8 @@ mencoder dvd://1 -oac copy -vf tfields=2 -ovc lavc \
   Если планируете сильно уменьшать размер изображения, можно извлекать и
   декодировать только одно поле из двух. Конечно, Вы потеряете половину
   вертикального разрешения, но если планируется уменьшать размер как минимум
-  вдвое, потеря будет не сильно заметна. В результате получится построчной 
-  развёртки файл с 30000/1001 кадрами в секунду. Процедура следующая: 
+  вдвое, потеря будет не сильно заметна. В результате получится построчной
+  развёртки файл с 30000/1001 кадрами в секунду. Процедура следующая:
   <option>-vf field</option>, затем обрезание
   <link linkend="menc-feat-telecine-footnotes">[1]</link> и масштабирование
   соответствующим образом. Помните, что потребуется скорректировать масштабирование
@@ -2403,7 +2399,7 @@ mencoder dvd://1 -oac copy -vf pullup,softskip \
   имеет тенденцию к более частому нахождению соответствий.
   Какой фильтр будет лучше работать зависит от исходного видео и
   личного вкуса; не бойтесь экспериментировать с тонкой настройкой
-  опций фильтров, если у вас возникли проблемы с любым из них (подробности
+  опций фильтров, если у Вас возникли проблемы с любым из них (подробности
   смотрите на странице руководства man). Для большинства качественного
   исходного видео, однако, оба фильтра работают достаточно хорошо,
   так что начинать работать можно с любым из них.
@@ -2414,10 +2410,10 @@ mencoder dvd://1 -oac copy -vf filmdint -ovc lavc -ofps 24000/1001<!--
 <listitem><para>
   Более старый метод заключается не в применении обратного телесина к
   телесиненным частям, а, наоборот, в телесине не подверженных телесину частей и
-  последующем применении обратного телесина ко всему видео. Звучит запутанно? 
+  последующем применении обратного телесина ко всему видео. Звучит запутанно?
   softpulldown &mdash; это фильтр, проходящий по видео и делающий телесиненным весь
   файл. Если следом за softpulldown указать либо <option>detc</option>, либо
-  <option>ivtc</option>, финальный результат будет полностью построчным. 
+  <option>ivtc</option>, финальный результат будет полностью построчным.
   <option>-ofps 24000/1001</option> необходима.
   <screen>
 mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001
@@ -2446,23 +2442,23 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001
   </para>
 
   <para>
-  Эта опция определенно не должна использоваться, если Вы хотите со 
+  Эта опция определенно не должна использоваться, если Вы хотите со
   временем отображать видео на чересстрочном устройстве (с помощью TV карты,
   например). Если у Вас есть чересстрочные кадры в видео с 24000/1001 кадрами в
   секунду, к ним, как и к прогрессивным, будет применен телесин. Половина их
   чересстрочных "кадров" будут отображаться с длительностью трех полей
-  (3/(60000/1001) секунд), давая в результате неприятно выглядящий эффект 
+  (3/(60000/1001) секунд), давая в результате неприятно выглядящий эффект
   <!-- FIXME is translation correct? -->
-  "прыжка назад во времени". Даже если Вы пробуете это, Вы 
+  "прыжка назад во времени". Даже если Вы пробуете это, Вы
   <emphasis role="bold">должны</emphasis> использовать фильтр деинтерлейсинга,
   такой как <option>lb</option> или <option>l5</option>.
   </para>
 
   <para>
   Для отображения на построчном дисплее это тоже может быть плохой идеей.
-  Будут отбрасываться пары последовательных чересстрочных полей, приводя к 
+  Будут отбрасываться пары последовательных чересстрочных полей, приводя к
   разрывам, которые могут быть заметнее, чем при использовании второго метода,
-  отображающего некоторые построчные кадры дважды. Чересстрочное видео с 
+  отображающего некоторые построчные кадры дважды. Чересстрочное видео с
   30000/1001 кадрами в секунду уже несколько прерывисто, потому что в реальности
   оно должно отображаться с 60000/1001 полями в секунду, так что дублирующиеся
   кадры не так сильно выделяются.
@@ -2471,7 +2467,7 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001
   <para>
   Так или иначе, лучше всего проанализировать Ваше содержимое и как Вы его
   собираетесь показывать. Если видео на 90% построчное и Вы никогда не будете
-  показывать его на TV, Вам следует отдать предпочтение построчному варианту. 
+  показывать его на TV, Вам следует отдать предпочтение построчному варианту.
   Если оно только наполовину построчное, Вы, возможно, захотите кодировать
   его, как если бы оно было чересстрочным.
   </para>
@@ -2497,13 +2493,13 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001
   <title>Об усечении сторон:</title>
   <para>
   Видеоданные на DVD хранятся в формате, называемом YUV 4:2:0. В YUV
-  видео, люма ("яркость") и хрома ("цвет") хранятся отдельно. 
-  Поскольку человеческий глаз отчасти менее чувствителен к цвету, чем к яркости, 
+  видео, люма ("яркость") и хрома ("цвет") хранятся отдельно.
+  Поскольку человеческий глаз отчасти менее чувствителен к цвету, чем к яркости,
   в YUV 4:2:0 изображении присутствует только один цветностный пиксел на четыре
-  яркостных. В изображении с построчной развёрткой каждый квадрат из четырёх яркостных 
+  яркостных. В изображении с построчной развёрткой каждый квадрат из четырёх яркостных
   пикселов (два на два) имеют один общий цветностный пиксел. Вы должны обрезать
   построчный YUV 4:2:0 до чётных размеров и использовать чётные смещения.
-  Например, 
+  Например,
   <option>crop=716:380:2:26</option> &mdash; правильно, а
   <option>crop=716:380:3:26 </option> &mdash; нет.
   </para>
@@ -2548,7 +2544,7 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001
   <systemitem class="library">libavcodec</systemitem>, которые значительно
   увеличивают качество. Вам всегда следует использовать как минимум эти две,
   за исключением случая, когда потеря скорости кодирования недопустима
-  (например, кодирование в реальном времени). Есть множество других 
+  (например, кодирование в реальном времени). Есть множество других
   <systemitem class="library">libavcodec</systemitem> опций, улучшающих качество
   (и замедляющих кодирование), но их описание выходит за рамки этого
   документа.
@@ -2559,12 +2555,12 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001
   <title>О производительности pullup:</title>
   <para>
   Использование <option>pullup</option> (совместно с <option>softskip</option>)
-  для видео с построчной развёрткой вполне безопасно и обычно является хорошей 
+  для видео с построчной развёрткой вполне безопасно и обычно является хорошей
   идеей, если только про источник не известно достоверно, что он полностью
   построчный. Потеря скорости мала в большинстве случаев.
   В минимальном варианте кодирования <option>pullup</option> замедляет
   <application>MEncoder</application> на 50%. Добавление обработки звука и
-  продвинутых <option>lavcopts</option> опций затмевает эту разницу, уменьшая 
+  продвинутых <option>lavcopts</option> опций затмевает эту разницу, уменьшая
   падение производительности от использования <option>pullup</option> до 2%.
   </para>
 </formalpara></listitem>
@@ -3021,13 +3017,13 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy
 В идеале, Вы, наверное, хотели бы иметь возможность просто сказать кодировщику
 переключиться на "высокое качество" и начать кодирование.
 Это было бы замечательно, но, к сожалению, трудно реализуемо, поскольку
-различные опции кодирования, в зависимости от исходного материала, дают в результате 
+различные опции кодирования, в зависимости от исходного материала, дают в результате
 различное качество.
 Так происходит потому, что сжатие зависит от визуальных свойств видео.
 Например, аниме и живая съемка имеют сильно отличающиеся свойства и,
 поэтому, требуют разные опции для получения оптимального результата.
-Хорошая новость состоит в том, что некоторые опции, такие как 
-<option>mbd=2</option>, <option>trell</option> и <option>v4mv</option>, 
+Хорошая новость состоит в том, что некоторые опции, такие как
+<option>mbd=2</option>, <option>trell</option> и <option>v4mv</option>,
 никогда не следует опускать.
 Детальное описание основных опций кодирования смотрите ниже.
 </para>
@@ -3039,7 +3035,7 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy
   от фильма.
   Заметьте, если хотите, чтобы Ваш фильм декодировался DivX5, Вы должны
   активировать поддержку закрытых GOP, используя опцию <option>cgop</option>
-  <systemitem class="library">libavcodec</systemitem>, но также должны деактивировать 
+  <systemitem class="library">libavcodec</systemitem>, но также должны деактивировать
   определение сцен, что не является хорошей идеей, поскольку несколько вредит
   эффективности.
 </para></listitem>
@@ -3053,7 +3049,7 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy
   <emphasis role="bold">dia</emphasis>: диапазон поиска движения. Большие
   значения лучше и медленнее.
   Отрицательные значения &mdash; это совершенно другая шкала.
-  Хорошими значениями являются -1 для быстрого кодирования или 2-4 &mdash; для 
+  Хорошими значениями являются -1 для быстрого кодирования или 2-4 &mdash; для
   медленного.
 </para></listitem>
 <listitem><para>
@@ -3092,7 +3088,7 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy
   <emphasis role="bold">qns</emphasis>: очень медленно, особенно в комбинации с qprd.
   Эта опция укажет кодировщику минимизировать шум от артефактов сжатия вместо
   создания закодированного видео, полностью соответствующего исходному.
-  Не используйте ее, если только не перепробовали настроить все, что было 
+  Не используйте ее, если только не перепробовали настроить все, что было
   возможно, а результат все таки недостаточно хорош.
 </para></listitem>
 <listitem><para>
@@ -3109,8 +3105,8 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy
   Они кодируются независимо во всех MPEG-похожих алгоритмах.
   Идея этих опций заключается в использованию некоторой хорошей эвристики для
   определения момента, когда изменения в блоке ниже указанного Вами порога, и что его
-  стоит кодировать как "блок без изменений". 
-  Это сохраняет биты и, возможно, ускоряет кодирование. 
+  стоит кодировать как "блок без изменений".
+  Это сохраняет биты и, возможно, ускоряет кодирование.
   vlelim=-4 и vcelim=9 выглядят неплохими для живой съемки, но, скорее всего, не
   помогут для аниме; при кодировании анимации Вам, возможно, следует оставить
   эту опцию неизменной.
@@ -3164,7 +3160,7 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy
 </para>
 
 <para>
-Все настройки кодирования проверялись на тестовом видео 720x448 @30000/1001 fps 
+Все настройки кодирования проверялись на тестовом видео 720x448 @30000/1001 fps
 с целевым битпотоком 900кбит/сек, на машине AMD-64 3400+ с 2400 МГц и 64 битном режиме.
 Для каждой настройки кодирования указаны измеренная скорость кодирования (в
 кадрах в секунду) и потеря PSNR (в дБ) по сравнению с настройкой "очень высокое
@@ -3292,7 +3288,7 @@ vcodec=mpeg2video:intra_matrix=8,9,12,22,26,27,29,34,9,10,14,26,27,29,34,37,\
 <para>
 Итак, Вы только что купили новенькую, блестящую копию фильма "Гарри Поттер и Тайная
 Комната" (в широкоэкранном формате, конечно) и хотите сделать рип этого DVD так,
-чтобы добавить его к Домашнему кинотеатру на PC. Это DVD первого региона, 
+чтобы добавить его к Домашнему кинотеатру на PC. Это DVD первого региона,
 поэтому NTSC. Пример ниже также применим и для PAL, за исключением того, что
 надо будет опустить <option>-ofps 24000/1001</option> (поскольку частота кадров
 на выходе такая же, как и на входе), и, конечно, границы обрезания будут
@@ -3308,17 +3304,17 @@ vcodec=mpeg2video:intra_matrix=8,9,12,22,26,27,29,34,9,10,14,26,27,29,34,37,\
 </para>
 
 <para id="menc-feat-dvd-mpeg4-example-crop">
-Далее, мы хотим определить верные границы обрезания, поэтому используем фильтр 
+Далее, мы хотим определить верные границы обрезания, поэтому используем фильтр
 cropdetect:
 <screen>mplayer dvd://1 -vf cropdetect</screen>
 Убедитесь, что переместились к полностью заполненному кадру (например,
-к светлой сцене после пропущенных начальных титров и логотипов), 
+к светлой сцене после пропущенных начальных титров и логотипов),
 Вы должны увидеть в консоли <application>MPlayer</application>:
 <screen>crop area: X: 0..719  Y: 57..419  (-vf crop=720:362:0:58)</screen>
 Затем снова воспроизводим фильм с этим фильтром для проверки его корректности:
 <screen>mplayer dvd://1 -vf crop=720:362:0:58</screen>
 И убеждаемся, что все выглядит прекрасно. Далее, проверяем, что ширина и высота
-делятся на 16. С шириной все в порядке, а с высотой &mdash; нет. 
+делятся на 16. С шириной все в порядке, а с высотой &mdash; нет.
 Поскольку мы не заваливали математику в 7-ом классе, то знаем, что ближайшее
 целое, меньшее 362 и кратное 16, равно 352.
 </para>
@@ -3342,7 +3338,7 @@ cropdetect:
 
 <para>
 Если Вас действительно заботит потеря этих 10 пикселов, Вы можете
-вместо этого отмасштабировать фильм, уменьшив размерности до ближайших 
+вместо этого отмасштабировать фильм, уменьшив размерности до ближайших
 кратных 16 значений.
 Цепочка фильтров будет выглядеть примерно так:
 <screen>-vf crop=720:362:0:58,scale=720:352</screen>
@@ -3379,23 +3375,23 @@ mencoder dvd://1 -ofps 24000/1001 -oac copy -o <replaceable>Harry_Potter_2.avi</
 <para>
 Опции <option>v4mv:mbd=2:trell</option> значительно улучшат качество ценой
 времени кодирования. Нет никаких оснований отключать эти
-опции, когда главным критерием является качество. Опции 
+опции, когда главным критерием является качество. Опции
 <option>cmp=3:subcmp=3</option> выбирают функцию сравнения, дающую
 лучшее качество, чем стандартная. Вы можете поэкспериментировать с этим параметром
 (возможные значения смотрите на man странице), поскольку разные функции могут
 давать разный прирост в качестве в зависимости от исходного материала.
 Например, если Вы замечаете, что <systemitem class="library">libavcodec</systemitem>
 производит слишком много блочных артефактов (квадратиков), то можете попытаться
-выбрать экспериментальный NSSE в качестве функции сравнения при помощи опции 
+выбрать экспериментальный NSSE в качестве функции сравнения при помощи опции
 <option>*cmp=10</option>.
 </para>
 
 <para>
 Для этого фильма полученный AVI будет 138 минут длинной и размером около 3Гб.
 И, поскольку Вы сказали, что размер файла значения не имеет, это вполне
-приемлемый результат. Однако, если все-таки хотите получить меньший размер файла, 
-можете попробовать уменьшить битпоток. Увеличение битпотока имеет снижающийся эффект, 
-поэтому, хотя мы можем ясно видеть улучшение от 1800Кбит/сек до 2000Кбит/сек, оно 
+приемлемый результат. Однако, если все-таки хотите получить меньший размер файла,
+можете попробовать уменьшить битпоток. Увеличение битпотока имеет снижающийся эффект,
+поэтому, хотя мы можем ясно видеть улучшение от 1800Кбит/сек до 2000Кбит/сек, оно
 может быть не столь заметно выше 2000Кбит/сек.
 </para>
 
@@ -3406,7 +3402,7 @@ mencoder dvd://1 -ofps 24000/1001 -oac copy -o <replaceable>Harry_Potter_2.avi</
 улучшит воспринимаемое качество и поможет избежать блочных артефактов в видео.
 Опцией <option>autoq</option> <application>MPlayer</application>'а Вы можете
 изменять величину производимой фильтром spp постобработки в зависимости от
-доступных ресурсов CPU. Вдобавок, на этом этапе Вы можете захотеть применить 
+доступных ресурсов CPU. Вдобавок, на этом этапе Вы можете захотеть применить
 коррекцию гаммы и/или цвета для лучшего соответствия Вашему монитору. Например:
 <screen>
 mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2=1.2 -autoq 3
@@ -3432,7 +3428,7 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2=
 <para>
 Это руководство в основном нацелено на особенности применения тех же методов,
 что описаны в руководстве по кодированию с помощью x264.
-Поэтому, сначала прочтите, пожалуйста, 
+Поэтому, сначала прочтите, пожалуйста,
 <link linkend="menc-feat-x264-encoding-options-intro">первую часть</link>
 того руководства.
 </para>
@@ -3443,7 +3439,7 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2=
 <title>Какие опции следует использовать для получения лучших результатов?</title>
 
 <para>
-Пожалуйста, начните с просмотра раздела 
+Пожалуйста, начните с просмотра раздела
 <systemitem class="library">Xvid</systemitem> man страницы
 <application>MPlayer</application>.
 Этот раздел предполагается как дополнение к man странице.
@@ -3497,24 +3493,24 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2=
   Управляет чувствительностью кодировщика к B-кадрам, где большие значения
   приводят к использованию большего количества B-кадров (и наоборот).
   Опция должна использоваться совместно с <option>max_bframes</option>;
-  если Вы стеснены величиной битпотока, то должны увеличить и 
+  если Вы стеснены величиной битпотока, то должны увеличить и
   <option>max_bframes</option>, и <option>bf_threshold</option>,
   в том время как увеличение <option>max_bframes</option> и уменьшение
   <option>bf_threshold</option> позволят кодировщику использовать больше
   B-кадров в местах, где это <emphasis role="bold">действительно</emphasis>
   необходимо.
-  Низкое количество <option>max_bframes</option> и высокое значение 
+  Низкое количество <option>max_bframes</option> и высокое значение
   <option>bf_threshold</option> &mdash; это, возможно, не самое мудрое решение,
   поскольку оно принудит кодировщик размещать B-кадры в местах, которые никак не
   выиграют от этого, тем самым ухудшая визуальное качество.
   Однако, если Вам требуется совместимость с аппаратными
   проигрывателями, поддерживающими только старые DivX профили (которые
-  поддерживают только 1 последовательный B-кадр), это единственный способ 
+  поддерживают только 1 последовательный B-кадр), это единственный способ
   увеличить сжимаемость при помощи B-кадров.
 </para></listitem>
 <listitem><para>
   <emphasis role="bold">trellis</emphasis>
-  Оптимизирует процесс квантования для получения оптимального 
+  Оптимизирует процесс квантования для получения оптимального
   соотношения между PSNR и битпотоком, что позволяет существенно экономить биты.
   Эти биты впоследствии будут потрачены на другие части видео, что приведет к
   увеличению общего качества.
@@ -3570,10 +3566,10 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2=
 </para></listitem>
 <listitem><para>
   <emphasis role="bold">lumi_mask</emphasis>
-  Пытается отдать меньший битпоток областям изображения, которые 
+  Пытается отдать меньший битпоток областям изображения, которые
   человеческий глаз не в состоянии увидеть достаточно хорошо, что
-  позволит кодировщику потратить сэкономленные биты на более важные 
-  части картинки. Качество закодированного материала, привнесенное этой 
+  позволит кодировщику потратить сэкономленные биты на более важные
+  части картинки. Качество закодированного материала, привнесенное этой
   опцией, сильно зависит от личных предпочтений и от типа и настроек монитора,
   использовавшегося для просмотра (обычно результат выглядит не очень хорошо,
   если он яркий, или является TFT монитором).
@@ -3581,7 +3577,7 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2=
 <listitem>
   <para>
   <emphasis role="bold">qpel</emphasis>
-  Увеличивает количество предполагаемых векторов движения, путём повышения 
+  Увеличивает количество предполагаемых векторов движения, путём повышения
   точности оценки движения с полупиксельной до четвертьпиксельной.
   Идея состоит в том, чтобы найти лучшие векторы движения, которые взамен
   уменьшат битпоток (тем самым увеличивая качество).
@@ -3590,11 +3586,11 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2=
   дают (значительно) лучшие результаты.
   Достаточно часто кодек тратит дополнительные биты на повышенную точность
   впустую, а взамен получает или вообще ничего, или небольшое увеличение качества.
-  К сожалению, нет способа предсказать возможные улучшения от <option>qpel</option>, 
+  К сожалению, нет способа предсказать возможные улучшения от <option>qpel</option>,
   так что Вам придется сделать кодирование с ней и без нее, чтобы знать
   наверняка.
   </para>
-  
+
   <para>
   <option>qpel</option> может почти удвоить время кодирования и
   требует, как минимум, на 25% большей мощности при декодировании.
@@ -3606,7 +3602,7 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2=
   Пытается сэкономить биты в панорамных сценах, используя один вектор
   движения для всего кадра. Это почти всегда увеличивает PSNR, но заметно
   замедляет кодирование (так же как и декодирование).
-  Поэтому Вас следует использовать ее, только когда Вы включили 
+  Поэтому Вас следует использовать ее, только когда Вы включили
   <option>vhq</option> на максимум.
   GMC <systemitem class="library">Xvid</systemitem>'а является более сложным,
   чем у DivX'а, но поддерживается только некоторыми аппаратными проигрывателями.
@@ -3902,7 +3898,7 @@ Xvid поддерживает профили кодирования через 
 </para>
 
 <para>
-Все настройки кодирования проверялись на тестовом видео 720x448 @30000/1001 fps 
+Все настройки кодирования проверялись на тестовом видео 720x448 @30000/1001 fps
 с целевым битпотоком 900кбит/сек, на машине AMD-64 3400+ с 2400 МГц и 64 битном режиме.
 Для каждой настройки кодирования указаны измеренная скорость кодирования (в
 кадрах в секунду) и потеря PSNR (в дБ) по сравнению с настройкой "очень высокое
@@ -3913,7 +3909,7 @@ Xvid поддерживает профили кодирования через 
 <informaltable frame="all">
 <tgroup cols="4">
 <thead>
-<row><entry>Описание</entry><entry>Опции кодирования</entry><entry>скорость 
+<row><entry>Описание</entry><entry>Опции кодирования</entry><entry>скорость
 (в fps)</entry><entry>Относительная потеря PSNR (в дБ)</entry></row>
 </thead>
 <tbody>
@@ -3966,8 +3962,8 @@ Xvid поддерживает профили кодирования через 
 <title>Опции кодирования x264</title>
 
 <para>
-Начните, пожалуйста с просмотра раздела 
-<systemitem class="library">x264</systemitem> 
+Начните, пожалуйста с просмотра раздела
+<systemitem class="library">x264</systemitem>
 man страницы <application>MPlayer</application>'а.
 Этот раздел предполагается быть дополнением к странице man.
 Здесь Вы найдете быстрые подсказки о том, какие опции чаще всего интересуют
@@ -3998,7 +3994,7 @@ man страницы <application>MPlayer</application>'а.
 целей. Решение для первого класса опций очень простое:
 надо только определить, считаете ли Вы, что разница в качестве оправдывает разницу в
 скорости.  Для второго класса опций предпочтения могут быть значительно более
-субъективными и зависеть от большего числа факторов. 
+субъективными и зависеть от большего числа факторов.
 Имейте в виду, что некоторые из опций категории "пользовательских предпочтений и специальных
 требований" могут все же иметь большое влияние на скорость или качество,
 но это не основное их предназначение.
@@ -4035,16 +4031,16 @@ man страницы <application>MPlayer</application>'а.
 
 
 <sect3 id="menc-feat-x264-encoding-options-speedvquality">
-<title>Опции, затрагивающие, в основном, скорость и качество</title> 
+<title>Опции, затрагивающие, в основном, скорость и качество</title>
 
 <itemizedlist>
 <listitem>
   <para>
   <emphasis role="bold">subq</emphasis>:
-  Из всех опций, позволяющих выбирать между скоростью и качеством, 
+  Из всех опций, позволяющих выбирать между скоростью и качеством,
   <option>subq</option> и <option>frameref</option> (смотрите ниже), пожалуй,
   самые важные.
-  Если Вы заинтересованы в тонкой настройке либо скорости, либо качества, 
+  Если Вы заинтересованы в тонкой настройке либо скорости, либо качества,
   эти две &mdash; первое, с чего Вам стоит начать.
   С точки зрения скорости, опции <option>frameref</option> и
   <option>subq</option> очень жестко взаимодействуют друг с другом.
@@ -4054,29 +4050,29 @@ man страницы <application>MPlayer</application>'а.
   С 6 ссылочными кадрами эта величина достигает 60%.
   Эффект <option>subq</option> на PSNR выглядит довольно постоянным, в отличие
   от количества ссылочных кадров.
-  Как правило, <option>subq=5</option> достигает значения глобального PSNR 
+  Как правило, <option>subq=5</option> достигает значения глобального PSNR
   на 0.2-0.5 дБ большего, чем  при <option>subq=1</option>.
   Обычно этого достаточно, чтобы заметить.
   </para>
-  
+
   <para>
   <option>subq=6</option> &mdash; медленнее и дает лучшее качество при разумной
   цене.
   Если сравнивать с <option>subq=5</option>, он обычно дает на 0.1-0.4 дБ
   больший глобальный PSNR ценой потери 25%-100% скорости.
-  В отличие от остальных уровней <option>subq</option>, поведение 
+  В отличие от остальных уровней <option>subq</option>, поведение
   <option>subq=6</option> не так сильно зависит от <option>frameref</option>
-  и <option>me</option>. Вместо этого, эффективность <option>subq=6</option> 
+  и <option>me</option>. Вместо этого, эффективность <option>subq=6</option>
   по большей части зависит от количества используемых B-кадров. При
   обычном использовании это означает, что <option>subq=6</option> в сложных,
   высокодинамичных сценах имеет большое влияние как на скорость, так и на
   качество, но в сценах с малым количествах движения она не имеет такого
-  эффекта. Имейте в виду, что по-прежнему рекомендуется всегда устанавливать 
+  эффекта. Имейте в виду, что по-прежнему рекомендуется всегда устанавливать
   <option>bframes</option> в значение, отличное от нуля (смотрите далее).
   </para>
   <para>
   <option>subq=7</option> &mdash; самый медленный режим с наилучшим качеством.
-  По сравнению с <option>subq=6</option> он, обычно, улучшает общий PSNR на 
+  По сравнению с <option>subq=6</option> он, обычно, улучшает общий PSNR на
   0.01-0.05 дБ ценой потери 15%-30% скорости.
   Поскольку соотношение качества и времени кодирования очень невелико, Вам
   следует использовать этот режим, только если боретесь за каждый бит, и время
@@ -4095,14 +4091,14 @@ man страницы <application>MPlayer</application>'а.
   <option>frameref=3</option> медленнее примерно на 15%, чем
   <option>frameref=1</option>.
   К сожалению, улучшение очень быстро сходит на нет.
-  От <option>frameref=6</option> можно ожидать прироста PSNR лишь на 
+  От <option>frameref=6</option> можно ожидать прироста PSNR лишь на
   0.05-0.1 дБ по сравнению с <option>frameref=3</option> с дополнительной
   потерей 15% скорости.
-  Выше <option>frameref=6</option> качество обычно увеличивается очень незначительно 
+  Выше <option>frameref=6</option> качество обычно увеличивается очень незначительно
   (хотя на всем протяжении этой дискуссии Вам следует иметь в виду, оно может
   значительно изменяться в зависимости от исходного материала).
-  В довольно типичном случае <option>frameref=12</option> улучшит глобальный 
-  PSNR всего на 0.02дБ по сравнению с <option>frameref=6</option>, 
+  В довольно типичном случае <option>frameref=12</option> улучшит глобальный
+  PSNR всего на 0.02дБ по сравнению с <option>frameref=6</option>,
   ценой 15%-20% скорости.
   При таких высоких значениях <option>frameref</option>, единственная
   действительно хорошая вешь, о которой может быть сказано, состоит в том, что
@@ -4112,11 +4108,11 @@ man страницы <application>MPlayer</application>'а.
   </para>
   <note><title>Замечание:</title>
   <para>
-  Увеличение <option>frameref</option> до чрезмерно высоких значений 
+  Увеличение <option>frameref</option> до чрезмерно высоких значений
   <emphasis role="bold">может</emphasis> и
   <emphasis role="bold">обычно наносит</emphasis>
   вред эффективности кодирования, если CABAC отключен.
-  С задействованным CABAC (настройка по умолчанию), возможность установки 
+  С задействованным CABAC (настройка по умолчанию), возможность установки
   <option>frameref</option> "слишком высоким" на данный момент выглядит слишком
   далекой, чтобы об этом беспокоиться, а в будущем оптимизации могут вообще
   убрать такую возможность.
@@ -4127,17 +4123,17 @@ man страницы <application>MPlayer</application>'а.
   затем увеличить их во втором. Обычно, это обладает ничтожным отрицательным
   эффектом на конечное качество: Вы, возможно, потеряете вплоть до 0.1дБ PSNR,
   что должно быть слишком малой разницей, чтобы её заметить.
-  Однако, различные значения <option>frameref</option> могут 
+  Однако, различные значения <option>frameref</option> могут
   иногда повлиять на решение о выборе типа кадра.
   Скорее всего, это довольно редкие крайние случаи, но если Вы хотите быть точно
   уверенными, посмотрите, содержит ли Ваше видео полноэкранные
   <!-- FIXME is translation correct? -->
   периодически вспыхивающие изображения или очень большие паузы, которые могут стать
   причиной принудительной вставки I-кадра.
-  Настройте <option>frameref</option> в первом проходе так, чтобы 
+  Настройте <option>frameref</option> в первом проходе так, чтобы
   она была достаточно большой для содержания длительности цикла вспыхивания
   (или паузы).
-  Например, если сцены вспыхивают и гаснут между двумя изображениями в течении 
+  Например, если сцены вспыхивают и гаснут между двумя изображениями в течении
   трёх кадров, установите <option>frameref</option> равным 3 или выше.
   Эта проблема, возможно, очень редко появляется для живой съемки, но она иногда
   возникает при записи видео игр.
@@ -4149,11 +4145,11 @@ man страницы <application>MPlayer</application>'а.
   Эта опция используется для выбора метода оценки движения.
   Изменение этой опции оказывает прямое влияние на соотношение
   скорость-качество. <option>me=dia</option> лишь на несколько процентов
-  быстрее, чем поиск по умолчанию, ценой не больше 0.1дБ глобального PSNR. 
+  быстрее, чем поиск по умолчанию, ценой не больше 0.1дБ глобального PSNR.
   Значение по умолчанию (<option>me=hex</option>) &mdash; разумный выбор между скоростью
   и качеством. <option>me=umh</option> немного, вплоть до 0.1дБ, улучшает
-  глобальный PSNR, соответствующее падение скорости меняется в 
-  зависимости от <option>frameref</option>. С высокими значениями 
+  глобальный PSNR, соответствующее падение скорости меняется в
+  зависимости от <option>frameref</option>. С высокими значениями
   <option>frameref</option> (например, 12 или около того), <option>me=umh</option>
   примерно на 40% медленнее, чем настройка по умолчанию <option>me=hex</option>.
   С <option>frameref=3</option>, падение скорости уменьшается до 25%-30%.
@@ -4188,7 +4184,7 @@ man страницы <application>MPlayer</application>'а.
   <para>
   С отключенным адаптивным принятием решения о B-кадрах
   (<option>nob_adapt</option> в <option>x264encopts</option>),
-  оптимальное значение этой опции обычно не превышает 
+  оптимальное значение этой опции обычно не превышает
   <option>bframes=1</option>, иначе могут пострадать высокодинамичные сцены.
   С включенным адаптивным принятием решения о B-кадрах (поведение по умолчанию),
   можно безопасно использовать более высокие значения; кодировщик уменьшит
@@ -4204,7 +4200,7 @@ man страницы <application>MPlayer</application>'а.
   Заметьте: она включена по умолчанию.
   </para>
   <para>
-  Когда эта опция включена, кодировщик будет использовать разумно 
+  Когда эта опция включена, кодировщик будет использовать разумно
   быстрый процесс принятия решения для уменьшения количества B-кадров,
   используемых в сценах, которые от этого не сильно выиграют.
   Вы можете использовать <option>b_bias</option> для тонкой настройки того,
@@ -4224,7 +4220,7 @@ man страницы <application>MPlayer</application>'а.
   Вы получите небольшое улучшение качества без потери в скорости, как и говорит
   man руководство.
   Имейте в виду, что такое видео не может быть прочитано основанными на
-  libavcodec декодерами, созданными ранее, чем примерно 5 Марта 2005. 
+  libavcodec декодерами, созданными ранее, чем примерно 5 Марта 2005.
 </para></listitem>
 <listitem>
   <para>
@@ -4243,7 +4239,7 @@ man страницы <application>MPlayer</application>'а.
   <para>
   К сожалению, текущий алгоритм адаптивного принятия решений о B-кадрах имеет
   твердую склонность к избеганию использования B-кадров при затуханиях.
-  До тех пор, пока это не изменится, хорошей идеей, возможно, будет добавить 
+  До тех пор, пока это не изменится, хорошей идеей, возможно, будет добавить
   <option>nob_adapt</option> к x264encopts, если предполагаете, что затухания
   будут давать существенный вклад в Вашем конкретном видеоклипе.
   </para>
@@ -4252,8 +4248,8 @@ man страницы <application>MPlayer</application>'а.
   <para>
   <emphasis role="bold">threads</emphasis>
   Эта опция позволяет породить потоки для параллельного кодирования на
-  нескольких CPU. Вы можете вручную выбрать количество создаваемых потоков или, 
-  что лучше, установить <option>threads=auto</option> и позволить 
+  нескольких CPU. Вы можете вручную выбрать количество создаваемых потоков или,
+  что лучше, установить <option>threads=auto</option> и позволить
   <systemitem class="library">x264</systemitem> определить количество доступных
   CPU и выбрать соответствующее количество потоков.
   Если у Вас многопроцессорная машина, Вам следует всерьез задуматься об
@@ -4295,11 +4291,11 @@ man страницы <application>MPlayer</application>'а.
   Во-первых, оно установит битпоток в 1400 кбит/сек для обеих частей. Первая
   часть может оказаться чрезмерно квантованной, что приведет к
   недопустимо выглядящему и неоправданно блочному изображению. Вторая часть будет
-  существенно недостаточно квантованной; она может выглядеть отлично, но цена 
+  существенно недостаточно квантованной; она может выглядеть отлично, но цена
   битпотока для этого качества будет полностью неоправданной.
   Чего намного труднее избежать, так это проблемы перехода между двумя
   сценами. В первых секундах малодинамичной части квантователь будет чрезвычайно
-  превышен, потому что управление битпотоком все еще ожидает встретить такие же 
+  превышен, потому что управление битпотоком все еще ожидает встретить такие же
   требования к битпотоку как и в первой части. Этот "ошибочный период" с
   чрезвычайно превышенным квантованием будет выглядеть раздражающе неприятно и
   использовать на самом деле меньше, чем 300 кбит/сек, требуемых ему для того,
@@ -4309,7 +4305,7 @@ man страницы <application>MPlayer</application>'а.
   </para>
   <para>
   Многопроходное кодирование может предложить огромные преимущества по сравнению
-  с однопроходным. Используя статистику, собранную при первом проходе, 
+  с однопроходным. Используя статистику, собранную при первом проходе,
   кодировщик может оценить, с разумной точностью, "стоимость" (в битах)
   кодирования любого заданного кадра при любом заданном квантователе.
   Это делает возможным намного более рациональное, лучше спланированное
@@ -4335,7 +4331,7 @@ man страницы <application>MPlayer</application>'а.
   x264 предоставляет возможность делать желаемое количество последовательных
   проходов. Если Вы указали <option>pass=1</option> при первом проходе,
   используйте затем <option>pass=3</option> в последующем проходе, этот проход
-  будет одновременно читать статистику предыдущего прохода и записывать свою 
+  будет одновременно читать статистику предыдущего прохода и записывать свою
   собственную. Дополнительный проход, следующий за этим, будет иметь очень
   хорошую основу для осуществления очень точных предсказаний размеров кадров при
   выбранном квантователе. На практике, общее улучшение качества от использования
@@ -4355,7 +4351,7 @@ man страницы <application>MPlayer</application>'а.
   случай: <option>qcomp=0</option>, предназначен для истинно постоянного
   битпотока. Обычно это сделает высокодинамичные сцены выглядящими просто
   ужасно, в то время как малодинамичные сцены будут, возможно, выглядеть
-  абсолютно великолепно, но при этом будут использовать во много раз больший 
+  абсолютно великолепно, но при этом будут использовать во много раз больший
   битпоток, чем им необходимо, чтобы выглядеть лишь превосходно.
   Другая крайность: <option>qcomp=1</option>, добивается примерно одинакового
   параметра квантования (QP). Постоянный QP не выглядит плохо, но большинство
@@ -4378,7 +4374,7 @@ man страницы <application>MPlayer</application>'а.
   убывающим, вплоть до исчезающе малого или даже нулевого). Видео поток
   по-прежнему будет иметь точки перемещения, пока в нем есть какие-то изменения
   сцен.
-</para></listitem> 
+</para></listitem>
 <listitem>
   <para>
   <emphasis role="bold">deblock</emphasis>:
@@ -4457,7 +4453,7 @@ man страницы <application>MPlayer</application>'а.
 </para>
 
 <para>
-Все настройки кодирования проверялись на тестовом видео 720x448 @30000/1001 fps 
+Все настройки кодирования проверялись на тестовом видео 720x448 @30000/1001 fps
 с целевым битпотоком 900кбит/сек, на машине AMD-64 3400+ с 2400 МГц и 64-х битном режиме.
 Для каждой настройки кодирования указаны измеренная скорость кодирования (в
 кадрах в секунду) и потеря PSNR (в дБ) по сравнению с настройкой "очень высокое
@@ -4518,7 +4514,7 @@ Video for Windows предоставляет простое кодировани
 <para>
 Имейте в виду, что поддержка этой возможности очень экспериментальная и
 некоторые кодеки могут не работать корректно. Некоторые кодеки могут работать
-только в определенных пространствах цветов, попробуйте 
+только в определенных пространствах цветов, попробуйте
 <option>-vf format=bgr24</option> и <option>-vf format=yuy2</option>,
 если кодек выдает ошибку или кодирует неверно.
 </para>
@@ -4661,8 +4657,8 @@ Video for Windows предоставляет простое кодировани
 </tgroup>
 </informaltable>
 
-Первый столбец содержит имена кодеков, которые должны указываться после 
-параметра <literal>codec</literal>, 
+Первый столбец содержит имена кодеков, которые должны указываться после
+параметра <literal>codec</literal>,
 например: <option>-xvfwopts codec=divx.dll</option>
 FourCC код, используемый каждым кодеком, указан в скобках.
 </para>
@@ -4699,7 +4695,7 @@ mencoder -dvd-device <replaceable>zeiram.iso</replaceable> dvd://7 -o <replaceab
 <application>Cygwin</application> используйте:
 <screen>gcc vfw2menc.c -o vfw2menc.exe -lwinmm -lole32</screen>
 
-Для сборки в <application>MSVC</application> вам потребуется getopt.
+Для сборки в <application>MSVC</application> Вам потребуется getopt.
 Getopt можно найти в исходном архиве <application>vfw2menc</application>,
 доступном в:
 Проект <ulink url="http://oss.netfarm.it/mplayer-win32.php">MPlayer на win32</ulink>.
@@ -4715,8 +4711,8 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 </para>
 </informalexample>
 <para>
-Пользователи Windows могут использовать 
-<option>-xvfwopts codec=vp6vfw.dll:compdata=dialog</option>, 
+Пользователи Windows могут использовать
+<option>-xvfwopts codec=vp6vfw.dll:compdata=dialog</option>,
 для показа окна настроек кодека перед началом кодирования.
 </para>
 </sect2>
@@ -4727,7 +4723,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 
 
 <sect1 id="menc-feat-quicktime-7">
-<title>Использование <application>MEncoder</application> 
+<title>Использование <application>MEncoder</application>
 для создания совместимых с <application>QuickTime</application>
 файлов</title>
 
@@ -4737,7 +4733,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 файлы?</title>
 
 <para>
-  Есть несколько причин, по которым создание 
+  Есть несколько причин, по которым создание
   <application>QuickTime</application>-совместимых файлов может быть
   желательно.
 </para>
@@ -4747,7 +4743,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
   результат Вашего кодирования на большинстве платформ (Windows, Mac OS X, Unices &hellip;).
 </para></listitem>
 <listitem><para>
-  <application>QuickTime</application> 
+  <application>QuickTime</application>
   позволяет воспользоваться преимуществами большего числа возможностей
   аппаратного и программного ускорения на Mac OS X, чем платформо-независимые
   плееры наподобие <application>MPlayer</application> или
@@ -4757,7 +4753,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 </para></listitem>
 <listitem><para>
   <application>QuickTime</application> 7 поддерживает кодек нового поколения
-  H.264, который даёт существенно лучшее качество изображения, чем 
+  H.264, который даёт существенно лучшее качество изображения, чем
   предыдущие поколения кодеков (MPEG-2, MPEG-4 &hellip;).
 </para></listitem>
 </itemizedlist>
@@ -4767,11 +4763,11 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 <title>Ограничения <application>QuickTime</application> 7</title>
 
 <para>
-  <application>QuickTime</application> 7 поддерживает H.264 видео и 
-  AAC аудио, но не поддерживает их мультиплексирование в формат 
+  <application>QuickTime</application> 7 поддерживает H.264 видео и
+  AAC аудио, но не поддерживает их мультиплексирование в формат
   контейнера AVI.
-  Однако, Вы можете использовать <application>MEncoder</application> 
-  для кодирования видео и аудио, а потом использовать внешнюю 
+  Однако, Вы можете использовать <application>MEncoder</application>
+  для кодирования видео и аудио, а потом использовать внешнюю
   программу, такую как <application>mp4creator</application> (часть
   <ulink url="http://mpeg4ip.sourceforge.net/">пакета MPEG4I</ulink>)
   для ремультиплексирования видео и аудио дорожек в контейнер MP4.
@@ -4790,15 +4786,15 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 <listitem><para>
   <emphasis role="bold">B-кадры</emphasis>:
   <application>QuickTime</application> 7 поддерживает максимум 1 B-кадр,
-  т.е. <option>-x264encopts bframes=1</option>. Это означает, что 
-  <option>b_pyramid</option> и <option>weight_b</option> не дадут 
-  эффекта, поскольку им необходимо, чтобы <option>bframes</option> 
+  т.е. <option>-x264encopts bframes=1</option>. Это означает, что
+  <option>b_pyramid</option> и <option>weight_b</option> не дадут
+  эффекта, поскольку им необходимо, чтобы <option>bframes</option>
   было больше 1.
 </para></listitem>
 <listitem><para>
   <emphasis role="bold">Макроблоки</emphasis>:
   <application>QuickTime</application> 7 не поддерживает 8x8 DCT макроблоки.
-  Эта опция (<option>8x8dct</option>) выключена по умолчанию, так что 
+  Эта опция (<option>8x8dct</option>) выключена по умолчанию, так что
   просто удостоверьтесь, что явно её не задали.
   Это также означает, что опция <option>i8x8</option> будет бесполезна,
   т.к. ей необходима <option>8x8dct</option>.
@@ -4806,7 +4802,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 <listitem><para>
   <emphasis role="bold">Коэффициент соотношения сторон</emphasis>:
   <application>QuickTime</application> 7 не поддерживает информацию
-  SAR (коэффициент пропорций пиксела, sample aspect ratio) 
+  SAR (коэффициент пропорций пиксела, sample aspect ratio)
   в MPEG-4 файлах; он предполагает SAR=1. Прочтите
   <link linkend="menc-feat-quicktime-7-scale">раздел о масштабировании</link>
   для обхода проблемы.
@@ -4820,23 +4816,23 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 <para>
   Предположим, что Вы хотите сделать рип свежекупленной копии "Хроник
   Нарнии" и Ваш регион DVD 1, что означает, что это NTSC.
-  Пример ниже будет также применим к PAL, за исключением того, что Вам 
+  Пример ниже будет также применим к PAL, за исключением того, что Вам
   нужно будет опустить <option>-ofps 24000/1001</option> и использовать
   слегка отличающиеся размеры для <option>crop</option> и <option>scale</option>.
 </para>
 
 <para>
-  После запуска <option>mplayer dvd://1</option>, Вы следуете процессу, 
-  описанному в разделе <link linkend="menc-feat-telecine">Как работать 
-  с телесином и чересстрочной развёрткой на NTSC DVD</link> и обнаруживаете, 
-  что это 24000/1001 fps видео с построчной развёрткой. Это несколько 
-  упрощает обработку, поскольку Вам не нужно использовать фильтр 
-  обратного телесина, такой как <option>pullup</option>, или фильтр 
+  После запуска <option>mplayer dvd://1</option>, Вы следуете процессу,
+  описанному в разделе <link linkend="menc-feat-telecine">Как работать
+  с телесином и чересстрочной развёрткой на NTSC DVD</link> и обнаруживаете,
+  что это 24000/1001 fps видео с построчной развёрткой. Это несколько
+  упрощает обработку, поскольку Вам не нужно использовать фильтр
+  обратного телесина, такой как <option>pullup</option>, или фильтр
   деинтерлейса, такой как <option>yadif</option>.
 </para>
 
 <para>
-  Затем Вам необходимо усечь чёрные полосы сверху и снизу видео, как 
+  Затем Вам необходимо усечь чёрные полосы сверху и снизу видео, как
   описано в <link linkend="menc-feat-dvd-mpeg4-example-crop">этом</link>
   разделе.
 </para>
@@ -4848,22 +4844,22 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 
 <para>
   Следующий шаг действительно душераздирающий.
-  <application>QuickTime</application> 7 не поддерживает MPEG-4 видео 
-  с коэффициентом соотношения сторон пиксела, отличным от 1. Так что Вам 
-  придётся масштабировать видео либо в сторону увеличения (что впустую 
-  потратит много места на диске), либо в строну уменьшения (что приведёт 
+  <application>QuickTime</application> 7 не поддерживает MPEG-4 видео
+  с коэффициентом соотношения сторон пиксела, отличным от 1. Так что Вам
+  придётся масштабировать видео либо в сторону увеличения (что впустую
+  потратит много места на диске), либо в строну уменьшения (что приведёт
   к потере некоторых деталей источника) для квадратизации пикселов.
-  Какой бы способ Вы не выбрали, это будет крайне неэффективным, но 
+  Какой бы способ Вы не выбрали, это будет крайне неэффективным, но
   не может быть опущено, если Вы хотите, чтоб Ваше видео воспроизводилось
   с помощью <application>QuickTime</application> 7.
-  <application>MEncoder</application> может применить необходимое 
+  <application>MEncoder</application> может применить необходимое
   увеличивающее или уменьшающее масштабирование, если ему указать
   <option>-vf scale=-10:-1</option> или <option>-vf scale=-1:-10</option>
   соответственно.
-  Это отмасштабирует Ваше видео до корректной ширины для усечённой 
-  высоты, округлённой до ближайшего множителя 16 для оптимального 
+  Это отмасштабирует Ваше видео до корректной ширины для усечённой
+  высоты, округлённой до ближайшего множителя 16 для оптимального
   сжатия.
-  Помните, что если производите обрезание, то нужно сперва обрезать, а лишь затем 
+  Помните, что если производите обрезание, то нужно сперва обрезать, а лишь затем
   масштабировать:
 
   <screen>-vf crop=720:352:0:62,scale=-10:-1</screen>
@@ -4876,12 +4872,12 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 
 <para>
   Поскольку Вы будете мультиплексировать в другой контейнер, Вы должны
-  всегда использовать опцию <option>harddup</option>, чтобы убедиться, 
+  всегда использовать опцию <option>harddup</option>, чтобы убедиться,
   что дублирующиеся кадры будут действительно дублироваться в полученном
   видео. Без этой опции <application>MEncoder</application> будет просто
   располагать маркер в видеопотоке о том, что кадр был повторен, и будет
-  полагаться на то, что клиентское программное обеспечение покажет кадр 
-  дважды. К сожалению, это "мягкое дублирование" не переживает 
+  полагаться на то, что клиентское программное обеспечение покажет кадр
+  дважды. К сожалению, это "мягкое дублирование" не переживает
   ремультиплексирование, в результате чего аудио будет постепенно терять
   синхронизацию с видео.
 </para>
@@ -4897,15 +4893,15 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 <title>Битпоток</title>
 
 <para>
-  Как обычно, выбор битпотока зависит от технических свойств исходного 
+  Как обычно, выбор битпотока зависит от технических свойств исходного
   материала, как объясняется
   <link linkend="menc-feat-dvd-mpeg4-resolution-bitrate">здесь</link>,
   как, впрочем, и от личного вкуса.
-  Этот фильм обладает небольшим количеством движения и большим 
-  количеством деталей, но H.264 видео хорошо выглядит на существенно 
+  Этот фильм обладает небольшим количеством движения и большим
+  количеством деталей, но H.264 видео хорошо выглядит на существенно
   меньших битпотоках, чем XviD или другие MPEG-4 кодеки.
-  После длительного экспериментирования, автор данного руководства 
-  решил кодировать фильм на 900 кбит/сек, и считает, что он выглядит 
+  После длительного экспериментирования, автор данного руководства
+  решил кодировать фильм на 900 кбит/сек, и считает, что он выглядит
   очень хорошо. Вы можете уменьшить битпоток, если Вам нужно сохранить
   больше места, или увеличить, если Вам нужно улучшить качество.
 </para>
@@ -4916,14 +4912,14 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf
 <title>Пример кодирования</title>
 
 <para>
-  Теперь Вы готовы к кодированию видео. Поскольку Вы заботитесь 
+  Теперь Вы готовы к кодированию видео. Поскольку Вы заботитесь
   о качестве, Вы , разумеется, будете делать двупроходное кодирование.
   Для некоторого сокращения времени кодирования, Вы можете указать
   опцию <option>turbo</option> при первом проходе; это уменьшит
-  <option>subq</option> и <option>frameref</option> до 1. 
+  <option>subq</option> и <option>frameref</option> до 1.
   Чтобы сохранить немного места на диске, Вы можете использовать
-  параметр <option>ss</option> для отрезания первых нескольких 
-  секунд видео. (Я обнаружил, что, в частности, у данного фильма 
+  параметр <option>ss</option> для отрезания первых нескольких
+  секунд видео. (Я обнаружил, что, в частности, у данного фильма
   есть 32 секунды титров и логотипов.)
   <option>bframes</option> может быть 0 или 1.
   остальные опции описаны в разделе <link
@@ -4938,8 +4934,8 @@ me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300
 -oac faac -faacopts br=192:mpeg=4:object=2 -channels 2 -srate 48000 \
 -ofps 24000/1001</screen>
 
-  Если у Вас многопроцессорная машина, не упустите шанс значительно 
-  ускорить кодирование задействованием 
+  Если у Вас многопроцессорная машина, не упустите шанс значительно
+  ускорить кодирование задействованием
   <link linkend="menc-feat-x264-encoding-options-speedquality-threads">
   многопоточного режима <systemitem class="library">x264</systemitem></link>,
   добавив <option>threads=auto</option> в <option>x264encopts</option> в
@@ -4947,7 +4943,7 @@ me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300
 </para>
 
 <para>
-  Второй проход выполняется аналогично, за исключением того, что Вам 
+  Второй проход выполняется аналогично, за исключением того, что Вам
   нужно указать выходной файл и установить <option>pass=2</option>.
 
   <screen>mencoder dvd://1 <emphasis role="bold">-o нарния.avi</emphasis> -ss 32 -ovc x264 \
@@ -4961,7 +4957,7 @@ me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300
 <para>
   Получившееся AVI должно хорошо воспроизводиться в
   <application>MPlayer</application>, но, конечно же,
-  <application>QuickTime</application> не сможет его воспроизвести, 
+  <application>QuickTime</application> не сможет его воспроизвести,
   т.к. не поддерживает H.264, мультиплексированный в AVI.
   Так что следующий шаг &mdash; ремультиплексирование видео в контейнер MP4.
 </para>
@@ -4971,14 +4967,14 @@ me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300
 <title>Ремультиплексирование в MP4</title>
 
 <para>
-  Существует несколько способов ремультиплексирования AVI файлов 
-  в MP4. Вы можете использовать <application>mp4creator</application>, 
+  Существует несколько способов ремультиплексирования AVI файлов
+  в MP4. Вы можете использовать <application>mp4creator</application>,
   являющийся частью
   <ulink url="http://mpeg4ip.sourceforge.net/">пакета MPEG4IP</ulink>.
 </para>
 
 <para>
-  Сперва демультиплексируйте AVI в отдельные аудио и видео потоки 
+  Сперва демультиплексируйте AVI в отдельные аудио и видео потоки
   с помощью <application>MPlayer</application>.
 
   <screen>mplayer нарния.avi -dumpaudio -dumpfile нарния.aac
@@ -4990,7 +4986,7 @@ mplayer нарния.avi -dumpvideo -dumpfile нарния.h264</screen>
 </para>
 
 <para>
-  Теперь используйте <application>mp4creator</application> для создания 
+  Теперь используйте <application>mp4creator</application> для создания
   нового MP4 файла из аудио и видео потоков.
 
   <screen>mp4creator -create=нарния.aac нарния.mp4
@@ -5005,9 +5001,9 @@ mp4creator -create=нарния.h264 -rate=23.976 нарния.mp4</screen>
   Теперь файл <systemitem>нарния.mp4</systemitem> должен проигрываться
   с помощью любого <application>QuickTime</application> 7 приложения,
   например, <application>QuickTime Player</application> или
-  <application>iTunes</application>. 
-  Если Вы планируете просмотр видео в вэб-браузере с помощью плагина 
-  <application>QuickTime</application>, Вам также необходимо 
+  <application>iTunes</application>.
+  Если Вы планируете просмотр видео в вэб-браузере с помощью плагина
+  <application>QuickTime</application>, Вам также необходимо
   модифицировать фильм таким образом, чтобы плагин
   <application>QuickTime</application> мог начать его воспроизведение
   ещё во время загрузки. <application>mp4creator</application>
@@ -5017,7 +5013,7 @@ mp4creator -create=нарния.h264 -rate=23.976 нарния.mp4</screen>
 mp4creator -hint=2 нарния.mp4
 mp4creator -optimize нарния.mp4</screen>
 
-  Вы можете проверить полученный результат, чтобы убедиться, что 
+  Вы можете проверить полученный результат, чтобы убедиться, что
   вспомогательные дорожки были успешно созданы.
 
   <screen>mp4creator -list нарния.mp4</screen>
@@ -5038,18 +5034,18 @@ mp4creator -optimize нарния.mp4</screen>
 <title>Добавление тегов метаданных</title>
 
 <para>
-  Если Вы хотите добавить в видео теги, которые отображаются в iTunes, Вы 
+  Если Вы хотите добавить в видео теги, которые отображаются в iTunes, Вы
   можете использовать
   <ulink url="http://atomicparsley.sourceforge.net/">AtomicParsley</ulink>.
-  
+
   <screen>AtomicParsley нарния.mp4 --metaEnema --title "The Chronicles of Narnia" --year 2005 --stik Movie --freefree --overWrite</screen>
 
   Опция <option>--metaEnema</option> удаляет любые существующие метаданные
   (<application>mp4creator</application> вставляет своё название в тег
   "утилита кодирования") и <option>--freefree</option> высвобождает место,
   оставшееся от удалённых метаданных.
-  Опция <option>--stik</option> устанавливает тип видео (например, 
-  Movie или TV Show), который используется iTunes для группировки 
+  Опция <option>--stik</option> устанавливает тип видео (например,
+  Movie или TV Show), который используется iTunes для группировки
   родственных видеофайлов.
   Опция <option>--overWrite</option> перезаписывает исходный файл; без неё
   <application>AtomicParsley</application> создаст новый файл с автоматическим
@@ -5065,7 +5061,7 @@ mp4creator -optimize нарния.mp4</screen>
 
 
 <sect1 id="menc-feat-vcd-dvd">
-<title>Использование <application>MEncoder</application> 
+<title>Использование <application>MEncoder</application>
   для создания VCD/SVCD/DVD-совместимых файлов.</title>
 
 <sect2 id="menc-feat-vcd-dvd-constraints">
@@ -5074,11 +5070,11 @@ mp4creator -optimize нарния.mp4</screen>
 <para>
 <application>MEncoder</application> способен создавать MPEG файлы VCD, SCVD
 и DVD формата, используя библиотеку <systemitem class="library">libavcodec</systemitem>.
-Эти файлы затем могут быть использованы совместно с 
+Эти файлы затем могут быть использованы совместно с
 <ulink url="http://www.gnu.org/software/vcdimager/vcdimager.html">vcdimager</ulink>
 или
 <ulink url="http://dvdauthor.sourceforge.net/">dvdauthor</ulink>
-для создания дисков, которые будут воспроизводиться на стандартном видео 
+для создания дисков, которые будут воспроизводиться на стандартном видео
 проигрывателе.
 </para>
 
@@ -5112,7 +5108,7 @@ DVD, SVCD, и VCD форматы обладают жесткими ограни
 <tbody>
 <row>
   <entry>NTSC DVD</entry>
-  <entry>720x480, 704x480, 352x480, 352x240</entry> 
+  <entry>720x480, 704x480, 352x480, 352x240</entry>
   <entry>MPEG-2</entry>
   <entry>9800 кбит/с</entry>
   <entry>48000 Гц</entry>
@@ -5125,7 +5121,7 @@ DVD, SVCD, и VCD форматы обладают жесткими ограни
   <entry>NTSC DVD</entry>
   <entry>352x240<footnote id='fn-rare-resolutions'><para>
   Эти разрешения редко используются для DVD, поскольку имеют довольно низкое
-  качество.</para></footnote></entry> 
+  качество.</para></footnote></entry>
   <entry>MPEG-1</entry>
   <entry>1856 кбит/с</entry>
   <entry>48000 Гц</entry>
@@ -5220,7 +5216,7 @@ DVD, SVCD, и VCD форматы обладают жесткими ограни
 <title>Ограничения на размер GOP</title>
 
 <para>
-DVD, VCD, и SVCD также ограничивают Вас относительно низкими размерами  
+DVD, VCD, и SVCD также ограничивают Вас относительно низкими размерами
 GOP (Group of Pictures, Группа Изображений).
 Для материала с 30 fps максимальный допустимый размер GOP равен 18.
 Для 25 или 24 fps, максимум равен 15.
@@ -5325,14 +5321,14 @@ DVD с NTSC Pullup:
 <title>Сохранение A/V синхронизации</title>
 
 <para>
-Для того, чтобы сохранять аудио/видео синхронизацию на протяжении всего 
+Для того, чтобы сохранять аудио/видео синхронизацию на протяжении всего
 кодирования, <application>MEncoder</application> должен выбрасывать или
 дублировать кадры. Это довольно неплохо работает при мультиплексировании в AVI
 файл, но с другими мультиплексорами, такими как MPEG, почти гарантировано
-приведет к нарушению A/V синхронизации. Для избежания подобных проблем, 
+приведет к нарушению A/V синхронизации. Для избежания подобных проблем,
 необходимо добавить видео фильтр <option>harddup</option> в конец цепочки
 фильтров. Дополнительную техническую информацию о <option>harddup</option> можно
-найти в разделе 
+найти в разделе
 <link linkend="menc-feat-dvd-mpeg4-muxing-filter-issues">Улучшение
 мультиплексирования и надежности A/V синхронизации</link> или в man руководстве.
 </para>
@@ -5369,8 +5365,8 @@ VCD и SVCD:
 <title>Введение</title>
 
 <para>
-  Используя соответствующие опции, можно применять 
-  <systemitem class="library">libavcodec</systemitem> для создания VCD/SVCD/DVD 
+  Используя соответствующие опции, можно применять
+  <systemitem class="library">libavcodec</systemitem> для создания VCD/SVCD/DVD
   совместимого видео.
 </para>
 </sect3>
@@ -5405,7 +5401,7 @@ VCD и SVCD:
   <option>mpeg1video</option> для VCD;
   <option>mpeg2video</option> для SVCD;
   <option>mpeg2video</option> обычно используется для DVD, но Вы также можете
-  использовать 
+  использовать
   <option>mpeg1video</option> для CIF разрешений.
 </para></listitem>
 <listitem><para>
@@ -5491,15 +5487,15 @@ keyint=15:vstrict=0:acodec=ac3
 <title>Расширенные опции</title>
 
 <para>
-Для достижения более высокого качества кодирования, Вы также можете 
+Для достижения более высокого качества кодирования, Вы также можете
 добавить опции lavcopts, улучшающие качество, такие как
 <option>trell</option>, <option>mbd=2</option> и другие.
-Обратите внимание, что <option>qpel</option> и <option>v4mv</option>, 
+Обратите внимание, что <option>qpel</option> и <option>v4mv</option>,
 часто полезные с MPEG-4, не применимы к MPEG-1 или MPEG-2.
 Также, если Вы хотите выполнить очень высококачественное кодирование
 DVD, может быть полезным добавление <option>dc=10</option> в lavcopts.
-Это может помочь подавить появление блоков в однородно окрашенных 
-областях. Подводя итог, вот пример настроек lavcopts для 
+Это может помочь подавить появление блоков в однородно окрашенных
+областях. Подводя итог, вот пример настроек lavcopts для
 высококачественного DVD:
 </para>
 
@@ -5519,7 +5515,7 @@ vqmin=1:lmin=1:dc=10:vstrict=0
 <title>Кодирование звука</title>
 
 <para>
-VCD и SVCD поддерживают звук MPEG-1 layer II, используя одну из 
+VCD и SVCD поддерживают звук MPEG-1 layer II, используя одну из
 <systemitem class="library">toolame</systemitem>,
 <systemitem class="library">twolame</systemitem>,
 или MP2 <systemitem class="library">libavcodec</systemitem> кодировщик.
diff --git a/Makefile b/Makefile
index a7461a0..263f3cd 100644
--- a/Makefile
+++ b/Makefile
@@ -92,8 +92,6 @@ SRCS_COMMON = asxparser.c \
               libmpcodecs/dec_video.c \
               libmpcodecs/img_format.c \
               libmpcodecs/mp_image.c \
-              libmpcodecs/native/nuppelvideo.c \
-              libmpcodecs/native/rtjpegn.c \
               libmpcodecs/native/xa_gsm.c \
               libmpcodecs/pullup.c \
               libmpcodecs/vd.c \
@@ -102,7 +100,6 @@ SRCS_COMMON = asxparser.c \
               libmpcodecs/vd_mpegpes.c \
               libmpcodecs/vd_mtga.c \
               libmpcodecs/vd_null.c \
-              libmpcodecs/vd_nuv.c \
               libmpcodecs/vd_raw.c \
               libmpcodecs/vd_sgi.c \
               libmpcodecs/vf.c \
@@ -187,7 +184,6 @@ SRCS_COMMON = asxparser.c \
               libmpdemux/demux_mov.c \
               libmpdemux/demux_mpg.c \
               libmpdemux/demux_nsv.c \
-              libmpdemux/demux_nuv.c \
               libmpdemux/demux_pva.c \
               libmpdemux/demux_rawaudio.c \
               libmpdemux/demux_rawvideo.c \
@@ -600,6 +596,7 @@ SRCS_MPLAYER-$(IVTV)         += libao2/ao_ivtv.c libvo/vo_ivtv.c
 SRCS_MPLAYER-$(JACK)         += libao2/ao_jack.c
 SRCS_MPLAYER-$(JOYSTICK)     += input/joystick.c
 SRCS_MPLAYER-$(JPEG)         += libvo/vo_jpeg.c
+SRCS_MPLAYER-$(KVA)          += libvo/vo_kva.c
 SRCS_MPLAYER-$(LIBMENU)      += libmenu/menu.c \
                                 libmenu/menu_chapsel.c \
                                 libmenu/menu_cmdlist.c  \
@@ -688,7 +685,7 @@ SRCS_MENCODER-$(FAAC)             += libmpcodecs/ae_faac.c
 SRCS_MENCODER-$(LIBAVCODEC)       += libmpcodecs/ae_lavc.c libmpcodecs/ve_lavc.c
 SRCS_MENCODER-$(LIBAVFORMAT)      += libmpdemux/muxer_lavf.c
 SRCS_MENCODER-$(LIBDV)            += libmpcodecs/ve_libdv.c
-SRCS_MENCODER-$(LIBLZO)           += libmpcodecs/ve_nuv.c
+SRCS_MENCODER-$(LIBLZO)           += libmpcodecs/ve_nuv.c libmpcodecs/native/rtjpegn.c
 SRCS_MENCODER-$(MP3LAME)          += libmpcodecs/ae_lame.c
 SRCS_MENCODER-$(QTX_CODECS_WIN32) += libmpcodecs/ve_qtvideo.c
 SRCS_MENCODER-$(TOOLAME)          += libmpcodecs/ae_toolame.c
@@ -825,7 +822,7 @@ mplayer$(EXESUF): $(MPLAYER_DEPS)
 	$(CC) -o $@ $^ $(LDFLAGS_MPLAYER)
 
 codec-cfg$(EXESUF): codec-cfg.c help_mp.h
-	$(HOST_CC) -O -DCODECS2HTML $(EXTRA_INC) -o $@ $<
+	$(HOST_CC) -O -DCODECS2HTML -I. -o $@ $<
 
 codecs.conf.h: codec-cfg$(EXESUF) etc/codecs.conf
 	./$^ > $@
@@ -855,18 +852,19 @@ version.h: version.sh
 # Make sure all generated header files are created.
 $(DEPS) $(MENCODER_DEPS) $(MPLAYER_DEPS): codecs.conf.h help_mp.h version.h
 
-libdvdcss/%.o libdvdcss/%.d: CFLAGS += -D__USE_UNIX98 -D_GNU_SOURCE -DVERSION=\"1.2.10\" $(CFLAGS_LIBDVDCSS)
-libdvdnav/%.o libdvdnav/%.d: CFLAGS += -D__USE_UNIX98 -D_GNU_SOURCE -DHAVE_CONFIG_H -DVERSION=\"MPlayer-custom\"
-libdvdread4/%.o libdvdread4/%.d: CFLAGS += -D__USE_UNIX98 -D_GNU_SOURCE -DHAVE_CONFIG_H $(CFLAGS_LIBDVDCSS_DVDREAD)
-libfaad2/%.o libfaad2/%.d: CFLAGS += -Ilibfaad2 -D_GNU_SOURCE -DHAVE_CONFIG_H $(CFLAGS_FAAD_FIXED)
+libdvdcss/%: CFLAGS += -D__USE_UNIX98 -D_GNU_SOURCE -DVERSION=\"1.2.10\" $(CFLAGS_LIBDVDCSS)
+libdvdnav/%: CFLAGS += -D__USE_UNIX98 -D_GNU_SOURCE -DHAVE_CONFIG_H -DVERSION=\"MPlayer-custom\"
+libdvdnav/% stream/stream_dvdnav%: CFLAGS += $(CFLAGS_LIBDVDNAV)
+libdvdread4/%: CFLAGS += -D__USE_UNIX98 -D_GNU_SOURCE -DHAVE_CONFIG_H $(CFLAGS_LIBDVDCSS_DVDREAD)
+libfaad2/%: CFLAGS += -Ilibfaad2 -D_GNU_SOURCE -DHAVE_CONFIG_H $(CFLAGS_FAAD_FIXED)
 
-loader/% loader/%: CFLAGS += -Iloader -fno-omit-frame-pointer $(CFLAGS_NO_OMIT_LEAF_FRAME_POINTER)
-#loader/%.o loader/%.d: CFLAGS += -Ddbg_printf=__vprintf -DTRACE=__vprintf -DDETAILED_OUT
-loader/win32.o loader/win32.d: CFLAGS += $(CFLAGS_STACKREALIGN)
+loader/%: CFLAGS += -Iloader -fno-omit-frame-pointer $(CFLAGS_NO_OMIT_LEAF_FRAME_POINTER)
+#loader/%: CFLAGS += -Ddbg_printf=__vprintf -DTRACE=__vprintf -DDETAILED_OUT
+loader/win32%: CFLAGS += $(CFLAGS_STACKREALIGN)
 
-mp3lib/decode_i586.o: CFLAGS += -fomit-frame-pointer
+mp3lib/decode_i586%: CFLAGS += -fomit-frame-pointer
 
-tremor/%.o tremor/%.d: CFLAGS += $(CFLAGS_TREMOR_LOW)
+tremor/%: CFLAGS += $(CFLAGS_TREMOR_LOW)
 
 vidix/%: CFLAGS += $(CFLAGS_DHAHELPER) $(CFLAGS_SVGALIB_HELPER)
 
@@ -992,7 +990,7 @@ testsclean:
 TOOLS = $(addprefix TOOLS/,alaw-gen asfinfo avi-fix avisubdump compare dump_mp4 movinfo netstream subrip vivodump)
 
 ifdef ARCH_X86
-TOOLS += TOOLS/modify_reg
+TOOLS += TOOLS/fastmemcpybench TOOLS/modify_reg
 endif
 
 ALLTOOLS = $(TOOLS) TOOLS/bmovl-test TOOLS/vfw2menc
@@ -1002,7 +1000,7 @@ alltools: $(addsuffix $(EXESUF),$(ALLTOOLS))
 
 toolsclean:
 	-rm -f $(foreach file,$(ALLTOOLS),$(call ADD_ALL_EXESUFS,$(file)))
-	-rm -f TOOLS/fastmem*-* TOOLS/realcodecs/*.so.6.0
+	-rm -f TOOLS/realcodecs/*.so.6.0
 
 TOOLS/bmovl-test$(EXESUF): -lSDL_image
 
@@ -1019,22 +1017,11 @@ TOOLS/vivodump$(EXESUF): TOOLS/vivodump.c
 TOOLS/netstream$(EXESUF) TOOLS/vivodump$(EXESUF): $(subst mplayer.o,mplayer-nomain.o,$(OBJS_MPLAYER)) $(filter-out %mencoder.o,$(OBJS_MENCODER)) $(OBJS_COMMON) $(COMMON_LIBS)
 	$(CC) $(CFLAGS) -o $@ $^ $(EXTRALIBS_MPLAYER) $(EXTRALIBS_MENCODER) $(COMMON_LDFLAGS)
 
-fastmemcpybench: TOOLS/fastmemcpybench.c
-	$(CC) $(CFLAGS) $< -o TOOLS/fastmem-mmx$(EXESUF)  -DNAME=\"mmx\"      -DHAVE_MMX
-	$(CC) $(CFLAGS) $< -o TOOLS/fastmem-k6$(EXESUF)   -DNAME=\"k6\ \"     -DHAVE_MMX -DHAVE_AMD3DNOW
-	$(CC) $(CFLAGS) $< -o TOOLS/fastmem-k7$(EXESUF)   -DNAME=\"k7\ \"     -DHAVE_MMX -DHAVE_AMD3DNOW -DHAVE_MMX2
-	$(CC) $(CFLAGS) $< -o TOOLS/fastmem-sse$(EXESUF)  -DNAME=\"sse\"      -DHAVE_MMX -DHAVE_SSE      -DHAVE_MMX2
-	$(CC) $(CFLAGS) $< -o TOOLS/fastmem2-mmx$(EXESUF) -DNAME=\"mga-mmx\"  -DCONFIG_MGA -DHAVE_MMX
-	$(CC) $(CFLAGS) $< -o TOOLS/fastmem2-k6$(EXESUF)  -DNAME=\"mga-k6\ \" -DCONFIG_MGA -DHAVE_MMX -DHAVE_AMD3DNOW
-	$(CC) $(CFLAGS) $< -o TOOLS/fastmem2-k7$(EXESUF)  -DNAME=\"mga-k7\ \" -DCONFIG_MGA -DHAVE_MMX -DHAVE_AMD3DNOW -DHAVE_MMX2
-	$(CC) $(CFLAGS) $< -o TOOLS/fastmem2-sse$(EXESUF) -DNAME=\"mga-sse\"  -DCONFIG_MGA -DHAVE_MMX -DHAVE_SSE      -DHAVE_MMX2
-
 REAL_SRCS    = $(wildcard TOOLS/realcodecs/*.c)
 REAL_TARGETS = $(REAL_SRCS:.c=.so.6.0)
 
 realcodecs: $(REAL_TARGETS)
-
-fastmemcpybench realcodecs: CFLAGS += -g
+realcodecs: CFLAGS += -g
 
 %.so.6.0: %.o
 	ld -shared -o $@ $< -ldl -lc
@@ -1098,18 +1085,17 @@ vidix/dhahelperwin/dhahelper-rc.o: vidix/dhahelperwin/common.ver vidix/dhahelper
 
 vidix/dhahelperwin/base.tmp: vidix/dhahelperwin/dhahelper.o vidix/dhahelperwin/dhahelper-rc.o
 	$(CC) -Wl,--base-file,$@ -Wl,--entry,_DriverEntry at 8 -nostartfiles \
-            -nostdlib -o vidix/dhahelperwin/junk.tmp $^ -lntoskrnl
-	-rm -f vidix/dhahelperwin/junk.tmp
+            -nostdlib -o $(@D)/junk.tmp $^ -lntoskrnl
+	-rm -f $(@D)/junk.tmp
 
 vidix/dhahelperwin/temp.exp: vidix/dhahelperwin/base.tmp
-	dlltool --dllname vidix/dhahelperwin/dhahelper.sys --base-file $< --output-exp $@
+	dlltool --dllname $(@D)/dhahelper.sys --base-file $< --output-exp $@
 
 vidix/dhahelperwin/dhahelper.sys: vidix/dhahelperwin/temp.exp vidix/dhahelperwin/dhahelper.o vidix/dhahelperwin/dhahelper-rc.o
 	$(CC) -Wl,--subsystem,native -Wl,--image-base,0x10000 \
             -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 \
             -Wl,--entry,_DriverEntry at 8 -Wl,$< -mdll -nostartfiles -nostdlib \
-            -o $@ vidix/dhahelperwin/dhahelper.o \
-            vidix/dhahelperwin/dhahelper-rc.o -lntoskrnl
+            -o $@ $(@:.sys=.o) $(@:.sys=-rc.o) -lntoskrnl
 	strip $@
 
 install-dhahelperwin:
diff --git a/TOOLS/binary_codecs.sh b/TOOLS/binary_codecs.sh
index c4ab61c..410bede 100755
--- a/TOOLS/binary_codecs.sh
+++ b/TOOLS/binary_codecs.sh
@@ -1,9 +1,12 @@
 #!/bin/sh
 set -e
 
+# avoid insecure tempfile creation
+umask 0022
+
 # This script will download binary codecs for MPlayer unto a Debian system.
 
-# Author:  thuglife, mennucc1
+# Author: thuglife, mennucc1
 #
 
 CODECDIR=/usr/lib/codecs
@@ -22,23 +25,24 @@ choosemirror ()
 {
   cd $PREFDIR
 
-  #if [ ! -r mirrors ] || find  mirrors -mtime +20  ; then
-    echo Downloading mirrors list..
+  #if [ ! -r mirrors ] || find mirrors -mtime +20 ; then
+    echo "Downloading mirrors list"
     wget -nv -c -N $MYSITE/mirrors || true
   #fi
   if [ ! -r bestsites ] || [ mirrors -nt bestsites ] || \
-    find  bestsites -mtime +20 > /dev/null ; then
-    if which netselect > /dev/null  ; then
-      echo  Choosing best mirrors using netselect....
-      netselect  -s 5  $( cat mirrors ) | awk '{print $2}' > bestsites
+    find bestsites -mtime +20 | grep -q bestsites ; then
+    if which netselect > /dev/null ; then
+      echo Choosing best mirrors using netselect
+      netselect -s 5 -t 5 $( cat mirrors ) | awk '{print $2}' > bestsites
     elif which fping > /dev/null ; then
-      fping -C 1   $( sed   's#.*//##;s#/.*##' mirrors ) 2>&1 | \
-        egrep -v 'bytes.*loss' | sort -n -k3  | \
-        grep -v ': *-' |  awk '/:/{print $1}' | head -5 > bestsites
+     fping -C 1  $( sed   's#.*//##;s#/.*##' mirrors ) 2>&1 | \
+       egrep -v 'bytes.*loss' | sort -n -k3 | \
+       grep -v ': *-' | awk '/:/{print $1}' | head -5 | ( while read mainsite ; do
+         grep $mainsite $PREFDIR/mirrors ; done ) > bestsites
     else
-      echo "(If you install 'netselect', it will select the best mirror for you"
+      echo "(If you install 'netselect' or 'fping', it will select the best mirror for you"
       echo "  you may wish to stop this script and rerun after installation)"
-      sleep 5
+      sleep 3
       head -3 mirrors > bestsites
     fi
   fi
@@ -54,24 +58,22 @@ INSTALL () {
   cd $CODECDIR/mplayer_binary_codecs
 
   if [ -r $filename ] ; then
-    cp $filename  $filename.bak
+    cp $filename $filename.bak
   fi
 
-  if [  "$url" = @MAINSITE@ ] ; then
-    cat $PREFDIR/bestsites |   while read mainsite ; do
+  if [ "$url" = @MAINSITE@ ] ; then
+    cat $PREFDIR/bestsites | while read mainsite ; do
       echo Downloading $filename from $mainsite ...
-      wget -v -c -N $mainsite/$dir/$filename || true
+      wget -c -N $mainsite/$dir/$filename || true
       if [ -r "$filename" ] ; then
         UNPACK "$filename"
-        [ -r $filename.bak ] && rm $filename.bak
         return 0
       fi
     done
   else
-    wget -v -c -N $url/$dir/$filename || true
-    if  [ -r "$filename" ] ; then
+    wget -c -N $url/$dir/$filename || true
+    if [ -r "$filename" ] ; then
       UNPACK "$filename"
-      [ -r $filename.bak ] && rm $filename.bak
       return 0
     fi
   fi
@@ -83,28 +85,41 @@ INSTALL () {
 UNPACK ()
 {
   filename="$1"
-  if [ ! -r $filename.bak ] || ! cmp $filename.bak $filename ; then
-    echo Installing $filename  ...
-    if [ -r $filename.list  ] ; then
-      tr '\n' '\000' < $filename.list | xargs -r0 rm  || true
+  if [ -r $filename.bak ] && cmp $filename.bak $filename && [ -r  $filename.list ] ; then
+    echo It appears that $filename was already succesfully installed
+    [ -r $filename.bak ] && rm $filename.bak
+  else
+    if grep -q " $filename$" $PREFDIR/MD5SUMS ; then
+      echo Checking MD5 for $filename
+      grep " $filename$" $PREFDIR/MD5SUMS | md5sum -c -
+    else
+      echo Warning: no MD5 for $filename were found. Hit enter to continue.
+      read dummy
+    fi
+    echo Installing $filename ...
+    if [ -r $filename.list ] ; then
+      tr '\n' '\000' < $filename.list | xargs -r0 rm || true
       UNLINK $filename.list
       rm $filename.list
     fi
 
+    tarfail () { echo FAILED $filename ; rm $filename.list ; exit 1 ; }
+
     case "$filename" in
       *.tar.gz)
-        tar xvzf $filename > $filename.list
+        tar xvzf $filename > $filename.list || tarfail
         #rm $filename
         ;;
       *.tgz)
-        tar xvzf $filename > $filename.list
+        tar xvzf $filename > $filename.list || tarfail
         #rm $filename
         ;;
       *.tar.bz2)
-        tar  --bzip2 -xvf $filename > $filename.list
+        tar --bzip2 -xvf $filename > $filename.list || tarfail
         #rm $filename
         ;;
     esac
+    [ -r $filename.bak ] && rm $filename.bak
     LINK $filename.list
     echo "Installed $filename Succesfully!"
   fi
@@ -135,22 +150,51 @@ fi
 
 case "$1" in
   install)
+    if test -x /bin/bzip2 || test -x /usr/bin/bzip2 ; then : ; else
+      echo You need to install bzip2
+      exit 1
+    fi
     choosemirror
     cd $PREFDIR
-    #if [ ! -r codecs_list ] || find  codecs_list -mtime +20  ; then
-      echo 'Getting  codecs list ...'
+    #if [ ! -r codecs_list ] || find codecs_list -mtime +20 ; then
+      echo "Getting codecs list"
       wget -nv -c -N $MYSITE/codecs_list || true
     #fi
 
-    if  grep -q "^$dpkgarch" $PREFDIR/codecs_list   ] ; then
+    cd $PREFDIR
+    echo Downloading MD5 sums from main site
+    [ -r MD5SUMS ] && mv MD5SUMS MD5SUMS.bak
+    if wget -nv -N http://www.mplayerhq.hu/MPlayer/releases/codecs/MD5SUMS ; then
+      [ -r MD5SUMS.bak ] && rm MD5SUMS.bak
+    else
+      echo "failed"
+      if [ -r MD5SUMS.bak ] ; then
+        echo "trying to use backup"
+        mv MD5SUMS.bak MD5SUMS
+      fi
+    fi
+
+    if grep -q "^$dpkgarch" $PREFDIR/codecs_list ; then
       egrep -v "^[[:space:]]*(#|$)" $PREFDIR/codecs_list | \
         while read arch url dir file info ; do
           if [ "$dpkgarch" = "$arch" ]; then
-            echo Installing $file  $info...
-            INSTALL "$url"  "$dir"  "$file"
-            n=1
+            echo Downloading and installing $file $info...
+            INSTALL "$url" "$dir" "$file"
           fi
         done
+      needlibstd=no
+      test "$dpkgarch" = "powerpc" && needlibstd=yes
+      test "$dpkgarch" = "i386" && needlibstd=yes
+      if test "$needlibstd" = "yes" && ! test -r /usr/lib/libstdc++.so.5 ; then
+	echo "Warning: you need to install libstdc++ 5 libraries"
+	echo -n "Do it now? "
+	read R
+	case $R in
+         y*) apt-get install libstdc++5 ;;
+          *) echo "If you change your mind, use the command"
+             echo "  apt-get install libstdc++5" ;;
+        esac
+      fi
     else
       echo "Sorry, no codecs for your arch '$dpkgarch'. Sorry dude :("
       exit 1
diff --git a/TOOLS/fastmemcpybench.c b/TOOLS/fastmemcpybench.c
index 2d8ac2b..35946d8 100644
--- a/TOOLS/fastmemcpybench.c
+++ b/TOOLS/fastmemcpybench.c
@@ -1,14 +1,12 @@
 /*
-   fastmemcpybench.c used to benchmark fastmemcpy.h code from libvo.
-     
-   Note: this code can not be used on PentMMX-PII because they contain
-   a bug in rdtsc. For Intel processors since P6(PII) rdpmc should be used
-   instead. For PIII it's disputable and seems bug was fixed but I don't
-   tested it.
+ * benchmark tool for fast_memcpy code from libvo
+ *
+ * NOTE: This code can not be used on Pentium MMX / II because they contain
+ * a bug in rdtsc. For Intel processors since P6(PII) rdpmc should be used
+ * instead. For PIII it's disputable and it seems the bug was fixed but this
+ * was not confirmed through testing.
 */
 
-/* According to Uoti this code is broken. */
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -19,6 +17,92 @@
 #include <sys/time.h>
 #include <inttypes.h>
 
+#include "config.h"
+#include "cpudetect.h"
+
+#define BLOCK_SIZE 4096
+#define CONFUSION_FACTOR 0
+
+#if HAVE_MMX
+#define COMPILE_MMX
+#endif
+
+#if HAVE_MMX2
+#define COMPILE_MMX2
+#endif
+
+#if HAVE_AMD3DNOW
+#define COMPILE_AMD3DNOW
+#endif
+
+#if HAVE_SSE
+#define COMPILE_SSE
+#endif
+
+#ifdef COMPILE_MMX
+#undef RENAME
+#undef HAVE_MMX
+#undef HAVE_MMX2
+#undef HAVE_AMD3DNOW
+#undef HAVE_SSE
+#undef HAVE_SSE2
+#define HAVE_MMX 1
+#define HAVE_MMX2 0
+#define HAVE_AMD3DNOW 0
+#define HAVE_SSE 0
+#define HAVE_SSE2 0
+#define RENAME(a) a ## _MMX
+#include "libvo/aclib_template.c"
+#endif
+
+#ifdef COMPILE_MMX2
+#undef RENAME
+#undef HAVE_MMX
+#undef HAVE_MMX2
+#undef HAVE_AMD3DNOW
+#undef HAVE_SSE
+#undef HAVE_SSE2
+#define HAVE_MMX 1
+#define HAVE_MMX2 1
+#define HAVE_AMD3DNOW 0
+#define HAVE_SSE 0
+#define HAVE_SSE2 0
+#define RENAME(a) a ## _MMX2
+#include "libvo/aclib_template.c"
+#endif
+
+#ifdef COMPILE_AMD3DNOW
+#undef RENAME
+#undef HAVE_MMX
+#undef HAVE_MMX2
+#undef HAVE_AMD3DNOW
+#undef HAVE_SSE
+#undef HAVE_SSE2
+#define HAVE_MMX 1
+#define HAVE_MMX2 0
+#define HAVE_AMD3DNOW 1
+#define HAVE_SSE 0
+#define HAVE_SSE2 0
+#define RENAME(a) a ## _3DNow
+#include "libvo/aclib_template.c"
+#endif
+
+#ifdef COMPILE_SSE
+#undef RENAME
+#undef HAVE_MMX
+#undef HAVE_MMX2
+#undef HAVE_AMD3DNOW
+#undef HAVE_SSE
+#undef HAVE_SSE2
+#define HAVE_MMX 1
+#define HAVE_MMX2 1
+#define HAVE_AMD3DNOW 0
+#define HAVE_SSE 1
+#define HAVE_SSE2 1
+#define RENAME(a) a ## _SSE
+#include "libvo/aclib_template.c"
+#endif
+
 //#define ARR_SIZE 100000
 #define ARR_SIZE (1024*768*2)
 
@@ -27,50 +111,48 @@
 #include "drivers/mga_vid.h"
 
 static mga_vid_config_t mga_vid_config;
-static unsigned char* frame=NULL;
+static unsigned char* frame = NULL;
 static int f;
 
 static int mga_init(void)
 {
-	f = open("/dev/mga_vid",O_RDWR);
-	if(f == -1)
-	{
-		fprintf(stderr,"Couldn't open /dev/mga_vid\n"); 
-		return -1;
-	}
-
-	mga_vid_config.num_frames=1;
-        mga_vid_config.frame_size=ARR_SIZE;
-        mga_vid_config.format=MGA_VID_FORMAT_YUY2;
-
-        mga_vid_config.colkey_on=0;
-	mga_vid_config.src_width = 640;
-	mga_vid_config.src_height= 480;
-	mga_vid_config.dest_width = 320;
-	mga_vid_config.dest_height= 200;
-	mga_vid_config.x_org= 0;
-	mga_vid_config.y_org= 0;
-	
-	mga_vid_config.version=MGA_VID_VERSION;
-	if (ioctl(f,MGA_VID_CONFIG,&mga_vid_config))
-	{
-		perror("Error in mga_vid_config ioctl()");
-                printf("Your mga_vid driver version is incompatible with this MPlayer version!\n");
-                exit(1);
-	}
-	ioctl(f,MGA_VID_ON,0);
-
-	frame = (char*)mmap(0,mga_vid_config.frame_size*mga_vid_config.num_frames,PROT_WRITE,MAP_SHARED,f,0);
-        if(!frame){
-          printf("Can't mmap mga frame\n");
-          exit(1);
-        }
-
-	//clear the buffer
-	//memset(frames[0],0x80,mga_vid_config.frame_size*mga_vid_config.num_frames);
-
-  return 0;
-
+    f = open("/dev/mga_vid", O_RDWR);
+    if (f == -1) {
+        fprintf(stderr, "Couldn't open /dev/mga_vid.\n");
+        return -1;
+    }
+
+    mga_vid_config.num_frames = 1;
+    mga_vid_config.frame_size = ARR_SIZE;
+    mga_vid_config.format     = MGA_VID_FORMAT_YUY2;
+
+    mga_vid_config.colkey_on   =   0;
+    mga_vid_config.src_width   = 640;
+    mga_vid_config.src_height  = 480;
+    mga_vid_config.dest_width  = 320;
+    mga_vid_config.dest_height = 200;
+    mga_vid_config.x_org       =   0;
+    mga_vid_config.y_org       =   0;
+
+    mga_vid_config.version     = MGA_VID_VERSION;
+    if (ioctl(f, MGA_VID_CONFIG, &mga_vid_config)) {
+        perror("Error in mga_vid_config ioctl()");
+        printf("Your mga_vid driver version is incompatible with this MPlayer version!\n");
+        exit(1);
+    }
+    ioctl(f, MGA_VID_ON, 0);
+
+    frame = (char*)mmap(0, mga_vid_config.frame_size*mga_vid_config.num_frames,
+                        PROT_WRITE,MAP_SHARED, f, 0);
+    if (!frame) {
+        printf("Can't mmap MGA frame.\n");
+        exit(1);
+    }
+
+    //clear the buffer
+    //memset(frames[0], 0x80, mga_vid_config.frame_size*mga_vid_config.num_frames);
+
+    return 0;
 }
 
 #endif
@@ -78,45 +160,68 @@ static int mga_init(void)
 // Returns current time in microseconds
 static unsigned int GetTimer(void)
 {
-  struct timeval tv;
-  struct timezone tz;
-//  float s;
-  gettimeofday(&tv,&tz);
-//  s=tv.tv_usec;s*=0.000001;s+=tv.tv_sec;
-  return tv.tv_sec * 1000000 + tv.tv_usec;
-}  
-
-static inline unsigned long long int read_tsc( void )
+    struct timeval tv;
+    struct timezone tz;
+    //float s;
+    gettimeofday(&tv, &tz);
+    //s = tv.tv_usec; s *= 0.000001; s += tv.tv_sec;
+    return tv.tv_sec * 1000000 + tv.tv_usec;
+}
+
+static inline unsigned long long int read_tsc(void)
 {
-  unsigned long long int retval;
-  __asm__ volatile ("rdtsc":"=A"(retval)::"memory");
-  return retval;
+    unsigned long long int retval;
+    __asm__ volatile ("rdtsc":"=A" (retval)::"memory");
+    return retval;
 }
 
-unsigned char  __attribute__((aligned(4096)))arr1[ARR_SIZE],arr2[ARR_SIZE];
+unsigned char __attribute__((aligned(4096)))arr1[ARR_SIZE], arr2[ARR_SIZE];
 
-int main( void )
+int main(void)
 {
-  unsigned long long int v1,v2;
-  unsigned char * marr1,*marr2;
-  int i;
-  unsigned int t;
+    unsigned long long int v1, v2;
+    unsigned char *marr1, *marr2;
+    int i;
+    unsigned int t;
 #ifdef CONFIG_MGA
-  mga_init();
-  marr1 = &frame[3];
+    mga_init();
+    marr1 = &frame[3];
 #else
-  marr1 = &arr1[3];
+    marr1 = &arr1[0];
+#endif
+    marr2 = &arr2[0];
+
+    for (i = 0; i < ARR_SIZE - 16; i++)
+        marr1[i] = marr2[i] = i;
+
+#define testblock(func, name)                                                \
+    t  = GetTimer();                                                         \
+    v1 = read_tsc();                                                         \
+    for (i = 0; i < 100; i++)                                                \
+        func(marr1, marr2, ARR_SIZE - 16);                                   \
+    v2 = read_tsc();                                                         \
+    t  = GetTimer() - t;                                                     \
+    /* ARR_SIZE*100 / (1024*1024) / (t/1000000) = ARR_SIZE*95.36743 / t */   \
+    printf(name "CPU clocks=%llu = %dus  (%5.3ffps)  %5.1fMB/s\n", v2-v1, t, \
+           100000000.0f / (float)t, (float)ARR_SIZE*95.36743f / (float)t);
+
+    testblock(memcpy, "libc:   ");
+
+#if HAVE_MMX
+    testblock(fast_memcpy_MMX, "MMX:    ");
 #endif
-  marr2 = &arr2[9];
-
-  for(i=0; i<ARR_SIZE-16; i++) marr1[i] = marr2[i] = i;
-
-  t=GetTimer();
-  v1 = read_tsc();
-  for(i=0;i<100;i++) memcpy(marr1,marr2,ARR_SIZE-16);
-  v2 = read_tsc();
-  t=GetTimer()-t;
-  // ARR_SIZE*100/(1024*1024)/(t/1000000) = ARR_SIZE*95.36743/t
-  printf(NAME": cpu clocks=%llu = %dus  (%5.3ffps)  %5.1fMB/s\n",v2-v1,t,100000000.0f/(float)t,(float)ARR_SIZE*95.36743f/(float)t);
-  return 0;
+
+#if HAVE_AMD3DNOW
+    testblock(fast_memcpy_3DNow, "3DNow!: ");
+#endif
+
+#if HAVE_MMX2
+    testblock(fast_memcpy_MMX2, "MMX2:   ");
+#endif
+
+#if HAVE_SSE
+    testblock(fast_memcpy_SSE, "SSE:    ");
+#endif
+
+    return 0;
 }
diff --git a/configure b/configure
index e035652..37f242c 100755
--- a/configure
+++ b/configure
@@ -61,13 +61,13 @@ compile_check() {
   echo >> "$TMPLOG"
   cat "$1" >> "$TMPLOG"
   echo >> "$TMPLOG"
-  echo "$_cc $CFLAGS $_inc_extra $_ld_static $_ld_extra $_libs_mplayer $_libs_mencoder -o $TMPEXE $@" >> "$TMPLOG"
+  echo "$_cc $CFLAGS $extra_cflags $_ld_static $extra_ldflags $libs_mplayer $libs_mencoder -o $TMPEXE $@" >> "$TMPLOG"
   rm -f "$TMPEXE"
-  $_cc $CFLAGS $_inc_extra $_ld_static $_ld_extra $_libs_mplayer $_libs_mencoder -o "$TMPEXE" "$@" >> "$TMPLOG" 2>&1
-  TMP="$?"
+  $_cc $CFLAGS $extra_cflags $_ld_static $extra_ldflags $libs_mplayer $libs_mencoder -o "$TMPEXE" "$@" >> "$TMPLOG" 2>&1
+  TMPRES="$?"
   echo >> "$TMPLOG"
   echo >> "$TMPLOG"
-  return "$TMP"
+  return "$TMPRES"
 }
 
 cc_check() {
@@ -85,10 +85,10 @@ yasm_check() {
   echo "$_yasm $YASMFLAGS -o $TMPEXE $TMPS $@" >> "$TMPLOG"
   rm -f "$TMPEXE"
   $_yasm $YASMFLAGS -o "$TMPEXE" "$TMPS" "$@" >> "$TMPLOG" 2>&1
-  TMP="$?"
+  TMPRES="$?"
   echo >> "$TMPLOG"
   echo >> "$TMPLOG"
-  return "$TMP"
+  return "$TMPRES"
 }
 
 tmp_run() {
@@ -366,6 +366,7 @@ Video output:
   --enable-vesa            enable VESA video output [autodetect]
   --enable-svga            enable SVGAlib video output [autodetect]
   --enable-sdl             enable SDL video output [autodetect]
+  --enable-kva             enable KVA video output [autodetect]
   --enable-aa              enable AAlib video output [autodetect]
   --enable-caca            enable CACA  video output [autodetect]
   --enable-ggi             enable GGI video output [autodetect]
@@ -463,13 +464,12 @@ Advanced options:
   --enable-crash-debug      enable automatic gdb attach on crash [disable]
   --enable-dynamic-plugins  enable dynamic A/V plugins [disable]
 
-Use these options if autodetection fails (Options marked with (*) accept
-multiple paths separated by ':'):
+Use these options if autodetection fails:
+  --extra-cflags=FLAGS        extra CFLAGS
+  --extra-ldflags=FLAGS       extra LDFLAGS
   --extra-libs=FLAGS          extra linker flags
   --extra-libs-mplayer=FLAGS  extra linker flags for MPlayer
   --extra-libs-mencoder=FLAGS extra linker flags for MEncoder
-  --with-extraincdir=DIR      extra header search paths in DIR (*)
-  --with-extralibdir=DIR      extra linker search paths in DIR (*)
   --with-xvmclib=NAME         adapter-specific library name (e.g. XvMCNVIDIA)
 
   --with-freetype-config=PATH path to freetype-config
@@ -556,6 +556,7 @@ _xv=auto
 _xvmc=no  #auto when complete
 _vdpau=auto
 _sdl=auto
+_kva=auto
 _direct3d=auto
 _directx=auto
 _win32waveout=auto
@@ -763,12 +764,6 @@ for ac_option do
   --realcodecsdir=*)
     _realcodecsdir=`echo $ac_option | cut -d '=' -f 2`
     ;;
-  --with-extraincdir=*)
-    _inc_extra=-I`echo $ac_option | cut -d '=' -f 2 | sed 's,:, -I,g'`
-    ;;
-  --with-extralibdir=*)
-    _ld_extra=-L`echo $ac_option | cut -d '=' -f 2 | sed 's,:, -L,g'`
-    ;;
 
   --with-install=*)
     _install=`echo $ac_option | cut -d '=' -f 2 `
@@ -799,14 +794,20 @@ for ac_option do
     _dvdreadconfig=`echo $ac_option | cut -d '=' -f 2`
     ;;
 
+  --extra-cflags=*)
+    extra_cflags=`echo $ac_option | cut -d '=' -f 2-`
+    ;;
+  --extra-ldflags=*)
+    extra_ldflags=`echo $ac_option | cut -d '=' -f 2-`
+    ;;
   --extra-libs=*)
-    _extra_libs=`echo $ac_option | cut -d '=' -f 2`
+    extra_libs=`echo $ac_option | cut -d '=' -f 2`
     ;;
   --extra-libs-mplayer=*)
-    _libs_mplayer=`echo $ac_option | cut -d '=' -f 2`
+    libs_mplayer=`echo $ac_option | cut -d '=' -f 2`
     ;;
   --extra-libs-mencoder=*)
-    _libs_mencoder=`echo $ac_option | cut -d '=' -f 2`
+    libs_mencoder=`echo $ac_option | cut -d '=' -f 2`
     ;;
 
   --target=*)
@@ -888,6 +889,8 @@ for ac_option do
   --disable-vdpau)      _vdpau=no       ;;
   --enable-sdl)		_sdl=yes	;;
   --disable-sdl)	_sdl=no		;;
+  --enable-kva)     _kva=yes    ;;
+  --disable-kva)    _kva=no     ;;
   --enable-direct3d)    _direct3d=yes   ;;
   --disable-direct3d)   _direct3d=no    ;;
   --enable-directx)     _directx=yes    ;;
@@ -1408,27 +1411,27 @@ if test "$_runtime_cpudetection" = yes && ! x86 && ! ppc; then
 fi
 
 
-_inc_extra="-I. $_inc_extra"
+extra_cflags="-I. $extra_cflags"
 _timer=timer-linux.c
 _getch=getch2.c
 if freebsd ; then
-  _ld_extra="$_ld_extra -L/usr/local/lib"
-  _inc_extra="$_inc_extra -I/usr/local/include"
+  extra_ldflags="$extra_ldflags -L/usr/local/lib"
+  extra_cflags="$extra_cflags -I/usr/local/include"
 fi
 
 if netbsd || dragonfly ; then
-  _ld_extra="$_ld_extra -L/usr/pkg/lib"
-  _inc_extra="$_inc_extra -I/usr/pkg/include"
+  extra_ldflags="$extra_ldflags -L/usr/pkg/lib"
+  extra_cflags="$extra_cflags -I/usr/pkg/include"
 fi
 
 if darwin; then
-  _ld_extra="$_ld_extra -L/usr/local/lib"
-  _inc_extra="$_inc_extra -I/usr/local/include"
+  extra_ldflags="$extra_ldflags -L/usr/local/lib"
+  extra_cflags="$extra_cflags -I/usr/local/include"
   _timer=timer-darwin.c
 fi
 
 if aix ; then
-  _ld_extra="$_ld_extra -lC"
+  extra_ldflags="$extra_ldflags -lC"
 fi
 
 if irix ; then
@@ -1440,7 +1443,7 @@ fi
 if win32 ; then
   _exesuf=".exe"
   # -lwinmm is always needed for osdep/timer-win2.c
-  _ld_extra="$_ld_extra -lwinmm"
+  extra_ldflags="$extra_ldflags -lwinmm"
   _pe_executable=yes
   _timer=timer-win2.c
   _priority=yes
@@ -1461,7 +1464,7 @@ if amigaos ; then
 fi
 
 if qnx ; then
-  _ld_extra="$_ld_extra -lph"
+  extra_ldflags="$extra_ldflags -lph"
 fi
 
 if os2 ; then
@@ -1519,7 +1522,7 @@ if test "`basename $_cc`" = "icc" || test "`basename $_cc`" = "ecc"; then
       cc_version="v. ?.??, bad"
       cc_fail=yes
       ;;
-    10.1|11.0)
+    10.1|11.0|11.1)
       cc_version="$cc_version, ok"
       ;;
     *)
@@ -1703,6 +1706,7 @@ fi
 
 
 def_fast_64bit='#define HAVE_FAST_64BIT 0'
+def_fast_unaligned='#define HAVE_FAST_UNALIGNED 0'
 _arch_all='X86 X86_32 X86_64 IA64 SPARC ARM AVR32 SH4 PPC ALPHA SGI_MIPS PA_RISC S390 S390X VAX BFIN XTENSA GENERIC'
 case "$host_arch" in
   i[3-9]86|x86|x86pc|k5|k6|k6-2|k6-3|pentium*|athlon*|i586-i686)
@@ -2402,19 +2406,19 @@ elif test -z "$CFLAGS" ; then
     CFLAGS="-O2 $_march $_mcpu $_pipe"
   else
     CFLAGS="-Wall -Wno-switch -Wpointer-arith -Wredundant-decls -O4 $_march $_mcpu $_pipe -ffast-math -fomit-frame-pointer"
-    _ld_extra="$_ld_extra -ffast-math"
+    extra_ldflags="$extra_ldflags -ffast-math"
   fi
 else
   _warn_CFLAGS=yes
 fi
 if test -n "$LDFLAGS" ; then
-  _ld_extra="$_ld_extra $LDFLAGS"
+  extra_ldflags="$extra_ldflags $LDFLAGS"
   _warn_CFLAGS=yes
 elif test "$cc_vendor" = "intel" ; then
-  _ld_extra="$_ld_extra -i-static"
+  extra_ldflags="$extra_ldflags -i-static"
 fi
 if test -n "$CPPFLAGS" ; then
-  _inc_extra="$_inc_extra $CPPFLAGS"
+  extra_cflags="$extra_cflags $CPPFLAGS"
   _warn_CFLAGS=yes
 fi
 
@@ -2715,7 +2719,7 @@ cat > $TMPC <<EOF
 int main(void) { return 0; }
 EOF
 if cc_check -lposix ; then
-  _ld_extra="$_ld_extra -lposix"
+  extra_ldflags="$extra_ldflags -lposix"
   echores "yes"
 else
   echores "no"
@@ -2855,7 +2859,7 @@ _kstat=no
 cc_check -lkstat && _kstat=yes
 if test "$_kstat" = yes ; then
   def_kstat="#define HAVE_LIBKSTAT 1"
-  _ld_extra="$_ld_extra -lkstat"
+  extra_ldflags="$extra_ldflags -lkstat"
 else
   def_kstat="#undef HAVE_LIBKSTAT"
 fi
@@ -2871,7 +2875,7 @@ EOF
 _posix4=no
 cc_check -lposix4 && _posix4=yes
 if test "$_posix4" = yes ; then
-  _ld_extra="$_ld_extra -lposix4"
+  extra_ldflags="$extra_ldflags -lposix4"
 fi
 echores "$_posix4"
 
@@ -3042,7 +3046,7 @@ test $_winsock2_h = no && test $inet_pton = no &&
   test $inet_aton = no && _network=no
 if test "$_network" = yes ; then
   def_network='#define CONFIG_NETWORK 1'
-  _ld_extra="$_ld_extra $_ld_sock"
+  extra_ldflags="$extra_ldflags $_ld_sock"
   _inputmodules="network $_inputmodules"
 else
   _noinputmodules="network $_noinputmodules"
@@ -3276,7 +3280,7 @@ fi
 echores "$_dynamic_plugins"
 
 
-def_threads='#undef HAVE_THREADS'
+def_threads='#define HAVE_THREADS 0'
 
 echocheck "pthread"
 if test "$_pthreads" = auto ; then
@@ -3329,10 +3333,10 @@ echores "$_w32threads"
 echocheck "rpath"
 netbsd &&_rpath=yes
 if test "$_rpath" = yes ; then
-  for I in `echo $_ld_extra | sed 's/-L//g'` ; do
+  for I in `echo $extra_ldflags | sed 's/-L//g'` ; do
     tmp="$tmp ` echo $I | sed 's/.*/ -L& -Wl,-R&/'`"
   done
-_ld_extra=$tmp
+extra_ldflags=$tmp
 fi
 echores "$_rpath"
 
@@ -3372,7 +3376,7 @@ int main(void) {
 EOF
   _iconv=no
   for _ld_tmp in "" "-liconv" "-liconv $_ld_dl" ; do
-    cc_check $_ld_lm $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" && \
+    cc_check $_ld_lm $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" && \
       _iconv=yes && break
   done
 fi
@@ -3533,7 +3537,7 @@ int main(void) { tgetent(NULL, NULL); return 0; }
 EOF
   _termcap=no
   for _ld_tmp in "-lncurses" "-ltinfo" "-ltermcap"; do
-    cc_check $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" \
+    cc_check $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" \
       && _termcap=yes && break
   done
 fi
@@ -3784,7 +3788,7 @@ if test "$_macosx" = yes ; then
 int main(void) { return 0; }
 EOF
   if cc_check -framework CoreAudio; then
-    _ld_extra="$_ld_extra -framework CoreAudio -framework AudioUnit -framework AudioToolbox"
+    extra_ldflags="$extra_ldflags -framework CoreAudio -framework AudioUnit -framework AudioToolbox"
     _coreaudio=yes
     def_coreaudio='#define CONFIG_COREAUDIO 1'
     _aomodules="macosx $_aomodules"
@@ -3804,7 +3808,7 @@ int main(void) {
 }
 EOF
   if cc_check -framework Carbon -framework QuickTime; then
-    _ld_extra="$_ld_extra -framework Carbon -framework QuickTime"
+    extra_ldflags="$extra_ldflags -framework Carbon -framework QuickTime"
     _quartz=yes
     def_quartz='#define CONFIG_QUARTZ 1'
     _vomodules="quartz $_vomodules"
@@ -3822,7 +3826,7 @@ int main(void) { return 0; }
 EOF
 	if cc_check -framework Carbon -framework QuartzCore -framework OpenGL; then
 		_vomodules="macosx $_vomodules"
-		_ld_extra="$_ld_extra -framework Cocoa -framework QuartzCore -framework OpenGL"
+		extra_ldflags="$extra_ldflags -framework Cocoa -framework QuartzCore -framework OpenGL"
 		def_corevideo='#define CONFIG_COREVIDEO 1'
 		_corevideo=yes
 	else
@@ -3889,7 +3893,7 @@ EOF
 fi
 if test "$_apple_remote" = yes ; then
   def_apple_remote='#define CONFIG_APPLE_REMOTE 1'
-  _ld_extra="$_ld_extra -framework IOKit"
+  extra_ldflags="$extra_ldflags -framework IOKit"
 else
   def_apple_remote='#undef CONFIG_APPLE_REMOTE'
 fi
@@ -3936,7 +3940,7 @@ fi
 
 echocheck "Samba support (libsmbclient)"
 if test "$_smb" = yes; then
-  _ld_extra="$_ld_extra -lsmbclient"
+  extra_ldflags="$extra_ldflags -lsmbclient"
 fi
 if test "$_smb" = auto; then
     _smb=no
@@ -3945,7 +3949,7 @@ if test "$_smb" = auto; then
 int main(void) { smbc_opendir("smb://"); return 0; }
 EOF
   for _ld_tmp in "-lsmbclient" "-lsmbclient $_ld_dl" "-lsmbclient $_ld_dl -lnsl" "-lsmbclient $_ld_dl -lssl -lnsl" ; do
-    cc_check $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" && \
+    cc_check $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" && \
       _smb=yes && break
   done
 fi
@@ -4085,7 +4089,7 @@ EOF
   for _inc_tmp in "" -I/usr/local/include/directfb \
       -I/usr/include/directfb -I/usr/local/include; do
     cc_check $_inc_tmp -ldirectfb && _directfb=yes && \
-      _inc_extra="$_inc_extra $_inc_tmp" && break
+      extra_cflags="$extra_cflags $_inc_tmp" && break
   done
 fi
 
@@ -4100,7 +4104,7 @@ int
 dfb_ver = DIRECTFB_MAJOR_VERSION.DIRECTFB_MINOR_VERSION.DIRECTFB_MICRO_VERSION
 ;
 EOF
-  if $_cc -E $TMPC $_inc_extra > "$TMPEXE"; then
+  if $_cc -E $TMPC $extra_cflags > "$TMPEXE"; then
     _directfb_version=`sed -n 's/^dfb_ver[^0-9]*\(.*\)/\1/p' "$TMPEXE" | tr -d '()'`
     _dfb_major=`echo $_directfb_version | cut -d . -f 1`
     _dfb_minor=`echo $_directfb_version | cut -d . -f 2`
@@ -4125,7 +4129,7 @@ echores "$_directfb"
 if test "$_directfb" = yes ; then
   def_directfb='#define CONFIG_DIRECTFB 1'
   _vomodules="directfb $_vomodules"
-  _libs_mplayer="$_libs_mplayer -ldirectfb"
+  libs_mplayer="$libs_mplayer -ldirectfb"
 else
   def_directfb='#undef CONFIG_DIRECTFB'
   _novomodules="directfb $_novomodules"
@@ -4142,7 +4146,7 @@ fi
 echocheck "X11 headers presence"
   _x11_headers="no"
   _res_comment="check if the dev(el) packages are installed"
-  for I in `echo $_inc_extra | sed s/-I//g` /usr/include ; do
+  for I in `echo $extra_cflags | sed s/-I//g` /usr/include ; do
     if test -f "$I/X11/Xlib.h" ; then
       _x11_headers="yes"
       _res_comment=""
@@ -4150,9 +4154,10 @@ echocheck "X11 headers presence"
     fi
   done
   if test $_cross_compile = no; then
-    for I in /usr/X11/include /usr/X11R6/include /usr/include/X11R6 /usr/openwin/include ; do
+    for I in /usr/X11/include /usr/X11R7/include /usr/X11R6/include \
+             /usr/include/X11R6 /usr/openwin/include ; do
       if test -f "$I/X11/Xlib.h" ; then
-        _inc_extra="$_inc_extra -I$I"
+        extra_cflags="$extra_cflags -I$I"
         _x11_headers="yes"
         _res_comment="using $I"
         break
@@ -4169,14 +4174,15 @@ if test "$_x11" = auto && test "$_x11_headers" = yes ; then
 #include <X11/Xutil.h>
 int main(void) { (void) XCreateWindow(0,0,0,0,0,0,0,0,0,0,0,0); return 0; }
 EOF
-  for I in "" -L/usr/X11R6/lib -L/usr/lib/X11R6 -L/usr/X11/lib \
-           -L/usr/lib32 -L/usr/openwin/lib -L/usr/X11R6/lib64 -L/usr/lib ; do
+  for I in "" -L/usr/X11R7/lib -L/usr/X11R6/lib -L/usr/lib/X11R6 \
+           -L/usr/X11/lib -L/usr/lib32 -L/usr/openwin/lib -L/usr/X11R6/lib64 \
+           -L/usr/lib ; do
     if netbsd; then
       _ld_tmp="$I -lXext -lX11 $_ld_pthread -Wl,-R`echo $I | sed s/^-L//`"
     else
       _ld_tmp="$I -lXext -lX11 $_ld_pthread"
     fi
-    cc_check $_ld_tmp && _libs_mplayer="$_libs_mplayer $_ld_tmp" \
+    cc_check $_ld_tmp && libs_mplayer="$libs_mplayer $_ld_tmp" \
                       && _x11=yes && break
   done
 fi
@@ -4205,7 +4211,7 @@ EOF
 fi
 if test "$_xss" = yes ; then
   def_xss='#define CONFIG_XSS 1'
-  _libs_mplayer="$_libs_mplayer -lXss"
+  libs_mplayer="$libs_mplayer -lXss"
 else
   def_xss='#undef CONFIG_XSS'
 fi
@@ -4237,7 +4243,7 @@ if test "$_xdpms4" = yes ; then
   echores "yes"
 elif test "$_xdpms3" = yes ; then
   def_xdpms='#define CONFIG_XDPMS 1'
-  _libs_mplayer="$_libs_mplayer -lXdpms"
+  libs_mplayer="$libs_mplayer -lXdpms"
   _res_comment="using Xdpms 3"
   echores "yes"
 else
@@ -4262,7 +4268,7 @@ fi
 
 if test "$_xv" = yes ; then
   def_xv='#define CONFIG_XV 1'
-  _libs_mplayer="$_libs_mplayer -lXv"
+  libs_mplayer="$libs_mplayer -lXv"
   _vomodules="xv $_vomodules"
 else
   def_xv='#undef CONFIG_XV'
@@ -4289,7 +4295,7 @@ EOF
 fi
 if test "$_xvmc" = yes ; then
   def_xvmc='#define CONFIG_XVMC 1'
-  _libs_mplayer="$_libs_mplayer -lXvMC -l$_xvmclib"
+  libs_mplayer="$libs_mplayer -lXvMC -l$_xvmclib"
   _vomodules="xvmc $_vomodules"
   _res_comment="using $_xvmclib"
 else
@@ -4306,7 +4312,7 @@ if test "$_vdpau" = auto ; then
   if test "$_dl" = yes ; then
     cat > $TMPC <<EOF
 #include <vdpau/vdpau_x11.h>
-int main(void) {return 0;}
+int main(void) {return VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE;}
 EOF
     cc_check && _vdpau=yes
   fi
@@ -4335,7 +4341,7 @@ fi
 
 if test "$_xinerama" = yes ; then
   def_xinerama='#define CONFIG_XINERAMA 1'
-  _libs_mplayer="$_libs_mplayer -lXinerama"
+  libs_mplayer="$libs_mplayer -lXinerama"
 else
   def_xinerama='#undef CONFIG_XINERAMA'
 fi
@@ -4359,7 +4365,7 @@ EOF
 fi
 if test "$_vm" = yes ; then
   def_vm='#define CONFIG_XF86VM 1'
-  _libs_mplayer="$_libs_mplayer -lXxf86vm"
+  libs_mplayer="$libs_mplayer -lXxf86vm"
 else
   def_vm='#undef CONFIG_XF86VM'
 fi
@@ -4421,7 +4427,7 @@ elif test "$_dga2" = yes ; then
 fi
 if test "$_dga" = yes ; then
   def_dga='#define CONFIG_DGA 1'
-  _libs_mplayer="$_libs_mplayer -lXxf86dga"
+  libs_mplayer="$libs_mplayer -lXxf86dga"
   _vomodules="dga $_vomodules"
 else
   _novomodules="dga $_novomodules"
@@ -4466,14 +4472,14 @@ EOF
   _gl=no
   if cc_check -lGL $_ld_lm ; then
     _gl=yes
-    _libs_mplayer="$_libs_mplayer -lGL $_ld_dl"
+    libs_mplayer="$libs_mplayer -lGL $_ld_dl"
   elif cc_check -lGL $_ld_lm $_ld_pthread ; then
     _gl=yes
-    _libs_mplayer="$_libs_mplayer -lGL $_ld_pthread $_ld_dl"
+    libs_mplayer="$libs_mplayer -lGL $_ld_pthread $_ld_dl"
   elif cc_check -DGL_WIN32 -lopengl32 ; then
     _gl=yes
     _gl_win32=yes
-    _libs_mplayer="$_libs_mplayer -lopengl32 -lgdi32"
+    libs_mplayer="$libs_mplayer -lopengl32 -lgdi32"
   fi
 else
   _gl=no
@@ -4572,7 +4578,7 @@ fi
 if test "$_vidix" = yes && win32; then
   winvidix=yes
   _vomodules="winvidix $_vomodules"
-  _libs_mplayer="$_libs_mplayer -lgdi32"
+  libs_mplayer="$libs_mplayer -lgdi32"
 else
   _novomodules="winvidix $_novomodules"
 fi
@@ -4624,7 +4630,7 @@ EOF
 fi
 if test "$_ggi" = yes ; then
   def_ggi='#define CONFIG_GGI 1'
-  _libs_mplayer="$_libs_mplayer -lggi"
+  libs_mplayer="$libs_mplayer -lggi"
   _vomodules="ggi $_vomodules"
 else
   def_ggi='#undef CONFIG_GGI'
@@ -4646,7 +4652,7 @@ fi
 # like --disable-ggi --enable-ggiwmh
 if test "$_ggi" = yes && test "$_ggiwmh" = yes ; then
   def_ggiwmh='#define CONFIG_GGIWMH 1'
-  _libs_mplayer="$_libs_mplayer -lggiwmh"
+  libs_mplayer="$libs_mplayer -lggiwmh"
 else
   _ggiwmh=no
   def_ggiwmh='#undef CONFIG_GGIWMH'
@@ -4671,13 +4677,13 @@ return 0; }
 EOF
   _aa=no
   for _ld_tmp in "-laa" ; do
-    cc_check $_ld_tmp && _libs_mplayer="$_libs_mplayer $_ld_tmp" && _aa=yes && break
+    cc_check $_ld_tmp && libs_mplayer="$libs_mplayer $_ld_tmp" && _aa=yes && break
   done
 fi
 if test "$_aa" = yes ; then
   def_aa='#define CONFIG_AA 1'
   if cygwin ; then
-    _libs_mplayer="$_libs_mplayer `aalib-config --libs | cut -d " " -f 2,5,6`"
+    libs_mplayer="$libs_mplayer `aalib-config --libs | cut -d " " -f 2,5,6`"
   fi
   _vomodules="aa $_vomodules"
 else
@@ -4703,8 +4709,8 @@ EOF
 fi
 if test "$_caca" = yes ; then
   def_caca='#define CONFIG_CACA 1'
-  _inc_extra="$_inc_extra `caca-config --cflags`"
-  _libs_mplayer="$_libs_mplayer `caca-config --libs`"
+  extra_cflags="$extra_cflags `caca-config --cflags`"
+  libs_mplayer="$libs_mplayer `caca-config --libs`"
   _vomodules="caca $_vomodules"
 else
   def_caca='#undef CONFIG_CACA'
@@ -4724,7 +4730,7 @@ EOF
 fi
 if test "$_svga" = yes ; then
   def_svga='#define CONFIG_SVGALIB 1'
-  _libs_mplayer="$_libs_mplayer -lvga"
+  libs_mplayer="$libs_mplayer -lvga"
   _vomodules="svga $_vomodules"
 else
   def_svga='#undef CONFIG_SVGALIB'
@@ -4767,7 +4773,7 @@ int main(void) {return 0;}
 EOF
   for _inc_tmp in "" "-I/usr/src/DVB/ost/include" ; do
     cc_check $_inc_tmp && _dvb=yes && \
-     _inc_extra="$_inc_extra $_inc_tmp" && break
+     extra_cflags="$extra_cflags $_inc_tmp" && break
   done
 fi
 echores "$_dvb"
@@ -4796,7 +4802,7 @@ int main(void) {return 0;}
 EOF
   for _inc_tmp in "" "-I/usr/src/DVB/include" ; do
     cc_check $_inc_tmp && _dvbhead=yes && \
-      _inc_extra="$_inc_extra $_inc_tmp" && break
+      extra_cflags="$extra_cflags $_inc_tmp" && break
   done
 fi
 echores "$_dvbhead"
@@ -4856,7 +4862,7 @@ fi
 echores "$_png"
 if test "$_png" = yes ; then
   def_png='#define CONFIG_PNG 1'
-  _ld_extra="$_ld_extra -lpng -lz"
+  extra_ldflags="$extra_ldflags -lpng -lz"
   _vomodules="png $_vomodules"
 else
   def_png='#undef CONFIG_PNG'
@@ -4880,7 +4886,7 @@ fi
 echores "$_mng"
 if test "$_mng" = yes ; then
   def_mng='#define CONFIG_MNG 1'
-  _ld_extra="$_ld_extra -lmng -lz"
+  extra_ldflags="$extra_ldflags -lmng -lz"
 else
   def_mng='#undef CONFIG_MNG'
 fi
@@ -4907,7 +4913,7 @@ echores "$_jpeg"
 if test "$_jpeg" = yes ; then
   def_jpeg='#define CONFIG_JPEG 1'
   _vomodules="jpeg $_vomodules"
-  _ld_extra="$_ld_extra -ljpeg"
+  extra_ldflags="$extra_ldflags -ljpeg"
 else
   def_jpeg='#undef CONFIG_JPEG'
   _novomodules="jpeg $_novomodules"
@@ -4967,7 +4973,7 @@ if test "$_gif" = yes ; then
   _vomodules="gif89a $_vomodules"
   _res_comment="old version, some encoding functions disabled"
   def_gif_4='#undef CONFIG_GIF_4'
-  _ld_extra="$_ld_extra $_ld_gif"
+  extra_ldflags="$extra_ldflags $_ld_gif"
 
   cat > $TMPC << EOF
 #include <signal.h>
@@ -5026,7 +5032,7 @@ EOF
 fi
 if test "$_vesa" = yes ; then
   def_vesa='#define CONFIG_VESA 1'
-  _libs_mplayer="$_libs_mplayer -lvbe -llrmi"
+  libs_mplayer="$libs_mplayer -lvbe -llrmi"
   _vomodules="vesa $_vomodules"
 else
   def_vesa='#undef CONFIG_VESA'
@@ -5075,14 +5081,14 @@ fi
 if test "$_sdl" = yes ; then
   def_sdl='#define CONFIG_SDL 1'
   if cygwin ; then
-    _libs_mplayer="$_libs_mplayer `$_sdlconfig --libs | cut -d " " -f 1,4,6 | sed s/no-cygwin/cygwin/`"
-    _inc_extra="$_inc_extra `$_sdlconfig --cflags | cut -d " " -f 1,5,6 | sed s/no-cygwin/cygwin/`"
+    libs_mplayer="$libs_mplayer `$_sdlconfig --libs | cut -d " " -f 1,4,6 | sed s/no-cygwin/cygwin/`"
+    extra_cflags="$extra_cflags `$_sdlconfig --cflags | cut -d " " -f 1,5,6 | sed s/no-cygwin/cygwin/`"
   elif mingw32 ; then
-    _libs_mplayer="$_libs_mplayer `$_sdlconfig --libs | sed -e s/-mwindows// -e s/-lmingw32//`"
-    _inc_extra="$_inc_extra `$_sdlconfig --cflags | sed s/-Dmain=SDL_main//`"
+    libs_mplayer="$libs_mplayer `$_sdlconfig --libs | sed -e s/-mwindows// -e s/-lmingw32//`"
+    extra_cflags="$extra_cflags `$_sdlconfig --cflags | sed s/-Dmain=SDL_main//`"
   else
-    _libs_mplayer="$_libs_mplayer `$_sdlconfig --libs`"
-    _inc_extra="$_inc_extra `$_sdlconfig --cflags | sed s/-D_GNU_SOURCE=1//`"
+    libs_mplayer="$libs_mplayer `$_sdlconfig --libs`"
+    extra_cflags="$extra_cflags `$_sdlconfig --cflags | sed s/-D_GNU_SOURCE=1//`"
   fi
   _vomodules="sdl $_vomodules"
   _aomodules="sdl $_aomodules"
@@ -5095,6 +5101,29 @@ fi
 echores "$_sdl"
 
 
+if os2 ; then
+echocheck "KVA (SNAP/WarpOverlay!/DIVE)"
+if test "$_kva" = auto; then
+  cat > $TMPC << EOF
+#include <os2.h>
+#include <kva.h>
+int main( void ) { return 0; }
+EOF
+  _kva=no;
+  cc_check -lkva && _kva=yes
+fi
+if test "$_kva" = yes ; then
+  def_kva='#define CONFIG_KVA 1'
+  libs_mplayer="$libs_mplayer -lkva"
+  _vomodules="kva $_vomodules"
+else
+  def_kva='#undef CONFIG_KVA'
+  _novomodules="kva $_novomodules"
+fi
+echores "$_kva"
+fi #if os2
+
+
 if win32; then
 
 echocheck "Windows waveout"
@@ -5109,7 +5138,7 @@ EOF
 fi
 if test "$_win32waveout" = yes ; then
   def_win32waveout='#define CONFIG_WIN32WAVEOUT 1'
-  _libs_mplayer="$_libs_mplayer -lwinmm"
+  libs_mplayer="$libs_mplayer -lwinmm"
   _aomodules="win32 $_aomodules"
 else
   def_win32waveout='#undef CONFIG_WIN32WAVEOUT'
@@ -5129,7 +5158,7 @@ EOF
 fi
 if test "$_direct3d" = yes ; then
   def_direct3d='#define CONFIG_DIRECT3D 1'
-  _libs_mplayer="$_libs_mplayer -ld3d9"
+  libs_mplayer="$libs_mplayer -ld3d9"
   _vomodules="direct3d $_vomodules"
 else
   def_direct3d='#undef CONFIG_DIRECT3D'
@@ -5150,7 +5179,7 @@ EOF
 fi
 if test "$_directx" = yes ; then
   def_directx='#define CONFIG_DIRECTX 1'
-  _libs_mplayer="$_libs_mplayer -lgdi32"
+  libs_mplayer="$libs_mplayer -lgdi32"
   _vomodules="directx $_vomodules"
   _aomodules="dsound $_aomodules"
 else
@@ -5172,7 +5201,7 @@ int main(void) { return 0; }
 EOF
   for _inc_tmp in "" -I/usr/local/include/dxr2 -I/usr/include/dxr2; do
     cc_check $_inc_tmp && _dxr2=yes && \
-     _inc_extra="$_inc_extra $_inc_tmp" && break
+     extra_cflags="$extra_cflags $_inc_tmp" && break
   done
 fi
 if test "$_dxr2" = yes; then
@@ -5307,7 +5336,7 @@ EOF
        def_ossaudio_devdsp='#define PATH_DEV_DSP "/dev/dsp"'
      elif netbsd || openbsd ; then
        def_ossaudio_devdsp='#define PATH_DEV_DSP "/dev/sound"'
-       _ld_extra="$_ld_extra -lossaudio"
+       extra_ldflags="$extra_ldflags -lossaudio"
      else
        def_ossaudio_devdsp='#define PATH_DEV_DSP "/dev/dsp"'
      fi
@@ -5339,8 +5368,8 @@ fi
 if test "$_arts" = yes ; then
   def_arts='#define CONFIG_ARTS 1'
   _aomodules="arts $_aomodules"
-  _libs_mplayer="$_libs_mplayer `artsc-config --libs`"
-  _inc_extra="$_inc_extra `artsc-config --cflags`"
+  libs_mplayer="$libs_mplayer `artsc-config --libs`"
+  extra_cflags="$extra_cflags `artsc-config --cflags`"
 else
   _noaomodules="arts $_noaomodules"
 fi
@@ -5365,8 +5394,8 @@ echores "$_esd"
 if test "$_esd" = yes ; then
   def_esd='#define CONFIG_ESD 1'
   _aomodules="esd $_aomodules"
-  _libs_mplayer="$_libs_mplayer `esd-config --libs`"
-  _inc_extra="$_inc_extra `esd-config --cflags`"
+  libs_mplayer="$libs_mplayer `esd-config --libs`"
+  extra_cflags="$extra_cflags `esd-config --cflags`"
 
   echocheck "esd_get_latency()"
   cat > $TMPC << EOF
@@ -5393,7 +5422,7 @@ EOF
 fi
 if test "$_nas" = yes ; then
   def_nas='#define CONFIG_NAS 1'
-  _libs_mplayer="$_libs_mplayer -laudio -lXt"
+  libs_mplayer="$libs_mplayer -laudio -lXt"
   _aomodules="nas $_aomodules"
 else
   _noaomodules="nas $_noaomodules"
@@ -5420,8 +5449,8 @@ echores "$_pulse"
 if test "$_pulse" = yes ; then
   def_pulse='#define CONFIG_PULSE 1'
   _aomodules="pulse $_aomodules"
-  _libs_mplayer="$_libs_mplayer `$_pkg_config --libs libpulse`"
-  _inc_extra="$_inc_extra `$_pkg_config --cflags libpulse`"
+  libs_mplayer="$libs_mplayer `$_pkg_config --libs libpulse`"
+  extra_cflags="$extra_cflags `$_pkg_config --cflags libpulse`"
 else
   def_pulse='#undef CONFIG_PULSE'
   _noaomodules="pulse $_noaomodules"
@@ -5437,10 +5466,10 @@ cat > $TMPC << EOF
 int main(void) { jack_client_open("test", JackUseExactName, NULL); return 0; }
 EOF
   if cc_check -ljack ; then
-    _libs_mplayer="$_libs_mplayer -ljack"
+    libs_mplayer="$libs_mplayer -ljack"
   elif cc_check `$_pkg_config --libs --cflags --silence-errors jack` ; then
-    _libs_mplayer="$_libs_mplayer `$_pkg_config --libs jack`"
-    _inc_extra="$_inc_extra "`$_pkg_config --cflags jack`""
+    libs_mplayer="$libs_mplayer `$_pkg_config --libs jack`"
+    extra_cflags="$extra_cflags "`$_pkg_config --cflags jack`""
   else
     _jack=no
   fi
@@ -5473,7 +5502,7 @@ EOF
     cc_check $I && _openal=yes && break
     cc_check -DOPENAL_AL_H=1 $I && def_openal_h='#define OPENAL_AL_H 1' && _openal=yes && break
   done
-  test "$_openal" = yes && _libs_mplayer="$_libs_mplayer $I"
+  test "$_openal" = yes && libs_mplayer="$libs_mplayer $I"
 fi
 if test "$_openal" = yes ; then
   def_openal='#define CONFIG_OPENAL 1'
@@ -5584,7 +5613,7 @@ if test "$_alsaver" ; then
     _alsa=no
     _res_comment="unknown version"
   fi
-  _ld_extra="$_ld_extra -lasound $_ld_dl $_ld_pthread"
+  extra_ldflags="$extra_ldflags -lasound $_ld_dl $_ld_pthread"
 else
   _noaomodules="alsa $_noaomodules"
 fi
@@ -5639,7 +5668,7 @@ EOF
 fi
 if test "$_sgiaudio" = "yes" ; then
   def_sgiaudio='#define CONFIG_SGI_AUDIO 1'
-  _libs_mplayer="$_libs_mplayer -laudio"
+  libs_mplayer="$libs_mplayer -laudio"
   _aomodules="sgi $_aomodules"
 else
   def_sgiaudio='#undef CONFIG_SGI_AUDIO'
@@ -5662,7 +5691,7 @@ EOF
 fi
 if test "$_dart" = yes ; then
   def_dart='#define CONFIG_DART 1'
-  _libs_mplayer="$_libs_mplayer -ldart"
+  libs_mplayer="$libs_mplayer -ldart"
   _aomodules="dart $_aomodules"
 else
   def_dart='#undef CONFIG_DART'
@@ -5725,7 +5754,7 @@ if test "$_dvdread_internal" = auto ; then
      || darwin || win32 || os2; then
     _dvdread_internal=yes
     _dvdread=yes
-    _inc_extra="$_inc_extra -Ilibdvdread4"
+    extra_cflags="$extra_cflags -Ilibdvdread4"
   fi
 elif test "$_dvdread" = auto ; then
   _dvdread=no
@@ -5744,8 +5773,8 @@ EOF
   if cc_check -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE \
     $_dvdreadcflags $_dvdreadlibs $_ld_dl ; then
     _dvdread=yes
-    _inc_extra="$_inc_extra $_dvdreadcflags"
-    _ld_extra="$_ld_extra $_dvdreadlibs"
+    extra_cflags="$extra_cflags $_dvdreadcflags"
+    extra_ldflags="$extra_ldflags $_dvdreadlibs"
     _res_comment="external"
   fi
 fi
@@ -5758,7 +5787,7 @@ if test "$_dvdread_internal" = yes; then
 elif test "$_dvdread" = yes; then
   def_dvdread='#define CONFIG_DVDREAD 1'
   _largefiles=yes
-  _ld_extra="$_ld_extra -ldvdread"
+  extra_ldflags="$extra_ldflags -ldvdread"
   _inputmodules="dvdread(external) $_inputmodules"
   _res_comment="external"
 else
@@ -5782,7 +5811,7 @@ if test "$_libdvdcss_internal" = yes ; then
     def_dvd_bsd='#define HAVE_BSD_DVD_STRUCT 1'
   elif darwin ; then
     def_dvd_darwin='#define DARWIN_DVD_IOCTL'
-    _ld_extra="$_ld_extra -framework IOKit"
+    extra_ldflags="$extra_ldflags -framework IOKit"
   elif cygwin ; then
     cflags_libdvdcss="-DSYS_CYGWIN -DWIN32"
   elif beos ; then
@@ -5810,13 +5839,13 @@ EOF
     _cdparanoia=no
     for _inc_tmp in "" "-I/usr/include/cdda" "-I/usr/local/include/cdda" ; do
       cc_check $_inc_tmp -lcdda_interface -lcdda_paranoia $_ld_lm && \
-        _cdparanoia=yes && _inc_extra="$_inc_extra $_inc_tmp" && break
+        _cdparanoia=yes && extra_cflags="$extra_cflags $_inc_tmp" && break
     done
 fi
 if test "$_cdparanoia" = yes ; then
     _cdda='yes'
-    _ld_extra="$_ld_extra -lcdda_interface -lcdda_paranoia"
-    openbsd && _ld_extra="$_ld_extra -lutil"
+    extra_ldflags="$extra_ldflags -lcdda_interface -lcdda_paranoia"
+    openbsd && extra_ldflags="$extra_ldflags -lutil"
 fi
 echores "$_cdparanoia"
 
@@ -5838,13 +5867,13 @@ EOF
     for _ld_tmp in "" "-lwinmm" ; do
         _ld_tmp="-lcdio_cdda -lcdio -lcdio_paranoia $_ld_tmp"
         cc_check $_ld_tmp $_ld_lm \
-          && _libcdio=yes && _ld_extra="$_ld_extra $_ld_tmp" && break
+          && _libcdio=yes && extra_ldflags="$extra_ldflags $_ld_tmp" && break
     done
     if test "$_libcdio" = no && $_pkg_config --exists libcdio_paranoia ; then
       _inc_tmp=`$_pkg_config --cflags libcdio_paranoia`
       _ld_tmp=`$_pkg_config --libs libcdio_paranoia`
       cc_check $_inc_tmp $_ld_tmp $_ld_lm && _libcdio=yes \
-        && _ld_extra="$_ld_extra $_ld_tmp" && _inc_extra="$_inc_extra $_inc_tmp"
+        && extra_ldflags="$extra_ldflags $_ld_tmp" && extra_cflags="$extra_cflags $_inc_tmp"
     fi
 fi
 if test "$_libcdio" = yes && test "$_cdparanoia" = no ; then
@@ -5931,8 +5960,8 @@ EOF
 fi
 if test "$_freetype" = yes ; then
     def_freetype='#define CONFIG_FREETYPE'
-    _inc_extra="$_inc_extra `$_freetypeconfig --cflags`"
-    _ld_extra="$_ld_extra `$_freetypeconfig --libs`"
+    extra_cflags="$extra_cflags `$_freetypeconfig --cflags`"
+    extra_ldflags="$extra_ldflags `$_freetypeconfig --libs`"
 else
     def_freetype='#undef CONFIG_FREETYPE'
 fi
@@ -5960,13 +5989,13 @@ EOF
   _fontconfig=no
   for _ld_tmp in "" "-lexpat -lfreetype" "-lexpat -lfreetype -lz" ; do
     _ld_tmp="-lfontconfig $_ld_tmp"
-    cc_check $_ld_tmp && _fontconfig=yes && _ld_extra="$_ld_extra $_ld_tmp" && break
+    cc_check $_ld_tmp && _fontconfig=yes && extra_ldflags="$extra_ldflags $_ld_tmp" && break
   done
   if test "$_fontconfig" = no && $_pkg_config --exists fontconfig ; then
     _inc_tmp=`$_pkg_config --cflags fontconfig`
     _ld_tmp=`$_pkg_config --libs fontconfig`
     cc_check $_inc_tmp $_ld_tmp && _fontconfig=yes \
-      && _ld_extra="$_ld_extra $_ld_tmp" && _inc_extra="$_inc_extra $_inc_tmp"
+      && extra_ldflags="$extra_ldflags $_ld_tmp" && extra_cflags="$extra_cflags $_inc_tmp"
   fi
 fi
 if test "$_fontconfig" = yes ; then
@@ -6031,8 +6060,8 @@ EOF
 fi
 if test "$_fribidi" = yes ; then
     def_fribidi='#define CONFIG_FRIBIDI'
-    _inc_extra="$_inc_extra `$_fribidiconfig --cflags`"
-    _ld_extra="$_ld_extra `$_fribidiconfig --libs`"
+    extra_cflags="$extra_cflags `$_fribidiconfig --cflags`"
+    extra_ldflags="$extra_ldflags `$_fribidiconfig --libs`"
 else
     def_fribidi='#undef CONFIG_FRIBIDI'
 fi
@@ -6056,7 +6085,7 @@ EOF
 fi
     if test "$_enca" = yes ; then
 	def_enca='#define CONFIG_ENCA 1'
-	_ld_extra="$_ld_extra -lenca"
+	extra_ldflags="$extra_ldflags -lenca"
     else
 	def_enca='#undef CONFIG_ENCA'
     fi
@@ -6072,7 +6101,7 @@ _zlib=no
 cc_check -lz && _zlib=yes
 if test "$_zlib" = yes ; then
   def_zlib='#define CONFIG_ZLIB 1'
-  _ld_extra="$_ld_extra -lz"
+  extra_ldflags="$extra_ldflags -lz"
 else
   def_zlib='#define CONFIG_ZLIB 0'
   _libavdecoders=`echo $_libavdecoders | sed -e s/FLASHSV_DECODER// -e s/PNG_DECODER// -e s/ZMBV_DECODER// -e s/DXA_DECODER// -e s/TSCC_DECODER// `
@@ -6091,7 +6120,7 @@ EOF
 cc_check -lbz2 && bzlib=yes
 if test "$bzlib" = yes ; then
   def_bzlib='#define CONFIG_BZLIB 1'
-  _ld_extra="$_ld_extra -lbz2"
+  extra_ldflags="$extra_ldflags -lbz2"
 fi
 echores "$bzlib"
 
@@ -6131,7 +6160,7 @@ EOF
 fi
 if test "$_liblzo" = yes ; then
   def_liblzo='#define CONFIG_LIBLZO 1'
-  _ld_extra="$_ld_extra -llzo2"
+  extra_ldflags="$extra_ldflags -llzo2"
   _codecmodules="liblzo $_codecmodules"
 else
   def_liblzo='#undef CONFIG_LIBLZO'
@@ -6151,7 +6180,7 @@ EOF
 fi
 if test "$_mad" = yes ; then
   def_mad='#define CONFIG_LIBMAD 1'
-  _ld_extra="$_ld_extra -lmad"
+  extra_ldflags="$extra_ldflags -lmad"
   _codecmodules="libmad $_codecmodules"
 else
   def_mad='#undef CONFIG_LIBMAD'
@@ -6170,7 +6199,7 @@ EOF
 fi
 if test "$_twolame" = yes ; then
   def_twolame='#define CONFIG_TWOLAME 1'
-  _libs_mencoder="$_libs_mencoder -ltwolame"
+  libs_mencoder="$libs_mencoder -ltwolame"
   _codecmodules="twolame $_codecmodules"
 else
   def_twolame='#undef CONFIG_TWOLAME'
@@ -6193,7 +6222,7 @@ fi
 fi
 if test "$_toolame" = yes ; then
   def_toolame='#define CONFIG_TOOLAME 1'
-  _libs_mencoder="$_libs_mencoder -ltoolame"
+  libs_mencoder="$libs_mencoder -ltoolame"
   _codecmodules="toolame $_codecmodules"
 else
   def_toolame='#undef CONFIG_TOOLAME'
@@ -6239,13 +6268,13 @@ elif test "$_tremor" = yes ; then
   def_tremor='#define CONFIG_TREMOR 1'
   _codecmodules="tremor(external) $_codecmodules"
   _res_comment="external Tremor"
-  _ld_extra="$_ld_extra -logg -lvorbisidec"
+  extra_ldflags="$extra_ldflags -logg -lvorbisidec"
 elif test "$_libvorbis" = yes ; then
   _vorbis=yes
   def_vorbis='#define CONFIG_OGGVORBIS 1'
   _codecmodules="libvorbis $_codecmodules"
   _res_comment="libvorbis"
-  _ld_extra="$_ld_extra -lvorbis -logg"
+  extra_ldflags="$extra_ldflags -lvorbis -logg"
 else
   _vorbis=no
   _nocodecmodules="libvorbis $_nocodecmodules"
@@ -6263,7 +6292,7 @@ EOF
 fi
 if test "$_speex" = yes ; then
   def_speex='#define CONFIG_SPEEX 1'
-  _ld_extra="$_ld_extra -lspeex"
+  extra_ldflags="$extra_ldflags -lspeex"
   _codecmodules="speex $_codecmodules"
 else
   def_speex='#undef CONFIG_SPEEX'
@@ -6308,22 +6337,22 @@ int main(void) {
 EOF
   _ld_theora=$($_pkg_config --silence-errors --libs theora)
   _inc_theora=$($_pkg_config --silence-errors --cflags theora)
-  cc_check $_inc_theora $_ld_theora && _ld_extra="$_ld_extra $_ld_theora" &&
-    _inc_extra="$_inc_extra $_inc_theora" && _theora=yes
+  cc_check $_inc_theora $_ld_theora && extra_ldflags="$extra_ldflags $_ld_theora" &&
+    extra_cflags="$extra_cflags $_inc_theora" && _theora=yes
   if test _theora = no; then
     _ld_theora="-ltheora -logg"
-    cc_check $_ld_theora && _ld_extra="$_ld_extra $_ld_theora" && _theora=yes
+    cc_check $_ld_theora && extra_ldflags="$extra_ldflags $_ld_theora" && _theora=yes
   fi
   if test "$_theora" = no && test "$_tremor_internal" = yes; then
     _ld_theora=$($_pkg_config --silence-errors --libs theora)
     _inc_theora=$($_pkg_config --silence-errors --cflags theora)
     cc_check tremor/bitwise.c $_inc_theora $_ld_theora &&
-      _ld_extra="$_ld_extra $_ld_theora" &&
-      _inc_extra="$_inc_extra $_inc_theora" && _theora=yes
+      extra_ldflags="$extra_ldflags $_ld_theora" &&
+      extra_cflags="$extra_cflags $_inc_theora" && _theora=yes
     if test _theora = no; then
       _ld_theora="-ltheora -logg"
       cc_check tremor/bitwise.c $_ld_theora &&
-        _ld_extra="$_ld_extra $_ld_theora" && _theora=yes
+        extra_ldflags="$extra_ldflags $_ld_theora" && _theora=yes
     fi
   fi
 fi
@@ -6332,7 +6361,7 @@ if test "$_theora" = yes ; then
   _codecmodules="libtheora $_codecmodules"
   # when --enable-theora is forced, we'd better provide a probably sane
   # $_ld_theora than nothing
-  test -z "$_ld_theora" && _ld_extra="$_ld_extra -ltheora -logg"
+  test -z "$_ld_theora" && extra_ldflags="$extra_ldflags -ltheora -logg"
 else
   def_theora='#undef CONFIG_OGGTHEORA'
   _nocodecmodules="libtheora $_nocodecmodules"
@@ -6369,7 +6398,7 @@ elif test "$_liba52_internal" = no && test "$_liba52" = auto ; then
 #include <a52dec/a52.h>
 int main(void) { a52_state_t *testHand; testHand=a52_init(0); return 0; }
 EOF
-  cc_check -la52 && _liba52=yes && _res_comment="external" && _ld_extra="$_ld_extra -la52"
+  cc_check -la52 && _liba52=yes && _res_comment="external" && extra_ldflags="$extra_ldflags -la52"
 fi
 if test "$_liba52" = yes ; then
   def_liba52='#define CONFIG_LIBA52 1'
@@ -6409,7 +6438,7 @@ if test "$_libdca" = auto ; then
 int main(void) { dts_init(0); return 0; }
 EOF
   for _ld_dca in -ldts -ldca ; do
-    cc_check $_ld_dca $_ld_lm && _ld_extra="$_ld_extra $_ld_dca" \
+    cc_check $_ld_dca $_ld_lm && extra_ldflags="$extra_ldflags $_ld_dca" \
       && _libdca=yes && break
   done
 fi
@@ -6440,7 +6469,7 @@ EOF
 fi
 if test "$_musepack" = yes ; then
   def_musepack='#define CONFIG_MUSEPACK 1'
-  _ld_extra="$_ld_extra -lmpcdec"
+  extra_ldflags="$extra_ldflags -lmpcdec"
   _codecmodules="musepack $_codecmodules"
 else
   def_musepack='#undef CONFIG_MUSEPACK'
@@ -6458,7 +6487,7 @@ int main(void) { unsigned long x, y; faacEncOpen(48000, 2, &x, &y); return 0; }
 EOF
   _faac=no
   for _ld_faac in "-lfaac" "-lfaac -lmp4v2 -lstdc++" ; do
-    cc_check -O4 $_ld_faac $_ld_lm && _libs_mencoder="$_libs_mencoder $_ld_faac" && _faac=yes && break
+    cc_check -O4 $_ld_faac $_ld_lm && libs_mencoder="$libs_mencoder $_ld_faac" && _faac=yes && break
   done
 fi
 if test "$_faac" = yes ; then
@@ -6466,7 +6495,7 @@ if test "$_faac" = yes ; then
   test "$_faac_lavc" = auto && _faac_lavc=yes
   if test "$_faac_lavc" = yes ; then
     def_faac_lavc="#define CONFIG_LIBFAAC 1"
-    _libs_mplayer="$_libs_mplayer $_ld_faac"
+    libs_mplayer="$libs_mplayer $_ld_faac"
     _libavencoders="$_libavencoders LIBFAAC_ENCODER"
   fi
   _codecmodules="faac $_codecmodules"
@@ -6522,7 +6551,7 @@ if test "$_faad_internal" = yes ; then
     _res_comment="internal fixed-point"
   fi
 elif test "$_faad" = yes ; then
-  _ld_extra="$_ld_extra -lfaad"
+  extra_ldflags="$extra_ldflags -lfaad"
 fi
 
 if test "$_faad" = yes ; then
@@ -6592,7 +6621,7 @@ if test "$_win32dll" = yes ; then
     def_win32_loader='#define WIN32_LOADER 1'
     _win32_emulation=yes
   else
-    _ld_extra="$_ld_extra -ladvapi32 -lole32"
+    extra_ldflags="$extra_ldflags -ladvapi32 -lole32"
     _res_comment="using native windows"
   fi
   _codecmodules="win32 $_codecmodules"
@@ -6670,8 +6699,8 @@ echocheck "Nemesi Streaming Media libraries"
 if test "$_nemesi" = auto  && test "$_network" = yes ; then
     _nemesi=no
     if $_pkg_config libnemesi --atleast-version=0.6.3 ; then
-        _inc_extra="$_inc_extra `$_pkg_config --cflags libnemesi`"
-        _ld_extra="$_ld_extra `$_pkg_config --libs libnemesi`"
+        extra_cflags="$extra_cflags `$_pkg_config --cflags libnemesi`"
+        extra_ldflags="$extra_ldflags `$_pkg_config --libs libnemesi`"
         _nemesi=yes
     fi
 fi
@@ -6698,15 +6727,15 @@ int main(void) { return 0; }
 EOF
 
   _live=no
-  for I in $_inc_extra "-I$_libdir/live" "-I/usr/lib/live" "-I/usr/lib64/live" "-I/usr/local/live" "-I/usr/local/lib/live" ; do
+  for I in $extra_cflags "-I$_libdir/live" "-I/usr/lib/live" "-I/usr/lib64/live" "-I/usr/local/live" "-I/usr/local/lib/live" ; do
     cxx_check $I/liveMedia/include $I/UsageEnvironment/include \
       $I/groupsock/include && _livelibdir=`echo $I| sed s/-I//` && \
-      _ld_extra="$_livelibdir/liveMedia/libliveMedia.a \
+      extra_ldflags="$_livelibdir/liveMedia/libliveMedia.a \
                  $_livelibdir/groupsock/libgroupsock.a \
                  $_livelibdir/UsageEnvironment/libUsageEnvironment.a \
                  $_livelibdir/BasicUsageEnvironment/libBasicUsageEnvironment.a \
-                 $_ld_extra  -lstdc++" \
-      _inc_extraxx="-I$_livelibdir/liveMedia/include \
+                 $extra_ldflags  -lstdc++" \
+      extra_cxxflags="-I$_livelibdir/liveMedia/include \
                   -I$_livelibdir/UsageEnvironment/include \
                   -I$_livelibdir/BasicUsageEnvironment/include \
                   -I$_livelibdir/groupsock/include" && \
@@ -6726,8 +6755,8 @@ elif test "$_live_dist" = yes && test "$_network" = yes; then
   _res_comment="using distribution version"
   _live="yes"
   def_live='#define CONFIG_LIVE555 1'
-  _ld_extra="$_ld_extra -lliveMedia -lgroupsock -lUsageEnvironment -lBasicUsageEnvironment -lstdc++"
-  _inc_extraxx="-I/usr/include/liveMedia -I/usr/include/UsageEnvironment \
+  extra_ldflags="$extra_ldflags -lliveMedia -lgroupsock -lUsageEnvironment -lBasicUsageEnvironment -lstdc++"
+  extra_cxxflags="-I/usr/include/liveMedia -I/usr/include/UsageEnvironment \
              -I/usr/include/BasicUsageEnvironment -I/usr/include/groupsock"
  _inputmodules="live555 $_inputmodules"
 else
@@ -6755,10 +6784,10 @@ EOF
   if $_pkg_config --exists libavutil ; then
     _inc_libavutil=`$_pkg_config --cflags libavutil`
     _ld_tmp=`$_pkg_config --libs libavutil`
-    cc_check $_inc_libavutil $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" \
+    cc_check $_inc_libavutil $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" \
       && _libavutil_so=yes
   elif cc_check -lavutil $_ld_lm ; then
-    _ld_extra="$_ld_extra -lavutil"
+    extra_ldflags="$extra_ldflags -lavutil"
     _libavutil_so=yes
     _res_comment="using libavutil.so, but static libavutil is recommended"
   fi
@@ -6794,10 +6823,10 @@ EOF
   if $_pkg_config --exists libavcodec ; then
     _inc_libavcodec=`$_pkg_config --cflags libavcodec`
     _ld_tmp=`$_pkg_config --libs libavcodec`
-    cc_check $_inc_libavcodec $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" \
+    cc_check $_inc_libavcodec $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" \
       && _libavcodec_so=yes
   elif cc_check -lavcodec $_ld_lm ; then
-    _ld_extra="$_ld_extra -lavcodec"
+    extra_ldflags="$extra_ldflags -lavcodec"
     _libavcodec_so=yes
     _res_comment="using libavcodec.so, but static libavcodec is recommended"
   fi
@@ -6838,10 +6867,10 @@ EOF
   if $_pkg_config --exists libavformat ; then
     _inc_libavformat=`$_pkg_config --cflags libavformat`
     _ld_tmp=`$_pkg_config --libs libavformat`
-    cc_check $_inc_libavformat $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" \
+    cc_check $_inc_libavformat $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" \
       && _libavformat_so=yes
   elif cc_check $_ld_lm -lavformat ; then
-    _ld_extra="$_ld_extra -lavformat"
+    extra_ldflags="$extra_ldflags -lavformat"
     _libavformat_so=yes
     _res_comment="using libavformat.so, but static libavformat is recommended"
   fi
@@ -6872,7 +6901,7 @@ elif test "$_libpostproc_so" = auto ; then
   int main(void) { pp_get_mode_by_name_and_quality("de", 0); return 0; }
 EOF
   if cc_check -lpostproc $_ld_lm ; then
-    _ld_extra="$_ld_extra -lpostproc"
+    extra_ldflags="$extra_ldflags -lpostproc"
     _libpostproc_so=yes
     _res_comment="using libpostproc.so, but static libpostproc is recommended"
   fi
@@ -6905,10 +6934,10 @@ EOF
   if $_pkg_config --exists libswscale ; then
     _inc_libswscale=`$_pkg_config --cflags libswscale`
     _ld_tmp=`$_pkg_config --libs libswscale`
-    cc_check $_inc_libswscale $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" \
+    cc_check $_inc_libswscale $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" \
       && _libswscale_so=yes
   elif cc_check -lswscale ; then
-    _ld_extra="$_ld_extra -lswscale"
+    extra_ldflags="$extra_ldflags -lswscale"
     _libswscale_so=yes
   fi
 fi
@@ -6938,7 +6967,7 @@ EOF
 fi
 if test "$_libamr_nb" = yes ; then
   _libamr=yes
-  _ld_extra="$_ld_extra -lamrnb"
+  extra_ldflags="$extra_ldflags -lamrnb"
   def_libamr='#define CONFIG_LIBAMR 1'
   def_libamr_nb='#define CONFIG_LIBAMR_NB 1'
   _libavdecoders="$_libavdecoders LIBAMR_NB_DECODER"
@@ -6966,7 +6995,7 @@ EOF
 fi
 if test "$_libamr_wb" = yes ; then
   _libamr=yes
-  _ld_extra="$_ld_extra -lamrwb"
+  extra_ldflags="$extra_ldflags -lamrwb"
   def_libamr='#define CONFIG_LIBAMR 1'
   def_libamr_wb='#define CONFIG_LIBAMR_WB 1'
   _libavdecoders="$_libavdecoders LIBAMR_WB_DECODER"
@@ -6989,7 +7018,7 @@ EOF
 fi
 if test "$_libdv" = yes ; then
   def_libdv='#define CONFIG_LIBDV095 1'
-  _ld_extra="$_ld_extra -ldv"
+  extra_ldflags="$extra_ldflags -ldv"
   _codecmodules="libdv $_codecmodules"
 else
   def_libdv='#undef CONFIG_LIBDV095'
@@ -7006,7 +7035,7 @@ if test "$_xvid" = auto ; then
 int main(void) { xvid_global(0, 0, 0, 0); return 0; }
 EOF
   for _ld_tmp in "-lxvidcore $_ld_lm" "-lxvidcore $_ld_lm $_ld_pthread" ; do
-    cc_check $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" && _xvid=yes && break
+    cc_check $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" && _xvid=yes && break
   done
 fi
 
@@ -7042,14 +7071,14 @@ if test "$_x264" = auto ; then
   cat > $TMPC << EOF
 #include <inttypes.h>
 #include <x264.h>
-#if X264_BUILD < 59
+#if X264_BUILD < 65
 #error We do not support old versions of x264. Get the latest from SVN.
 #endif
 int main(void) { x264_encoder_open((void*)0); return 0; }
 EOF
   _x264=no
   for _ld_x264 in "-lx264 $_ld_pthread" "-lx264 $_ld_pthread $_ld_lm" ; do
-    cc_check $_ld_x264 && _libs_mencoder="$_libs_mencoder $_ld_x264" && _x264=yes && break
+    cc_check $_ld_x264 && libs_mencoder="$libs_mencoder $_ld_x264" && _x264=yes && break
   done
 fi
 
@@ -7059,7 +7088,7 @@ if test "$_x264" = yes ; then
   test "$_x264_lavc" = auto && _x264_lavc=yes
   if test "$_x264_lavc" = yes ; then
     def_x264_lavc='#define CONFIG_LIBX264 1'
-    _libs_mplayer="$_libs_mplayer $_ld_x264"
+    libs_mplayer="$libs_mplayer $_ld_x264"
     _libavencoders="$_libavencoders LIBX264_ENCODER"
   fi
 else
@@ -7097,8 +7126,8 @@ EOF
       _ld_dirac=`$_pkg_config --silence-errors --libs dirac`
       cc_check $_inc_dirac $_ld_dirac      &&
       _libdirac_lavc=yes                   &&
-      _inc_extra="$_inc_extra $_inc_dirac" &&
-      _ld_extra="$_ld_extra $_ld_dirac"
+      extra_cflags="$extra_cflags $_inc_dirac" &&
+      extra_ldflags="$extra_ldflags $_ld_dirac"
     fi
   fi
 fi
@@ -7129,8 +7158,8 @@ EOF
       _ld_schroedinger=`$_pkg_config --silence-errors --libs schroedinger-1.0`
       cc_check $_inc_schroedinger $_ld_schroedinger &&
       _libschroedinger_lavc=yes                     &&
-      _inc_extra="$_inc_extra $_inc_schroedinger"   &&
-      _ld_extra="$_ld_extra $_ld_schroedinger"
+      extra_cflags="$extra_cflags $_inc_schroedinger"   &&
+      extra_ldflags="$extra_ldflags $_ld_schroedinger"
     fi
   fi
 fi
@@ -7160,7 +7189,7 @@ fi
 
 if test "$_libnut" = yes ; then
   def_libnut='#define CONFIG_LIBNUT 1'
-  _ld_extra="$_ld_extra -lnut"
+  extra_ldflags="$extra_ldflags -lnut"
 else
   def_libnut='#undef CONFIG_LIBNUT'
 fi
@@ -7211,7 +7240,7 @@ fi
 if test "$_mp3lame" = yes ; then
   def_mp3lame="#define CONFIG_MP3LAME"
   _ld_mp3lame=-lmp3lame
-  _libs_mencoder="$_libs_mencoder $_ld_mp3lame"
+  libs_mencoder="$libs_mencoder $_ld_mp3lame"
   cat > $TMPC << EOF
 #include <lame/lame.h>
 int main(void) { lame_set_preset(NULL, STANDARD_FAST); return 0; }
@@ -7226,7 +7255,7 @@ EOF
   if test "$_mp3lame_lavc" = yes ; then
     def_mp3lame_lavc="#define CONFIG_LIBMP3LAME 1"
     _libavencoders="$_libavencoders LIBMP3LAME_ENCODER"
-    _libs_mplayer="$_libs_mplayer $_ld_mp3lame"
+    libs_mplayer="$libs_mplayer $_ld_mp3lame"
   fi
 else
   _mp3lame_lavc=no
@@ -7376,7 +7405,7 @@ fi
 if test "$_tv_dshow" = yes ; then
   _inputmodules="tv-dshow $_inputmodules"
   def_tv_dshow='#define CONFIG_TV_DSHOW 1'
-  _ld_extra="$_ld_extra -lole32 -luuid"
+  extra_ldflags="$extra_ldflags -lole32 -luuid"
 else
   _noinputmodules="tv-dshow $_noinputmodules"
   def_tv_dshow='#undef CONFIG_TV_DSHOW'
@@ -7590,7 +7619,7 @@ fi
 if test "$_vstream" = yes ; then
   def_vstream='#define CONFIG_VSTREAM 1'
   _inputmodules="vstream $_inputmodules"
-  _ld_extra="$_ld_extra -lvstream-client"
+  extra_ldflags="$extra_ldflags -lvstream-client"
 else
   _noinputmodules="vstream $_noinputmodules"
   def_vstream='#undef CONFIG_VSTREAM'
@@ -7630,9 +7659,9 @@ if test "$_xmms" = yes ; then
 
   def_xmms='#define CONFIG_XMMS 1'
   if darwin ; then
-     _ld_extra="$_ld_extra ${_xmmslibdir}/libxmms.dylib"
+     extra_ldflags="$extra_ldflags ${_xmmslibdir}/libxmms.dylib"
   else
-     _ld_extra="$_ld_extra ${_xmmslibdir}/libxmms.so.1 -export-dynamic"
+     extra_ldflags="$extra_ldflags ${_xmmslibdir}/libxmms.so.1 -export-dynamic"
   fi
 else
   def_xmms='#undef CONFIG_XMMS'
@@ -7695,15 +7724,15 @@ if test "$_gtk1" = no ; then
 
   if $_pkg_config gtk+-2.0 --exists ; then
     _gtk=`$_pkg_config gtk+-2.0 --modversion 2>/dev/null`
-    _inc_extra="$_inc_extra `$_pkg_config gtk+-2.0 --cflags 2>/dev/null`"
-    _libs_mplayer="$_libs_mplayer `$_pkg_config gtk+-2.0 --libs 2>/dev/null`"
+    extra_cflags="$extra_cflags `$_pkg_config gtk+-2.0 --cflags 2>/dev/null`"
+    libs_mplayer="$libs_mplayer `$_pkg_config gtk+-2.0 --libs 2>/dev/null`"
     echores "$_gtk"
 
     # Check for GLIB2
     if $_pkg_config glib-2.0 --exists ; then
       echocheck "glib version"
       _glib=`$_pkg_config glib-2.0 --modversion 2>/dev/null`
-      _libs_mplayer="$_libs_mplayer `$_pkg_config glib-2.0 --libs 2>/dev/null`"
+      libs_mplayer="$libs_mplayer `$_pkg_config glib-2.0 --libs 2>/dev/null`"
       echores "$_glib"
 
       def_gui='#define CONFIG_GUI 1'
@@ -7731,8 +7760,8 @@ if test "$_gtk1" = yes ; then
     fi
   fi
   _gtk=`$_gtkconfig --version 2>&1`
-  _inc_extra="$_inc_extra `$_gtkconfig --cflags 2>&1`"
-  _libs_mplayer="$_libs_mplayer `$_gtkconfig --libs 2>&1`"
+  extra_cflags="$extra_cflags `$_gtkconfig --cflags 2>&1`"
+  libs_mplayer="$libs_mplayer `$_gtkconfig --libs 2>&1`"
   echores "$_gtk (using $_gtkconfig)"
 
   # Check for GLIB
@@ -7747,7 +7776,7 @@ if test "$_gtk1" = yes ; then
     fi
   fi
   _glib=`$_glibconfig --version 2>&1`
-  _libs_mplayer="$_libs_mplayer `$_glibconfig --libs 2>&1`"
+  libs_mplayer="$libs_mplayer `$_glibconfig --libs 2>&1`"
   echores "$_glib (using $_glibconfig)"
 
   def_gui='#define CONFIG_GUI 1'
@@ -7756,7 +7785,7 @@ fi
 
 else #if ! win32
   _gui_win32=yes
-  _libs_mplayer="$_libs_mplayer -lcomdlg32 -lcomctl32 -lshell32 -lkernel32"
+  libs_mplayer="$libs_mplayer -lcomdlg32 -lcomctl32 -lshell32 -lkernel32"
   def_gui='#define CONFIG_GUI 1'
   def_gtk2='#undef CONFIG_GTK2'
 fi #if ! win32
@@ -7768,13 +7797,11 @@ fi #if test "$_gui"
 # --------------- GUI specific tests end -------------------
 
 
-if test "$_charset" = "noconv" ; then
-  _charset=""
-fi
-if test "$_charset" ; then
+if test "$_charset" != "noconv" ; then
   def_charset="#define MSG_CHARSET \"$_charset\""
 else
   def_charset="#undef MSG_CHARSET"
+  _charset="UTF-8"
 fi
 
 if test -n "$_charset" && test "$_charset" != "UTF-8" ; then
@@ -7808,7 +7835,7 @@ cat > $TMPC <<EOF
 int main(void) { return 0; }
 EOF
 if cc_check -Wl,-z,noexecstack ; then
-  _ld_extra="-Wl,-z,noexecstack $_ld_extra"
+  extra_ldflags="-Wl,-z,noexecstack $extra_ldflags"
   echores "yes"
 else
   echores "no"
@@ -7823,9 +7850,9 @@ if test "$_real" = yes || test "$_xanim" = yes && ! win32 && ! qnx && ! darwin &
   _ld_dl_dynamic='-rdynamic'
 fi
 
-_ld_extra="$_ld_extra $_ld_pthread $_ld_dl $_ld_dl_dynamic"
-bsdos && _ld_extra="$_ld_extra -ldvd"
-(netbsd || openbsd) && x86_32 && _ld_extra="$_ld_extra -li386"
+extra_ldflags="$extra_ldflags $_ld_pthread $_ld_dl $_ld_dl_dynamic"
+bsdos && extra_ldflags="$extra_ldflags -ldvd"
+(netbsd || openbsd) && x86_32 && extra_ldflags="$extra_ldflags -li386"
 
 def_debug='#undef MP_DEBUG'
 test "$_debug" != "" && def_debug='#define MP_DEBUG 1'
@@ -7855,7 +7882,7 @@ EOF
 fi
 if test "$_lirc" = yes ; then
   def_lirc='#define CONFIG_LIRC 1'
-  _ld_extra="$_ld_extra -llirc_client"
+  extra_ldflags="$extra_ldflags -llirc_client"
 else
   def_lirc='#undef CONFIG_LIRC'
 fi
@@ -7872,7 +7899,7 @@ EOF
 fi
 if test "$_lircc" = yes ; then
   def_lircc='#define CONFIG_LIRCC 1'
-  _ld_extra="$_ld_extra -llircc"
+  extra_ldflags="$extra_ldflags -llircc"
 else
   def_lircc='#undef CONFIG_LIRCC'
 fi
@@ -7892,8 +7919,8 @@ EOF
 fi
 if test "$_maemo" = yes ; then
   def_maemo='#define CONFIG_MAEMO 1'
-  _inc_extra="$_inc_extra `$_pkg_config --cflags libosso`"
-  _ld_extra="$_ld_extra `$_pkg_config --libs libosso` -lXsp"
+  extra_cflags="$extra_cflags `$_pkg_config --cflags libosso`"
+  extra_ldflags="$extra_ldflags `$_pkg_config --libs libosso` -lXsp"
 else
   def_maemo='#undef CONFIG_MAEMO'
 fi
@@ -7906,20 +7933,20 @@ fi
 # the OMF format needs to come after the 'extern symbol prefix' check, which
 # uses nm.
 if os2 ; then
-  _ld_extra="$_ld_extra -Zomf -Zstack 16384 -Zbin-files -Zargs-wild"
+  extra_ldflags="$extra_ldflags -Zomf -Zstack 16384 -Zbin-files -Zargs-wild"
 fi
 
 # linker paths should be the same for mencoder and mplayer
 _ld_tmp=""
-for I in $_libs_mplayer ; do
+for I in $libs_mplayer ; do
   _tmp=`echo $I | sed -e 's/^-L.*$//'`
   if test -z "$_tmp" ; then
-    _ld_extra="$_ld_extra $I"
+    extra_ldflags="$extra_ldflags $I"
   else
     _ld_tmp="$_ld_tmp $I"
   fi
 done
-_libs_mplayer=$_ld_tmp
+libs_mplayer=$_ld_tmp
 
 
 #############################################################################
@@ -7996,11 +8023,11 @@ if test "$_dvdnav" = yes ; then
   _largefiles=yes
   def_dvdnav='#define CONFIG_DVDNAV 1'
   if test "$dvdnav_internal" = yes ; then
-    _inc_extra="$_inc_extra -Ilibdvdnav"
+    cflags_libdvdnav="-Ilibdvdnav"
     _inputmodules="dvdnav(internal) $_inputmodules"
   else
-    _inc_extra="$_inc_extra `$_dvdnavconfig --cflags`"
-    _ld_extra="$_ld_extra `$_dvdnavconfig --minilibs`"
+    extra_cflags="$extra_cflags `$_dvdnavconfig --cflags`"
+    extra_ldflags="$extra_ldflags `$_dvdnavconfig --minilibs`"
     _inputmodules="dvdnav $_inputmodules"
   fi
 else
@@ -8045,25 +8072,24 @@ INSTALLSTRIP = $_install_strip
 RANLIB = $_ranlib
 WINDRES = $_windres
 
-EXTRA_INC = $_inc_extra
-EXTRAXX_INC = $_inc_extra $_inc_extraxx
-CFLAGS = $CFLAGS \$(EXTRA_INC)
-OPTFLAGS = $CFLAGS \$(EXTRA_INC)
-CXXFLAGS = $CXXFLAGS \$(EXTRAXX_INC)
+CFLAGS = $CFLAGS $extra_cflags
+OPTFLAGS = $CFLAGS $extra_cflags
+CXXFLAGS = $CXXFLAGS $extra_cflags $extra_cxxflags
 CFLAGS_DHAHELPER = $cflags_dhahelper
 CFLAGS_FAAD_FIXED = $cflags_faad_fixed
 CFLAGS_LIBDVDCSS = $cflags_libdvdcss
 CFLAGS_LIBDVDCSS_DVDREAD = $cflags_libdvdcss_dvdread
+CFLAGS_LIBDVDNAV = $cflags_libdvdnav
 CFLAGS_NO_OMIT_LEAF_FRAME_POINTER = $cflags_no_omit_leaf_frame_pointer
 CFLAGS_STACKREALIGN = $cflags_stackrealign
 CFLAGS_SVGALIB_HELPER = $cflags_svgalib_helper
 CFLAGS_TREMOR_LOW = $cflags_tremor_low
 YASMFLAGS = $YASMFLAGS
 
-EXTRALIBS = $_extra_libs
-EXTRA_LIB = $_ld_extra $_ld_static $_ld_lm
-EXTRALIBS_MPLAYER = $_libs_mplayer
-EXTRALIBS_MENCODER = $_libs_mencoder
+EXTRALIBS = $extra_libs
+EXTRA_LIB = $extra_ldflags $_ld_static $_ld_lm
+EXTRALIBS_MPLAYER = $libs_mplayer
+EXTRALIBS_MENCODER = $libs_mencoder
 
 DEPEND_CMD   = \$(CC) -MM \$(CFLAGS) \$(filter-out %.h,\$^) | sed "s,[0-9a-z._-]*: \(\$(SRC_DIR)/\)*\([a-z0-9]*/\)[^/]* ,\\2&,"
 
@@ -8144,6 +8170,7 @@ IVTV = $_ivtv
 JACK = $_jack
 JOYSTICK = $_joystick
 JPEG = $_jpeg
+KVA = $_kva
 LADSPA = $_ladspa
 LIBA52 = $_liba52
 LIBA52_INTERNAL = $_liba52_internal
@@ -8646,6 +8673,7 @@ $def_gl
 $def_gl_win32
 $def_ivtv
 $def_jpeg
+$def_kva
 $def_md5sum
 $def_mga
 $def_mng
@@ -8741,11 +8769,13 @@ $def_yasm
 #define CONFIG_POWERPC_PERF 0
 #define CONFIG_SMALL 0
 #define CONFIG_SWSCALE 1
+#define CONFIG_SWSCALE_ALPHA 1
 
 #define HAVE_GETHRTIME 0
 #define HAVE_INLINE_ASM 0
 #define HAVE_POLL_H 1
 #define HAVE_PPC4XX 0
+#define HAVE_VIRTUALALLOC 0
 
 /* Some FFmpeg codecs depend on these. Enable them unconditionally for now. */
 #define CONFIG_AANDCT 1
diff --git a/cpudetect.c b/cpudetect.c
index 5da169d..62afe58 100644
--- a/cpudetect.c
+++ b/cpudetect.c
@@ -44,20 +44,15 @@ static void check_os_katmai_support( void );
 // return TRUE if cpuid supported
 static int has_cpuid(void)
 {
-	long a, c;
-
 // code from libavcodec:
 #if ARCH_X86_64
-#define PUSHF "pushfq\n\t"
-#define POPF "popfq\n\t"
+   return 1;
 #else
-#define PUSHF "pushfl\n\t"
-#define POPF "popfl\n\t"
-#endif
+	long a, c;
     __asm__ volatile (
                           /* See if CPUID instruction is supported ... */
                           /* ... Get copies of EFLAGS into eax and ecx */
-                          PUSHF
+                          "pushfl\n\t"
                           "pop %0\n\t"
                           "mov %0, %1\n\t"
                           
@@ -65,19 +60,18 @@ static int has_cpuid(void)
                           /*     to the EFLAGS reg */
                           "xor $0x200000, %0\n\t"
                           "push %0\n\t"
-                          POPF
+                          "popfl\n\t"
                           
                           /* ... Get the (hopefully modified) EFLAGS */
-                          PUSHF
+                          "pushfl\n\t"
                           "pop %0\n\t"
                           : "=a" (a), "=c" (c)
                           :
                           : "cc" 
                           );
-#undef PUSHF
-#undef POPF
 
 	return a != c;
+#endif
 }
 
 static void
@@ -143,6 +137,7 @@ void GetCpuCaps( CpuCaps *caps)
 		caps->hasMMX  = (regs2[3] & (1 << 23 )) >> 23; // 0x0800000
 		caps->hasSSE  = (regs2[3] & (1 << 25 )) >> 25; // 0x2000000
 		caps->hasSSE2 = (regs2[3] & (1 << 26 )) >> 26; // 0x4000000
+		caps->hasSSE3 = (regs2[2] & 1);                // 0x0000001
 		caps->hasSSSE3 = (regs2[2] & (1 << 9 )) >>  9; // 0x0000200
 		caps->hasMMX2 = caps->hasSSE; // SSE cpus supports mmxext too
 		cl_size = ((regs2[1] >> 8) & 0xFF)*8;
@@ -276,7 +271,7 @@ static void sigill_handler_sse( int signal, struct sigcontext sc )
 }
 #endif /* __linux__ && _POSIX_SOURCE */
 
-#if defined(__MINGW32__) || defined(__CYGWIN__)
+#if (defined(__MINGW32__) || defined(__CYGWIN__)) && !ARCH_X86_64
 LONG CALLBACK win32_sig_handler_sse(EXCEPTION_POINTERS* ep)
 {
    if(ep->ExceptionRecord->ExceptionCode==EXCEPTION_ILLEGAL_INSTRUCTION){
@@ -458,6 +453,7 @@ void GetCpuCaps( CpuCaps *caps)
 	caps->has3DNowExt=0;
 	caps->hasSSE=0;
 	caps->hasSSE2=0;
+	caps->hasSSE3=0;
 	caps->hasSSSE3=0;
 	caps->hasSSE4a=0;
 	caps->isX86=0;
diff --git a/cpudetect.h b/cpudetect.h
index 2cc99d4..f31bf07 100644
--- a/cpudetect.h
+++ b/cpudetect.h
@@ -46,6 +46,7 @@ typedef struct cpucaps_s {
 	int has3DNowExt;
 	int hasSSE;
 	int hasSSE2;
+	int hasSSE3;
 	int hasSSSE3;
 	int hasSSE4a;
 	int isX86;
diff --git a/cpuinfo.c b/cpuinfo.c
index ac49cd7..78f5d5b 100644
--- a/cpuinfo.c
+++ b/cpuinfo.c
@@ -290,11 +290,11 @@ main(void)
        have to check the family, model and stepping instead. */
     if (strstr(idstr, "AMD") &&
         family == 5 &&
-        (model >= 9 || model == 8 && stepping >= 8))
+        (model >= 9 || (model == 8 && stepping >= 8)))
       printf(" %s", "k6_mtrr");
     /* similar for cyrix_arr. */
     if (strstr(idstr, "Cyrix") &&
-        (family == 5 && model < 4 || family == 6))
+        (family == 5 && (model < 4 || family == 6)))
       printf(" %s", "cyrix_arr");
     /* as well as centaur_mcr. */
     if (strstr(idstr, "Centaur") &&
diff --git a/etc/codecs.conf b/etc/codecs.conf
index 11d0a01..ef879ab 100644
--- a/etc/codecs.conf
+++ b/etc/codecs.conf
@@ -3,7 +3,7 @@
 ;  Before editing this file, please read DOCS/tech/codecs.conf.txt !
 ;=============================================================================
 
-release 20070930
+release 20090308
 
 ;=============================================================================
 ;                   VIDEO CODECS
@@ -319,14 +319,6 @@ videocodec ffnuv
   dll nuv
   out I420
 
-videocodec nuv
-  info "NuppelVideo"
-  status working
-  fourcc NUV1 ; NUV1 is an internal MPlayer FOURCC
-  fourcc RJPG
-  driver nuv
-  out I420,IYUV
-
 videocodec ffbmp
   info "FFmpeg BMP"
   status working
@@ -533,6 +525,15 @@ videocodec theora
 
 ;WIN32:
 
+videocodec smartsight
+  info "Verint Video Manager"
+  status working
+  fourcc SN40
+  fourcc SN41,SJPG ; untested
+  driver vfw
+  dll "SN4Codec.dll"
+  out BGR24 flip
+
 videocodec msuscls
   info "MSU Screen Capture Lossless Codec"
   status working
@@ -891,7 +892,7 @@ videocodec ffodivx
   fourcc FFDS
   fourcc DCOD,MVXM,EM4A,PM4V
   fourcc M4T3,DMK2,DIGI,INMC
-  fourcc EPHV
+  fourcc EPHV,SN40
   driver ffmpeg
   dll mpeg4 ;opendivx
   out YV12,I420,IYUV
@@ -942,7 +943,7 @@ videocodec xvid
   fourcc FFDS
   fourcc DCOD,MVXM,EM4A,PM4V
   fourcc M4T3,DMK2,DIGI,INMC
-  fourcc EPHV
+  fourcc EPHV,SN40
   format 0x10000004  ; mpeg 4 es
   driver xvid
   out YV12
@@ -1519,20 +1520,6 @@ videocodec indeo3xa
 
 ; DV:  qdv is more stable...  libdv is slow, mcdv is unstable
 
-videocodec qdv
-  info "Sony Digital Video (DV)"
-  status working
-  fourcc dvsl,dvsd,dvhd  ; ????
-  fourcc DVSD dvsd   ; pal .avi
-  fourcc "dvcp" dvsd ; pal .mov
-  fourcc "dvc " dvsd ; ntsc .mov
-  driver dshow
-  dll "qdv.dll"
-  guid 0xB1B77C00, 0xC3E4, 0x11CF, 0xAF, 0x79, 0x00, 0xAA, 0x00, 0xB6, 0x7A, 0x42
-  out YUY2
-  out UYVY
-  out BGR24,BGR16,BGR15 ; BGR32 is buggy, at least with one sample
-
 videocodec ffdv
   info "FFmpeg DV"
   status working
@@ -1553,6 +1540,20 @@ videocodec ffdv
   dll dvvideo
   out 411P,422P,YV12
 
+videocodec qdv
+  info "Sony Digital Video (DV)"
+  status working
+  fourcc dvsl,dvsd,dvhd  ; ????
+  fourcc DVSD dvsd   ; pal .avi
+  fourcc "dvcp" dvsd ; pal .mov
+  fourcc "dvc " dvsd ; ntsc .mov
+  driver dshow
+  dll "qdv.dll"
+  guid 0xB1B77C00, 0xC3E4, 0x11CF, 0xAF, 0x79, 0x00, 0xAA, 0x00, 0xB6, 0x7A, 0x42
+  out YUY2
+  out UYVY
+  out BGR24,BGR16,BGR15 ; BGR32 is buggy, at least with one sample
+
 videocodec libdv
   info "Raw DV (libdv)"
   status working
@@ -3035,6 +3036,7 @@ audiocodec ffqclp
   info "FFmpeg QCLP audio"
   status buggy
   format 0x706C6351 ; "Qclp"
+  format 0x70637173 ; "sqcp"
   driver ffmpeg
   dll "qcelp"
 
diff --git a/help/help_mp-bg.h b/help/help_mp-bg.h
index cd989fe..0ac8450 100644
--- a/help/help_mp-bg.h
+++ b/help/help_mp-bg.h
@@ -6,7 +6,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Употреба:   mplayer [опции] [url|път/]име_на_файл\n"
 "\n"
 "Основни опции:   (пълният списък е в ръководството - 'man mplayer')\n"
diff --git a/help/help_mp-cs.h b/help/help_mp-cs.h
index 35898fd..a9f0db0 100644
--- a/help/help_mp-cs.h
+++ b/help/help_mp-cs.h
@@ -7,7 +7,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Použití:          mplayer [volby] [url|cesta/]jméno_souboru\n"
 "\n"
 "Základní volby: (úplný seznam najdete v manuálové stránce)\n"
diff --git a/help/help_mp-de.h b/help/help_mp-de.h
index 58a21f0..db7f5ca 100644
--- a/help/help_mp-de.h
+++ b/help/help_mp-de.h
@@ -12,7 +12,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Verwendung:   mplayer [Optionen] [URL|Verzeichnis/]Dateiname\n"
 "\n"
 "Basisoptionen: (siehe Manpage für eine vollständige Liste aller Optionen!)\n"
diff --git a/help/help_mp-dk.h b/help/help_mp-dk.h
index 3b633a5..d1c149e 100644
--- a/help/help_mp-dk.h
+++ b/help/help_mp-dk.h
@@ -7,7 +7,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Benyt:   mplayer [indstillinger] [URL|sti/]filnavn\n"
 "\n"
 "Basale indstillinger (se manualen for en komplet liste):\n"
diff --git a/help/help_mp-el.h b/help/help_mp-el.h
index e01ef40..bc9e6f4 100644
--- a/help/help_mp-el.h
+++ b/help/help_mp-el.h
@@ -5,7 +5,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Usage:   mplayer [επιλογές] [url|διαδρομή/]όνομα_αρχείου\n"
 "\n"
 "Βασικές επιλογές: (Ανατρέξτε στη  σελίδα εγχειριδίου για ολοκληρωμένη λίστα με επιλογές)\n"
diff --git a/help/help_mp-en.h b/help/help_mp-en.h
index 75d3254..cea08e9 100644
--- a/help/help_mp-en.h
+++ b/help/help_mp-en.h
@@ -1,4 +1,4 @@
-// $Revision: 28122 $
+// $Revision: 28860 $
 // MASTER FILE. Use this file as base for translations.
 // Translated files should be sent to the mplayer-DOCS mailing list or
 // to the help messages maintainer, see DOCS/tech/MAINTAINERS.
@@ -13,7 +13,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Usage:   mplayer [options] [url|path/]filename\n"
 "\n"
 "Basic options: (complete list in the man page)\n"
diff --git a/help/help_mp-es.h b/help/help_mp-es.h
index f25d18e..3de10bb 100644
--- a/help/help_mp-es.h
+++ b/help/help_mp-es.h
@@ -17,7 +17,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Uso:   mplayer [opciones] [url o ruta del archivo]\n"
 "\n"
 "Opciones básicas: ('man mplayer' para una lista completa)\n"
diff --git a/help/help_mp-fr.h b/help/help_mp-fr.h
index 339674d..9a8cbf2 100644
--- a/help/help_mp-fr.h
+++ b/help/help_mp-fr.h
@@ -8,7 +8,7 @@
 // ========================= Aide MPlayer ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Utilisation :      mplayer [options] [url|répertoire/]fichier\n"
 "\n"
 "Options de base :  (liste complète dans la page de man)\n"
diff --git a/help/help_mp-hu.h b/help/help_mp-hu.h
index bcea3f2..770c552 100644
--- a/help/help_mp-hu.h
+++ b/help/help_mp-hu.h
@@ -3,13 +3,13 @@
 //... Okay enough of the hw, now send the other two!
 //
 // Updated by: Gabrov <gabrov at freemail.hu>
-// Sync'ed with help_mp-en.h r28122 (2008. 12. 17.)
+// Sync'ed with help_mp-en.h r28860 (2009. 03. 09.)
 
 
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Indítás:   mplayer [opciók] [url|útvonal/]fájlnév\n"
 "\n"
 "Alapvető opciók: (az összes opció listájához lásd a man lapot)\n"
diff --git a/help/help_mp-it.h b/help/help_mp-it.h
index 5e7459d..c747ae3 100644
--- a/help/help_mp-it.h
+++ b/help/help_mp-it.h
@@ -8,7 +8,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Uso:   mplayer [opzioni] [url|percorso/]nome_file\n"
 "\n"
 "Opzioni di base: (vedi la pagina man per la lista completa)\n"
diff --git a/help/help_mp-ja.h b/help/help_mp-ja.h
index 7fd1c0b..61aa98a 100644
--- a/help/help_mp-ja.h
+++ b/help/help_mp-ja.h
@@ -6,7 +6,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "使い方:   mplayer [オプション] [url|パス/]ファイル名\n"
 "\n"
 "基本的なオプション: (man page に全て網羅されています)\n"
diff --git a/help/help_mp-ko.h b/help/help_mp-ko.h
index 6a9a130..7d883a3 100644
--- a/help/help_mp-ko.h
+++ b/help/help_mp-ko.h
@@ -4,7 +4,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "사용법:   mplayer [선택사항] [url|경로/]파일명\n"
 "\n"
 "기본 선택사항: (전체 목록은 man 페이지 참조)\n"
diff --git a/help/help_mp-mk.h b/help/help_mp-mk.h
index fb0c6fc..a65ea9d 100644
--- a/help/help_mp-mk.h
+++ b/help/help_mp-mk.h
@@ -5,7 +5,7 @@
 // ========================= MPlayer Помош ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Употреба: mplayer [опции] [url|патека/]ИмеНаДатотеката\n"
 "\n"
 "Основни Опции: (комплетна листа на man страницата)\n"
diff --git a/help/help_mp-nb.h b/help/help_mp-nb.h
index 9e6c860..c420728 100644
--- a/help/help_mp-nb.h
+++ b/help/help_mp-nb.h
@@ -4,7 +4,7 @@
 // ========================= MPlayer hjelp ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Bruk:    mplayer [valg] [sti/]filnavn\n"
 "\n"
 "Valg:\n"
diff --git a/help/help_mp-nl.h b/help/help_mp-nl.h
index dabb187..9171a03 100644
--- a/help/help_mp-nl.h
+++ b/help/help_mp-nl.h
@@ -3,7 +3,7 @@
 //synced with help_mp-en.h revision 1.152
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Gebruik:   mplayer [opties] [url|pad/]bestandsnaam\n"
 "\n"
 "Basis-opties: (volledige lijst in de man-pagina's)\n"
diff --git a/help/help_mp-pl.h b/help/help_mp-pl.h
index 7d09950..14191d1 100644
--- a/help/help_mp-pl.h
+++ b/help/help_mp-pl.h
@@ -6,7 +6,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Użycie:   mplayer [opcje] [url|ścieżka/]plik\n"
 "\n"
 "Podstawowe opcje: (pełna lista dostępna na stronie man)\n"
diff --git a/help/help_mp-pt_BR.h b/help/help_mp-pt_BR.h
index 8cc56a1..bcb6eef 100644
--- a/help/help_mp-pt_BR.h
+++ b/help/help_mp-pt_BR.h
@@ -6,7 +6,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Uso:   mplayer [opções] [url|caminho/]nome-do-arquivo\n"
 "\n"
 "Opções básicas: (lista completa na página do manual)\n"
diff --git a/help/help_mp-ro.h b/help/help_mp-ro.h
index ff71201..26f675e 100644
--- a/help/help_mp-ro.h
+++ b/help/help_mp-ro.h
@@ -1,5 +1,5 @@
 // FIXME: This needs to be redone properly.
-// Partially sync'ed with help_mp-en.h $Revision: 27402 $
+// Partially sync'ed with help_mp-en.h $Revision: 28860 $
 // This is a retranslation of the file by Bogdan Butnaru <bogdanb at fastmail.fm>,
 // based on the previous translation by Codre Adrian
 // <codreadrian at softhome.net> (address bounces).
@@ -9,7 +9,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Folosire: mplayer [opþiuni] [url|cale/]numefiºier\n"
 "\n"
 "Opþiuni principale: (lista completã în pagina man)\n"
diff --git a/help/help_mp-ru.h b/help/help_mp-ru.h
index d9906b1..d997bf1 100644
--- a/help/help_mp-ru.h
+++ b/help/help_mp-ru.h
@@ -2,13 +2,13 @@
 // Dmitry Baryshkov <mitya at school.ioffe.ru>
 // Reworked by: Andrew Savchenko aka Bircoph <Bircoph[at]list[dot]ru>
 
-// Synced with help_mp-en.h: r28122
+// Synced with help_mp-en.h: r28860
 
 
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Использование:   mplayer [опции] [URL|путь/]имя_файла\n"
 "\n"
 "Базовые опции: (полный список см. на man-странице)\n"
diff --git a/help/help_mp-sk.h b/help/help_mp-sk.h
index ed54ec2..875aded 100644
--- a/help/help_mp-sk.h
+++ b/help/help_mp-sk.h
@@ -7,7 +7,7 @@
 #ifdef HELP_MP_DEFINE_STATIC
 // Preklad do slovenčiny 
 
-static char help_text[]=
+static const char help_text[]=
 "Použitie:   mplayer [prepínače] [url|cesta/]menosúboru\n"
 "\n"
 "Základné prepínače: (Kompletný zoznam nájdete v man stránke)\n"
diff --git a/help/help_mp-sv.h b/help/help_mp-sv.h
index 6ce5f43..79e624b 100644
--- a/help/help_mp-sv.h
+++ b/help/help_mp-sv.h
@@ -4,7 +4,7 @@
 // ========================= MPlayer hjälp ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Användning:   mplayer [argument] [url|sökväg/]filnamn\n"
 "\n"
 "Grundläggande argument: (komplett lista återfinns i `man mplayer`)\n"
diff --git a/help/help_mp-tr.h b/help/help_mp-tr.h
index 23b34a8..ae7b57c 100644
--- a/help/help_mp-tr.h
+++ b/help/help_mp-tr.h
@@ -7,7 +7,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Kullanım: mplayer [seçenekler] [adres|yol/]dosya adı\n"
 "\n"
 "Genel seçenekler: (Tüm seçenekler için man sayfalarına bakınız)\n"
diff --git a/help/help_mp-uk.h b/help/help_mp-uk.h
index 6b8a9ac..bebc874 100644
--- a/help/help_mp-uk.h
+++ b/help/help_mp-uk.h
@@ -7,7 +7,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "Запуск:   mplayer [опції] [path/]filename\n"
 "\n"
 "Опції:\n"
@@ -947,6 +947,128 @@ static char help_text[]=
 #define MSGTR_LIBVO_MGA_ResolutionTooHigh "[MGA] Розширення джерела, у крайньому випадку в одному вимірі, більше ніж 1023x1023.\n[MGA] Перемасштабуйте програмно або викорстайте -lavdopts lowres=1.\n"
 #define MSGTR_LIBVO_MGA_mgavidVersionMismatch "[MGA] версія драйверу mga_vid ядра (%u) та MPlayer (%u) не співпадають\n"
 
+// vo_null.c
+#define MSGTR_LIBVO_NULL_UnknownSubdevice "[VO_NULL] Невідомий підпристрій: %s.\n"
+
+// vo_png.c
+#define MSGTR_LIBVO_PNG_Warning1 "[VO_PNG] Попередження: рівень стиснення встановлено 0, стиснення вимкнено!\n"
+#define MSGTR_LIBVO_PNG_Warning2 "[VO_PNG] Інфо: Використайте -vo png:z=<n> щоб встановити рівень стиснення з 0 до 9.\n"
+#define MSGTR_LIBVO_PNG_Warning3 "[VO_PNG] Інфо: (0 = без стиснення, 1 = найшвидша, найповільніша - 9 але найкраще стиснення)\n"
+#define MSGTR_LIBVO_PNG_ErrorOpeningForWriting "\n[VO_PNG] Помилка при відкритті '%s' для запису!\n"
+#define MSGTR_LIBVO_PNG_ErrorInCreatePng "[VO_PNG] Помилка при створенні png.\n"
+
+// vo_pnm.c
+#define MSGTR_VO_PNM_ASCIIMode "Режим ASCII увімкнено."
+#define MSGTR_VO_PNM_RawMode "Режим Raw увімкнено."
+#define MSGTR_VO_PNM_PPMType "Запише файли PPM."
+#define MSGTR_VO_PNM_PGMType "Запише файли PGM."
+#define MSGTR_VO_PNM_PGMYUVType "Запише файли PGMYUV."
+
+// vo_sdl.c
+#define MSGTR_LIBVO_SDL_CouldntGetAnyAcceptableSDLModeForOutput "[VO_SDL] Не можу вивести прийнятний SDL Mode.\n"
+#define MSGTR_LIBVO_SDL_SetVideoModeFailed "[VO_SDL] set_video_mode: Збій SDL_SetVideoMode: %s.\n"
+#define MSGTR_LIBVO_SDL_SetVideoModeFailedFull "[VO_SDL] Set_fullmode: Збій SDL_SetVideoMode: %s.\n"
+#define MSGTR_LIBVO_SDL_MappingI420ToIYUV "[VO_SDL] Показую I420 у IYUV.\n"
+#define MSGTR_LIBVO_SDL_UnsupportedImageFormat "[VO_SDL] Формат картинки не підтримується (0x%X).\n"
+#define MSGTR_LIBVO_SDL_InfoPleaseUseVmOrZoom "[VO_SDL] Інфо - спробуйте -vm чи -zoom щоб перейти до найкращої роздільної здатності.\n"
+#define MSGTR_LIBVO_SDL_FailedToSetVideoMode "[VO_SDL] Не вдалося встановити відео режим: %s.\n"
+#define MSGTR_LIBVO_SDL_CouldntCreateAYUVOverlay "[VO_SDL] Не вдалося створити оверлей YUV: %s.\n"
+#define MSGTR_LIBVO_SDL_CouldntCreateARGBSurface "[VO_SDL] Не вдалося створити поверхню RGB: %s.\n"
+#define MSGTR_LIBVO_SDL_UsingDepthColorspaceConversion "[VO_SDL] Використовую перетворення глибини/кольорового простору, це уповільнить протікання процесу (%ibpp -> %ibpp).\n"
+#define MSGTR_LIBVO_SDL_UnsupportedImageFormatInDrawslice "[VO_SDL] Формат картинки не підтримується у draw_slice, повідомте розробників MPlayer!\n"
+#define MSGTR_LIBVO_SDL_BlitFailed "[VO_SDL] Збій Blit: %s.\n"
+#define MSGTR_LIBVO_SDL_InitializationFailed "[VO_SDL] Ініціялізація SDL не вдалася: %s.\n"
+#define MSGTR_LIBVO_SDL_UsingDriver "[VO_SDL] Використовую драйвер: %s.\n"
+
+// vo_svga.c
+#define MSGTR_LIBVO_SVGA_ForcedVidmodeNotAvailable "[VO_SVGA] Форсований vid_mode %d (%s) не доступний.\n"
+#define MSGTR_LIBVO_SVGA_ForcedVidmodeTooSmall "[VO_SVGA] Форсований vid_mode %d (%s) замалий.\n"
+#define MSGTR_LIBVO_SVGA_Vidmode "[VO_SVGA] Vid_mode: %d, %dx%d %dbpp.\n"
+#define MSGTR_LIBVO_SVGA_VgasetmodeFailed "[VO_SVGA] Збій Vga_setmode(%d).\n"
+#define MSGTR_LIBVO_SVGA_VideoModeIsLinearAndMemcpyCouldBeUsed "[VO_SVGA] Режим Відео лінійний та для передачі зображення може бути\nвикористаний memcpy.\n"
+#define MSGTR_LIBVO_SVGA_VideoModeHasHardwareAcceleration "[VO_SVGA] Режим Відео має апаратне прискорення тому може бути кокористаний put_image.\n"
+#define MSGTR_LIBVO_SVGA_IfItWorksForYouIWouldLikeToKnow "[VO_SVGA] Якщо це працює у вас, дайте мені знати.\n[VO_SVGA] (надішліть лоґ з `mplayer test.avi -v -v -v -v &> svga.log`). Дякую!\n"
+#define MSGTR_LIBVO_SVGA_VideoModeHas "[VO_SVGA] Режим Відео має %d сторінку(ок/ки).\n"
+#define MSGTR_LIBVO_SVGA_CenteringImageStartAt "[VO_SVGA] Centering image. Starting at (%d,%d)\n"
+#define MSGTR_LIBVO_SVGA_UsingVidix "[VO_SVGA] Використовую VIDIX. w=%i h=%i  mw=%i mh=%i\n"
+
+// vo_tdfx_vid.c
+#define MSGTR_LIBVO_TDFXVID_Move "[VO_TDXVID] Переміщую %d(%d) x %d => %d.\n"
+#define MSGTR_LIBVO_TDFXVID_AGPMoveFailedToClearTheScreen "[VO_TDFXVID] Переміщення AGP не вдалося очистити екран.\n"
+#define MSGTR_LIBVO_TDFXVID_BlitFailed "[VO_TDFXVID] Збій Blit.\n"
+#define MSGTR_LIBVO_TDFXVID_NonNativeOverlayFormatNeedConversion "[VO_TDFXVID] Нестандартний формат оверлею потребує перетворення.\n"
+#define MSGTR_LIBVO_TDFXVID_UnsupportedInputFormat "[VO_TDFXVID] Формат вводу 0x%x не підтримується.\n"
+#define MSGTR_LIBVO_TDFXVID_OverlaySetupFailed "[VO_TDFXVID] Встановлення оверлею не вдалося.\n"
+#define MSGTR_LIBVO_TDFXVID_OverlayOnFailed "[VO_TDFXVID] Помилка оверлею.\n"
+#define MSGTR_LIBVO_TDFXVID_OverlayReady "[VO_TDFXVID] Оверлей готовий: %d(%d) x %d @ %d => %d(%d) x %d @ %d.\n"
+#define MSGTR_LIBVO_TDFXVID_TextureBlitReady "[VO_TDFXVID] Blit текстур готовий: %d(%d) x %d @ %d => %d(%d) x %d @ %d.\n"
+#define MSGTR_LIBVO_TDFXVID_OverlayOffFailed "[VO_TDFXVID] Ввимкнення оверлею не вдолося\n"
+#define MSGTR_LIBVO_TDFXVID_CantOpen "[VO_TDFXVID] Не можу відкрити %s: %s.\n"
+#define MSGTR_LIBVO_TDFXVID_CantGetCurrentCfg "[VO_TDFXVID] Не можу отримати поточну конфігурацію: %s.\n"
+#define MSGTR_LIBVO_TDFXVID_MemmapFailed "[VO_TDFXVID] Збій memmap !!!!!\n"
+#define MSGTR_LIBVO_TDFXVID_GetImageTodo "Треба доробити картинку.\n"
+#define MSGTR_LIBVO_TDFXVID_AgpMoveFailed "[VO_TDFXVID] Переміщення AGP не вдалося.\n"
+#define MSGTR_LIBVO_TDFXVID_SetYuvFailed "[VO_TDFXVID] Встановлення YUV не вдалося.\n"
+#define MSGTR_LIBVO_TDFXVID_AgpMoveFailedOnYPlane "[VO_TDFXVID] Переміщення AGP не вдалося на проєкції Y.\n"
+#define MSGTR_LIBVO_TDFXVID_AgpMoveFailedOnUPlane "[VO_TDFXVID] Переміщення AGP не вдалося на проєкції U.\n"
+#define MSGTR_LIBVO_TDFXVID_AgpMoveFailedOnVPlane "[VO_TDFXVID] Переміщення AGP не вдалося на проєкції V.\n"
+#define MSGTR_LIBVO_TDFXVID_UnknownFormat "[VO_TDFXVID] невідомий формат: 0x%x.\n"
+
+// vo_tdfxfb.c
+#define MSGTR_LIBVO_TDFXFB_CantOpen "[VO_TDFXFB] Не можу відкрити %s: %s.\n"
+#define MSGTR_LIBVO_TDFXFB_ProblemWithFbitgetFscreenInfo "[VO_TDFXFB] Проблема з FBITGET_FSCREENINFO ioctl: %s.\n"
+#define MSGTR_LIBVO_TDFXFB_ProblemWithFbitgetVscreenInfo "[VO_TDFXFB] Проблема з FBITGET_VSCREENINFO ioctl: %s.\n"
+#define MSGTR_LIBVO_TDFXFB_ThisDriverOnlySupports "[VO_TDFXFB] Це драйвер підтримує тільки 3Dfx Banshee, Voodoo3 та Voodoo 5.\n"
+#define MSGTR_LIBVO_TDFXFB_OutputIsNotSupported "[VO_TDFXFB] %d вивід bpp не підтримується.\n"
+#define MSGTR_LIBVO_TDFXFB_CouldntMapMemoryAreas "[VO_TDFXFB] Не можу показати частини пам'яті: %s.\n"
+#define MSGTR_LIBVO_TDFXFB_BppOutputIsNotSupported "[VO_TDFXFB] %d вивід bpp не підтримується (Цього зовсім не повинно траплятися).\n"
+#define MSGTR_LIBVO_TDFXFB_SomethingIsWrongWithControl "[VO_TDFXFB] Ой! Щось сталося з control().\n"
+#define MSGTR_LIBVO_TDFXFB_NotEnoughVideoMemoryToPlay "[VO_TDFXFB] Не достатньо пам'яті щоб програти це відео. Спробуйте меншу роздільну здатність.\n"
+#define MSGTR_LIBVO_TDFXFB_ScreenIs "[VO_TDFXFB] Екран %dx%d на %d bpp, у %dx%d на %d bpp, режим %dx%d.\n"
+
+// vo_tga.c
+#define MSGTR_LIBVO_TGA_UnknownSubdevice "[VO_TGA] Невідомий підпристрій: %s.\n"
+
+// vo_vesa.c
+#define MSGTR_LIBVO_VESA_FatalErrorOccurred "[VO_VESA] Виникла фатально помилка! Не можу продовжити.\n"
+#define MSGTR_LIBVO_VESA_UnknownSubdevice "[VO_VESA] невідомий підпристрій: '%s'.\n"
+#define MSGTR_LIBVO_VESA_YouHaveTooLittleVideoMemory "[VO_VESA] Замало відео пам'яті для цього режиму:\n[VO_VESA] Потребує: %08lX є: %08lX.\n"
+#define MSGTR_LIBVO_VESA_YouHaveToSpecifyTheCapabilitiesOfTheMonitor "[VO_VESA] Ви маєте вказати можливості монітора. Не змінюю частому оновлення.\n"
+#define MSGTR_LIBVO_VESA_UnableToFitTheMode "[VO_VESA] Режим не відповідає обмеженням монітора. Не змінюю частому оновлення.\n"
+#define MSGTR_LIBVO_VESA_DetectedInternalFatalError "[VO_VESA] Виявлена фатальна внутрішня помилка: init викликаний перед preinit.\n"
+#define MSGTR_LIBVO_VESA_SwitchFlipIsNotSupported "[VO_VESA] Опція -flip не підтримується.\n"
+#define MSGTR_LIBVO_VESA_PossibleReasonNoVbe2BiosFound "[VO_VESA] Можлива причина: Не знайдено VBE2 BIOS.\n"
+#define MSGTR_LIBVO_VESA_FoundVesaVbeBiosVersion "[VO_VESA] Знайдено VESA VBE BIOS, версія %x.%x ревізія: %x.\n"
+#define MSGTR_LIBVO_VESA_VideoMemory "[VO_VESA] Відео пам'ять: %u Кб.\n"
+#define MSGTR_LIBVO_VESA_Capabilites "[VO_VESA] Можливості VESA: %s %s %s %s %s.\n"
+#define MSGTR_LIBVO_VESA_BelowWillBePrintedOemInfo "[VO_VESA] !!! OEM інформація буде виведена нище !!!\n"
+#define MSGTR_LIBVO_VESA_YouShouldSee5OemRelatedLines "[VO_VESA] Ви повинні бачити 5 рядків інфо про OEM нище; Якщо ні, у вас поламана vm86.\n"
+#define MSGTR_LIBVO_VESA_OemInfo "[VO_VESA] OEM інфо: %s.\n"
+#define MSGTR_LIBVO_VESA_OemRevision "[VO_VESA] OEM ревізія: %x.\n"
+#define MSGTR_LIBVO_VESA_OemVendor "[VO_VESA] OEM постачальник: %s.\n"
+#define MSGTR_LIBVO_VESA_OemProductName "[VO_VESA] Назва продукту OEM: %s.\n"
+#define MSGTR_LIBVO_VESA_OemProductRev "[VO_VESA] Ревізія продукту OEM: %s.\n"
+#define MSGTR_LIBVO_VESA_Hint "[VO_VESA] Підказка: Для роботи ТБ-виходу вам необхідно підключити ТБ роз'єм\n"\
+"[VO_VESA] перед завантаженням як VESA BIOS ініціялізує себе протягом POST.\n"
+#define MSGTR_LIBVO_VESA_UsingVesaMode "[VO_VESA] Використовую режим VESA (%u) = %x [%ux%u@%u]\n"
+#define MSGTR_LIBVO_VESA_CantInitializeSwscaler "[VO_VESA] Не можу ініціялізувати програмне масштабування.\n"
+#define MSGTR_LIBVO_VESA_CantUseDga "[VO_VESA] Не можу використовувати DGA. Форсую режим комутації сегментів. :(\n"
+#define MSGTR_LIBVO_VESA_UsingDga "[VO_VESA] Використовую DGA (фізичні ресурси: %08lXh, %08lXh)"
+#define MSGTR_LIBVO_VESA_CantUseDoubleBuffering "[VO_VESA] Не можу використати подвійну буферизацію: не достатньо відео пам'яті.\n"
+#define MSGTR_LIBVO_VESA_CantFindNeitherDga "[VO_VESA] Не можу знайти ні DGA ні переміщуваного фрейму вікна.\n"
+#define MSGTR_LIBVO_VESA_YouveForcedDga "[VO_VESA] Ви форсували DGA. Виходжу\n"
+#define MSGTR_LIBVO_VESA_CantFindValidWindowAddress "[VO_VESA] Не можу знайти правильну адресу вікна.\n"
+#define MSGTR_LIBVO_VESA_UsingBankSwitchingMode "[VO_VESA] Використовую режим комутації сегментів (фізичні ресурси: %08lXh, %08lXh).\n"
+#define MSGTR_LIBVO_VESA_CantAllocateTemporaryBuffer "[VO_VESA] Не можу виділити тимчасовий буфер.\n"
+#define MSGTR_LIBVO_VESA_SorryUnsupportedMode "[VO_VESA] Вибачте, режим не підтримується -- спробуйте -x 640 -zoom.\n"
+#define MSGTR_LIBVO_VESA_OhYouReallyHavePictureOnTv "[VO_VESA] О, ви справді маєте картинку на ТБ!\n"
+#define MSGTR_LIBVO_VESA_CantInitialozeLinuxVideoOverlay "[VO_VESA] Не можу ініціялізувати Відео оверлей Linux.\n"
+#define MSGTR_LIBVO_VESA_UsingVideoOverlay "[VO_VESA] Використовую відео оверлей: %s.\n"
+#define MSGTR_LIBVO_VESA_CantInitializeVidixDriver "[VO_VESA] Не можу ініціялізувати драйвер VIDIX.\n"
+#define MSGTR_LIBVO_VESA_UsingVidix "[VO_VESA] Використовую VIDIX.\n"
+#define MSGTR_LIBVO_VESA_CantFindModeFor "[VO_VESA] Не можу знайти режим для: %ux%u@%u.\n"
+#define MSGTR_LIBVO_VESA_InitializationComplete "[VO_VESA] Ініціялізація VESA завершена.\n"
+
 // open.c, stream.c:
 #define MSGTR_CdDevNotfound "Компактовід \"%s\" не знайдений!\n"
 #define MSGTR_ErrTrackSelect "Помилка вибору треку на VCD!"
diff --git a/help/help_mp-zh_CN.h b/help/help_mp-zh_CN.h
index d5ce571..26df21c 100644
--- a/help/help_mp-zh_CN.h
+++ b/help/help_mp-zh_CN.h
@@ -17,7 +17,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "用法:            mplayer [选项] [URL|路径/]文件名\n"
 "\n"
 "基本选项:        (完整列表参见手册页)\n"
diff --git a/help/help_mp-zh_TW.h b/help/help_mp-zh_TW.h
index 0d8770e..928d35a 100644
--- a/help/help_mp-zh_TW.h
+++ b/help/help_mp-zh_TW.h
@@ -9,7 +9,7 @@
 // ========================= MPlayer help ===========================
 
 #ifdef HELP_MP_DEFINE_STATIC
-static char help_text[]=
+static const char help_text[]=
 "用法:   mplayer [選項] [URL|路徑/]文件名\n"
 "\n"
 "基本選項: (完整列表參見手册頁)\n"
diff --git a/input/input.c b/input/input.c
index dcbeb2b..ee5342f 100644
--- a/input/input.c
+++ b/input/input.c
@@ -583,6 +583,7 @@ static mp_cmd_t* ar_cmd = NULL;
 static unsigned int ar_delay = 100, ar_rate = 8, last_ar = 0;
 
 static int use_joystick = 1, use_lirc = 1, use_lircc = 1;
+static int default_bindings = 1;
 static char* config_file = "input.conf";
 
 /* Apple Remote */
@@ -611,6 +612,8 @@ static m_option_t input_conf[] = {
   { "cmdlist", mp_input_print_cmd_list, CONF_TYPE_FUNC, CONF_GLOBAL, 0, 0, NULL },
   { "js-dev", &js_dev, CONF_TYPE_STRING, CONF_GLOBAL, 0, 0, NULL },
   { "file", &in_file, CONF_TYPE_STRING, CONF_GLOBAL, 0, 0, NULL },
+  { "default-bindings", &default_bindings, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL },
+  { "nodefault-bindings", &default_bindings, CONF_TYPE_FLAG, CONF_GLOBAL, 1, 0, NULL },
   { NULL, NULL, 0, 0, 0, 0, NULL}
 };
 
@@ -767,7 +770,7 @@ int mp_input_parse_and_queue_cmds(const char *str) {
 mp_cmd_t*
 mp_input_parse_cmd(char* str) {
   int i,l;
-  int pausing = 0;
+  int pausing = -1;
   char *ptr,*e;
   mp_cmd_t *cmd;
   const mp_cmd_t *cmd_def;
@@ -817,6 +820,15 @@ mp_input_parse_cmd(char* str) {
   cmd = calloc(1, sizeof(mp_cmd_t));
   cmd->id = cmd_def->id;
   cmd->name = strdup(cmd_def->name);
+  if (pausing == -1) {
+    switch (cmd->id) {
+      case MP_CMD_KEYDOWN_EVENTS:
+      case MP_CMD_SET_MOUSE_POS:
+        pausing = 4; break;
+      default:
+        pausing = 0; break;
+    }
+  }
   cmd->pausing = pausing;
 
   ptr = str;
@@ -1069,7 +1081,7 @@ mp_input_get_cmd_from_keys(int n,int* keys, int paused) {
     cmd = mp_input_find_bind_for_key(cmd_binds,n,keys);
   if(cmd_binds_default && cmd == NULL)
     cmd = mp_input_find_bind_for_key(cmd_binds_default,n,keys);
-  if(cmd == NULL)
+  if(default_bindings && cmd == NULL)
     cmd = mp_input_find_bind_for_key(def_cmd_binds,n,keys);
 
   if(cmd == NULL) {
diff --git a/liba52/a52.h b/liba52/a52.h
index fab88f5..293eb18 100644
--- a/liba52/a52.h
+++ b/liba52/a52.h
@@ -8,7 +8,7 @@
  *
  * Modified for use with MPlayer, changes contained in liba52_changes.diff.
  * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
- * $Id: a52.h 18786 2006-06-22 13:34:00Z diego $
+ * $Id: a52.h 28832 2009-03-06 00:41:09Z diego $
  *
  * a52dec is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,6 +28,9 @@
 #ifndef A52_H
 #define A52_H
 
+#include <stdint.h>
+#include "mm_accel.h"
+
 #ifndef LIBA52_DOUBLE
 typedef float sample_t;
 #else
diff --git a/liba52/liba52_changes.diff b/liba52/liba52_changes.diff
index 0e9e71c..206e84c 100644
--- a/liba52/liba52_changes.diff
+++ b/liba52/liba52_changes.diff
@@ -1,6 +1,6 @@
 --- include/a52.h	2006-06-12 15:04:57.000000000 +0200
 +++ liba52/a52.h	2006-06-05 02:23:02.000000000 +0200
-@@ -63,4 +63,9 @@
+@@ -59,4 +66,9 @@
  int a52_block (a52_state_t * state);
  void a52_free (a52_state_t * state);
  
@@ -12,11 +12,11 @@
  #endif /* A52_H */
 --- liba52/a52_internal.h	2006-06-12 15:05:07.000000000 +0200
 +++ liba52/a52_internal.h	2006-06-05 02:23:02.000000000 +0200
-@@ -107,18 +107,34 @@
+@@ -103,18 +107,34 @@
  #define DELTA_BIT_NONE (2)
  #define DELTA_BIT_RESERVED (3)
  
-+#ifdef ARCH_X86_64
++#if ARCH_X86_64
 +# define REG_a "rax"
 +# define REG_d "rdx"
 +# define REG_S "rsi"
@@ -52,7 +52,7 @@
 +void imdct_do_512 (sample_t * data, sample_t * delay, sample_t bias);
 --- liba52/bitstream.c	2006-06-12 15:05:07.000000000 +0200
 +++ liba52/bitstream.c	2006-06-05 02:23:02.000000000 +0200
-@@ -35,6 +35,10 @@
+@@ -31,6 +35,10 @@
  
  #define BUFFER_SIZE 4096
  
@@ -63,7 +63,7 @@
  void a52_bitstream_set_ptr (a52_state_t * state, uint8_t * buf)
  {
      int align;
-@@ -42,6 +46,9 @@
+@@ -38,6 +46,9 @@
      align = (long)buf & 3;
      state->buffer_start = (uint32_t *) (buf - align);
      state->bits_left = 0;
@@ -75,7 +75,7 @@
  
 --- liba52/bitstream.h	2006-06-12 15:05:07.000000000 +0200
 +++ liba52/bitstream.h	2006-06-05 02:23:02.000000000 +0200
-@@ -25,6 +25,42 @@
+@@ -21,6 +25,42 @@
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
@@ -91,7 +91,7 @@
 +#define ALT_BITSTREAM_READER
 +
 +/* used to avoid misaligned exceptions on some archs (alpha, ...) */
-+#if defined (ARCH_X86) || defined(HAVE_ARMV6)
++#if ARCH_X86 || HAVE_ARMV6
 +#    define unaligned32(a) (*(uint32_t*)(a))
 +#else
 +#    ifdef __GNUC__
@@ -118,7 +118,7 @@
  /* (stolen from the kernel) */
  #ifdef WORDS_BIGENDIAN
  
-@@ -32,7 +74,7 @@
+@@ -28,7 +68,7 @@
  
  #else
  
@@ -127,7 +127,7 @@
  
  #	define swab32(x) __i386_swab32(x)
  	static inline const uint32_t __i386_swab32(uint32_t x)
-@@ -43,19 +85,34 @@
+@@ -39,19 +79,34 @@
  
  #	else
  
@@ -166,7 +166,7 @@
      uint32_t result;
  	
      if (num_bits < state->bits_left) {
-@@ -65,10 +122,29 @@
+@@ -61,10 +116,29 @@
      }
  
      return a52_bitstream_get_bh (state, num_bits);
@@ -196,7 +196,7 @@
      int32_t result;
  	
      if (num_bits < state->bits_left) {
-@@ -78,4 +154,5 @@
+@@ -74,4 +148,5 @@
      }
  
      return a52_bitstream_get_bh_2 (state, num_bits);
@@ -204,7 +204,7 @@
  }
 --- liba52/downmix.c	2006-06-12 15:17:53.000000000 +0200
 +++ liba52/downmix.c	2006-06-05 02:23:02.000000000 +0200
-@@ -23,18 +23,46 @@
+@@ -19,18 +23,46 @@
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
@@ -241,7 +241,7 @@
 +{
 +    a52_upmix= upmix_C;
 +    a52_downmix= downmix_C;
-+#if defined(ARCH_X86) || defined(ARCH_X86_64)
++#if ARCH_X86 || ARCH_X86_64
 +    if(mm_accel & MM_ACCEL_X86_MMX) a52_upmix= upmix_MMX;
 +    if(mm_accel & MM_ACCEL_X86_SSE) a52_downmix= downmix_SSE;
 +    if(mm_accel & MM_ACCEL_X86_3DNOW) a52_downmix= downmix_3dnow;
@@ -251,7 +251,7 @@
  int a52_downmix_init (int input, int flags, sample_t * level,
  		      sample_t clev, sample_t slev)
  {
-@@ -451,7 +479,7 @@
+@@ -447,7 +479,7 @@
  	samples[i] = 0;
  }
  
@@ -260,7 +260,7 @@
  		  sample_t clev, sample_t slev)
  {
      switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
-@@ -563,7 +591,7 @@
+@@ -559,7 +591,7 @@
  	break;
  
      case CONVERT (A52_3F2R, A52_2F1R):
@@ -269,7 +269,7 @@
  	move2to1 (samples + 768, samples + 512, bias);
  	break;
  
-@@ -587,12 +615,12 @@
+@@ -583,12 +615,12 @@
  	break;
  
      case CONVERT (A52_3F1R, A52_3F2R):
@@ -284,12 +284,12 @@
  {
      switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
  
-@@ -657,3 +685,1104 @@
+@@ -653,3 +685,1104 @@
  	goto mix_31to21;
      }
  }
 +
-+#if defined(ARCH_X86) || defined(ARCH_X86_64)
++#if ARCH_X86 || ARCH_X86_64
 +static void mix2to1_SSE (sample_t * dest, sample_t * src, sample_t bias)
 +{
 +	__asm__ volatile(
@@ -1391,7 +1391,7 @@
 +#endif // ARCH_X86 || ARCH_X86_64
 --- liba52/imdct.c	2008-02-19 00:18:33.000000000 +0100
 +++ liba52/imdct.c	2008-02-19 00:16:40.000000000 +0100
-@@ -26,6 +26,11 @@
+@@ -22,6 +26,11 @@
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
@@ -1403,7 +1403,7 @@
   */
  
  #include "config.h"
-@@ -43,12 +48,49 @@
+@@ -39,12 +48,50 @@
  #include "a52.h"
  #include "a52_internal.h"
  #include "mm_accel.h"
@@ -1413,6 +1413,7 @@
 +
 +#ifdef RUNTIME_CPUDETECT
 +#undef HAVE_AMD3DNOWEXT
++#define HAVE_AMD3DNOWEXT 0
 +#endif
  
  typedef struct complex_s {
@@ -1453,7 +1454,7 @@
  static uint8_t fftorder[] = {
        0,128, 64,192, 32,160,224, 96, 16,144, 80,208,240,112, 48,176,
        8,136, 72,200, 40,168,232,104,248,120, 56,184, 24,152,216, 88,
-@@ -60,6 +102,40 @@
+@@ -56,6 +103,40 @@
        6,134, 70,198, 38,166,230,102,246,118, 54,182, 22,150,214, 86
  };
  
@@ -1473,7 +1474,7 @@
 +static sample_t __attribute__((aligned(16))) xcos1[128];
 +static sample_t __attribute__((aligned(16))) xsin1[128];
 +
-+#if defined(ARCH_X86) || defined(ARCH_X86_64)
++#if ARCH_X86 || ARCH_X86_64
 +// NOTE: SSE needs 16byte alignment or it will segfault 
 +// 
 +static float __attribute__((aligned(16))) sseSinCos1c[256];
@@ -1494,7 +1495,7 @@
  /* Root values for IFFT */
  static sample_t roots16[3];
  static sample_t roots32[7];
-@@ -245,7 +321,7 @@
+@@ -241,7 +322,7 @@
      ifft_pass (buf, roots128 - 32, 32);
  }
  
@@ -1503,11 +1504,11 @@
  {
      int i, k;
      sample_t t_r, t_i, a_r, a_i, b_r, b_i, w_1, w_2;
-@@ -289,6 +365,701 @@
+@@ -285,6 +366,702 @@
      }
  }
  
-+#ifdef HAVE_ALTIVEC
++#if HAVE_ALTIVEC
 +
 +#ifdef HAVE_ALTIVEC_H
 +#include <altivec.h>
@@ -1852,10 +1853,9 @@
 +
 +// Stuff below this line is borrowed from libac3
 +#include "srfftp.h"
-+#if defined(ARCH_X86) || defined(ARCH_X86_64)
-+#ifndef HAVE_AMD3DNOW
++#if ARCH_X86 || ARCH_X86_64
++#undef HAVE_AMD3DNOW
 +#define HAVE_AMD3DNOW 1
-+#endif
 +#include "srfftp_3dnow.h"
 +
 +const i_cmplx_t x_plus_minus_3dnow __attribute__ ((aligned (8))) = {{ 0x00000000UL, 0x80000000UL }}; 
@@ -1863,8 +1863,10 @@
 +const complex_t HSQRT2_3DNOW __attribute__ ((aligned (8))) = { 0.707106781188, 0.707106781188 };
 +
 +#undef HAVE_AMD3DNOWEXT
++#define HAVE_AMD3DNOWEXT 0
 +#include "imdct_3dnow.h"
-+#define HAVE_AMD3DNOWEXT
++#undef HAVE_AMD3DNOWEXT
++#define HAVE_AMD3DNOWEXT 1
 +#include "imdct_3dnow.h"
 +
 +void
@@ -2205,7 +2207,7 @@
  void a52_imdct_256(sample_t * data, sample_t * delay, sample_t bias)
  {
      int i, k;
-@@ -368,7 +1145,7 @@
+@@ -364,7 +1141,7 @@
  
  void a52_imdct_init (uint32_t mm_accel)
  {
@@ -2214,7 +2216,7 @@
      double sum;
  
      /* compute imdct window - kaiser-bessel derived window, alpha = 5.0 */
-@@ -420,6 +1197,99 @@
+@@ -416,6 +1193,99 @@
  	post2[i].real = cos ((M_PI / 128) * (i + 0.5));
  	post2[i].imag = sin ((M_PI / 128) * (i + 0.5));
      }
@@ -2229,7 +2231,7 @@
 +	    w[i][k].imag = sin (-M_PI * k / j);
 +	}
 +    }
-+#if defined(ARCH_X86) || defined(ARCH_X86_64)
++#if ARCH_X86 || ARCH_X86_64
 +	for (i = 0; i < 128; i++) {
 +	    sseSinCos1c[2*i+0]= xcos1[i];
 +	    sseSinCos1c[2*i+1]= -xcos1[i];
@@ -2283,7 +2285,7 @@
 +	ifft128 = ifft128_c;
 +	ifft64 = ifft64_c;
 +
-+#if defined(ARCH_X86) || defined(ARCH_X86_64)
++#if ARCH_X86 || ARCH_X86_64
 +	if(mm_accel & MM_ACCEL_X86_SSE)
 +	{
 +	  fprintf (stderr, "Using SSE optimized IMDCT transform\n");
@@ -2303,7 +2305,7 @@
 +	}
 +	else
 +#endif // ARCH_X86 || ARCH_X86_64
-+#ifdef HAVE_ALTIVEC
++#if HAVE_ALTIVEC
 +        if (mm_accel & MM_ACCEL_PPC_ALTIVEC)
 +	{
 +	  fprintf(stderr, "Using AltiVec optimized IMDCT transform\n");
@@ -2314,7 +2316,7 @@
  
  #ifdef LIBA52_DJBFFT
      if (mm_accel & MM_ACCEL_DJBFFT) {
-@@ -430,7 +1300,5 @@
+@@ -426,7 +1296,5 @@
  #endif
      {
  	fprintf (stderr, "No accelerated IMDCT transform found\n");
@@ -2324,7 +2326,7 @@
  }
 --- include/mm_accel.h	2006-06-12 15:05:00.000000000 +0200
 +++ liba52/mm_accel.h	2006-06-05 02:23:04.000000000 +0200
-@@ -34,7 +34,12 @@
+@@ -30,7 +34,12 @@
  /* x86 accelerations */
  #define MM_ACCEL_X86_MMX	0x80000000
  #define MM_ACCEL_X86_3DNOW	0x40000000
@@ -2339,7 +2341,7 @@
  
 --- liba52/parse.c	2006-12-05 08:08:01.000000000 +0100
 +++ liba52/parse.c	2006-12-05 08:08:44.000000000 +0100
-@@ -28,6 +28,7 @@
+@@ -24,6 +28,7 @@
  #include "config.h"
  
  #include <stdlib.h>
@@ -2347,7 +2349,7 @@
  #include <string.h>
  #include <inttypes.h>
  
-@@ -35,13 +36,12 @@
+@@ -31,13 +36,12 @@
  #include "a52_internal.h"
  #include "bitstream.h"
  #include "tables.h"
@@ -2364,7 +2366,7 @@
  #endif
  
  typedef struct {
-@@ -64,7 +64,16 @@
+@@ -60,7 +64,16 @@
      if (state == NULL)
  	return NULL;
  
@@ -2381,7 +2383,7 @@
      if (state->samples == NULL) {
  	free (state);
  	return NULL;
-@@ -78,6 +87,7 @@
+@@ -74,6 +87,7 @@
      state->lfsr_state = 1;
  
      a52_imdct_init (mm_accel);
@@ -2389,7 +2391,7 @@
  
      return state;
  }
-@@ -145,7 +155,7 @@
+@@ -141,7 +155,7 @@
      state->acmod = acmod = buf[6] >> 5;
  
      a52_bitstream_set_ptr (state, buf + 6);
@@ -2398,7 +2400,7 @@
  
      if ((acmod == 2) && (bitstream_get (state, 2) == 2))	/* dsurmod */
  	acmod = A52_DOLBY;
-@@ -176,28 +186,28 @@
+@@ -172,28 +186,28 @@
  
      chaninfo = !acmod;
      do {
@@ -2435,7 +2437,7 @@
  	} while (addbsil--);
      }
  
-@@ -684,7 +694,7 @@
+@@ -680,7 +694,7 @@
  				 state->fbw_expbap[i].exp[0],
  				 state->fbw_expbap[i].exp + 1))
  		return 1;
@@ -2444,7 +2446,7 @@
  	}
      if (lfeexpstr != EXP_REUSE) {
  	do_bit_alloc |= 32;
-@@ -759,7 +769,7 @@
+@@ -755,7 +769,7 @@
      if (bitstream_get (state, 1)) {	/* skiple */
  	i = bitstream_get (state, 9);	/* skipl */
  	while (i--)
@@ -2453,7 +2455,7 @@
      }
  
      samples = state->samples;
-@@ -900,6 +910,10 @@
+@@ -896,6 +910,10 @@
  
  void a52_free (a52_state_t * state)
  {
diff --git a/libaf/af_ladspa.c b/libaf/af_ladspa.c
index 97b8982..414cd34 100644
--- a/libaf/af_ladspa.c
+++ b/libaf/af_ladspa.c
@@ -1,5 +1,5 @@
 /*
- * af_ladspa.c, LADSPA plugin loader
+ * LADSPA plugin loader
  *
  * Written by Ivo van Poorten <ivop at euronet.nl>
  * Copyright (C) 2004, 2005
diff --git a/libaf/af_resample.c b/libaf/af_resample.c
index 2536c07..2844940 100644
--- a/libaf/af_resample.c
+++ b/libaf/af_resample.c
@@ -33,7 +33,7 @@
    Valid definitions are L8 and L16, where the number denotes the
    length of the filter. This definition affects the computational
    complexity (see play()), the performance (see filter.h) and the
-   memory usage. The filterlength is choosen to 8 if the machine is
+   memory usage. The filter length is chosen to 8 if the machine is
    slow and to 16 if the machine is fast and has MMX.  
 */
 
@@ -174,16 +174,14 @@ static int control(struct af_instance_s* af, int cmd, void* arg)
 {
   switch(cmd){
   case AF_CONTROL_REINIT:{
-    af_resample_t* s   = (af_resample_t*)af->setup; 
-    af_data_t* 	   n   = (af_data_t*)arg; // New configureation
+    af_resample_t* s   = af->setup; 
+    af_data_t* 	   n   = arg; // New configuration
     int            i,d = 0;
     int 	   rv  = AF_OK;
 
-    // Free space for circular bufers
+    // Free space for circular buffers
     if(s->xq){
-      for(i=1;i<af->data->nch;i++)
-	if(s->xq[i])
-	  free(s->xq[i]);
+      free(s->xq[0]);
       free(s->xq);
       s->xq = NULL;
     }
@@ -216,13 +214,14 @@ static int control(struct af_instance_s* af, int cmd, void* arg)
       d*=m;
     }
 
-    // Create space for circular bufers
+    // Create space for circular buffers
     s->xq = malloc(n->nch*sizeof(void*));
-    for(i=0;i<n->nch;i++)
-      s->xq[i] = malloc(2*L*af->data->bps);
+    s->xq[0] = calloc(n->nch, 2*L*af->data->bps);
+    for(i=1;i<n->nch;i++)
+      s->xq[i] = (uint8_t *)s->xq[i-1] + 2*L*af->data->bps;
     s->xi = 0;
 
-    // Check if the the design needs to be redone
+    // Check if the design needs to be redone
     if(s->up != af->data->rate/d || s->dn != n->rate/d){
       float* w;
       float* wt;
@@ -233,9 +232,9 @@ static int control(struct af_instance_s* af, int cmd, void* arg)
       s->wi = 0;
       s->i = 0;
       
-      // Calculate cuttof frequency for filter
+      // Calculate cutoff frequency for filter
       fc = 1/(float)(max(s->up,s->dn));
-      // Allocate space for polyphase filter bank and protptype filter
+      // Allocate space for polyphase filter bank and prototype filter
       w = malloc(sizeof(float) * s->up *L);
       if(NULL != s->w)
 	free(s->w);
@@ -271,7 +270,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg)
     return rv;
   }
   case AF_CONTROL_COMMAND_LINE:{
-    af_resample_t* s   = (af_resample_t*)af->setup; 
+    af_resample_t* s   = af->setup; 
     int rate=0;
     int type=RSMP_INT;
     int sloppy=1;
@@ -306,6 +305,13 @@ static int control(struct af_instance_s* af, int cmd, void* arg)
 // Deallocate memory 
 static void uninit(struct af_instance_s* af)
 {
+  af_resample_t *s = af->setup;
+  if (s) {
+    if (s->xq) free(s->xq[0]);
+    free(s->xq);
+    free(s->w);
+    free(s);
+  }
   if(af->data)
     free(af->data->audio);
   free(af->data);
@@ -317,7 +323,7 @@ static af_data_t* play(struct af_instance_s* af, af_data_t* data)
   int 		 len = 0; 	 // Length of output data
   af_data_t*     c   = data;	 // Current working data
   af_data_t*     l   = af->data; // Local data
-  af_resample_t* s   = (af_resample_t*)af->setup;
+  af_resample_t* s   = af->setup;
 
   if(AF_OK != RESIZE_LOCAL_BUFFER(af,data))
     return NULL;
diff --git a/libao2/ao_alsa.c b/libao2/ao_alsa.c
index 6d2e1f9..032d1d1 100644
--- a/libao2/ao_alsa.c
+++ b/libao2/ao_alsa.c
@@ -57,7 +57,7 @@
 #include "audio_out_internal.h"
 #include "libaf/af_format.h"
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
     "ALSA-0.9.x-1.x audio output",
     "alsa",
diff --git a/libao2/ao_alsa5.c b/libao2/ao_alsa5.c
index abf2eff..007a5f1 100644
--- a/libao2/ao_alsa5.c
+++ b/libao2/ao_alsa5.c
@@ -32,7 +32,7 @@
 #include "mp_msg.h"
 #include "help_mp.h"
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
     "ALSA-0.5.x audio output",
     "alsa5",
diff --git a/libao2/ao_arts.c b/libao2/ao_arts.c
index 30db48f..df44db4 100644
--- a/libao2/ao_arts.c
+++ b/libao2/ao_arts.c
@@ -38,7 +38,7 @@
 
 static arts_stream_t stream;
 
-static ao_info_t info =
+static const ao_info_t info =
 {
     "aRts audio output",
     "arts",
diff --git a/libao2/ao_dart.c b/libao2/ao_dart.c
index 95efa04..e9bff8d 100644
--- a/libao2/ao_dart.c
+++ b/libao2/ao_dart.c
@@ -39,7 +39,7 @@
 #include "libvo/fastmemcpy.h"
 #include "subopt-helper.h"
 
-static ao_info_t info = {
+static const ao_info_t info = {
     "DART audio output",
     "dart",
     "KO Myung-Hun <komh at chollian.net>",
diff --git a/libao2/ao_dsound.c b/libao2/ao_dsound.c
index acd5998..729084b 100644
--- a/libao2/ao_dsound.c
+++ b/libao2/ao_dsound.c
@@ -42,7 +42,7 @@
 #include "subopt-helper.h"
 
 
-static ao_info_t info =
+static const ao_info_t info =
 {
 	"Windows DirectSound audio output",
 	"dsound",
@@ -431,7 +431,7 @@ static int init(int rate, int channels, int format, int flags)
 		case AF_FORMAT_AC3:
 		case AF_FORMAT_S24_LE:
 		case AF_FORMAT_S16_LE:
-		case AF_FORMAT_S8:
+		case AF_FORMAT_U8:
 			break;
 		default:
 			mp_msg(MSGT_AO, MSGL_V,"ao_dsound: format %s not supported defaulting to Signed 16-bit Little-Endian\n",af_fmt2str_short(format));
diff --git a/libao2/ao_dxr2.c b/libao2/ao_dxr2.c
index cd92ea3..7f9594f 100644
--- a/libao2/ao_dxr2.c
+++ b/libao2/ao_dxr2.c
@@ -36,7 +36,7 @@
 #include "libmpdemux/mpeg_packetizer.h"
 
 
-static ao_info_t info =
+static const ao_info_t info =
 {
 	"DXR2 audio output",
 	"dxr2",
diff --git a/libao2/ao_esd.c b/libao2/ao_esd.c
index a5602ff..d54f843 100644
--- a/libao2/ao_esd.c
+++ b/libao2/ao_esd.c
@@ -67,7 +67,7 @@
 #define	ESD_CLIENT_NAME	"MPlayer"
 #define	ESD_MAX_DELAY	(1.0f)	/* max amount of data buffered in esd (#sec) */
 
-static ao_info_t info =
+static const ao_info_t info =
 {
     "EsounD audio output",
     "esd",
diff --git a/libao2/ao_ivtv.c b/libao2/ao_ivtv.c
index 96ea563..c2b367a 100644
--- a/libao2/ao_ivtv.c
+++ b/libao2/ao_ivtv.c
@@ -41,7 +41,7 @@
 
 static int freq = 0;
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
   "IVTV MPEG Audio Decoder output",
   "ivtv",
diff --git a/libao2/ao_jack.c b/libao2/ao_jack.c
index d7f2092..e861d08 100644
--- a/libao2/ao_jack.c
+++ b/libao2/ao_jack.c
@@ -40,7 +40,7 @@
 
 #include <jack/jack.h>
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
   "JACK audio output",
   "jack",
diff --git a/libao2/ao_macosx.c b/libao2/ao_macosx.c
index fcbda6f..fb5883b 100644
--- a/libao2/ao_macosx.c
+++ b/libao2/ao_macosx.c
@@ -53,7 +53,7 @@
 #include "libaf/af_format.h"
 #include "osdep/timer.h"
 
-static ao_info_t info =
+static const ao_info_t info =
   {
     "Darwin/Mac OS X native audio output",
     "macosx",
diff --git a/libao2/ao_mpegpes.c b/libao2/ao_mpegpes.c
index 38f30b1..3746d24 100644
--- a/libao2/ao_mpegpes.c
+++ b/libao2/ao_mpegpes.c
@@ -63,7 +63,7 @@ int vo_mpegpes_fd2 = -1;
 
 #include <errno.h>
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
 #ifdef CONFIG_DVB
 	"DVB audio output",
diff --git a/libao2/ao_nas.c b/libao2/ao_nas.c
index 9394649..e5e675b 100644
--- a/libao2/ao_nas.c
+++ b/libao2/ao_nas.c
@@ -119,7 +119,7 @@ static const char* nas_state(unsigned int state) {
 	return nas_states[state];
 }
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
 	"NAS audio output",
 	"nas",
diff --git a/libao2/ao_null.c b/libao2/ao_null.c
index 2e28b8f..20b715f 100644
--- a/libao2/ao_null.c
+++ b/libao2/ao_null.c
@@ -27,7 +27,7 @@
 #include "audio_out.h"
 #include "audio_out_internal.h"
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
 	"Null audio output",
 	"null",
diff --git a/libao2/ao_openal.c b/libao2/ao_openal.c
index c91694d..c80c49b 100644
--- a/libao2/ao_openal.c
+++ b/libao2/ao_openal.c
@@ -42,7 +42,7 @@
 #include "osdep/timer.h"
 #include "subopt-helper.h"
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
   "OpenAL audio output",
   "openal",
diff --git a/libao2/ao_oss.c b/libao2/ao_oss.c
index a98d5d1..e4688d1 100644
--- a/libao2/ao_oss.c
+++ b/libao2/ao_oss.c
@@ -48,7 +48,7 @@
 #include "audio_out.h"
 #include "audio_out_internal.h"
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
 	"OSS/ioctl audio output",
 	"oss",
diff --git a/libao2/ao_pcm.c b/libao2/ao_pcm.c
index bd66ed0..b64118f 100644
--- a/libao2/ao_pcm.c
+++ b/libao2/ao_pcm.c
@@ -35,12 +35,12 @@
 #include "help_mp.h"
 
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
-	"RAW PCM/WAVE file writer audio output",
-	"pcm",
-	"Atmosfear",
-	""
+    "RAW PCM/WAVE file writer audio output",
+    "pcm",
+    "Atmosfear",
+    ""
 };
 
 LIBAO_EXTERN(pcm)
@@ -60,23 +60,24 @@ static int fast = 0;
 
 struct WaveHeader
 {
-	uint32_t riff;
-	uint32_t file_length;
-	uint32_t wave;
-	uint32_t fmt;
-	uint32_t fmt_length;
-	uint16_t fmt_tag;
-	uint16_t channels;
-	uint32_t sample_rate;
-	uint32_t bytes_per_second;
-	uint16_t block_align;
-	uint16_t bits;
-	uint32_t data;
-	uint32_t data_length;
+    uint32_t riff;
+    uint32_t file_length;
+    uint32_t wave;
+    uint32_t fmt;
+    uint32_t fmt_length;
+    uint16_t fmt_tag;
+    uint16_t channels;
+    uint32_t sample_rate;
+    uint32_t bytes_per_second;
+    uint16_t block_align;
+    uint16_t bits;
+    uint32_t data;
+    uint32_t data_length;
 };
 
 /* init with default values */
 static struct WaveHeader wavhdr;
+static uint64_t data_length;
 
 static FILE *fp = NULL;
 
@@ -88,102 +89,107 @@ static int control(int cmd,void *arg){
 // open & setup audio device
 // return: 1=success 0=fail
 static int init(int rate,int channels,int format,int flags){
-	int bits;
-	opt_t subopts[] = {
-	  {"waveheader", OPT_ARG_BOOL, &ao_pcm_waveheader, NULL},
-	  {"file",       OPT_ARG_MSTRZ, &ao_outputfilename, NULL},
-	  {"fast",       OPT_ARG_BOOL, &fast, NULL},
-	  {NULL}
-	};
-	// set defaults
-	ao_pcm_waveheader = 1;
-
-	if (subopt_parse(ao_subdevice, subopts) != 0) {
-	  return 0;
-	}
-	if (!ao_outputfilename){
-	  ao_outputfilename =
-	    strdup(ao_pcm_waveheader?"audiodump.wav":"audiodump.pcm");
-	}
-
-	bits=8;
-	switch(format){
-	case AF_FORMAT_S32_BE:
-	    format=AF_FORMAT_S32_LE;
-	case AF_FORMAT_S32_LE:
-	    bits=32;
-	    break;
-	case AF_FORMAT_FLOAT_BE:
-	    format=AF_FORMAT_FLOAT_LE;
-	case AF_FORMAT_FLOAT_LE:
-	    bits=32;
-	    break;
-	case AF_FORMAT_S8:
-	    format=AF_FORMAT_U8;
-	case AF_FORMAT_U8:
-	    break;
-	case AF_FORMAT_AC3:
-	    bits=16;
-	    break;
-	default:
-	    format=AF_FORMAT_S16_LE;
-	    bits=16;
-	    break;
-	}
-
-	ao_data.outburst = 65536;
-	ao_data.buffersize= 2*65536;
-	ao_data.channels=channels;
-	ao_data.samplerate=rate;
-	ao_data.format=format;
-	ao_data.bps=channels*rate*(bits/8);
-
-	wavhdr.riff = le2me_32(WAV_ID_RIFF);
-	wavhdr.wave = le2me_32(WAV_ID_WAVE);
-	wavhdr.fmt = le2me_32(WAV_ID_FMT);
-	wavhdr.fmt_length = le2me_32(16);
-	wavhdr.fmt_tag = le2me_16(format == AF_FORMAT_FLOAT_LE ? WAV_ID_FLOAT_PCM : WAV_ID_PCM);
-	wavhdr.channels = le2me_16(ao_data.channels);
-	wavhdr.sample_rate = le2me_32(ao_data.samplerate);
-	wavhdr.bytes_per_second = le2me_32(ao_data.bps);
-	wavhdr.bits = le2me_16(bits);
-	wavhdr.block_align = le2me_16(ao_data.channels * (bits / 8));
-	
-	wavhdr.data = le2me_32(WAV_ID_DATA);
-	wavhdr.data_length=le2me_32(0x7ffff000);
-	wavhdr.file_length = wavhdr.data_length + sizeof(wavhdr) - 8;
-
-	mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_PCM_FileInfo, ao_outputfilename, 
-	       (ao_pcm_waveheader?"WAVE":"RAW PCM"), rate, 
-	       (channels > 1) ? "Stereo" : "Mono", af_fmt2str_short(format));
-	mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_PCM_HintInfo);
-
-	fp = fopen(ao_outputfilename, "wb");
-	if(fp) {
-		if(ao_pcm_waveheader){ /* Reserve space for wave header */
-			fwrite(&wavhdr,sizeof(wavhdr),1,fp);
-			wavhdr.file_length=wavhdr.data_length=0;
-		}
-		return 1;
-	}
-	mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_PCM_CantOpenOutputFile, 
+    int bits;
+    opt_t subopts[] = {
+        {"waveheader", OPT_ARG_BOOL, &ao_pcm_waveheader, NULL},
+        {"file",       OPT_ARG_MSTRZ, &ao_outputfilename, NULL},
+        {"fast",       OPT_ARG_BOOL, &fast, NULL},
+        {NULL}
+    };
+    // set defaults
+    ao_pcm_waveheader = 1;
+
+    if (subopt_parse(ao_subdevice, subopts) != 0) {
+        return 0;
+    }
+    if (!ao_outputfilename){
+        ao_outputfilename =
+            strdup(ao_pcm_waveheader?"audiodump.wav":"audiodump.pcm");
+    }
+
+    bits=8;
+    switch(format){
+    case AF_FORMAT_S32_BE:
+        format=AF_FORMAT_S32_LE;
+    case AF_FORMAT_S32_LE:
+        bits=32;
+        break;
+    case AF_FORMAT_FLOAT_BE:
+        format=AF_FORMAT_FLOAT_LE;
+    case AF_FORMAT_FLOAT_LE:
+        bits=32;
+        break;
+    case AF_FORMAT_S8:
+        format=AF_FORMAT_U8;
+    case AF_FORMAT_U8:
+        break;
+    case AF_FORMAT_AC3:
+        bits=16;
+        break;
+    default:
+        format=AF_FORMAT_S16_LE;
+        bits=16;
+        break;
+    }
+
+    ao_data.outburst = 65536;
+    ao_data.buffersize= 2*65536;
+    ao_data.channels=channels;
+    ao_data.samplerate=rate;
+    ao_data.format=format;
+    ao_data.bps=channels*rate*(bits/8);
+
+    wavhdr.riff = le2me_32(WAV_ID_RIFF);
+    wavhdr.wave = le2me_32(WAV_ID_WAVE);
+    wavhdr.fmt = le2me_32(WAV_ID_FMT);
+    wavhdr.fmt_length = le2me_32(16);
+    wavhdr.fmt_tag = le2me_16(format == AF_FORMAT_FLOAT_LE ? WAV_ID_FLOAT_PCM : WAV_ID_PCM);
+    wavhdr.channels = le2me_16(ao_data.channels);
+    wavhdr.sample_rate = le2me_32(ao_data.samplerate);
+    wavhdr.bytes_per_second = le2me_32(ao_data.bps);
+    wavhdr.bits = le2me_16(bits);
+    wavhdr.block_align = le2me_16(ao_data.channels * (bits / 8));
+    
+    wavhdr.data = le2me_32(WAV_ID_DATA);
+    wavhdr.data_length=le2me_32(0x7ffff000);
+    wavhdr.file_length = wavhdr.data_length + sizeof(wavhdr) - 8;
+
+    mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_PCM_FileInfo, ao_outputfilename, 
+           (ao_pcm_waveheader?"WAVE":"RAW PCM"), rate, 
+           (channels > 1) ? "Stereo" : "Mono", af_fmt2str_short(format));
+    mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_PCM_HintInfo);
+
+    fp = fopen(ao_outputfilename, "wb");
+    if(fp) {
+        if(ao_pcm_waveheader){ /* Reserve space for wave header */
+            fwrite(&wavhdr,sizeof(wavhdr),1,fp);
+        }
+        return 1;
+    }
+    mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_PCM_CantOpenOutputFile, 
                ao_outputfilename);
-	return 0;
+    return 0;
 }
 
 // close audio device
 static void uninit(int immed){
-	
-	if(ao_pcm_waveheader && fseek(fp, 0, SEEK_SET) == 0){ /* Write wave header */
-		wavhdr.file_length = wavhdr.data_length + sizeof(wavhdr) - 8;
-		wavhdr.file_length = le2me_32(wavhdr.file_length);
-		wavhdr.data_length = le2me_32(wavhdr.data_length);
-		fwrite(&wavhdr,sizeof(wavhdr),1,fp);
-	}
-	fclose(fp);
-	if (ao_outputfilename)
-	  free(ao_outputfilename);
-	ao_outputfilename = NULL;
+    
+    if(ao_pcm_waveheader){ /* Rewrite wave header */
+        if (fseek(fp, 0, SEEK_SET) != 0)
+            mp_msg(MSGT_AO, MSGL_ERR, "Could not seek to start, WAV size headers not updated!\n");
+        else if (data_length > 0x7ffff000)
+            mp_msg(MSGT_AO, MSGL_ERR, "File larger than allowed for WAV files, may play truncated!\n");
+        else {
+            wavhdr.file_length = data_length + sizeof(wavhdr) - 8;
+            wavhdr.file_length = le2me_32(wavhdr.file_length);
+            wavhdr.data_length = le2me_32(data_length);
+            fwrite(&wavhdr,sizeof(wavhdr),1,fp);
+        }
+    }
+    fclose(fp);
+    if (ao_outputfilename)
+        free(ao_outputfilename);
+    ao_outputfilename = NULL;
 }
 
 // stop playing and empty buffers (for seeking/pause)
@@ -207,7 +213,7 @@ static void audio_resume(void)
 static int get_space(void){
 
     if(vo_pts)
-      return ao_data.pts < vo_pts + fast * 30000 ? ao_data.outburst : 0;
+        return ao_data.pts < vo_pts + fast * 30000 ? ao_data.outburst : 0;
     return ao_data.outburst;
 }
 
@@ -219,31 +225,31 @@ static int play(void* data,int len,int flags){
 // let libaf to do the conversion...
 #if 0
 //#ifdef WORDS_BIGENDIAN
-	if (ao_data.format == AFMT_S16_LE) {
-	  unsigned short *buffer = (unsigned short *) data;
-	  register int i;
-	  for(i = 0; i < len/2; ++i) {
-	    buffer[i] = le2me_16(buffer[i]);
-	  }
-	}
+    if (ao_data.format == AFMT_S16_LE) {
+      unsigned short *buffer = (unsigned short *) data;
+      register int i;
+      for(i = 0; i < len/2; ++i) {
+        buffer[i] = le2me_16(buffer[i]);
+      }
+    }
 #endif 
 
-	if (ao_data.channels == 6 || ao_data.channels == 5) {
-		int frame_size = le2me_16(wavhdr.bits) / 8;
-		len -= len % (frame_size * ao_data.channels);
-		reorder_channel_nch(data, AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT,
-		                    AF_CHANNEL_LAYOUT_WAVEEX_DEFAULT,
-		                    ao_data.channels,
-		                    len / frame_size, frame_size);
-	}
-
-	//printf("PCM: Writing chunk!\n");
-	fwrite(data,len,1,fp);
-
-	if(ao_pcm_waveheader)
-		wavhdr.data_length += len;
-	
-	return len;
+    if (ao_data.channels == 6 || ao_data.channels == 5) {
+        int frame_size = le2me_16(wavhdr.bits) / 8;
+        len -= len % (frame_size * ao_data.channels);
+        reorder_channel_nch(data, AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT,
+                            AF_CHANNEL_LAYOUT_WAVEEX_DEFAULT,
+                            ao_data.channels,
+                            len / frame_size, frame_size);
+    }
+
+    //printf("PCM: Writing chunk!\n");
+    fwrite(data,len,1,fp);
+
+    if(ao_pcm_waveheader)
+        data_length += len;
+    
+    return len;
 }
 
 // return: delay in seconds between first and last sample in buffer
diff --git a/libao2/ao_pulse.c b/libao2/ao_pulse.c
index d6974f8..2d27c85 100644
--- a/libao2/ao_pulse.c
+++ b/libao2/ao_pulse.c
@@ -33,7 +33,7 @@
 #define PULSE_CLIENT_NAME "MPlayer"
 
 /** General driver info */
-static ao_info_t info = {
+static const ao_info_t info = {
     "PulseAudio audio output",
     "pulse",
     "Lennart Poettering",
diff --git a/libao2/ao_sdl.c b/libao2/ao_sdl.c
index 97a70d4..6cbd607 100644
--- a/libao2/ao_sdl.c
+++ b/libao2/ao_sdl.c
@@ -38,7 +38,7 @@
 
 #include "libvo/fastmemcpy.h"
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
 	"SDLlib audio output",
 	"sdl",
diff --git a/libao2/ao_sgi.c b/libao2/ao_sgi.c
index db7c486..46b79c1 100644
--- a/libao2/ao_sgi.c
+++ b/libao2/ao_sgi.c
@@ -32,7 +32,7 @@
 #include "help_mp.h"
 #include "libaf/af_format.h"
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
 	"sgi audio output",
 	"sgi",
diff --git a/libao2/ao_sun.c b/libao2/ao_sun.c
index cae2287..725a49e 100644
--- a/libao2/ao_sun.c
+++ b/libao2/ao_sun.c
@@ -49,7 +49,7 @@
 #include "mp_msg.h"
 #include "help_mp.h"
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
     "Sun audio output",
     "sun",
diff --git a/libao2/ao_v4l2.c b/libao2/ao_v4l2.c
index b1b510e..412899c 100644
--- a/libao2/ao_v4l2.c
+++ b/libao2/ao_v4l2.c
@@ -38,7 +38,7 @@
 
 static int freq = 0;
 
-static ao_info_t info = 
+static const ao_info_t info = 
 {
   "V4L2 MPEG Audio Decoder output",
   "v4l2",
diff --git a/libao2/ao_win32.c b/libao2/ao_win32.c
index 40830eb..b2ba0fc 100644
--- a/libao2/ao_win32.c
+++ b/libao2/ao_win32.c
@@ -87,12 +87,10 @@ static const int channel_mask[] = {
 static WAVEHDR*     waveBlocks;         //pointer to our ringbuffer memory
 static HWAVEOUT     hWaveOut;           //handle to the waveout device
 static unsigned int buf_write=0;
-static unsigned int buf_write_pos=0;
-static int          full_buffers=0;
-static int          buffered_bytes=0;
+static volatile int buf_read=0;
 
 
-static ao_info_t info = 
+static const ao_info_t info =
 {
 	"Windows waveOut audio output",
 	"win32",
@@ -102,17 +100,12 @@ static ao_info_t info =
 
 LIBAO_EXTERN(win32)
 
-static void CALLBACK waveOutProc(HWAVEOUT hWaveOut,UINT uMsg,DWORD dwInstance,  
+static void CALLBACK waveOutProc(HWAVEOUT hWaveOut,UINT uMsg,DWORD dwInstance,
     DWORD dwParam1,DWORD dwParam2)
 {
 	if(uMsg != WOM_DONE)
         return;
-	if (full_buffers) {
-		buffered_bytes-=BUFFER_SIZE;
-		--full_buffers;
-	} else {
-		buffered_bytes=0;
-	}
+	buf_read = (buf_read + 1) % BUFFER_COUNT;
 }
 
 // to set/get/query special features/parameters
@@ -145,34 +138,34 @@ static int control(int cmd,void *arg)
 // return: 1=success 0=fail
 static int init(int rate,int channels,int format,int flags)
 {
-	WAVEFORMATEXTENSIBLE wformat;      
-	DWORD totalBufferSize = (BUFFER_SIZE + sizeof(WAVEHDR)) * BUFFER_COUNT;
+	WAVEFORMATEXTENSIBLE wformat;
 	MMRESULT result;
 	unsigned char* buffer;
 	int i;
-   
+
 	switch(format){
 		case AF_FORMAT_AC3:
 		case AF_FORMAT_S24_LE:
 		case AF_FORMAT_S16_LE:
-		case AF_FORMAT_S8:
+		case AF_FORMAT_U8:
 			break;
 		default:
 			mp_msg(MSGT_AO, MSGL_V,"ao_win32: format %s not supported defaulting to Signed 16-bit Little-Endian\n",af_fmt2str_short(format));
 			format=AF_FORMAT_S16_LE;
-	}   
+	}
 
 	// FIXME multichannel mode is buggy
 	if(channels > 2)
 		channels = 2;
-   
-	//fill global ao_data 
+
+	//fill global ao_data
 	ao_data.channels=channels;
 	ao_data.samplerate=rate;
 	ao_data.format=format;
 	ao_data.bps=channels*rate;
 	if(format != AF_FORMAT_U8 && format != AF_FORMAT_S8)
 	  ao_data.bps*=2;
+	ao_data.outburst = BUFFER_SIZE;
 	if(ao_data.buffersize==-1)
 	{
 		ao_data.buffersize=af_fmt2bits(format)/8;
@@ -181,22 +174,22 @@ static int init(int rate,int channels,int format,int flags)
 	}
 	mp_msg(MSGT_AO, MSGL_V,"ao_win32: Samplerate:%iHz Channels:%i Format:%s\n",rate, channels, af_fmt2str_short(format));
     mp_msg(MSGT_AO, MSGL_V,"ao_win32: Buffersize:%d\n",ao_data.buffersize);
-	
+
 	//fill waveformatex
     ZeroMemory( &wformat, sizeof(WAVEFORMATEXTENSIBLE));
     wformat.Format.cbSize          = (channels>2)?sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX):0;
-    wformat.Format.nChannels       = channels;                
-    wformat.Format.nSamplesPerSec  = rate;            
+    wformat.Format.nChannels       = channels;
+    wformat.Format.nSamplesPerSec  = rate;
     if(format == AF_FORMAT_AC3)
     {
         wformat.Format.wFormatTag      = WAVE_FORMAT_DOLBY_AC3_SPDIF;
         wformat.Format.wBitsPerSample  = 16;
         wformat.Format.nBlockAlign     = 4;
     }
-    else 
+    else
     {
         wformat.Format.wFormatTag      = (channels>2)?WAVE_FORMAT_EXTENSIBLE:WAVE_FORMAT_PCM;
-        wformat.Format.wBitsPerSample  = af_fmt2bits(format); 
+        wformat.Format.wBitsPerSample  = af_fmt2bits(format);
         wformat.Format.nBlockAlign     = wformat.Format.nChannels * (wformat.Format.wBitsPerSample >> 3);
     }
 	if(channels>2)
@@ -205,9 +198,9 @@ static int init(int rate,int channels,int format,int flags)
         wformat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
 	    wformat.Samples.wValidBitsPerSample=af_fmt2bits(format);
     }
-  
+
     wformat.Format.nAvgBytesPerSec = wformat.Format.nSamplesPerSec * wformat.Format.nBlockAlign;
- 	
+ 
     //open sound device
     //WAVE_MAPPER always points to the default wave device on the system
     result = waveOutOpen(&hWaveOut,WAVE_MAPPER,(WAVEFORMATEX*)&wformat,(DWORD_PTR)waveOutProc,0,CALLBACK_FUNCTION);
@@ -231,9 +224,8 @@ static int init(int rate,int channels,int format,int flags)
 		return 0;
     }
 	//allocate buffer memory as one big block
-	buffer = malloc(totalBufferSize);
-	memset(buffer,0x0,totalBufferSize);
-    //and setup pointers to each buffer 
+	buffer = calloc(BUFFER_COUNT, BUFFER_SIZE + sizeof(WAVEHDR));
+    //and setup pointers to each buffer
     waveBlocks = (WAVEHDR*)buffer;
     buffer += sizeof(WAVEHDR) * BUFFER_COUNT;
     for(i = 0; i < BUFFER_COUNT; i++) {
@@ -241,9 +233,7 @@ static int init(int rate,int channels,int format,int flags)
         buffer += BUFFER_SIZE;
     }
     buf_write=0;
-    buf_write_pos=0;
-    full_buffers=0;
-    buffered_bytes=0;
+    buf_read=0;
 
     return 1;
 }
@@ -251,10 +241,11 @@ static int init(int rate,int channels,int format,int flags)
 // close audio device
 static void uninit(int immed)
 {
-    if(!immed)while(buffered_bytes > 0)usec_sleep(50000);
-    else buffered_bytes=0;
+    if(!immed)
+	usec_sleep(get_delay() * 1000 * 1000);
+    else
 	waveOutReset(hWaveOut);
-	waveOutClose(hWaveOut);
+    while (waveOutClose(hWaveOut) == WAVERR_STILLPLAYING) usec_sleep(0);
 	mp_msg(MSGT_AO, MSGL_V,"waveOut device closed\n");
     free(waveBlocks);
 	mp_msg(MSGT_AO, MSGL_V,"buffer memory freed\n");
@@ -265,9 +256,7 @@ static void reset(void)
 {
    	waveOutReset(hWaveOut);
 	buf_write=0;
-    buf_write_pos=0;
-	full_buffers=0;
-	buffered_bytes=0;
+	buf_read=0;
 }
 
 // stop playing, keep buffers (for pause)
@@ -285,7 +274,9 @@ static void audio_resume(void)
 // return: how many bytes can be played without blocking
 static int get_space(void)
 {
-    return BUFFER_COUNT*BUFFER_SIZE - buffered_bytes;
+    int free = buf_read - buf_write - 1;
+    if (free < 0) free += BUFFER_COUNT;
+    return free * BUFFER_SIZE;
 }
 
 //writes data into buffer, based on ringbuffer code in ao_sdl.c
@@ -293,28 +284,23 @@ static int write_waveOutBuffer(unsigned char* data,int len){
   WAVEHDR* current;
   int len2=0;
   int x;
-  while(len>0){                       
+  while(len>0){
+    int buf_next = (buf_write + 1) % BUFFER_COUNT;
     current = &waveBlocks[buf_write];
-    if(buffered_bytes==BUFFER_COUNT*BUFFER_SIZE) break;
+    if(buf_next == buf_read) break;
     //unprepare the header if it is prepared
-	if(current->dwFlags & WHDR_PREPARED) 
+	if(current->dwFlags & WHDR_PREPARED)
            waveOutUnprepareHeader(hWaveOut, current, sizeof(WAVEHDR));
-	x=BUFFER_SIZE-buf_write_pos;          
-    if(x>len) x=len;                   
-    fast_memcpy(current->lpData+buf_write_pos,data+len2,x); 
-    if(buf_write_pos==0)full_buffers++;
-    len2+=x; len-=x;                 
-	buffered_bytes+=x; buf_write_pos+=x; 
+	x=BUFFER_SIZE;
+    if(x>len) x=len;
+    fast_memcpy(current->lpData,data+len2,x);
+    len2+=x; len-=x;
 	//prepare header and write data to device
-	current->dwBufferLength = buf_write_pos;
+	current->dwBufferLength = x;
 	waveOutPrepareHeader(hWaveOut, current, sizeof(WAVEHDR));
 	waveOutWrite(hWaveOut, current, sizeof(WAVEHDR));
-    
-	if(buf_write_pos>=BUFFER_SIZE){        //buffer is full find next
-       // block is full, find next!
-       buf_write=(buf_write+1)%BUFFER_COUNT;  
-	   buf_write_pos=0;                 
-    }                                 
+
+       buf_write = buf_next;
   }
   return len2;
 }
@@ -332,5 +318,7 @@ static int play(void* data,int len,int flags)
 // return: delay in seconds between first and last sample in buffer
 static float get_delay(void)
 {
-	return (float)(buffered_bytes + ao_data.buffersize)/(float)ao_data.bps;
+	int used = buf_write - buf_read;
+	if (used < 0) used += BUFFER_COUNT;
+	return (float)(used * BUFFER_SIZE + ao_data.buffersize)/(float)ao_data.bps;
 }
diff --git a/libao2/audio_out.c b/libao2/audio_out.c
index 222349c..0e26e76 100644
--- a/libao2/audio_out.c
+++ b/libao2/audio_out.c
@@ -31,29 +31,29 @@
 ao_data_t ao_data={0,0,0,0,OUTBURST,-1,0};
 char *ao_subdevice = NULL;
 
-extern ao_functions_t audio_out_oss;
-extern ao_functions_t audio_out_macosx;
-extern ao_functions_t audio_out_arts;
-extern ao_functions_t audio_out_esd;
-extern ao_functions_t audio_out_pulse;
-extern ao_functions_t audio_out_jack;
-extern ao_functions_t audio_out_openal;
-extern ao_functions_t audio_out_null;
-extern ao_functions_t audio_out_alsa5;
-extern ao_functions_t audio_out_alsa;
-extern ao_functions_t audio_out_nas;
-extern ao_functions_t audio_out_sdl;
-extern ao_functions_t audio_out_sun;
-extern ao_functions_t audio_out_sgi;
-extern ao_functions_t audio_out_win32;
-extern ao_functions_t audio_out_dsound;
-extern ao_functions_t audio_out_dart;
-extern ao_functions_t audio_out_dxr2;
-extern ao_functions_t audio_out_ivtv;
-extern ao_functions_t audio_out_v4l2;
-extern ao_functions_t audio_out_mpegpes;
-extern ao_functions_t audio_out_pcm;
-extern ao_functions_t audio_out_pss;
+extern const ao_functions_t audio_out_oss;
+extern const ao_functions_t audio_out_macosx;
+extern const ao_functions_t audio_out_arts;
+extern const ao_functions_t audio_out_esd;
+extern const ao_functions_t audio_out_pulse;
+extern const ao_functions_t audio_out_jack;
+extern const ao_functions_t audio_out_openal;
+extern const ao_functions_t audio_out_null;
+extern const ao_functions_t audio_out_alsa5;
+extern const ao_functions_t audio_out_alsa;
+extern const ao_functions_t audio_out_nas;
+extern const ao_functions_t audio_out_sdl;
+extern const ao_functions_t audio_out_sun;
+extern const ao_functions_t audio_out_sgi;
+extern const ao_functions_t audio_out_win32;
+extern const ao_functions_t audio_out_dsound;
+extern const ao_functions_t audio_out_dart;
+extern const ao_functions_t audio_out_dxr2;
+extern const ao_functions_t audio_out_ivtv;
+extern const ao_functions_t audio_out_v4l2;
+extern const ao_functions_t audio_out_mpegpes;
+extern const ao_functions_t audio_out_pcm;
+extern const ao_functions_t audio_out_pss;
 
 const ao_functions_t* const audio_out_drivers[] =
 {
diff --git a/libao2/audio_out.h b/libao2/audio_out.h
index 3312ab0..e1d36e7 100644
--- a/libao2/audio_out.h
+++ b/libao2/audio_out.h
@@ -34,7 +34,7 @@ typedef struct ao_info_s
 /* interface towards mplayer and */
 typedef struct ao_functions_s
 {
-	ao_info_t *info;
+	const ao_info_t *info;
         int (*control)(int cmd,void *arg);
         int (*init)(int rate,int channels,int format,int flags);
         void (*uninit)(int immed);
diff --git a/libao2/audio_out_internal.h b/libao2/audio_out_internal.h
index e702430..504923b 100644
--- a/libao2/audio_out_internal.h
+++ b/libao2/audio_out_internal.h
@@ -31,7 +31,7 @@ static float get_delay(void);
 static void audio_pause(void);
 static void audio_resume(void);
 
-#define LIBAO_EXTERN(x) ao_functions_t audio_out_##x =\
+#define LIBAO_EXTERN(x) const ao_functions_t audio_out_##x =\
 {\
 	&info,\
 	control,\
diff --git a/libass/ass.c b/libass/ass.c
index 8022dfc..b0c38c2 100644
--- a/libass/ass.c
+++ b/libass/ass.c
@@ -347,6 +347,8 @@ void process_force_style(ass_track_t* track) {
 			track->Timer = atof(token);
 		else if(!strcasecmp(*fs, "WrapStyle"))
 			track->WrapStyle = atoi(token);
+		else if(!strcasecmp(*fs, "ScaledBorderAndShadow"))
+			track->ScaledBorderAndShadow = parse_bool(token);
 
 		dt = strrchr(*fs, '.');
 		if (dt) {
@@ -520,6 +522,8 @@ static int process_info_line(ass_track_t* track, char *str)
 		track->Timer = atof(str + 6);
 	} else if (!strncmp(str,"WrapStyle:", 10)) {
 		track->WrapStyle = atoi(str + 10);
+	} else if (!strncmp(str, "ScaledBorderAndShadow:", 22)) {
+		track->ScaledBorderAndShadow = parse_bool(str + 22);
 	}
 	return 0;
 }
@@ -1124,6 +1128,7 @@ long long ass_step_sub(ass_track_t* track, long long now, int movement) {
 ass_track_t* ass_new_track(ass_library_t* library) {
 	ass_track_t* track = calloc(1, sizeof(ass_track_t));
 	track->library = library;
+	track->ScaledBorderAndShadow = 1;
 	track->parser_priv = calloc(1, sizeof(parser_priv_t));
 	return track;
 }
diff --git a/libass/ass_bitmap.c b/libass/ass_bitmap.c
index e6d5e8d..61457f1 100644
--- a/libass/ass_bitmap.c
+++ b/libass/ass_bitmap.c
@@ -243,7 +243,7 @@ static bitmap_t* fix_outline_and_shadow(bitmap_t* bm_g, bitmap_t* bm_o)
 			unsigned char c_g, c_o;
 			c_g = g[x];
 			c_o = o[x];
-			o[x] = (c_o > c_g) ? c_o : 0;
+			o[x] = (c_o > c_g) ? c_o - (c_g/2) : 0;
 			s[x] = (c_o < 0xFF - c_g) ? c_o + c_g : 0xFF;
 		}
 		g += bm_g->w;
@@ -255,11 +255,38 @@ static bitmap_t* fix_outline_and_shadow(bitmap_t* bm_g, bitmap_t* bm_o)
 	return bm_s;
 }
 
-int glyph_to_bitmap(ass_synth_priv_t* priv, ass_synth_priv_t* priv_blur,
+/**
+ * \brief Blur with [[1,2,1]. [2,4,2], [1,2,1]] kernel
+ * This blur is the same as the one employed by vsfilter.
+ */
+static void be_blur(unsigned char *buf, int w, int h) {
+	unsigned int x, y;
+	unsigned int old_sum, new_sum;
+
+	for (y=0; y<h; y++) {
+		old_sum = 2 * buf[y*w];
+		for (x=0; x<w-1; x++) {
+			new_sum = buf[y*w+x] + buf[y*w+x+1];
+			buf[y*w+x] = (old_sum + new_sum) >> 2;
+			old_sum = new_sum;
+		}
+	}
+
+	for (x=0; x<w; x++) {
+		old_sum = 2 * buf[x];
+		for (y=0; y<h-1; y++) {
+			new_sum = buf[y*w+x] + buf[(y+1)*w+x];
+			buf[y*w+x] = (old_sum + new_sum) >> 2;
+			old_sum = new_sum;
+		}
+	}
+}
+
+int glyph_to_bitmap(ass_synth_priv_t* priv_blur,
 		FT_Glyph glyph, FT_Glyph outline_glyph, bitmap_t** bm_g,
 		bitmap_t** bm_o, bitmap_t** bm_s, int be, double blur_radius)
 {
-	int bord = be ? (be+1) : 0;
+	int bord = be ? (be/4+1) : 0;
 	blur_radius *= 2;
 	bord = (blur_radius > 0.0) ? blur_radius : bord;
 
@@ -279,19 +306,16 @@ int glyph_to_bitmap(ass_synth_priv_t* priv, ass_synth_priv_t* priv_blur,
 			return 1;
 		}
 	}
-	if (*bm_o) {
-		resize_tmp(priv, (*bm_o)->w, (*bm_o)->h);
+	if (*bm_o)
 		resize_tmp(priv_blur, (*bm_o)->w, (*bm_o)->h);
-	}
-	resize_tmp(priv, (*bm_g)->w, (*bm_g)->h);
 	resize_tmp(priv_blur, (*bm_g)->w, (*bm_g)->h);
 	
 	if (be) {
 		while (be--) {
 			if (*bm_o)
-				blur((*bm_o)->buffer, priv->tmp, (*bm_o)->w, (*bm_o)->h, (*bm_o)->w, (int*)priv->gt2, priv->g_r, priv->g_w);
+				be_blur((*bm_o)->buffer, (*bm_o)->w, (*bm_o)->h);
 			else
-				blur((*bm_g)->buffer, priv->tmp, (*bm_g)->w, (*bm_g)->h, (*bm_g)->w, (int*)priv->gt2, priv->g_r, priv->g_w);
+				be_blur((*bm_g)->buffer, (*bm_g)->w, (*bm_g)->h);
 		}
 	} else {
 		if (blur_radius > 0.0) {
diff --git a/libass/ass_bitmap.h b/libass/ass_bitmap.h
index 5f45aae..c0b4ad2 100644
--- a/libass/ass_bitmap.h
+++ b/libass/ass_bitmap.h
@@ -46,7 +46,7 @@ typedef struct bitmap_s {
  * \param bm_g out: pointer to the bitmap of glyph shadow is returned here
  * \param be 1 = produces blurred bitmaps, 0 = normal bitmaps
  */
-int glyph_to_bitmap(ass_synth_priv_t* priv, ass_synth_priv_t* priv_blur, FT_Glyph glyph, FT_Glyph outline_glyph, bitmap_t** bm_g, bitmap_t** bm_o, bitmap_t** bm_s, int be, double blur_radius);
+int glyph_to_bitmap(ass_synth_priv_t* priv_blur, FT_Glyph glyph, FT_Glyph outline_glyph, bitmap_t** bm_g, bitmap_t** bm_o, bitmap_t** bm_s, int be, double blur_radius);
 
 void ass_free_bitmap(bitmap_t* bm);
 
diff --git a/libass/ass_cache.c b/libass/ass_cache.c
index 41645c4..3b90e66 100644
--- a/libass/ass_cache.c
+++ b/libass/ass_cache.c
@@ -192,6 +192,8 @@ static int font_compare(void* key1, void* key2, size_t key_size) {
 		return 0;
 	if (a->italic != b->italic)
 		return 0;
+	if (a->treat_family_as_pattern != b->treat_family_as_pattern)
+		return 0;
 	return 1;
 }
 
@@ -324,3 +326,53 @@ void ass_glyph_cache_reset(void)
 	ass_glyph_cache_done();
 	ass_glyph_cache_init();
 }
+
+
+//---------------------------------
+// composite cache
+
+hashmap_t* composite_cache;
+
+static void composite_hash_dtor(void* key, size_t key_size, void* value, size_t value_size)
+{
+	composite_hash_val_t* v = value;
+	free(v->a);
+	free(v->b);
+	free(key);
+	free(value);
+}
+
+void* cache_add_composite(composite_hash_key_t* key, composite_hash_val_t* val)
+{
+	return hashmap_insert(composite_cache, key, val);
+}
+
+/**
+ * \brief Get a composite bitmap from composite cache.
+ * \param key hash key
+ * \return requested hash val or 0 if not found
+*/
+composite_hash_val_t* cache_find_composite(composite_hash_key_t* key)
+{
+	return hashmap_find(composite_cache, key);
+}
+
+void ass_composite_cache_init(void)
+{
+	composite_cache = hashmap_init(sizeof(composite_hash_key_t),
+				   sizeof(composite_hash_val_t),
+				   0xFFFF + 13,
+				   composite_hash_dtor, NULL, NULL);
+}
+
+void ass_composite_cache_done(void)
+{
+	hashmap_done(composite_cache);
+}
+
+void ass_composite_cache_reset(void)
+{
+	ass_composite_cache_done();
+	ass_composite_cache_init();
+}
+
diff --git a/libass/ass_cache.h b/libass/ass_cache.h
index fdb8a64..f7042be 100644
--- a/libass/ass_cache.h
+++ b/libass/ass_cache.h
@@ -65,6 +65,27 @@ bitmap_hash_val_t* cache_find_bitmap(bitmap_hash_key_t* key);
 void ass_bitmap_cache_reset(void);
 void ass_bitmap_cache_done(void);
 
+
+// Cache for composited bitmaps
+typedef struct composite_hash_key_s {
+	int aw, ah, bw, bh;
+	int ax, ay, bx, by;
+	bitmap_hash_key_t a;
+	bitmap_hash_key_t b;
+} composite_hash_key_t;
+
+typedef struct composite_hash_val_s {
+	unsigned char* a;
+	unsigned char* b;
+} composite_hash_val_t;
+
+void ass_composite_cache_init(void);
+void* cache_add_composite(composite_hash_key_t* key, composite_hash_val_t* val);
+composite_hash_val_t* cache_find_composite(composite_hash_key_t* key);
+void ass_composite_cache_reset(void);
+void ass_composite_cache_done(void);
+
+
 // describes an outline glyph
 typedef struct glyph_hash_key_s {
 	ass_font_t* font;
diff --git a/libass/ass_font.c b/libass/ass_font.c
index f2214a3..579e658 100644
--- a/libass/ass_font.c
+++ b/libass/ass_font.c
@@ -125,7 +125,7 @@ static int add_face(void* fc_priv, ass_font_t* font, uint32_t ch)
 	if (font->n_faces == ASS_FONT_MAX_FACES)
 		return -1;
 	
-	path = fontconfig_select(fc_priv, font->desc.family, font->desc.bold,
+	path = fontconfig_select(fc_priv, font->desc.family, font->desc.treat_family_as_pattern, font->desc.bold,
 					      font->desc.italic, &index, ch);
 
 	mem_idx = find_font(font->library, path);
@@ -169,6 +169,7 @@ ass_font_t* ass_font_new(ass_library_t* library, FT_Library ftlibrary, void* fc_
 	font.ftlibrary = ftlibrary;
 	font.n_faces = 0;
 	font.desc.family = strdup(desc->family);
+	font.desc.treat_family_as_pattern = desc->treat_family_as_pattern;
 	font.desc.bold = desc->bold;
 	font.desc.italic = desc->italic;
 
diff --git a/libass/ass_font.h b/libass/ass_font.h
index 03396a6..5204318 100644
--- a/libass/ass_font.h
+++ b/libass/ass_font.h
@@ -33,6 +33,7 @@ typedef struct ass_font_desc_s {
 	char* family;
 	unsigned bold;
 	unsigned italic;
+	int treat_family_as_pattern;
 } ass_font_desc_t;
 
 #define ASS_FONT_MAX_FACES 10
diff --git a/libass/ass_fontconfig.c b/libass/ass_fontconfig.c
index 9a7bdde..a54bc8c 100644
--- a/libass/ass_fontconfig.c
+++ b/libass/ass_fontconfig.c
@@ -66,14 +66,15 @@ struct fc_instance_s {
  * \brief Low-level font selection.
  * \param priv private data
  * \param family font family
+ * \param treat_family_as_pattern treat family as fontconfig pattern
  * \param bold font weight value
  * \param italic font slant value
  * \param index out: font index inside a file
  * \param code: the character that should be present in the font, can be 0
  * \return font file path
 */ 
-static char* _select_font(fc_instance_t* priv, const char* family, unsigned bold, unsigned italic, int* index,
-			  uint32_t code)
+static char* _select_font(fc_instance_t* priv, const char* family, int treat_family_as_pattern,
+			  unsigned bold, unsigned italic, int* index, uint32_t code)
 {
 	FcBool rc;
 	FcResult result;
@@ -89,34 +90,40 @@ static char* _select_font(fc_instance_t* priv, const char* family, unsigned bold
 	
 	*index = 0;
 
-	pat = FcPatternCreate();
+	if (treat_family_as_pattern)
+		pat = FcNameParse((const FcChar8*)family);
+	else
+		pat = FcPatternCreate();
+
 	if (!pat)
 		goto error;
 	
-	FcPatternAddString(pat, FC_FAMILY, (const FcChar8*)family);
-
-	// In SSA/ASS fonts are sometimes referenced by their "full name",
-	// which is usually a concatenation of family name and font
-	// style (ex. Ottawa Bold). Full name is available from
-	// FontConfig pattern element FC_FULLNAME, but it is never
-	// used for font matching.
-	// Therefore, I'm removing words from the end of the name one
-	// by one, and adding shortened names to the pattern. It seems
-	// that the first value (full name in this case) has
-	// precedence in matching.
-	// An alternative approach could be to reimplement FcFontSort
-	// using FC_FULLNAME instead of FC_FAMILY.
-	family_cnt = 1;
-	{
-		char* s = strdup(family);
-		char* p = s + strlen(s);
-		while (--p > s)
-			if (*p == ' ' || *p == '-') {
-				*p = '\0';
-				FcPatternAddString(pat, FC_FAMILY, (const FcChar8*)s);
-				++ family_cnt;
-			}
-		free(s);
+	if (!treat_family_as_pattern) {
+		FcPatternAddString(pat, FC_FAMILY, (const FcChar8*)family);
+
+		// In SSA/ASS fonts are sometimes referenced by their "full name",
+		// which is usually a concatenation of family name and font
+		// style (ex. Ottawa Bold). Full name is available from
+		// FontConfig pattern element FC_FULLNAME, but it is never
+		// used for font matching.
+		// Therefore, I'm removing words from the end of the name one
+		// by one, and adding shortened names to the pattern. It seems
+		// that the first value (full name in this case) has
+		// precedence in matching.
+		// An alternative approach could be to reimplement FcFontSort
+		// using FC_FULLNAME instead of FC_FAMILY.
+		family_cnt = 1;
+		{
+			char* s = strdup(family);
+			char* p = s + strlen(s);
+			while (--p > s)
+				if (*p == ' ' || *p == '-') {
+					*p = '\0';
+					FcPatternAddString(pat, FC_FAMILY, (const FcChar8*)s);
+					++ family_cnt;
+				}
+			free(s);
+		}
 	}
 	FcPatternAddBool(pat, FC_OUTLINE, FcTrue);
 	FcPatternAddInteger(pat, FC_SLANT, italic);
@@ -153,11 +160,13 @@ static char* _select_font(fc_instance_t* priv, const char* family, unsigned bold
 		goto error;
 
 #if (FC_VERSION >= 20297)
-	// Remove all extra family names from original pattern.
-	// After this, FcFontRenderPrepare will select the most relevant family
-	// name in case there are more than one of them.
-	for (; family_cnt > 1; --family_cnt)
-		FcPatternRemove(pat, FC_FAMILY, family_cnt - 1);
+	if (!treat_family_as_pattern) {
+		// Remove all extra family names from original pattern.
+		// After this, FcFontRenderPrepare will select the most relevant family
+		// name in case there are more than one of them.
+		for (; family_cnt > 1; --family_cnt)
+			FcPatternRemove(pat, FC_FAMILY, family_cnt - 1);
+	}
 #endif
 
 	rpat = FcFontRenderPrepare(priv->config, pat, fset->fonts[curf]);
@@ -182,7 +191,8 @@ static char* _select_font(fc_instance_t* priv, const char* family, unsigned bold
 	if (result != FcResultMatch)
 		r_fullname = NULL;
 
-	if (!(r_family && strcasecmp((const char*)r_family, family) == 0) &&
+	if (!treat_family_as_pattern &&
+		!(r_family && strcasecmp((const char*)r_family, family) == 0) &&
 	    !(r_fullname && strcasecmp((const char*)r_fullname, family) == 0))
 		mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_SelectedFontFamilyIsNotTheRequestedOne,
 		       (const char*)(r_fullname ? r_fullname : r_family), family);
@@ -219,14 +229,15 @@ static char* _select_font(fc_instance_t* priv, const char* family, unsigned bold
  * \brief Find a font. Use default family or path if necessary.
  * \param priv_ private data
  * \param family font family
+ * \param treat_family_as_pattern treat family as fontconfig pattern
  * \param bold font weight value
  * \param italic font slant value
  * \param index out: font index inside a file
  * \param code: the character that should be present in the font, can be 0
  * \return font file path
 */ 
-char* fontconfig_select(fc_instance_t* priv, const char* family, unsigned bold, unsigned italic, int* index,
-			uint32_t code)
+char* fontconfig_select(fc_instance_t* priv, const char* family, int treat_family_as_pattern,
+			unsigned bold, unsigned italic, int* index, uint32_t code)
 {
 	char* res = 0;
 	if (!priv->config) {
@@ -234,9 +245,9 @@ char* fontconfig_select(fc_instance_t* priv, const char* family, unsigned bold,
 		return priv->path_default;
 	}
 	if (family && *family)
-		res = _select_font(priv, family, bold, italic, index, code);
+		res = _select_font(priv, family, treat_family_as_pattern, bold, italic, index, code);
 	if (!res && priv->family_default) {
-		res = _select_font(priv, priv->family_default, bold, italic, index, code);
+		res = _select_font(priv, priv->family_default, 0, bold, italic, index, code);
 		if (res)
 			mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_UsingDefaultFontFamily, 
 					family, bold, italic, res, *index);
@@ -248,7 +259,7 @@ char* fontconfig_select(fc_instance_t* priv, const char* family, unsigned bold,
 		       family, bold, italic, res, *index);
 	}
 	if (!res) {
-		res = _select_font(priv, "Arial", bold, italic, index, code);
+		res = _select_font(priv, "Arial", 0, bold, italic, index, code);
 		if (res)
 			mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_UsingArialFontFamily, 
 					family, bold, italic, res, *index);
@@ -474,8 +485,8 @@ exit:
 
 #else /* CONFIG_FONTCONFIG */
 
-char* fontconfig_select(fc_instance_t* priv, const char* family, unsigned bold, unsigned italic, int* index,
-			uint32_t code)
+char* fontconfig_select(fc_instance_t* priv, const char* family, int treat_family_as_pattern,
+			unsigned bold, unsigned italic, int* index, uint32_t code)
 {
 	*index = priv->index_default;
 	return priv->path_default;
diff --git a/libass/ass_fontconfig.h b/libass/ass_fontconfig.h
index e9a1ce1..7780690 100644
--- a/libass/ass_fontconfig.h
+++ b/libass/ass_fontconfig.h
@@ -35,7 +35,7 @@
 typedef struct fc_instance_s fc_instance_t;
 
 fc_instance_t* fontconfig_init(ass_library_t* library, FT_Library ftlibrary, const char* family, const char* path, int fc);
-char* fontconfig_select(fc_instance_t* priv, const char* family, unsigned bold, unsigned italic, int* index, uint32_t code);
+char* fontconfig_select(fc_instance_t* priv, const char* family, int treat_family_as_pattern, unsigned bold, unsigned italic, int* index, uint32_t code);
 void fontconfig_done(fc_instance_t* priv);
 
 #endif /* LIBASS_FONTCONFIG_H */
diff --git a/libass/ass_mp.c b/libass/ass_mp.c
index 40da63c..7e25b8e 100644
--- a/libass/ass_mp.c
+++ b/libass/ass_mp.c
@@ -94,6 +94,7 @@ ass_track_t* ass_default_track(ass_library_t* library) {
 		style = track->styles + sid;
 		style->Name = strdup("Default");
 		style->FontName = (font_fontconfig >= 0 && sub_font_name) ? strdup(sub_font_name) : (font_fontconfig >= 0 && font_name) ? strdup(font_name) : strdup("Sans");
+		style->treat_fontname_as_pattern = 1;
 
 		fs = track->PlayResY * text_font_scale_factor / 100.;
 		// approximate autoscale coefficients
diff --git a/libass/ass_render.c b/libass/ass_render.c
index a40adec..b561b2a 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -43,8 +43,10 @@
 
 #define MAX_GLYPHS 3000
 #define MAX_LINES 300
-#define BE_RADIUS 1.5
 #define BLUR_MAX_RADIUS 50.0
+#define MAX_BE 100
+#define ROUND(x) ((int) ((x) + .5))
+#define SUBPIXEL_MASK 56	// d6 bitmask for subpixel accuracy adjustment
 
 static int last_render_id = 0;
 
@@ -82,7 +84,6 @@ struct ass_renderer_s {
 	ass_settings_t settings;
 	int render_id;
 	ass_synth_priv_t* synth_priv;
-	ass_synth_priv_t* synth_priv_blur;
 
 	ass_image_t* images_root; // rendering result is stored here
 	ass_image_t* prev_images_root;
@@ -116,7 +117,7 @@ typedef struct glyph_info_s {
 //	int height;
 	int be; // blur edges
 	double blur; // gaussian blur
-	int shadow;
+	double shadow;
 	double frx, fry, frz; // rotation
 	
 	bitmap_hash_key_t hash_key;
@@ -165,7 +166,7 @@ typedef struct render_context_s {
 	uint32_t fade; // alpha from \fad
 	char be; // blur edges
 	double blur; // gaussian blur
-	int shadow;
+	double shadow;
 	int drawing_mode; // not implemented; when != 0 text is discarded, except for style override tags
 
 	effect_t effect_type;
@@ -183,6 +184,7 @@ typedef struct render_context_s {
 	char* family;
 	unsigned bold;
 	unsigned italic;
+	int treat_family_as_pattern;
 	
 } render_context_t;
 
@@ -224,9 +226,15 @@ static void ass_lazy_track_init(void)
 	} else {
 		double orig_aspect = (global_settings->aspect * frame_context.height * frame_context.orig_width) /
 			frame_context.orig_height / frame_context.width;
-		if (!track->PlayResY) {
+		if (!track->PlayResY && track->PlayResX == 1280) {
+			track->PlayResY = 1024;
+			mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_PlayResYUndefinedSettingY, track->PlayResY);
+		} else if (!track->PlayResY) {
 			track->PlayResY = track->PlayResX / orig_aspect + .5;
 			mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_PlayResYUndefinedSettingY, track->PlayResY);
+		} else if (!track->PlayResX && track->PlayResY == 1024) {
+			track->PlayResX = 1280;
+			mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_PlayResXUndefinedSettingX, track->PlayResX);
 		} else if (!track->PlayResX) {
 			track->PlayResX = track->PlayResY * orig_aspect + .5;
 			mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_PlayResXUndefinedSettingX, track->PlayResX);
@@ -263,8 +271,7 @@ ass_renderer_t* ass_renderer_init(ass_library_t* library)
 		goto ass_init_exit;
 	}
 
-	priv->synth_priv = ass_synth_init(BE_RADIUS);
-	priv->synth_priv_blur = ass_synth_init(BLUR_MAX_RADIUS);
+	priv->synth_priv = ass_synth_init(BLUR_MAX_RADIUS);
 
 	priv->library = library;
 	priv->ftlibrary = ft;
@@ -272,6 +279,7 @@ ass_renderer_t* ass_renderer_init(ass_library_t* library)
 	
 	ass_font_cache_init();
 	ass_bitmap_cache_init();
+	ass_composite_cache_init();
 	ass_glyph_cache_init();
 
 	text_info.glyphs = calloc(MAX_GLYPHS, sizeof(glyph_info_t));
@@ -287,6 +295,7 @@ void ass_renderer_done(ass_renderer_t* priv)
 {
 	ass_font_cache_done();
 	ass_bitmap_cache_done();
+	ass_composite_cache_done();
 	ass_glyph_cache_done();
 	if (render_context.stroker) {
 		FT_Stroker_Done(render_context.stroker);
@@ -399,6 +408,98 @@ static ass_image_t** render_glyph(bitmap_t* bm, int dst_x, int dst_y, uint32_t c
 }
 
 /**
+ * \brief Calculate overlapping area of two consecutive bitmaps and in case they
+ * overlap, composite them together
+ * Mainly useful for translucent glyphs and especially borders, to avoid the
+ * luminance adding up where they overlap (which looks ugly)
+ */
+static void render_overlap(ass_image_t** last_tail, ass_image_t** tail, bitmap_hash_key_t *last_hash, bitmap_hash_key_t* hash) {
+	int left, top, bottom, right;
+	int old_left, old_top, w, h, cur_left, cur_top;
+	int x, y, opos, cpos;
+	char m;
+	composite_hash_key_t hk;
+	composite_hash_val_t *hv;
+	composite_hash_key_t *nhk;
+	int ax = (*last_tail)->dst_x;
+	int ay = (*last_tail)->dst_y;
+	int aw = (*last_tail)->w;
+	int as = (*last_tail)->stride;
+	int ah = (*last_tail)->h;
+	int bx = (*tail)->dst_x;
+	int by = (*tail)->dst_y;
+	int bw = (*tail)->w;
+	int bs = (*tail)->stride;
+	int bh = (*tail)->h;
+	unsigned char* a;
+	unsigned char* b;
+
+	if ((*last_tail)->bitmap == (*tail)->bitmap)
+		return;
+
+	if ((*last_tail)->color != (*tail)->color)
+		return;
+
+	// Calculate overlap coordinates
+	left = (ax > bx) ? ax : bx;
+	top = (ay > by) ? ay : by;
+	right = ((ax+aw) < (bx+bw)) ? (ax+aw) : (bx+bw);
+	bottom = ((ay+ah) < (by+bh)) ? (ay+ah) : (by+bh);
+	if ((right <= left) || (bottom <= top))
+		return;
+	old_left = left-ax;
+	old_top = top-ay;
+	w = right-left;
+	h = bottom-top;
+	cur_left = left-bx;
+	cur_top = top-by;
+
+	// Query cache
+	memcpy(&hk.a, last_hash, sizeof(*last_hash));
+	memcpy(&hk.b, hash, sizeof(*hash));
+	hk.aw = aw;
+	hk.ah = ah;
+	hk.bw = bw;
+	hk.bh = bh;
+	hk.ax = ax;
+	hk.ay = ay;
+	hk.bx = bx;
+	hk.by = by;
+	hv = cache_find_composite(&hk);
+	if (hv) {
+		(*last_tail)->bitmap = hv->a;
+		(*tail)->bitmap = hv->b;
+		return;
+	}
+
+	// Allocate new bitmaps and copy over data
+	a = (*last_tail)->bitmap;
+	b = (*tail)->bitmap;
+	(*last_tail)->bitmap = malloc(as*ah);
+	(*tail)->bitmap = malloc(bs*bh);
+	memcpy((*last_tail)->bitmap, a, as*ah);
+	memcpy((*tail)->bitmap, b, bs*bh);
+
+	// Composite overlapping area
+	for (y=0; y<h; y++)
+		for (x=0; x<w; x++) {
+			opos = (old_top+y)*(as) + (old_left+x);
+			cpos = (cur_top+y)*(bs) + (cur_left+x);
+			m = (a[opos] > b[cpos]) ? a[opos] : b[cpos];
+			(*last_tail)->bitmap[opos] = 0;
+			(*tail)->bitmap[cpos] = m;
+		}
+
+	// Insert bitmaps into the cache
+	nhk = calloc(1, sizeof(*nhk));
+	memcpy(nhk, &hk, sizeof(*nhk));
+	hv = calloc(1, sizeof(*hv));
+	hv->a = (*last_tail)->bitmap;
+	hv->b = (*tail)->bitmap;
+	cache_add_composite(nhk, hv);
+}
+
+/**
  * \brief Convert text_info_t struct to ass_image_t list
  * Splits glyphs in halves when needed (for \kf karaoke).
  */
@@ -409,19 +510,28 @@ static ass_image_t* render_text(text_info_t* text_info, int dst_x, int dst_y)
 	bitmap_t* bm;
 	ass_image_t* head;
 	ass_image_t** tail = &head;
+	ass_image_t** last_tail = 0;
+	ass_image_t** here_tail = 0;
+	bitmap_hash_key_t* last_hash = 0;
 
 	for (i = 0; i < text_info->length; ++i) {
 		glyph_info_t* info = text_info->glyphs + i;
 		if ((info->symbol == 0) || (info->symbol == '\n') || !info->bm_s || (info->shadow == 0))
 			continue;
 
-		pen_x = dst_x + info->pos.x + info->shadow;
-		pen_y = dst_y + info->pos.y + info->shadow;
+		pen_x = dst_x + info->pos.x + ROUND(info->shadow * frame_context.border_scale);
+		pen_y = dst_y + info->pos.y + ROUND(info->shadow * frame_context.border_scale);
 		bm = info->bm_s;
 
+		here_tail = tail;
 		tail = render_glyph(bm, pen_x, pen_y, info->c[3], 0, 1000000, tail);
+		if (last_tail && tail != here_tail && ((info->c[3] & 0xff) > 0))
+			render_overlap(last_tail, here_tail, last_hash, &info->hash_key);
+		last_tail = here_tail;
+		last_hash = &info->hash_key;
 	}
 
+	last_tail = 0;
 	for (i = 0; i < text_info->length; ++i) {
 		glyph_info_t* info = text_info->glyphs + i;
 		if ((info->symbol == 0) || (info->symbol == '\n') || !info->bm_o)
@@ -433,8 +543,14 @@ static ass_image_t* render_text(text_info_t* text_info, int dst_x, int dst_y)
 		
 		if ((info->effect_type == EF_KARAOKE_KO) && (info->effect_timing <= info->bbox.xMax)) {
 			// do nothing
-		} else
+		} else {
+			here_tail = tail;
 			tail = render_glyph(bm, pen_x, pen_y, info->c[2], 0, 1000000, tail);
+			if (last_tail && tail != here_tail && ((info->c[2] & 0xff) > 0))
+				render_overlap(last_tail, here_tail, last_hash, &info->hash_key);
+			last_tail = here_tail;
+			last_hash = &info->hash_key;
+		}
 	}
 	for (i = 0; i < text_info->length; ++i) {
 		glyph_info_t* info = text_info->glyphs + i;
@@ -467,17 +583,22 @@ static int x2scr(double x) {
 	return x*frame_context.orig_width_nocrop / frame_context.track->PlayResX +
 		FFMAX(global_settings->left_margin, 0);
 }
-static int x2scr_pos(double x) {
+static double x2scr_pos(double x) {
 	return x*frame_context.orig_width / frame_context.track->PlayResX +
 		global_settings->left_margin;
 }
 /**
  * \brief Mapping between script and screen coordinates
  */
-static int y2scr(double y) {
+static double y2scr(double y) {
 	return y * frame_context.orig_height_nocrop / frame_context.track->PlayResY +
 		FFMAX(global_settings->top_margin, 0);
 }
+static double y2scr_pos(double y) {
+	return y * frame_context.orig_height / frame_context.track->PlayResY +
+		global_settings->top_margin;
+}
+
 // the same for toptitles
 static int y2scr_top(double y) {
 	if (global_settings->use_margins)
@@ -556,6 +677,7 @@ static void update_font(void)
 	ass_renderer_t* priv = frame_context.ass_priv;
 	ass_font_desc_t desc;
 	desc.family = strdup(render_context.family);
+	desc.treat_family_as_pattern = render_context.treat_family_as_pattern;
 
 	val = render_context.bold;
 	// 0 = normal, 1 = bold, >1 = exact weight
@@ -780,29 +902,29 @@ static char* parse_tag(char* p, double pwr) {
 			val = -1.; // reset to default
 		change_border(val);
 	} else if (mystrcmp(&p, "move")) {
-		int x1, x2, y1, y2;
+		double x1, x2, y1, y2;
 		long long t1, t2, delta_t, t;
 		double x, y;
 		double k;
 		skip('(');
-		mystrtoi(&p, &x1);
+		mystrtod(&p, &x1);
 		skip(',');
-		mystrtoi(&p, &y1);
+		mystrtod(&p, &y1);
 		skip(',');
-		mystrtoi(&p, &x2);
+		mystrtod(&p, &x2);
 		skip(',');
-		mystrtoi(&p, &y2);
+		mystrtod(&p, &y2);
 		if (*p == ',') {
 			skip(',');
 			mystrtoll(&p, &t1);
 			skip(',');
 			mystrtoll(&p, &t2);
-			mp_msg(MSGT_ASS, MSGL_DBG2, "movement6: (%d, %d) -> (%d, %d), (%" PRId64 " .. %" PRId64 ")\n", 
+			mp_msg(MSGT_ASS, MSGL_DBG2, "movement6: (%f, %f) -> (%f, %f), (%" PRId64 " .. %" PRId64 ")\n", 
 				x1, y1, x2, y2, (int64_t)t1, (int64_t)t2);
 		} else {
 			t1 = 0;
 			t2 = render_context.event->Duration;
-			mp_msg(MSGT_ASS, MSGL_DBG2, "movement: (%d, %d) -> (%d, %d)\n", x1, y1, x2, y2);
+			mp_msg(MSGT_ASS, MSGL_DBG2, "movement: (%f, %f) -> (%f, %f)\n", x1, y1, x2, y2);
 		}
 		skip(')');
 		delta_t = t2 - t1;
@@ -888,13 +1010,13 @@ static char* parse_tag(char* p, double pwr) {
 		else
 			render_context.alignment = render_context.style->Alignment;
 	} else if (mystrcmp(&p, "pos")) {
-		int v1, v2;
+		double v1, v2;
 		skip('(');
-		mystrtoi(&p, &v1);
+		mystrtod(&p, &v1);
 		skip(',');
-		mystrtoi(&p, &v2);
+		mystrtod(&p, &v2);
 		skip(')');
-		mp_msg(MSGT_ASS, MSGL_DBG2, "pos(%d, %d)\n", v1, v2);
+		mp_msg(MSGT_ASS, MSGL_DBG2, "pos(%f, %f)\n", v1, v2);
 		if (render_context.evt_type != EVENT_POSITIONED) {
 			render_context.evt_type = EVENT_POSITIONED;
 			render_context.detect_collisions = 0;
@@ -944,10 +1066,12 @@ static char* parse_tag(char* p, double pwr) {
 		skip(')');
 		mp_msg(MSGT_ASS, MSGL_DBG2, "org(%d, %d)\n", v1, v2);
 		//				render_context.evt_type = EVENT_POSITIONED;
-		render_context.org_x = v1;
-		render_context.org_y = v2;
-		render_context.have_origin = 1;
-		render_context.detect_collisions = 0;
+		if (!render_context.have_origin) {
+			render_context.org_x = v1;
+			render_context.org_y = v2;
+			render_context.have_origin = 1;
+			render_context.detect_collisions = 0;
+		}
 	} else if (mystrcmp(&p, "t")) {
 		double v[3];
 		int v1, v2;
@@ -1044,9 +1168,9 @@ static char* parse_tag(char* p, double pwr) {
 	} else if (mystrcmp(&p, "be")) {
 		int val;
 		if (mystrtoi(&p, &val)) {
-			// Clamp to 10, since high values need excessive CPU
+			// Clamp to a safe upper limit, since high values need excessive CPU
 			val = (val < 0) ? 0 : val;
-			val = (val > 10) ? 10 : val;
+			val = (val > MAX_BE) ? MAX_BE : val;
 			render_context.be = val;
 		} else
 			render_context.be = 0;
@@ -1237,6 +1361,7 @@ static void reset_render_context(void)
 	if (render_context.family)
 		free(render_context.family);
 	render_context.family = strdup(render_context.style->FontName);
+	render_context.treat_family_as_pattern = render_context.style->treat_fontname_as_pattern;
 	render_context.bold = render_context.style->Bold;
 	render_context.italic = render_context.style->Italic;
 	update_font();
@@ -1387,10 +1512,9 @@ static void get_bitmap_glyph(glyph_info_t* info)
 
 			// render glyph
 			error = glyph_to_bitmap(ass_renderer->synth_priv,
-					ass_renderer->synth_priv_blur,
 					info->glyph, info->outline_glyph,
 					&info->bm, &info->bm_o,
-					&info->bm_s, info->be, info->blur);
+					&info->bm_s, info->be, info->blur * frame_context.border_scale);
 			if (error)
 				info->symbol = 0;
 
@@ -1680,75 +1804,46 @@ static void get_base_point(FT_BBox bbox, int alignment, int* bx, int* by)
 }
 
 /**
- * \brief Multiply 4-vector by 4-matrix
- * \param a 4-vector
- * \param m 4-matrix]
- * \param b out: 4-vector
- * Calculates a * m and stores result in b
+ * \brief Apply transformation to outline points of a glyph
+ * Applies rotations given by frx, fry and frz and projects the points back
+ * onto the screen plane.
  */
-static inline void transform_point_3d(double *a, double *m, double *b)
-{
-	b[0] = a[0] * m[0] + a[1] * m[4] + a[2] * m[8] +  a[3] * m[12];
-	b[1] = a[0] * m[1] + a[1] * m[5] + a[2] * m[9] +  a[3] * m[13];
-	b[2] = a[0] * m[2] + a[1] * m[6] + a[2] * m[10] + a[3] * m[14];
-	b[3] = a[0] * m[3] + a[1] * m[7] + a[2] * m[11] + a[3] * m[15];
-}
-
-/**
- * \brief Apply 3d transformation to a vector
- * \param v FreeType vector (2d)
- * \param m 4-matrix
- * Transforms v by m, projects the result back to the screen plane
- * Result is returned in v.
- */
-static inline void transform_vector_3d(FT_Vector* v, double *m) {
-	const double camera = 2500 * frame_context.border_scale; // camera distance
-	const double cutoff_z = 10.;
-	double a[4], b[4];
-	a[0] = d6_to_double(v->x);
-	a[1] = d6_to_double(v->y);
-	a[2] = 0.;
-	a[3] = 1.;
-	transform_point_3d(a, m, b);
-	/* Apply perspective projection with the following matrix:
-	   2500     0     0     0
-	      0  2500     0     0
-	      0     0     0     0
-	      0     0     8     2500
-	   where 2500 is camera distance, 8 - z-axis scale.
-	   Camera is always located in (org_x, org_y, -2500). This means
-	   that different subtitle events can be displayed at the same time
-	   using different cameras. */
-	b[0] *= camera;
-	b[1] *= camera;
-	b[3] = 8 * b[2] + camera;
-	if (b[3] < cutoff_z)
-		b[3] = cutoff_z;
-	v->x = double_to_d6(b[0] / b[3]);
-	v->y = double_to_d6(b[1] / b[3]);
-}
-
-/**
- * \brief Apply 3d transformation to a glyph
- * \param glyph FreeType glyph
- * \param m 4-matrix
- * Transforms glyph by m, projects the result back to the screen plane
- * Result is returned in glyph.
- */
-static inline void transform_glyph_3d(FT_Glyph glyph, double *m, FT_Vector shift) {
-	int i;
-	FT_Outline* outline = &((FT_OutlineGlyph)glyph)->outline;
+static void transform_3d_points(FT_Vector shift, FT_Glyph glyph, double frx, double fry, double frz) {
+	double sx = sin(frx);
+	double sy = sin(fry);
+	double sz = sin(frz);
+	double cx = cos(frx);
+	double cy = cos(fry);
+	double cz = cos(frz);
+	FT_Outline *outline = &((FT_OutlineGlyph) glyph)->outline;
 	FT_Vector* p = outline->points;
+	double x, y, z, xx, yy, zz;
+	int i;
 
 	for (i=0; i<outline->n_points; i++) {
-		p[i].x += shift.x;
-		p[i].y += shift.y;
-		transform_vector_3d(p + i, m);
-		p[i].x -= shift.x;
-		p[i].y -= shift.y;
-	}
+		x = p[i].x + shift.x;
+		y = p[i].y + shift.y;
+		z = 0.;
+
+		xx = x*cz + y*sz;
+		yy = -(x*sz - y*cz);
+		zz = z;
+
+		x = xx;
+		y = yy*cx + zz*sx;
+		z = yy*sx - zz*cx;
 
-	//transform_vector_3d(&glyph->advance, m);
+		xx = x*cy + z*sy;
+		yy = y;
+		zz = x*sy - z*cy;
+
+		zz = FFMAX(zz, -19000);
+
+		x = (xx * 20000) / (zz + 20000);
+		y = (yy * 20000) / (zz + 20000);
+		p[i].x = x - shift.x + 0.5;
+		p[i].y = y - shift.y + 0.5;
+	}
 }
 
 /**
@@ -1763,28 +1858,18 @@ static inline void transform_glyph_3d(FT_Glyph glyph, double *m, FT_Vector shift
  */
 static void transform_3d(FT_Vector shift, FT_Glyph* glyph, FT_Glyph* glyph2, double frx, double fry, double frz)
 {
-	fry = - fry; // FreeType's y axis goes in the opposite direction
+	frx = - frx;
+	frz = - frz;
 	if (frx != 0. || fry != 0. || frz != 0.) {
-		double m[16];
-		double sx = sin(frx);
-		double sy = sin(fry);
- 		double sz = sin(frz);
-		double cx = cos(frx);
-		double cy = cos(fry);
-		double cz = cos(frz);
-		m[0] = cy * cz;            m[1] = cy*sz;              m[2]  = -sy;    m[3] = 0.0;
-		m[4] = -cx*sz + sx*sy*cz;  m[5] = cx*cz + sx*sy*sz;   m[6]  = sx*cy;  m[7] = 0.0;
-		m[8] = sx*sz + cx*sy*cz;   m[9] = -sx*cz + cx*sy*sz;  m[10] = cx*cy;  m[11] = 0.0;
-		m[12] = 0.0;               m[13] = 0.0;               m[14] = 0.0;    m[15] = 1.0;
-
 		if (glyph && *glyph)
-			transform_glyph_3d(*glyph, m, shift);
+			transform_3d_points(shift, *glyph, frx, fry, frz);
 
 		if (glyph2 && *glyph2)
-			transform_glyph_3d(*glyph2, m, shift);
+			transform_3d_points(shift, *glyph2, frx, fry, frz);
 	}
 }
 
+
 /**
  * \brief Main ass rendering function, glues everything together
  * \param event event to render
@@ -1852,8 +1937,13 @@ static int ass_render_event(ass_event_t* event, event_images_t* event_images)
 			pen.y += delta.y * render_context.scale_y;
 		}
 
-		shift.x = pen.x & 63;
-		shift.y = pen.y & 63;
+		shift.x = pen.x & SUBPIXEL_MASK;
+		shift.y = pen.y & SUBPIXEL_MASK;
+
+		if (render_context.evt_type == EVENT_POSITIONED) {
+			shift.x += double_to_d6(x2scr_pos(render_context.pos_x)) & SUBPIXEL_MASK;
+			shift.y -= double_to_d6(y2scr_pos(render_context.pos_y)) & SUBPIXEL_MASK;
+		}
 
 		ass_font_set_transform(render_context.font,
 				       render_context.scale_x * frame_context.font_scale_x,
@@ -2019,15 +2109,15 @@ static int ass_render_event(ass_event_t* event, event_images_t* event_images)
 		mp_msg(MSGT_ASS, MSGL_DBG2, "positioned event at %f, %f\n", render_context.pos_x, render_context.pos_y);
 		get_base_point(bbox, alignment, &base_x, &base_y);
 		device_x = x2scr_pos(render_context.pos_x) - base_x;
-		device_y = y2scr(render_context.pos_y) - base_y;
+		device_y = y2scr_pos(render_context.pos_y) - base_y;
 	}
 	
 	// fix clip coordinates (they depend on alignment)
-	render_context.clip_x0 = x2scr(render_context.clip_x0);
-	render_context.clip_x1 = x2scr(render_context.clip_x1);
 	if (render_context.evt_type == EVENT_NORMAL ||
 	    render_context.evt_type == EVENT_HSCROLL ||
 	    render_context.evt_type == EVENT_VSCROLL) {
+		render_context.clip_x0 = x2scr(render_context.clip_x0);
+		render_context.clip_x1 = x2scr(render_context.clip_x1);
 		if (valign == VALIGN_TOP) {
 			render_context.clip_y0 = y2scr_top(render_context.clip_y0);
 			render_context.clip_y1 = y2scr_top(render_context.clip_y1);
@@ -2039,8 +2129,10 @@ static int ass_render_event(ass_event_t* event, event_images_t* event_images)
 			render_context.clip_y1 = y2scr_sub(render_context.clip_y1);
 		}
 	} else if (render_context.evt_type == EVENT_POSITIONED) {
-		render_context.clip_y0 = y2scr(render_context.clip_y0);
-		render_context.clip_y1 = y2scr(render_context.clip_y1);
+		render_context.clip_x0 = x2scr_pos(render_context.clip_x0);
+		render_context.clip_x1 = x2scr_pos(render_context.clip_x1);
+		render_context.clip_y0 = y2scr_pos(render_context.clip_y0);
+		render_context.clip_y1 = y2scr_pos(render_context.clip_y1);
 	}
 
 	// calculate rotation parameters
@@ -2104,6 +2196,7 @@ static void ass_reconfigure(ass_renderer_t* priv)
 	priv->render_id = ++last_render_id;
 	ass_glyph_cache_reset();
 	ass_bitmap_cache_reset();
+	ass_composite_cache_reset();
 	ass_free_images(priv->prev_images_root);
 	priv->prev_images_root = 0;
 }
@@ -2226,12 +2319,12 @@ static int ass_start_frame(ass_renderer_t *priv, ass_track_t* track, long long n
 	
 	frame_context.font_scale = global_settings->font_size_coeff *
 	                           frame_context.orig_height / frame_context.track->PlayResY;
-	frame_context.border_scale = ((double)frame_context.orig_height) / frame_context.track->PlayResY;
-
-	if (frame_context.orig_width * track->PlayResY == frame_context.orig_height * track->PlayResX)
-		frame_context.font_scale_x = 1.;
+	if (frame_context.track->ScaledBorderAndShadow)
+		frame_context.border_scale = ((double)frame_context.orig_height) / frame_context.track->PlayResY;
 	else
-		frame_context.font_scale_x = ((double)(frame_context.orig_width * track->PlayResY)) / (frame_context.orig_height * track->PlayResX);
+		frame_context.border_scale = 1.;
+
+	frame_context.font_scale_x = 1.;
 
 	priv->prev_images_root = priv->images_root;
 	priv->images_root = 0;
diff --git a/libass/ass_types.h b/libass/ass_types.h
index 870fab4..01c36c5 100644
--- a/libass/ass_types.h
+++ b/libass/ass_types.h
@@ -58,6 +58,7 @@ typedef struct ass_style_s {
 	int MarginV;
 //        int AlphaLevel;
 	int Encoding;
+	int treat_fontname_as_pattern;
 } ass_style_t;
 
 typedef struct render_priv_s render_priv_t;
@@ -105,6 +106,7 @@ typedef struct ass_track_s {
 	int PlayResY;
 	double Timer;
 	int WrapStyle;
+	char ScaledBorderAndShadow;
 
 	
 	int default_style; // index of default style
diff --git a/libass/ass_utils.c b/libass/ass_utils.c
index 25e4d4f..7f728f1 100644
--- a/libass/ass_utils.c
+++ b/libass/ass_utils.c
@@ -96,6 +96,17 @@ int strtocolor(char** q, uint32_t* res)
 	return result;
 }
 
+// Return a boolean value for a string
+char parse_bool(char* str) {
+	while (*str == ' ' || *str == '\t')
+		str++;
+	if (!strncasecmp(str, "yes", 3))
+		return 1;
+	else if (strtol(str, NULL, 10) > 0)
+		return 1;
+	return 0;
+}
+
 #if 0
 static void sprint_tag(uint32_t tag, char* dst)
 {
diff --git a/libass/ass_utils.h b/libass/ass_utils.h
index f37bc0e..8c5f3e8 100644
--- a/libass/ass_utils.h
+++ b/libass/ass_utils.h
@@ -30,6 +30,7 @@ int mystrtoll(char** p, long long* res);
 int mystrtou32(char** p, int base, uint32_t* res);
 int mystrtod(char** p, double* res);
 int strtocolor(char** q, uint32_t* res);
+char parse_bool(char* str);
 
 static inline int d6_to_int(int x) {
 	return (x + 32) >> 6;
diff --git a/libavcodec/.svnrevision b/libavcodec/.svnrevision
index f8ba6ba..5883118 100644
--- a/libavcodec/.svnrevision
+++ b/libavcodec/.svnrevision
@@ -1 +1 @@
-17737
+18693
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index afa5fac..5067354 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -533,5 +533,4 @@ DIRS = alpha arm bfin mlib ppc ps2 sh4 sparc x86
 
 include $(SUBDIR)../subdir.mak
 
-$(SUBDIR)dct-test$(EXESUF): $(SUBDIR)fdctref.o $(SUBDIR)aandcttab.o
-$(SUBDIR)fft-test$(EXESUF): $(SUBDIR)fdctref.o
+$(SUBDIR)dct-test$(EXESUF): $(SUBDIR)dctref.o $(SUBDIR)aandcttab.o
diff --git a/libavcodec/bitstream.h b/libavcodec/bitstream.h
index 0b336f7..e1ec934 100644
--- a/libavcodec/bitstream.h
+++ b/libavcodec/bitstream.h
@@ -713,7 +713,9 @@ static inline unsigned int show_bits_long(GetBitContext *s, int n){
     if(n<=17) return show_bits(s, n);
     else{
         GetBitContext gb= *s;
-        return get_bits_long(&gb, n);
+        int ret= get_bits_long(s, n);
+        *s= gb;
+        return ret;
     }
 }
 
diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c
index fef142f..48e7c5a 100644
--- a/libavcodec/dct-test.c
+++ b/libavcodec/dct-test.c
@@ -46,9 +46,9 @@
 void *fast_memcpy(void *a, const void *b, size_t c){return memcpy(a,b,c);};
 
 /* reference fdct/idct */
-void fdct(DCTELEM *block);
-void idct(DCTELEM *block);
-void init_fdct(void);
+void ff_ref_fdct(DCTELEM *block);
+void ff_ref_idct(DCTELEM *block);
+void ff_ref_dct_init(void);
 
 void ff_mmx_idct(DCTELEM *data);
 void ff_mmxext_idct(DCTELEM *data);
@@ -90,57 +90,57 @@ struct algo {
 static int cpu_flags;
 
 struct algo algos[] = {
-  {"REF-DBL",         0, fdct,               fdct, NO_PERM},
-  {"FAAN",            0, ff_faandct,         fdct, FAAN_SCALE},
-  {"FAANI",           1, ff_faanidct,        idct, NO_PERM},
-  {"IJG-AAN-INT",     0, fdct_ifast,         fdct, SCALE_PERM},
-  {"IJG-LLM-INT",     0, ff_jpeg_fdct_islow, fdct, NO_PERM},
-  {"REF-DBL",         1, idct,               idct, NO_PERM},
-  {"INT",             1, j_rev_dct,          idct, MMX_PERM},
-  {"SIMPLE-C",        1, ff_simple_idct,     idct, NO_PERM},
+  {"REF-DBL",         0, ff_ref_fdct,        ff_ref_fdct, NO_PERM},
+  {"FAAN",            0, ff_faandct,         ff_ref_fdct, FAAN_SCALE},
+  {"FAANI",           1, ff_faanidct,        ff_ref_idct, NO_PERM},
+  {"IJG-AAN-INT",     0, fdct_ifast,         ff_ref_fdct, SCALE_PERM},
+  {"IJG-LLM-INT",     0, ff_jpeg_fdct_islow, ff_ref_fdct, NO_PERM},
+  {"REF-DBL",         1, ff_ref_idct,        ff_ref_idct, NO_PERM},
+  {"INT",             1, j_rev_dct,          ff_ref_idct, MMX_PERM},
+  {"SIMPLE-C",        1, ff_simple_idct,     ff_ref_idct, NO_PERM},
 
 #if HAVE_MMX
-  {"MMX",             0, ff_fdct_mmx,        fdct, NO_PERM, FF_MM_MMX},
+  {"MMX",             0, ff_fdct_mmx,        ff_ref_fdct, NO_PERM, FF_MM_MMX},
 #if HAVE_MMX2
-  {"MMX2",            0, ff_fdct_mmx2,       fdct, NO_PERM, FF_MM_MMXEXT},
-  {"SSE2",            0, ff_fdct_sse2,       fdct, NO_PERM, FF_MM_SSE2},
+  {"MMX2",            0, ff_fdct_mmx2,       ff_ref_fdct, NO_PERM, FF_MM_MMXEXT},
+  {"SSE2",            0, ff_fdct_sse2,       ff_ref_fdct, NO_PERM, FF_MM_SSE2},
 #endif
 
 #if CONFIG_GPL
-  {"LIBMPEG2-MMX",    1, ff_mmx_idct,        idct, MMX_PERM, FF_MM_MMX},
-  {"LIBMPEG2-MMXEXT", 1, ff_mmxext_idct,     idct, MMX_PERM, FF_MM_MMXEXT},
+  {"LIBMPEG2-MMX",    1, ff_mmx_idct,        ff_ref_idct, MMX_PERM, FF_MM_MMX},
+  {"LIBMPEG2-MMXEXT", 1, ff_mmxext_idct,     ff_ref_idct, MMX_PERM, FF_MM_MMXEXT},
 #endif
-  {"SIMPLE-MMX",      1, ff_simple_idct_mmx, idct, MMX_SIMPLE_PERM, FF_MM_MMX},
-  {"XVID-MMX",        1, ff_idct_xvid_mmx,   idct, NO_PERM, FF_MM_MMX},
-  {"XVID-MMX2",       1, ff_idct_xvid_mmx2,  idct, NO_PERM, FF_MM_MMXEXT},
-  {"XVID-SSE2",       1, ff_idct_xvid_sse2,  idct, SSE2_PERM, FF_MM_SSE2},
+  {"SIMPLE-MMX",      1, ff_simple_idct_mmx, ff_ref_idct, MMX_SIMPLE_PERM, FF_MM_MMX},
+  {"XVID-MMX",        1, ff_idct_xvid_mmx,   ff_ref_idct, NO_PERM, FF_MM_MMX},
+  {"XVID-MMX2",       1, ff_idct_xvid_mmx2,  ff_ref_idct, NO_PERM, FF_MM_MMXEXT},
+  {"XVID-SSE2",       1, ff_idct_xvid_sse2,  ff_ref_idct, SSE2_PERM, FF_MM_SSE2},
 #endif
 
 #if HAVE_ALTIVEC
-  {"altivecfdct",     0, fdct_altivec,       fdct, NO_PERM, FF_MM_ALTIVEC},
+  {"altivecfdct",     0, fdct_altivec,       ff_ref_fdct, NO_PERM, FF_MM_ALTIVEC},
 #endif
 
 #if ARCH_BFIN
-  {"BFINfdct",        0, ff_bfin_fdct,       fdct, NO_PERM},
-  {"BFINidct",        1, ff_bfin_idct,       idct, NO_PERM},
+  {"BFINfdct",        0, ff_bfin_fdct,       ff_ref_fdct, NO_PERM},
+  {"BFINidct",        1, ff_bfin_idct,       ff_ref_idct, NO_PERM},
 #endif
 
 #if ARCH_ARM
-  {"SIMPLE-ARM",      1, simple_idct_ARM,    idct, NO_PERM },
-  {"INT-ARM",         1, j_rev_dct_ARM,      idct, MMX_PERM },
+  {"SIMPLE-ARM",      1, simple_idct_ARM,    ff_ref_idct, NO_PERM },
+  {"INT-ARM",         1, j_rev_dct_ARM,      ff_ref_idct, MMX_PERM },
 #if HAVE_ARMV5TE
-  {"SIMPLE-ARMV5TE",  1, simple_idct_armv5te, idct, NO_PERM },
+  {"SIMPLE-ARMV5TE",  1, simple_idct_armv5te, ff_ref_idct, NO_PERM },
 #endif
 #if HAVE_ARMV6
-  {"SIMPLE-ARMV6",    1, ff_simple_idct_armv6, idct, MMX_PERM },
+  {"SIMPLE-ARMV6",    1, ff_simple_idct_armv6, ff_ref_idct, MMX_PERM },
 #endif
 #if HAVE_NEON
-  {"SIMPLE-NEON",     1, ff_simple_idct_neon, idct, PARTTRANS_PERM },
+  {"SIMPLE-NEON",     1, ff_simple_idct_neon, ff_ref_idct, PARTTRANS_PERM },
 #endif
 #endif /* ARCH_ARM */
 
 #if ARCH_ALPHA
-  {"SIMPLE-ALPHA",    1, ff_simple_idct_axp,  idct, NO_PERM },
+  {"SIMPLE-ALPHA",    1, ff_simple_idct_axp,  ff_ref_idct, NO_PERM },
 #endif
 
   { 0 }
@@ -222,7 +222,7 @@ void dct_error(const char *name, int is_idct,
             for(i=0;i<64;i++)
                 block1[i] = (random() % 512) -256;
             if (is_idct){
-                fdct(block1);
+                ff_ref_fdct(block1);
 
                 for(i=0;i<64;i++)
                     block1[i]>>=3;
@@ -336,7 +336,7 @@ void dct_error(const char *name, int is_idct,
         for(i=0;i<64;i++)
             block1[i] = (random() % 512) -256;
         if (is_idct){
-            fdct(block1);
+            ff_ref_fdct(block1);
 
             for(i=0;i<64;i++)
                 block1[i]>>=3;
@@ -559,7 +559,7 @@ int main(int argc, char **argv)
     int test=1;
     cpu_flags = mm_support();
 
-    init_fdct();
+    ff_ref_dct_init();
     idct_mmx_init();
 
     for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;
diff --git a/libavcodec/dctref.c b/libavcodec/dctref.c
new file mode 100644
index 0000000..faad057
--- /dev/null
+++ b/libavcodec/dctref.c
@@ -0,0 +1,121 @@
+/*
+ * reference discrete cosine transform (double precision)
+ * Copyright (C) 2009 Dylan Yudaken
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file libavcodec/dctref.c
+ * reference discrete cosine transform (double precision)
+ *
+ * @author Dylan Yudaken (dyudaken at gmail)
+ *
+ * @note This file could be optimized a lot, but is for
+ * reference and so readability is better.
+ */
+
+#include "libavutil/mathematics.h"
+static double coefficients[8 * 8];
+
+/**
+ * Initialize the double precision discrete cosine transform
+ * functions fdct & idct.
+ */
+av_cold void ff_ref_dct_init(void)
+{
+    unsigned int i, j;
+
+    for (j = 0; j < 8; ++j) {
+        coefficients[j] = sqrt(0.125);
+        for (i = 8; i < 64; i += 8) {
+            coefficients[i + j] = 0.5 * cos(i * (j + 0.5) * M_PI / 64.0);
+        }
+    }
+}
+
+/**
+ * Transform 8x8 block of data with a double precision forward DCT <br>
+ * This is a reference implementation.
+ *
+ * @param block pointer to 8x8 block of data to transform
+ */
+void ff_ref_fdct(short *block)
+{
+    /* implement the equation: block = coefficients * block * coefficients' */
+
+    unsigned int i, j, k;
+    double out[8 * 8];
+
+    /* out = coefficients * block */
+    for (i = 0; i < 64; i += 8) {
+        for (j = 0; j < 8; ++j) {
+            double tmp = 0;
+            for (k = 0; k < 8; ++k) {
+                tmp += coefficients[i + k] * block[k * 8 + j];
+            }
+            out[i + j] = tmp * 8;
+        }
+    }
+
+    /* block = out * (coefficients') */
+    for (j = 0; j < 8; ++j) {
+        for (i = 0; i < 64; i += 8) {
+            double tmp = 0;
+            for (k = 0; k < 8; ++k) {
+                tmp += out[i + k] * coefficients[j * 8 + k];
+            }
+            block[i + j] = floor(tmp + 0.499999999999);
+        }
+    }
+}
+
+/**
+ * Transform 8x8 block of data with a double precision inverse DCT <br>
+ * This is a reference implementation.
+ *
+ * @param block pointer to 8x8 block of data to transform
+ */
+void ff_ref_idct(short *block)
+{
+    /* implement the equation: block = (coefficients') * block * coefficients */
+
+    unsigned int i, j, k;
+    double out[8 * 8];
+
+    /* out = block * coefficients */
+    for (i = 0; i < 64; i += 8) {
+        for (j = 0; j < 8; ++j) {
+            double tmp = 0;
+            for (k = 0; k < 8; ++k) {
+                tmp += block[i + k] * coefficients[k * 8 + j];
+            }
+            out[i + j] = tmp;
+        }
+    }
+
+    /* block = (coefficients') * out */
+    for (i = 0; i < 8; ++i) {
+        for (j = 0; j < 8; ++j) {
+            double tmp = 0;
+            for (k = 0; k < 64; k += 8) {
+                tmp += coefficients[k + i] * out[k + j];
+            }
+            block[i * 8 + j] = floor(tmp + 0.5);
+        }
+    }
+}
diff --git a/libavcodec/fdctref.c b/libavcodec/fdctref.c
deleted file mode 100644
index 164883d..0000000
--- a/libavcodec/fdctref.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * @file libavcodec/fdctref.c
- * forward discrete cosine transform, double precision.
- */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose.  In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders.  Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- */
-
-#include <math.h>
-
-#ifndef PI
-# ifdef M_PI
-#  define PI M_PI
-# else
-#  define PI 3.14159265358979323846
-# endif
-#endif
-
-/* global declarations */
-void init_fdct (void);
-void fdct (short *block);
-
-/* private data */
-static double c[8][8]; /* transform coefficients */
-
-void init_fdct(void)
-{
-  int i, j;
-  double s;
-
-  for (i=0; i<8; i++)
-  {
-    s = (i==0) ? sqrt(0.125) : 0.5;
-
-    for (j=0; j<8; j++)
-      c[i][j] = s * cos((PI/8.0)*i*(j+0.5));
-  }
-}
-
-void fdct(block)
-short *block;
-{
-        register int i, j;
-        double s;
-        double tmp[64];
-
-        for(i = 0; i < 8; i++)
-            for(j = 0; j < 8; j++)
-            {
-                    s = 0.0;
-
-/*
- *                     for(k = 0; k < 8; k++)
- *                         s += c[j][k] * block[8 * i + k];
- */
-                s += c[j][0] * block[8 * i + 0];
-                s += c[j][1] * block[8 * i + 1];
-                s += c[j][2] * block[8 * i + 2];
-                s += c[j][3] * block[8 * i + 3];
-                s += c[j][4] * block[8 * i + 4];
-                s += c[j][5] * block[8 * i + 5];
-                s += c[j][6] * block[8 * i + 6];
-                s += c[j][7] * block[8 * i + 7];
-
-                    tmp[8 * i + j] = s;
-            }
-
-        for(j = 0; j < 8; j++)
-            for(i = 0; i < 8; i++)
-            {
-                    s = 0.0;
-
-/*
- *                       for(k = 0; k < 8; k++)
- *                    s += c[i][k] * tmp[8 * k + j];
- */
-                s += c[i][0] * tmp[8 * 0 + j];
-                s += c[i][1] * tmp[8 * 1 + j];
-                s += c[i][2] * tmp[8 * 2 + j];
-                s += c[i][3] * tmp[8 * 3 + j];
-                s += c[i][4] * tmp[8 * 4 + j];
-                s += c[i][5] * tmp[8 * 5 + j];
-                s += c[i][6] * tmp[8 * 6 + j];
-                s += c[i][7] * tmp[8 * 7 + j];
-                s*=8.0;
-
-                    block[8 * i + j] = (short)floor(s + 0.499999);
-/*
- * reason for adding 0.499999 instead of 0.5:
- * s is quite often x.5 (at least for i and/or j = 0 or 4)
- * and setting the rounding threshold exactly to 0.5 leads to an
- * extremely high arithmetic implementation dependency of the result;
- * s being between x.5 and x.500001 (which is now incorrectly rounded
- * downwards instead of upwards) is assumed to occur less often
- * (if at all)
- */
-      }
-}
-
-/* perform IDCT matrix multiply for 8x8 coefficient block */
-
-void idct(block)
-short *block;
-{
-  int i, j, k, v;
-  double partial_product;
-  double tmp[64];
-
-  for (i=0; i<8; i++)
-    for (j=0; j<8; j++)
-    {
-      partial_product = 0.0;
-
-      for (k=0; k<8; k++)
-        partial_product+= c[k][j]*block[8*i+k];
-
-      tmp[8*i+j] = partial_product;
-    }
-
-  /* Transpose operation is integrated into address mapping by switching
-     loop order of i and j */
-
-  for (j=0; j<8; j++)
-    for (i=0; i<8; i++)
-    {
-      partial_product = 0.0;
-
-      for (k=0; k<8; k++)
-        partial_product+= c[k][i]*tmp[8*k+j];
-
-      v = (int) floor(partial_product+0.5);
-      block[8*i+j] = v;
-    }
-}
diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c
index 5350d02..b3592f4 100644
--- a/libavcodec/flacdec.c
+++ b/libavcodec/flacdec.c
@@ -206,10 +206,10 @@ void ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s,
         avctx->sample_fmt = SAMPLE_FMT_S16;
 
     s->samples  = get_bits_long(&gb, 32) << 4;
-    s->samples |= get_bits(&gb, 4);
+    s->samples |= get_bits_long(&gb, 4);
 
-    skip_bits_long(&gb, 64); /* md5 sum */
-    skip_bits_long(&gb, 64); /* md5 sum */
+    skip_bits(&gb, 64); /* md5 sum */
+    skip_bits(&gb, 64); /* md5 sum */
 
     dump_headers(avctx, s);
 }
@@ -227,7 +227,7 @@ static int metadata_parse(FLACContext *s)
     int initial_pos= get_bits_count(&s->gb);
 
     if (show_bits_long(&s->gb, 32) == MKBETAG('f','L','a','C')) {
-        skip_bits_long(&s->gb, 32);
+        skip_bits(&s->gb, 32);
 
         do {
             metadata_last = get_bits1(&s->gb);
diff --git a/libavcodec/h263.c b/libavcodec/h263.c
index f4b1360..2a25cda 100644
--- a/libavcodec/h263.c
+++ b/libavcodec/h263.c
@@ -4005,6 +4005,18 @@ int ff_h263_decode_mb(MpegEncContext *s,
                 mot_val[1] = my;
             }
         }
+
+        /* decode each block */
+        for (i = 0; i < 6; i++) {
+            if (h263_decode_block(s, block[i], i, cbp&32) < 0)
+                return -1;
+            cbp+=cbp;
+        }
+
+        if(s->obmc){
+            if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
+                preview_obmc(s);
+        }
     } else if(s->pict_type==FF_B_TYPE) {
         int mb_type;
         const int stride= s->b8_stride;
@@ -4093,6 +4105,13 @@ int ff_h263_decode_mb(MpegEncContext *s,
         }
 
         s->current_picture.mb_type[xy]= mb_type;
+
+        /* decode each block */
+        for (i = 0; i < 6; i++) {
+            if (h263_decode_block(s, block[i], i, cbp&32) < 0)
+                return -1;
+            cbp+=cbp;
+        }
     } else { /* I-Frame */
         do{
             cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
@@ -4127,18 +4146,13 @@ intra:
         if (dquant) {
             h263_decode_dquant(s);
         }
-    }
 
-    /* decode each block */
-    for (i = 0; i < 6; i++) {
-        if (h263_decode_block(s, block[i], i, cbp&32) < 0)
-            return -1;
-        cbp+=cbp;
-    }
-
-    if(s->obmc && !s->mb_intra){
-        if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
-            preview_obmc(s);
+        /* decode each block */
+        for (i = 0; i < 6; i++) {
+            if (h263_decode_block(s, block[i], i, cbp&32) < 0)
+                return -1;
+            cbp+=cbp;
+        }
     }
 end:
 
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index b353b88..9e67ee5 100644
--- a/libavcodec/mpeg12.c
+++ b/libavcodec/mpeg12.c
@@ -2196,7 +2196,7 @@ static void mpeg_decode_gop(AVCodecContext *avctx,
  * Finds the end of the current frame in the bitstream.
  * @return the position of the first byte of the next frame, or -1
  */
-int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size, AVCodecParserContext *s)
+int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size)
 {
     int i;
     uint32_t state= pc->state;
@@ -2244,9 +2244,6 @@ int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size,
                     return i-3;
                 }
             }
-            if(s && state == PICTURE_START_CODE){
-                ff_fetch_timestamp(s, i-4, 1);
-            }
         }
     }
     pc->state= state;
@@ -2279,7 +2276,7 @@ static int mpeg_decode_frame(AVCodecContext *avctx,
     }
 
     if(s2->flags&CODEC_FLAG_TRUNCATED){
-        int next= ff_mpeg1_find_frame_end(&s2->parse_context, buf, buf_size, NULL);
+        int next= ff_mpeg1_find_frame_end(&s2->parse_context, buf, buf_size);
 
         if( ff_combine_frame(&s2->parse_context, next, (const uint8_t **)&buf, &buf_size) < 0 )
             return buf_size;
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 8dc3488..2af239b 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -1096,7 +1096,8 @@ static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int
  */
 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
 
-    if(s->avctx->hwaccel || !pict || !pict->mb_type) return;
+    if(s->avctx->hwaccel) return;
+    if(!pict || !pict->mb_type) return;
 
     if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
         int x,y;
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index ef40083..5620f1e 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -769,7 +769,7 @@ void mpeg1_encode_mb(MpegEncContext *s,
 void ff_mpeg1_encode_init(MpegEncContext *s);
 void ff_mpeg1_encode_slice_header(MpegEncContext *s);
 void ff_mpeg1_clean_buffers(MpegEncContext *s);
-int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size, AVCodecParserContext *s);
+int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size);
 
 extern const uint8_t ff_mpeg4_y_dc_scale_table[32];
 extern const uint8_t ff_mpeg4_c_dc_scale_table[32];
diff --git a/libavcodec/mpegvideo_parser.c b/libavcodec/mpegvideo_parser.c
index 215c86c..2ccb9ff 100644
--- a/libavcodec/mpegvideo_parser.c
+++ b/libavcodec/mpegvideo_parser.c
@@ -29,6 +29,7 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s,
 {
     ParseContext1 *pc = s->priv_data;
     const uint8_t *buf_end;
+    const uint8_t *buf_start= buf;
     uint32_t start_code;
     int frame_rate_index, ext_type, bytes_left;
     int frame_rate_ext_n, frame_rate_ext_d;
@@ -43,6 +44,8 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s,
         bytes_left = buf_end - buf;
         switch(start_code) {
         case PICTURE_START_CODE:
+            ff_fetch_timestamp(s, buf-buf_start-4, 1);
+
             if (bytes_left >= 2) {
                 s->pict_type = (buf[1] >> 3) & 7;
             }
@@ -134,7 +137,7 @@ static int mpegvideo_parse(AVCodecParserContext *s,
     if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
         next= buf_size;
     }else{
-        next= ff_mpeg1_find_frame_end(pc, buf, buf_size, s);
+        next= ff_mpeg1_find_frame_end(pc, buf, buf_size);
 
         if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) {
             *poutbuf = NULL;
diff --git a/libavcodec/parser.c b/libavcodec/parser.c
index 0d1126d..d738a62 100644
--- a/libavcodec/parser.c
+++ b/libavcodec/parser.c
@@ -87,7 +87,7 @@ void ff_fetch_timestamp(AVCodecParserContext *s, int off, int remove){
     s->dts= s->pts= AV_NOPTS_VALUE;
     s->offset= 0;
     for(i = 0; i < AV_PARSER_PTS_NB; i++) {
-        if (   s->cur_offset + off >= s->cur_frame_offset[i]
+        if (   s->next_frame_offset + off >= s->cur_frame_offset[i]
             &&(s->     frame_offset       <  s->cur_frame_offset[i] || !s->frame_offset)
             //check is disabled  becausue mpeg-ts doesnt send complete PES packets
             && /*s->next_frame_offset + off <*/  s->cur_frame_end[i]){
@@ -96,8 +96,6 @@ void ff_fetch_timestamp(AVCodecParserContext *s, int off, int remove){
             s->offset = s->next_frame_offset - s->cur_frame_offset[i];
             if(remove)
                 s->cur_frame_offset[i]= INT64_MAX;
-            if(s->cur_offset + off < s->cur_frame_end[i])
-                break;
         }
     }
 }
@@ -141,12 +139,14 @@ int av_parser_parse(AVCodecParserContext *s,
         buf = dummy_buf;
     } else {
         /* add a new packet descriptor */
+        if(pts != AV_NOPTS_VALUE || dts != AV_NOPTS_VALUE){
             i = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1);
             s->cur_frame_start_index = i;
             s->cur_frame_offset[i] = s->cur_offset;
             s->cur_frame_end[i] = s->cur_offset + buf_size;
             s->cur_frame_pts[i] = pts;
             s->cur_frame_dts[i] = dts;
+        }
     }
 
     if (s->fetch_timestamp){
diff --git a/libavformat/.svnrevision b/libavformat/.svnrevision
index f8ba6ba..5883118 100644
--- a/libavformat/.svnrevision
+++ b/libavformat/.svnrevision
@@ -1 +1 @@
-17737
+18693
diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
index c925e54..9bc2517 100644
--- a/libavformat/flvdec.c
+++ b/libavformat/flvdec.c
@@ -313,6 +313,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
     int64_t dts, pts = AV_NOPTS_VALUE;
     AVStream *st = NULL;
 
+ retry:
  for(;;){
     pos = url_ftell(s->pb);
     url_fskip(s->pb, 4); /* size of previous packet */
@@ -348,7 +349,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
             av_log(s, AV_LOG_ERROR, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags);
     skip:
         url_fseek(s->pb, next, SEEK_SET);
-        return AVERROR(EAGAIN);
+        continue;
     }
 
     /* skip empty data packets */
@@ -372,7 +373,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
        || st->discard >= AVDISCARD_ALL
        ){
         url_fseek(s->pb, next, SEEK_SET);
-        return AVERROR(EAGAIN);
+        continue;
     }
     if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)
         av_add_index_entry(st, pos, dts, size, 0, AVINDEX_KEYFRAME);
@@ -435,7 +436,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
                         st->codec->channels, st->codec->sample_rate);
             }
 
-            return AVERROR(EAGAIN);
+            goto retry;
         }
     }
 
diff --git a/libavformat/rtp_h264.c b/libavformat/rtp_h264.c
index f3ae699..85133be 100644
--- a/libavformat/rtp_h264.c
+++ b/libavformat/rtp_h264.c
@@ -78,7 +78,7 @@ static void sdp_parse_fmtp_config_h264(AVStream * stream,
     assert(h264_data != NULL);
 
     if (!strcmp(attr, "packetization-mode")) {
-        av_log(codec, AV_LOG_DEBUG, "RTP Packetization Mode: %d\n", atoi(value));
+        av_log(NULL, AV_LOG_DEBUG, "H.264/RTP Packetization Mode: %d\n", atoi(value));
         h264_data->packetization_mode = atoi(value);
         /*
            Packetization Mode:
@@ -87,8 +87,8 @@ static void sdp_parse_fmtp_config_h264(AVStream * stream,
            2: Interleaved Mode: 25 (STAP-B), 26 (MTAP16), 27 (MTAP24), 28 (FU-A), and 29 (FU-B) are allowed.
          */
         if (h264_data->packetization_mode > 1)
-            av_log(codec, AV_LOG_ERROR,
-                   "Interleaved RTP mode is not supported yet.");
+            av_log(stream, AV_LOG_ERROR,
+                   "H.264/RTP Interleaved RTP mode is not supported yet.");
     } else if (!strcmp(attr, "profile-level-id")) {
         if (strlen(value) == 6) {
             char buffer[3];
@@ -105,8 +105,8 @@ static void sdp_parse_fmtp_config_h264(AVStream * stream,
             level_idc = strtol(buffer, NULL, 16);
 
             // set the parameters...
-            av_log(codec, AV_LOG_DEBUG,
-                   "RTP Profile IDC: %x Profile IOP: %x Level: %x\n",
+            av_log(NULL, AV_LOG_DEBUG,
+                   "H.264/RTP Profile IDC: %x Profile IOP: %x Level: %x\n",
                    profile_idc, profile_iop, level_idc);
             h264_data->profile_idc = profile_idc;
             h264_data->profile_iop = profile_iop;
@@ -150,11 +150,11 @@ static void sdp_parse_fmtp_config_h264(AVStream * stream,
                     codec->extradata= dest;
                     codec->extradata_size+= sizeof(start_sequence)+packet_size;
                 } else {
-                    av_log(codec, AV_LOG_ERROR, "Unable to allocate memory for extradata!");
+                    av_log(NULL, AV_LOG_ERROR, "H.264/RTP Unable to allocate memory for extradata!");
                 }
             }
         }
-        av_log(codec, AV_LOG_DEBUG, "Extradata set to %p (size: %d)!", codec->extradata, codec->extradata_size);
+        av_log(NULL, AV_LOG_DEBUG, "H.264/RTP Extradata set to %p (size: %d)!", codec->extradata, codec->extradata_size);
     }
 }
 
@@ -231,7 +231,7 @@ static int h264_handle_packet(AVFormatContext *ctx,
                             dst+= nal_size;
                         }
                     } else {
-                        av_log(ctx, AV_LOG_ERROR,
+                        av_log(NULL, AV_LOG_ERROR,
                                "nal size exceeds length: %d %d\n", nal_size, src_len);
                     }
 
@@ -240,7 +240,7 @@ static int h264_handle_packet(AVFormatContext *ctx,
                     src_len -= nal_size;
 
                     if (src_len < 0)
-                        av_log(ctx, AV_LOG_ERROR,
+                        av_log(NULL, AV_LOG_ERROR,
                                "Consumed more bytes than we got! (%d)\n", src_len);
                 } while (src_len > 2);      // because there could be rtp padding..
 
@@ -259,7 +259,7 @@ static int h264_handle_packet(AVFormatContext *ctx,
     case 26:                   // MTAP-16
     case 27:                   // MTAP-24
     case 29:                   // FU-B
-        av_log(ctx, AV_LOG_ERROR,
+        av_log(NULL, AV_LOG_ERROR,
                "Unhandled type (%d) (See RFC for implementation details\n",
                type);
         result= -1;
@@ -305,7 +305,7 @@ static int h264_handle_packet(AVFormatContext *ctx,
     case 30:                   // undefined
     case 31:                   // undefined
     default:
-        av_log(ctx, AV_LOG_ERROR, "Undefined type (%d)", type);
+        av_log(NULL, AV_LOG_ERROR, "Undefined type (%d)", type);
         result= -1;
         break;
     }
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 900bd20..0ffe96a 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -1515,10 +1515,7 @@ static int av_seek_frame_generic(AVFormatContext *s,
                 return ret;
         }
         for(i=0;; i++) {
-            int ret;
-            do{
-                ret = av_read_frame(s, &pkt);
-            }while(ret == AVERROR(EAGAIN));
+            int ret = av_read_frame(s, &pkt);
             if(ret<0)
                 break;
             av_free_packet(&pkt);
@@ -1741,9 +1738,7 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
         if (i == ic->nb_streams)
             break;
 
-        do{
-            ret = av_read_packet(ic, pkt);
-        }while(ret == AVERROR(EAGAIN));
+        ret = av_read_packet(ic, pkt);
         if (ret != 0)
             break;
         read_size += pkt->size;
@@ -1768,9 +1763,7 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
         if (read_size >= DURATION_MAX_READ_SIZE)
             break;
 
-        do{
-            ret = av_read_packet(ic, pkt);
-        }while(ret == AVERROR(EAGAIN));
+        ret = av_read_packet(ic, pkt);
         if (ret != 0)
             break;
         read_size += pkt->size;
@@ -2079,8 +2072,6 @@ int av_find_stream_info(AVFormatContext *ic)
         /* NOTE: a new stream can be added there if no header in file
            (AVFMTCTX_NOHEADER) */
         ret = av_read_frame_internal(ic, &pkt1);
-        if(ret == AVERROR(EAGAIN))
-            continue;
         if (ret < 0) {
             /* EOF or error */
             ret = -1; /* we could not have all the codec parameters before EOF */
diff --git a/libavutil/.svnrevision b/libavutil/.svnrevision
index f8ba6ba..5883118 100644
--- a/libavutil/.svnrevision
+++ b/libavutil/.svnrevision
@@ -1 +1 @@
-17737
+18693
diff --git a/libdvdnav/.svnrevision b/libdvdnav/.svnrevision
index ddbefde..98a603e 100644
--- a/libdvdnav/.svnrevision
+++ b/libdvdnav/.svnrevision
@@ -1 +1 @@
-1168
+1170
diff --git a/libdvdnav/searching.c b/libdvdnav/searching.c
index 4d354f3..aead0c3 100644
--- a/libdvdnav/searching.c
+++ b/libdvdnav/searching.c
@@ -551,7 +551,7 @@ uint32_t dvdnav_describe_title_chapters(dvdnav_t *this, int32_t title, uint64_t
   uint16_t parts, i;
   title_info_t *ptitle = NULL;
   ptt_info_t *ptt = NULL;
-  ifo_handle_t *ifo;
+  ifo_handle_t *ifo = NULL;
   pgc_t *pgc;
   cell_playback_t *cell;
   uint64_t length, *tmp=NULL;
@@ -571,6 +571,7 @@ uint32_t dvdnav_describe_title_chapters(dvdnav_t *this, int32_t title, uint64_t
   ifo = vm_get_title_ifo(this->vm, title);
   if(!ifo || !ifo->vts_pgcit) {
     printerr("Couldn't open IFO for chosen title, exit.");
+    retval = 0;
     goto fail;
   }
 
@@ -611,11 +612,14 @@ uint32_t dvdnav_describe_title_chapters(dvdnav_t *this, int32_t title, uint64_t
   }
   *duration = length;
   vm_ifo_close(ifo);
+  ifo = NULL;
   retval = parts;
   *times = tmp;
 
 fail:
   pthread_mutex_unlock(&this->vm_lock);
+  if(!retval && ifo)
+    vm_ifo_close(ifo);
   if(!retval && tmp)
     free(tmp);
   return retval;
diff --git a/libdvdread4/.svnrevision b/libdvdread4/.svnrevision
index ddbefde..98a603e 100644
--- a/libdvdread4/.svnrevision
+++ b/libdvdread4/.svnrevision
@@ -1 +1 @@
-1168
+1170
diff --git a/libdvdread4/dvd_reader.c b/libdvdread4/dvd_reader.c
index f4f3328..05adb17 100644
--- a/libdvdread4/dvd_reader.c
+++ b/libdvdread4/dvd_reader.c
@@ -53,7 +53,7 @@ static inline int _private_gettimeofday( struct timeval *tv, void *tz )
 #define lseek64 _lseeki64
 #endif
 
-#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__bsdi__) || defined(__DARWIN__)
+#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__bsdi__) || defined(__APPLE__)
 #define SYS_BSD 1
 #endif
 
diff --git a/libmpcodecs/ad.c b/libmpcodecs/ad.c
index 11d6f35..01b9b26 100644
--- a/libmpcodecs/ad.c
+++ b/libmpcodecs/ad.c
@@ -1,6 +1,4 @@
-/*
-   ad.c - audio decoder interface
-*/
+/* audio decoder interface */
 
 #include <stdio.h>
 #include <stdlib.h>
diff --git a/libmpcodecs/ad_ffmpeg.c b/libmpcodecs/ad_ffmpeg.c
index c0a638d..32a9fc2 100644
--- a/libmpcodecs/ad_ffmpeg.c
+++ b/libmpcodecs/ad_ffmpeg.c
@@ -112,6 +112,15 @@ static int init(sh_audio_t *sh_audio)
   sh_audio->channels=lavc_context->channels;
   sh_audio->samplerate=lavc_context->sample_rate;
   sh_audio->i_bps=lavc_context->bit_rate/8;
+  switch (lavc_context->sample_fmt) {
+      case SAMPLE_FMT_U8:  sh_audio->sample_format = AF_FORMAT_U8;       break;
+      case SAMPLE_FMT_S16: sh_audio->sample_format = AF_FORMAT_S16_NE;   break;
+      case SAMPLE_FMT_S32: sh_audio->sample_format = AF_FORMAT_S32_NE;   break;
+      case SAMPLE_FMT_FLT: sh_audio->sample_format = AF_FORMAT_FLOAT_NE; break;
+      default:
+          mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Unsupported sample format\n");
+          return 0;
+  }
   if(sh_audio->wf){
       // If the decoder uses the wrong number of channels all is lost anyway.
       // sh_audio->channels=sh_audio->wf->nChannels;
@@ -120,7 +129,7 @@ static int init(sh_audio_t *sh_audio)
       if (sh_audio->wf->nAvgBytesPerSec)
       sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec;
   }
-  sh_audio->samplesize=2;
+  sh_audio->samplesize=af_fmt2bits(sh_audio->sample_format)/ 8;
   return 1;
 }
 
diff --git a/libmpcodecs/ae_lavc.c b/libmpcodecs/ae_lavc.c
index 3b07d6a..4bc82ab 100644
--- a/libmpcodecs/ae_lavc.c
+++ b/libmpcodecs/ae_lavc.c
@@ -248,6 +248,7 @@ int mpae_init_lavc(audio_encoder_t *encoder)
 	}
 
 	encoder->decode_buffer_size = lavc_actx->frame_size * 2 * encoder->params.channels;
+	while (encoder->decode_buffer_size < 1024) encoder->decode_buffer_size *= 2;
 	encoder->bind = bind_lavc;
 	encoder->get_frame_size = get_frame_size;
 	encoder->encode = encode_lavc;
diff --git a/libmpcodecs/dec_video.c b/libmpcodecs/dec_video.c
index f158d7e..4186bd5 100644
--- a/libmpcodecs/dec_video.c
+++ b/libmpcodecs/dec_video.c
@@ -415,10 +415,13 @@ int filter_video(sh_video_t *sh_video, void *frame, double pts)
     // apply video filters and call the leaf vo/ve
     int ret = vf->put_image(vf, mpi, pts);
     if (ret > 0) {
-	vf->control(vf, VFCTRL_DRAW_OSD, NULL);
+	// draw EOSD first so it ends up below the OSD.
+	// Note that changing this is will not work right with vf_ass and the
+	// vos currently always draw the EOSD first in paused mode.
 #ifdef CONFIG_ASS
 	vf->control(vf, VFCTRL_DRAW_EOSD, NULL);
 #endif
+	vf->control(vf, VFCTRL_DRAW_OSD, NULL);
     }
 
     t2 = GetTimer()-t2;
diff --git a/libmpcodecs/mp_image.h b/libmpcodecs/mp_image.h
index 7d82707..ddf52c7 100644
--- a/libmpcodecs/mp_image.h
+++ b/libmpcodecs/mp_image.h
@@ -54,8 +54,6 @@
 
 // buffer type was printed (do NOT set this flag - it's for INTERNAL USE!!!)
 #define MP_IMGFLAG_TYPE_DISPLAYED 0x8000
-// set if it can not be reused yet (for MP_IMGTYPE_NUMBERED)
-#define MP_IMGFLAG_IN_USE 0x10000
 
 // codec doesn't support any form of direct rendering - it has own buffer
 // allocation. so we just export its buffer pointers:
@@ -101,6 +99,7 @@ typedef struct mp_image_s {
     int chroma_height;
     int chroma_x_shift; // horizontal
     int chroma_y_shift; // vertical
+    int usage_count;
     /* for private use by filter or vo driver (to store buffer id or dmpi) */
     void* priv;
 } mp_image_t;
diff --git a/libmpcodecs/native/nuppelvideo.c b/libmpcodecs/native/nuppelvideo.c
deleted file mode 100644
index 8128f85..0000000
--- a/libmpcodecs/native/nuppelvideo.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * NuppelVideo 0.05 file parser
- * for MPlayer
- * by Panagiotis Issaris <takis at lumumba.luc.ac.be>
- *
- * Reworked by alex
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-
-#include "config.h"
-#include "mp_msg.h"
-#include "mpbswap.h"
-
-#include "libvo/fastmemcpy.h"
-
-#include "libmpdemux/nuppelvideo.h" 
-#include "rtjpegn.h"
-#include "libavutil/lzo.h"
-
-#define KEEP_BUFFER
-
-void decode_nuv( unsigned char *encoded, int encoded_size,
-		unsigned char *decoded, int width, int height)
-{
-	int r;
-	unsigned int out_len = width * height + ( width * height ) / 2;
-	struct rtframeheader *encodedh = ( struct rtframeheader* ) encoded;
-	static unsigned char *buffer = 0; /* for RTJpeg with LZO decompress */
-#ifdef KEEP_BUFFER
-	static unsigned char *previous_buffer = 0; /* to support Last-frame-copy */
-#endif
-
-//	printf("frametype: %c, comtype: %c, encoded_size: %d, width: %d, height: %d\n",
-//	    encodedh->frametype, encodedh->comptype, encoded_size, width, height);
-
-	le2me_rtframeheader(encodedh);
-	switch(encodedh->frametype)
-	{
-	    case 'D':	/* additional data for compressors */
-	    {
-		/* tables are in encoded */
-		if (encodedh->comptype == 'R')
-		{
-		    RTjpeg_init_decompress ( (unsigned long *)(encoded+12), width, height );
-		    mp_msg(MSGT_DECVIDEO, MSGL_V, "Found RTjpeg tables (size: %d, width: %d, height: %d)\n",
-			encoded_size-12, width, height);
-		}
-		break;
-	    }
-	    case 'V':
-	    {
-		int in_len = encodedh->packetlength;
-#ifdef KEEP_BUFFER		
-		if (!previous_buffer) 
-			previous_buffer = ( unsigned char * ) malloc ( out_len + AV_LZO_OUTPUT_PADDING );
-#endif
-
-		switch(encodedh->comptype)
-		{
-		    case '0': /* raw YUV420 */
-			fast_memcpy(decoded, encoded + 12, out_len);
-			break;
-		    case '1': /* RTJpeg */
-			RTjpeg_decompressYUV420 ( ( __s8 * ) encoded + 12, decoded );
-			break;
-		    case '2': /* RTJpeg with LZO */
-			if (!buffer) 
-			    buffer = ( unsigned char * ) malloc ( out_len + AV_LZO_OUTPUT_PADDING );
-			if (!buffer)
-			{
-			    mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Nuppelvideo: error decompressing\n");
-			    break;
-			}
-			r = av_lzo1x_decode ( buffer, &out_len, encoded + 12, &in_len );
-			if ( r ) 
-			{
-			    mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Nuppelvideo: error decompressing\n");
-			    break;
-			}
-			RTjpeg_decompressYUV420 ( ( __s8 * ) buffer, decoded );
-			break;
-		    case '3': /* raw YUV420 with LZO */
-			r = av_lzo1x_decode ( decoded, &out_len, encoded + 12, &in_len );
-			if ( r ) 
-			{
-			    mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Nuppelvideo: error decompressing\n");
-			    break;
-			}
-			break;
-		    case 'N': /* black frame */
-			memset ( decoded, 0,  width * height );
-			memset ( decoded + width * height, 127, width * height / 2);
-			break;
-		    case 'L': /* copy last frame */
-#ifdef KEEP_BUFFER
-			fast_memcpy ( decoded, previous_buffer, width*height*3/2);
-#endif
-			break;
-		}
-
-#ifdef KEEP_BUFFER
-		fast_memcpy(previous_buffer, decoded, width*height*3/2);
-#endif
-		break;
-	    }
-	    default:
-		mp_msg(MSGT_DECVIDEO, MSGL_V, "Nuppelvideo: unknwon frametype: %c\n",
-		    encodedh->frametype);
-	}
-}
diff --git a/libmpcodecs/native/rtjpegn.c b/libmpcodecs/native/rtjpegn.c
index 538bff6..0eea073 100644
--- a/libmpcodecs/native/rtjpegn.c
+++ b/libmpcodecs/native/rtjpegn.c
@@ -68,7 +68,7 @@ static const __u64 RTjpeg_aan_tab[64]={
 #if !HAVE_MMX
 static __s32 RTjpeg_ws[64+31];
 #endif
-__u8 RTjpeg_alldata[2*64+4*64+4*64+4*64+4*64+32];
+static __u8 RTjpeg_alldata[2*64+4*64+4*64+4*64+4*64+32];
 
 static __s16 *block; // rh
 static __s16 *RTjpeg_block;
@@ -86,13 +86,12 @@ static int RTjpeg_Ysize, RTjpeg_Csize;
 static __s16 *RTjpeg_old=NULL;
 
 #if HAVE_MMX
-mmx_t RTjpeg_lmask;
-mmx_t RTjpeg_cmask;
+static mmx_t RTjpeg_lmask;
+static mmx_t RTjpeg_cmask;
 #else
-__u16 RTjpeg_lmask;
-__u16 RTjpeg_cmask;
+static __u16 RTjpeg_lmask;
+static __u16 RTjpeg_cmask;
 #endif
-int RTjpeg_mtest=0;
 
 static const unsigned char RTjpeg_lum_quant_tbl[64] = {
     16,  11,  10,  16,  24,  40,  51,  61,
@@ -133,7 +132,7 @@ static const unsigned char RTjpeg_chrom_quant_tbl[64] = {
 /* Block to Stream (encoding)                         */
 /*                                                    */
 
-int RTjpeg_b2s(__s16 *data, __s8 *strm, __u8 bt8)
+static int RTjpeg_b2s(__s16 *data, __s8 *strm, __u8 bt8)
 {
  register int ci, co=1;
  register __s16 ZZvalue;
@@ -150,11 +149,6 @@ int RTjpeg_b2s(__s16 *data, __s8 *strm, __u8 bt8)
 
 #endif
 
-// *strm++ = 0x10;
-// *strm   = 0x00;
-//
-// return 2;
-
  // first byte allways written
  ((__u8*)strm)[0]=
       (__u8)(data[RTjpeg_ZZ[0]]>254) ? 254:((data[RTjpeg_ZZ[0]]<0)?0:data[RTjpeg_ZZ[0]]);
@@ -299,155 +293,9 @@ fprintf(stdout, "\n\n");
  return (int)co;
 }
 
-/* +++++++++++++++++++++++++++++++++++++++++++++++++++*/
-/* Stream to Block  (decoding)                        */
-/*                                                    */
-
-int RTjpeg_s2b(__s16 *data, __s8 *strm, __u8 bt8, __u32 *qtbl)
-{
- int ci;
- register int co;
- register int i;
- register unsigned char bitten;
- register unsigned char bitoff;
-
- /* first byte always read */
- i=RTjpeg_ZZ[0];
- data[i]=((__u8)strm[0])*qtbl[i];
-
- /* we start at the behind */ 
-
- bitten = ((unsigned char)strm[1]) >> 2;
- co = 63;
- for(; co > bitten; co--) {
-
-   data[RTjpeg_ZZ[co]] = 0;
-
- }
-
- if (co==0) {
-   ci = 2;
-   goto AUTOBAHN;
- }
-
- /* we have to read the last 2 bits of the second byte */
- ci=1;
- bitoff = 0;
-
- for(; co>0; co--) {
-
-  bitten  = ((unsigned char)strm[ci]) >> bitoff;
-  bitten &= 0x03;
-
-  i=RTjpeg_ZZ[co];
-
-  switch( bitten ) {
-  case 0x03:
-    data[i]= -qtbl[i];
-    break;
-  case 0x02:
-    goto FUSSWEG;
-    break;
-  case 0x01:
-    data[i]= qtbl[i];
-    break;
-  case 0x00:
-    data[i]= 0;
-    break;
-  default: 
-    break;
-  } 
-
-  if( bitoff == 0 ) {
-    bitoff = 8;
-    ci++;
-  }
-  bitoff -= 2;
- }
- /* co is 0 now */
- /* data is written properly */
-
- /* if bitoff!=6 then ci is the index, but should be the byte count, so we increment by 1 */
- if (bitoff!=6) ci++;
-
- goto AUTOBAHN;
- 
- 
-FUSSWEG:
-/* correct bitoff to nibble */
- switch(bitoff){
- case 4:
- case 6:
-   bitoff = 0;
-   break;
- case 2:
- case 0:
-   /* we have to read from the next byte */
-   ci++;
-   bitoff = 4;
-   break;
- default:
-   break;
- }
-
- for(; co>0; co--) {
-
-  bitten  = ((unsigned char)strm[ci]) >> bitoff;
-  bitten &= 0x0f;
-
-  i=RTjpeg_ZZ[co];
-
-  if( bitten == 0x08 ) {
-    goto STRASSE;
-  }
-
-  /* the compiler cannot do sign extension for signed nibbles */
-  if( bitten & 0x08 ) {
-    bitten |= 0xf0;
-  }
-  /* the unsigned char bitten now is a valid signed char */
-   
-  data[i]=((signed char)bitten)*qtbl[i];
-  
-  if( bitoff == 0 ) {
-    bitoff = 8;
-    ci++;
-  }
-  bitoff -= 4;
- }
- /* co is 0 */
-
- /* if bitoff!=4 then ci is the index, but should be the byte count, so we increment by 1 */
- if (bitoff!=4) ci++;
-
- goto AUTOBAHN;
-
-STRASSE:
-  ci++; 
- 
- for(; co>0; co--) {
-  i=RTjpeg_ZZ[co];
-  data[i]=strm[ci++]*qtbl[i];
- }
-
- /* ci now is the count, because it points to next element => no incrementing */
-
-AUTOBAHN:
-
-#ifdef SHOWBLOCK
-fprintf(stdout, "\nci = '%d'\n", ci);
- for (i=0; i < 64; i++) {
-   fprintf(stdout, "%d ", data[RTjpeg_ZZ[i]]);
- }
-fprintf(stdout, "\n\n");
-#endif
-
- return ci;
-}
-
 #else
 
-int RTjpeg_b2s(__s16 *data, __s8 *strm, __u8 bt8)
+static int RTjpeg_b2s(__s16 *data, __s8 *strm, __u8 bt8)
 {
  register int ci, co=1, tmp;
  register __s16 ZZvalue;
@@ -506,7 +354,7 @@ int RTjpeg_b2s(__s16 *data, __s8 *strm, __u8 bt8)
  return (int)co;
 }
 
-int RTjpeg_s2b(__s16 *data, __s8 *strm, __u8 bt8, __u32 *qtbl)
+static int RTjpeg_s2b(__s16 *data, __s8 *strm, __u8 bt8, __u32 *qtbl)
 {
  int ci=1, co=1, tmp;
  register int i;
@@ -539,7 +387,7 @@ int RTjpeg_s2b(__s16 *data, __s8 *strm, __u8 bt8, __u32 *qtbl)
 #endif
 
 #if HAVE_MMX
-void RTjpeg_quant_init(void)
+static void RTjpeg_quant_init(void)
 {
  int i;
  __s16 *qtbl;
@@ -554,7 +402,7 @@ void RTjpeg_quant_init(void)
 static mmx_t RTjpeg_ones={0x0001000100010001LL};
 static mmx_t RTjpeg_half={0x7fff7fff7fff7fffLL};
 
-void RTjpeg_quant(__s16 *block, __s32 *qtbl)
+static void RTjpeg_quant(__s16 *block, __s32 *qtbl)
 {
  int i;
  mmx_t *bl, *ql;
@@ -591,11 +439,11 @@ void RTjpeg_quant(__s16 *block, __s32 *qtbl)
  }
 }
 #else
-void RTjpeg_quant_init(void)
+static void RTjpeg_quant_init(void)
 {
 }
 
-void RTjpeg_quant(__s16 *block, __s32 *qtbl)
+static void RTjpeg_quant(__s16 *block, __s32 *qtbl)
 {
  int i;
  
@@ -626,7 +474,7 @@ static mmx_t RTjpeg_zero ={0x0000000000000000LL};
 #define D_MULTIPLY(var,const)  ((__s32) ((var) * (const)))
 #endif
 
-void RTjpeg_dct_init(void)
+static void RTjpeg_dct_init(void)
 {
  int i;
  
@@ -637,7 +485,7 @@ void RTjpeg_dct_init(void)
  }
 }
 
-void RTjpeg_dctY(__u8 *idata, __s16 *odata, int rskip)
+static void RTjpeg_dctY(__u8 *idata, __s16 *odata, int rskip)
 {
 #if !HAVE_MMX
   __s32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
@@ -1542,1148 +1390,6 @@ void RTjpeg_dctY(__u8 *idata, __s16 *odata, int rskip)
 #endif
 }
 
-#define FIX_1_082392200  ((__s32)  277)		/* FIX(1.082392200) */
-#define FIX_1_414213562  ((__s32)  362)		/* FIX(1.414213562) */
-#define FIX_1_847759065  ((__s32)  473)		/* FIX(1.847759065) */
-#define FIX_2_613125930  ((__s32)  669)		/* FIX(2.613125930) */
-
-#define DESCALE(x) (__s16)( ((x)+4) >> 3)
-
-/* clip yuv to 16..235 (should be 16..240 for cr/cb but ... */
-
-#define RL(x) ((x)>235) ? 235 : (((x)<16) ? 16 : (x))
-#define MULTIPLY(var,const)  (((__s32) ((var) * (const)) + 128)>>8)
-
-void RTjpeg_idct_init(void)
-{
- int i;
- 
- for(i=0; i<64; i++)
- {
-  RTjpeg_liqt[i]=((__u64)RTjpeg_liqt[i]*RTjpeg_aan_tab[i])>>32;
-  RTjpeg_ciqt[i]=((__u64)RTjpeg_ciqt[i]*RTjpeg_aan_tab[i])>>32;
- }
-}
-
-void RTjpeg_idct(__u8 *odata, __s16 *data, int rskip)
-{
-#if HAVE_MMX
-
-static mmx_t fix_141			= {0x5a825a825a825a82LL};
-static mmx_t fix_184n261	= {0xcf04cf04cf04cf04LL};
-static mmx_t fix_184			= {0x7641764176417641LL};
-static mmx_t fix_n184		= {0x896f896f896f896fLL};
-static mmx_t fix_108n184	= {0xcf04cf04cf04cf04LL};
-
-  mmx_t workspace[64];
-  mmx_t *wsptr = workspace;
-  register mmx_t *dataptr = (mmx_t *)odata;
-  mmx_t *idata = (mmx_t *)data;
-
-  rskip = rskip>>3;
-/*
- * Perform inverse DCT on one block of coefficients.
- */
-
-    /* Odd part */
-
-	movq_m2r(*(idata+10), mm1);	// load idata[DCTSIZE*5]
-
-	movq_m2r(*(idata+6), mm0);		// load idata[DCTSIZE*3]
-
-	movq_m2r(*(idata+2), mm3);		// load idata[DCTSIZE*1]
-
-	movq_r2r(mm1, mm2);				// copy tmp6	/* phase 6 */
-
-	movq_m2r(*(idata+14), mm4);	// load idata[DCTSIZE*7]
-
-	paddw_r2r(mm0, mm1);				// z13 = tmp6 + tmp5;
-
-	psubw_r2r(mm0, mm2);				// z10 = tmp6 - tmp5   
-
-	psllw_i2r(2, mm2);				// shift z10
-	movq_r2r(mm2, mm0); 				// copy z10
-
-	pmulhw_m2r(fix_184n261, mm2);	// MULTIPLY( z12, FIX_1_847759065); /* 2*c2 */
-	movq_r2r(mm3, mm5);				// copy tmp4
-
-	pmulhw_m2r(fix_n184, mm0);		// MULTIPLY(z10, -FIX_1_847759065); /* 2*c2 */
-	paddw_r2r(mm4, mm3);				// z11 = tmp4 + tmp7;
-
-	movq_r2r(mm3, mm6);				// copy z11			/* phase 5 */
-	psubw_r2r(mm4, mm5);				// z12 = tmp4 - tmp7;
-
-	psubw_r2r(mm1, mm6);				// z11-z13
-	psllw_i2r(2, mm5);				//	shift z12
-
-	movq_m2r(*(idata+12), mm4);	// load idata[DCTSIZE*6], even part
- 	movq_r2r(mm5, mm7);				//	copy z12
-
-	pmulhw_m2r(fix_108n184, mm5); //	MULT(z12, (FIX_1_08-FIX_1_84)) //- z5; /* 2*(c2-c6) */ even part
-	paddw_r2r(mm1, mm3);				// tmp7 = z11 + z13;	
-
-	//ok
-
-    /* Even part */
-	pmulhw_m2r(fix_184, mm7);		// MULTIPLY(z10,(FIX_1_847759065 - FIX_2_613125930)) //+ z5; /* -2*(c2+c6) */
-	psllw_i2r(2, mm6);
-
-	movq_m2r(*(idata+4), mm1);		// load idata[DCTSIZE*2]
-
-	paddw_r2r(mm5, mm0);				//	tmp10
-
-	paddw_r2r(mm7, mm2);				// tmp12
-
-	pmulhw_m2r(fix_141, mm6);		// tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
-	psubw_r2r(mm3, mm2);				// tmp6 = tmp12 - tmp7
-
-	movq_r2r(mm1, mm5);				// copy tmp1
-	paddw_r2r(mm4, mm1);				// tmp13= tmp1 + tmp3;	/* phases 5-3 */
-
-	psubw_r2r(mm4, mm5);				// tmp1-tmp3
-	psubw_r2r(mm2, mm6);				// tmp5 = tmp11 - tmp6;
-
-	movq_r2m(mm1, *(wsptr));		// save tmp13 in workspace
-	psllw_i2r(2, mm5);	// shift tmp1-tmp3
-    
-	movq_m2r(*(idata), mm7); 		// load idata[DCTSIZE*0]
-
-	pmulhw_m2r(fix_141, mm5);		// MULTIPLY(tmp1 - tmp3, FIX_1_414213562)
-	paddw_r2r(mm6, mm0);				// tmp4 = tmp10 + tmp5;
-
-	movq_m2r(*(idata+8), mm4); 	// load idata[DCTSIZE*4]
-	
-	psubw_r2r(mm1, mm5);				// tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */
-
-	movq_r2m(mm0, *(wsptr+4));		// save tmp4 in workspace
-	movq_r2r(mm7, mm1);			 	// copy tmp0	/* phase 3 */
-
-	movq_r2m(mm5, *(wsptr+2));		// save tmp12 in workspace
-	psubw_r2r(mm4, mm1);				// tmp11 = tmp0 - tmp2; 
-
-	paddw_r2r(mm4, mm7);				// tmp10 = tmp0 + tmp2;
-   movq_r2r(mm1, mm5);				// copy tmp11
-	
-	paddw_m2r(*(wsptr+2), mm1);	// tmp1 = tmp11 + tmp12;
-	movq_r2r(mm7, mm4);				// copy tmp10		/* phase 2 */
-
-	paddw_m2r(*(wsptr), mm7);		// tmp0 = tmp10 + tmp13;	
-
-	psubw_m2r(*(wsptr), mm4);		// tmp3 = tmp10 - tmp13;
-	movq_r2r(mm7, mm0);				//	copy tmp0
-
-	psubw_m2r(*(wsptr+2), mm5);	// tmp2 = tmp11 - tmp12;
-	paddw_r2r(mm3, mm7);				//	wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7);
-	
-	psubw_r2r(mm3, mm0);				// wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7);
-
-	movq_r2m(mm7, *(wsptr));		//	wsptr[DCTSIZE*0]
-	movq_r2r(mm1, mm3);				//	copy tmp1
-
-	movq_r2m(mm0, *(wsptr+14));		// wsptr[DCTSIZE*7]
-	paddw_r2r(mm2, mm1);				// wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6);
-
-	psubw_r2r(mm2, mm3);				// wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6);
-
-	movq_r2m(mm1, *(wsptr+2));		// wsptr[DCTSIZE*1]
-	movq_r2r(mm4, mm1);				//	copy tmp3
-
-	movq_r2m(mm3, *(wsptr+12));		// wsptr[DCTSIZE*6]
-
-	paddw_m2r(*(wsptr+4), mm4);	// wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4);
-
-	psubw_m2r(*(wsptr+4), mm1); 	// wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4);
-
-	movq_r2m(mm4, *(wsptr+8));		
-	movq_r2r(mm5, mm7);				// copy tmp2
-
-	paddw_r2r(mm6, mm5);				// wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5)
-
-	movq_r2m(mm1, *(wsptr+6));	
-	psubw_r2r(mm6, mm7);				//	wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5);
-
-	movq_r2m(mm5, *(wsptr+4));	
-
-	movq_r2m(mm7, *(wsptr+10));		
-
-	//ok
-
-
-/*****************************************************************/
-
-	idata++;
-	wsptr++;
-
-/*****************************************************************/
-
-	movq_m2r(*(idata+10), mm1);	// load idata[DCTSIZE*5]
-
-	movq_m2r(*(idata+6), mm0);		// load idata[DCTSIZE*3]
-
-	movq_m2r(*(idata+2),	mm3);		// load idata[DCTSIZE*1]
-	movq_r2r(mm1, mm2);				//	copy tmp6	/* phase 6 */
-
-	movq_m2r(*(idata+14),	mm4);		// load idata[DCTSIZE*7]
-	paddw_r2r(mm0, mm1);				//	z13 = tmp6 + tmp5;
-
-	psubw_r2r(mm0, mm2);				//	z10 = tmp6 - tmp5   
-
-	psllw_i2r(2, mm2);				//	shift z10
-	movq_r2r(mm2, mm0);				//	copy z10
-
-	pmulhw_m2r(fix_184n261, mm2);	// MULTIPLY( z12, FIX_1_847759065); /* 2*c2 */
-	movq_r2r(mm3, mm5);				//	copy tmp4
-
-	pmulhw_m2r(fix_n184, mm0);		// MULTIPLY(z10, -FIX_1_847759065); /* 2*c2 */
-	paddw_r2r(mm4, mm3);				// z11 = tmp4 + tmp7;
-
-	movq_r2r(mm3, mm6);				// copy z11			/* phase 5 */
-	psubw_r2r(mm4, mm5);				//	z12 = tmp4 - tmp7;
-
-	psubw_r2r(mm1, mm6);				// z11-z13
-	psllw_i2r(2, mm5);				//	shift z12
-
-	movq_m2r(*(idata+12), mm4);	// load idata[DCTSIZE*6], even part
- 	movq_r2r(mm5, mm7);				// copy z12
-
-	pmulhw_m2r(fix_108n184, mm5);	// MULT(z12, (FIX_1_08-FIX_1_84)) //- z5; /* 2*(c2-c6) */ even part
-	paddw_r2r(mm1, mm3);				// tmp7 = z11 + z13;	
-
-	//ok
-
-    /* Even part */
-	pmulhw_m2r(fix_184, mm7);		// MULTIPLY(z10,(FIX_1_847759065 - FIX_2_613125930)) //+ z5; /* -2*(c2+c6) */
-	psllw_i2r(2, mm6);
-
-	movq_m2r(*(idata+4), mm1);		// load idata[DCTSIZE*2]
-
-	paddw_r2r(mm5, mm0);				//	tmp10
-
-	paddw_r2r(mm7, mm2);				// tmp12
-
-	pmulhw_m2r(fix_141, mm6);		// tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
-	psubw_r2r(mm3, mm2);				// tmp6 = tmp12 - tmp7
-
-	movq_r2r(mm1, mm5);				// copy tmp1
-	paddw_r2r(mm4, mm1);				// tmp13= tmp1 + tmp3;	/* phases 5-3 */
-
-	psubw_r2r(mm4, mm5);				// tmp1-tmp3
-	psubw_r2r(mm2, mm6);				// tmp5 = tmp11 - tmp6;
-
-	movq_r2m(mm1, *(wsptr));		// save tmp13 in workspace
-	psllw_i2r(2, mm5); 				// shift tmp1-tmp3
-    
-	movq_m2r(*(idata), mm7);		// load idata[DCTSIZE*0]
-	paddw_r2r(mm6, mm0);				// tmp4 = tmp10 + tmp5;
-
-	pmulhw_m2r(fix_141, mm5);		// MULTIPLY(tmp1 - tmp3, FIX_1_414213562)
-
-	movq_m2r(*(idata+8), mm4);    // load idata[DCTSIZE*4]
-	
-	psubw_r2r(mm1, mm5);				// tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */
-
-	movq_r2m(mm0, *(wsptr+4));		// save tmp4 in workspace
-	movq_r2r(mm7, mm1);				// copy tmp0	/* phase 3 */
-
-	movq_r2m(mm5, *(wsptr+2));		// save tmp12 in workspace
-	psubw_r2r(mm4, mm1);				// tmp11 = tmp0 - tmp2; 
-
-	paddw_r2r(mm4, mm7);				// tmp10 = tmp0 + tmp2;
-   movq_r2r(mm1, mm5);				// copy tmp11
-	
-	paddw_m2r(*(wsptr+2), mm1);	// tmp1 = tmp11 + tmp12;
-	movq_r2r(mm7, mm4);				// copy tmp10		/* phase 2 */
-
-	paddw_m2r(*(wsptr), mm7);		// tmp0 = tmp10 + tmp13;	
-
-	psubw_m2r(*(wsptr), mm4);		// tmp3 = tmp10 - tmp13;
-	movq_r2r(mm7, mm0);				// copy tmp0
-
-	psubw_m2r(*(wsptr+2), mm5);	// tmp2 = tmp11 - tmp12;
-	paddw_r2r(mm3, mm7);				// wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7);
-	
-	psubw_r2r(mm3, mm0);				// wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7);
-
-	movq_r2m(mm7, *(wsptr));		// wsptr[DCTSIZE*0]
-	movq_r2r(mm1, mm3);				// copy tmp1
-
-	movq_r2m(mm0, *(wsptr+14));		// wsptr[DCTSIZE*7]
-	paddw_r2r(mm2, mm1);				// wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6);
-
-	psubw_r2r(mm2, mm3);				// wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6);
-
-	movq_r2m(mm1, *(wsptr+2));		// wsptr[DCTSIZE*1]
-	movq_r2r(mm4, mm1);				// copy tmp3
-
-	movq_r2m(mm3, *(wsptr+12));		// wsptr[DCTSIZE*6]
-
-	paddw_m2r(*(wsptr+4), mm4);	// wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4);
-
-	psubw_m2r(*(wsptr+4), mm1);	// wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4);
-
-	movq_r2m(mm4, *(wsptr+8));		
-	movq_r2r(mm5, mm7);				// copy tmp2
-
-	paddw_r2r(mm6, mm5);				// wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5)
-
-	movq_r2m(mm1, *(wsptr+6));		
-	psubw_r2r(mm6, mm7);				// wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5);
-
-	movq_r2m(mm5, *(wsptr+4));	
-
-	movq_r2m(mm7, *(wsptr+10));
-
-/*****************************************************************/
-
-  /* Pass 2: process rows from work array, store into output array. */
-  /* Note that we must descale the results by a factor of 8 == 2**3, */
-  /* and also undo the PASS1_BITS scaling. */
-
-/*****************************************************************/
-    /* Even part */
-
-	wsptr--;
-
-//    tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]);
-//    tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]);
-//    tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]);
-//    tmp14 = ((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6]);
-	movq_m2r(*(wsptr), mm0);		// wsptr[0,0],[0,1],[0,2],[0,3]
-
-	movq_m2r(*(wsptr+1),	mm1);		// wsptr[0,4],[0,5],[0,6],[0,7]
-	movq_r2r(mm0, mm2);
-	
-	movq_m2r(*(wsptr+2), mm3);		// wsptr[1,0],[1,1],[1,2],[1,3]
-	paddw_r2r(mm1, mm0);				// wsptr[0,tmp10],[xxx],[0,tmp13],[xxx]
-
-	movq_m2r(*(wsptr+3), mm4);		// wsptr[1,4],[1,5],[1,6],[1,7]
-	psubw_r2r(mm1, mm2);				// wsptr[0,tmp11],[xxx],[0,tmp14],[xxx]
-
-	movq_r2r(mm0, mm6);
-	movq_r2r(mm3, mm5);
-	
-	paddw_r2r(mm4, mm3);				// wsptr[1,tmp10],[xxx],[1,tmp13],[xxx]
-	movq_r2r(mm2, mm1);
-
-	psubw_r2r(mm4, mm5);				// wsptr[1,tmp11],[xxx],[1,tmp14],[xxx]
-	punpcklwd_r2r(mm3, mm0);		// wsptr[0,tmp10],[1,tmp10],[xxx],[xxx]
-
-	movq_m2r(*(wsptr+7), mm7);		// wsptr[3,4],[3,5],[3,6],[3,7]
-	punpckhwd_r2r(mm3, mm6);		// wsptr[0,tmp13],[1,tmp13],[xxx],[xxx]
-
-	movq_m2r(*(wsptr+4), mm3);		// wsptr[2,0],[2,1],[2,2],[2,3]
-	punpckldq_r2r(mm6, mm0);		// wsptr[0,tmp10],[1,tmp10],[0,tmp13],[1,tmp13]
-
-	punpcklwd_r2r(mm5, mm1);		// wsptr[0,tmp11],[1,tmp11],[xxx],[xxx]
-	movq_r2r(mm3, mm4);
-
-	movq_m2r(*(wsptr+6), mm6);		// wsptr[3,0],[3,1],[3,2],[3,3]
-	punpckhwd_r2r(mm5, mm2);		// wsptr[0,tmp14],[1,tmp14],[xxx],[xxx]
-
-	movq_m2r(*(wsptr+5), mm5);		// wsptr[2,4],[2,5],[2,6],[2,7]
-	punpckldq_r2r(mm2, mm1);		// wsptr[0,tmp11],[1,tmp11],[0,tmp14],[1,tmp14]
-
-	
-	paddw_r2r(mm5, mm3);				// wsptr[2,tmp10],[xxx],[2,tmp13],[xxx]
-	movq_r2r(mm6, mm2);
-
-	psubw_r2r(mm5, mm4);				// wsptr[2,tmp11],[xxx],[2,tmp14],[xxx]
-	paddw_r2r(mm7, mm6);				// wsptr[3,tmp10],[xxx],[3,tmp13],[xxx]
-
-	movq_r2r(mm3, mm5);
-	punpcklwd_r2r(mm6, mm3);		// wsptr[2,tmp10],[3,tmp10],[xxx],[xxx]
-	
-	psubw_r2r(mm7, mm2);				// wsptr[3,tmp11],[xxx],[3,tmp14],[xxx]
-	punpckhwd_r2r(mm6, mm5);		// wsptr[2,tmp13],[3,tmp13],[xxx],[xxx]
-
-	movq_r2r(mm4, mm7);
-	punpckldq_r2r(mm5, mm3);		// wsptr[2,tmp10],[3,tmp10],[2,tmp13],[3,tmp13]
-						 
-	punpcklwd_r2r(mm2, mm4);		// wsptr[2,tmp11],[3,tmp11],[xxx],[xxx]
-
-	punpckhwd_r2r(mm2, mm7);		// wsptr[2,tmp14],[3,tmp14],[xxx],[xxx]
-
-	punpckldq_r2r(mm7, mm4);		// wsptr[2,tmp11],[3,tmp11],[2,tmp14],[3,tmp14]
-	movq_r2r(mm1, mm6);
-
-	//ok
-
-//	mm0 = 	;wsptr[0,tmp10],[1,tmp10],[0,tmp13],[1,tmp13]
-//	mm1 =	;wsptr[0,tmp11],[1,tmp11],[0,tmp14],[1,tmp14]
-
-
-	movq_r2r(mm0, mm2);
-	punpckhdq_r2r(mm4, mm6);		// wsptr[0,tmp14],[1,tmp14],[2,tmp14],[3,tmp14]
-
-	punpckldq_r2r(mm4, mm1);		// wsptr[0,tmp11],[1,tmp11],[2,tmp11],[3,tmp11]
-	psllw_i2r(2, mm6);
-
-	pmulhw_m2r(fix_141, mm6);
-	punpckldq_r2r(mm3, mm0);		// wsptr[0,tmp10],[1,tmp10],[2,tmp10],[3,tmp10]
-
-	punpckhdq_r2r(mm3, mm2);		// wsptr[0,tmp13],[1,tmp13],[2,tmp13],[3,tmp13]
-	movq_r2r(mm0, mm7);
-
-//    tmp0 = tmp10 + tmp13;
-//    tmp3 = tmp10 - tmp13;
-	paddw_r2r(mm2, mm0);				// [0,tmp0],[1,tmp0],[2,tmp0],[3,tmp0]
-	psubw_r2r(mm2, mm7);				// [0,tmp3],[1,tmp3],[2,tmp3],[3,tmp3]
-
-//    tmp12 = MULTIPLY(tmp14, FIX_1_414213562) - tmp13;
-	psubw_r2r(mm2, mm6);				// wsptr[0,tmp12],[1,tmp12],[2,tmp12],[3,tmp12]
-//    tmp1 = tmp11 + tmp12;
-//    tmp2 = tmp11 - tmp12;
-	movq_r2r(mm1, mm5);
-
-	//OK
-
-    /* Odd part */
-
-//    z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3];
-//    z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3];
-//    z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7];
-//    z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7];
-	movq_m2r(*(wsptr), mm3);		// wsptr[0,0],[0,1],[0,2],[0,3]
-	paddw_r2r(mm6, mm1);				// [0,tmp1],[1,tmp1],[2,tmp1],[3,tmp1]
-
-	movq_m2r(*(wsptr+1), mm4);		// wsptr[0,4],[0,5],[0,6],[0,7]
-	psubw_r2r(mm6, mm5);				// [0,tmp2],[1,tmp2],[2,tmp2],[3,tmp2]
-
-	movq_r2r(mm3, mm6);
-	punpckldq_r2r(mm4, mm3);		// wsptr[0,0],[0,1],[0,4],[0,5]
-
-	punpckhdq_r2r(mm6, mm4);		// wsptr[0,6],[0,7],[0,2],[0,3]
-	movq_r2r(mm3, mm2);
-
-//Save tmp0 and tmp1 in wsptr
-	movq_r2m(mm0, *(wsptr));		// save tmp0
-	paddw_r2r(mm4, mm2);				// wsptr[xxx],[0,z11],[xxx],[0,z13]
-
-	
-//Continue with z10 --- z13
-	movq_m2r(*(wsptr+2), mm6);		// wsptr[1,0],[1,1],[1,2],[1,3]
-	psubw_r2r(mm4, mm3);				// wsptr[xxx],[0,z12],[xxx],[0,z10]
-
-	movq_m2r(*(wsptr+3), mm0);		// wsptr[1,4],[1,5],[1,6],[1,7]
-	movq_r2r(mm6, mm4);
-
-	movq_r2m(mm1, *(wsptr+1));		// save tmp1
-	punpckldq_r2r(mm0, mm6);		// wsptr[1,0],[1,1],[1,4],[1,5]
-
-	punpckhdq_r2r(mm4, mm0);		// wsptr[1,6],[1,7],[1,2],[1,3]
-	movq_r2r(mm6, mm1);
-	
-//Save tmp2 and tmp3 in wsptr
-	paddw_r2r(mm0, mm6);				// wsptr[xxx],[1,z11],[xxx],[1,z13]
-	movq_r2r(mm2, mm4);
-	
-//Continue with z10 --- z13
-	movq_r2m(mm5, *(wsptr+2));		// save tmp2
-	punpcklwd_r2r(mm6, mm2);		// wsptr[xxx],[xxx],[0,z11],[1,z11]
-
-	psubw_r2r(mm0, mm1);				// wsptr[xxx],[1,z12],[xxx],[1,z10]
-	punpckhwd_r2r(mm6, mm4);		// wsptr[xxx],[xxx],[0,z13],[1,z13]
-
-	movq_r2r(mm3, mm0);
-	punpcklwd_r2r(mm1, mm3);		// wsptr[xxx],[xxx],[0,z12],[1,z12]
-
-	movq_r2m(mm7, *(wsptr+3));		// save tmp3
-	punpckhwd_r2r(mm1, mm0);		// wsptr[xxx],[xxx],[0,z10],[1,z10]
-
-	movq_m2r(*(wsptr+4), mm6);		// wsptr[2,0],[2,1],[2,2],[2,3]
-	punpckhdq_r2r(mm2, mm0);		// wsptr[0,z10],[1,z10],[0,z11],[1,z11]
-
-	movq_m2r(*(wsptr+5), mm7);	// wsptr[2,4],[2,5],[2,6],[2,7]
-	punpckhdq_r2r(mm4, mm3);		// wsptr[0,z12],[1,z12],[0,z13],[1,z13]
-
-	movq_m2r(*(wsptr+6), mm1);	// wsptr[3,0],[3,1],[3,2],[3,3]
-	movq_r2r(mm6, mm4);
-
-	punpckldq_r2r(mm7, mm6);		// wsptr[2,0],[2,1],[2,4],[2,5]
-	movq_r2r(mm1, mm5);
-
-	punpckhdq_r2r(mm4, mm7);		// wsptr[2,6],[2,7],[2,2],[2,3]
-	movq_r2r(mm6, mm2);
-	
-	movq_m2r(*(wsptr+7), mm4);	// wsptr[3,4],[3,5],[3,6],[3,7]
-	paddw_r2r(mm7, mm6);				// wsptr[xxx],[2,z11],[xxx],[2,z13]
-
-	psubw_r2r(mm7, mm2);				// wsptr[xxx],[2,z12],[xxx],[2,z10]
-	punpckldq_r2r(mm4, mm1);		// wsptr[3,0],[3,1],[3,4],[3,5]
-
-	punpckhdq_r2r(mm5, mm4);		// wsptr[3,6],[3,7],[3,2],[3,3]
-	movq_r2r(mm1, mm7);
-
-	paddw_r2r(mm4, mm1);				// wsptr[xxx],[3,z11],[xxx],[3,z13]
-	psubw_r2r(mm4, mm7);				// wsptr[xxx],[3,z12],[xxx],[3,z10]
-
-	movq_r2r(mm6, mm5);
-	punpcklwd_r2r(mm1, mm6);		// wsptr[xxx],[xxx],[2,z11],[3,z11]
-
-	punpckhwd_r2r(mm1, mm5);		// wsptr[xxx],[xxx],[2,z13],[3,z13]
-	movq_r2r(mm2, mm4);
-
-	punpcklwd_r2r(mm7, mm2);		// wsptr[xxx],[xxx],[2,z12],[3,z12]
-
-	punpckhwd_r2r(mm7, mm4);		// wsptr[xxx],[xxx],[2,z10],[3,z10]
-
-	punpckhdq_r2r(mm6, mm4);		/// wsptr[2,z10],[3,z10],[2,z11],[3,z11]
-
-	punpckhdq_r2r(mm5, mm2);		// wsptr[2,z12],[3,z12],[2,z13],[3,z13]
-	movq_r2r(mm0, mm5);
-
-	punpckldq_r2r(mm4, mm0);		// wsptr[0,z10],[1,z10],[2,z10],[3,z10]
-
-	punpckhdq_r2r(mm4, mm5);		// wsptr[0,z11],[1,z11],[2,z11],[3,z11]
-	movq_r2r(mm3, mm4);
-
-	punpckhdq_r2r(mm2, mm4);		// wsptr[0,z13],[1,z13],[2,z13],[3,z13]
-	movq_r2r(mm5, mm1);
-
-	punpckldq_r2r(mm2, mm3);		// wsptr[0,z12],[1,z12],[2,z12],[3,z12]
-//    tmp7 = z11 + z13;		/* phase 5 */
-//    tmp8 = z11 - z13;		/* phase 5 */
-	psubw_r2r(mm4, mm1);				// tmp8
-
-	paddw_r2r(mm4, mm5);				// tmp7
-//    tmp21 = MULTIPLY(tmp8, FIX_1_414213562); /* 2*c4 */
-	psllw_i2r(2, mm1);
-
-	psllw_i2r(2, mm0);
-
-	pmulhw_m2r(fix_141, mm1);		// tmp21
-//    tmp20 = MULTIPLY(z12, (FIX_1_082392200- FIX_1_847759065))  /* 2*(c2-c6) */
-//			+ MULTIPLY(z10, - FIX_1_847759065); /* 2*c2 */
-	psllw_i2r(2, mm3);
-	movq_r2r(mm0, mm7);
-
-	pmulhw_m2r(fix_n184, mm7);
-	movq_r2r(mm3, mm6);
-
-	movq_m2r(*(wsptr), mm2);		// tmp0,final1
-
-	pmulhw_m2r(fix_108n184, mm6);
-//	 tmp22 = MULTIPLY(z10,(FIX_1_847759065 - FIX_2_613125930)) /* -2*(c2+c6) */
-//			+ MULTIPLY(z12, FIX_1_847759065); /* 2*c2 */
-	movq_r2r(mm2, mm4);				// final1
-  
-	pmulhw_m2r(fix_184n261, mm0);
-	paddw_r2r(mm5, mm2);				// tmp0+tmp7,final1
-
-	pmulhw_m2r(fix_184, mm3);
-	psubw_r2r(mm5, mm4);				// tmp0-tmp7,final1
-
-//    tmp6 = tmp22 - tmp7;	/* phase 2 */
-	psraw_i2r(3, mm2);				// outptr[0,0],[1,0],[2,0],[3,0],final1
-
-	paddw_r2r(mm6, mm7);				// tmp20
-	psraw_i2r(3, mm4);				// outptr[0,7],[1,7],[2,7],[3,7],final1
-
-	paddw_r2r(mm0, mm3);				// tmp22
-
-//    tmp5 = tmp21 - tmp6;
-	psubw_r2r(mm5, mm3);				// tmp6
-
-//    tmp4 = tmp20 + tmp5;
-	movq_m2r(*(wsptr+1), mm0);		// tmp1,final2
-	psubw_r2r(mm3, mm1);				// tmp5
-
-	movq_r2r(mm0, mm6);				// final2
-	paddw_r2r(mm3, mm0);				// tmp1+tmp6,final2
-
-    /* Final output stage: scale down by a factor of 8 and range-limit */
-
-
-//    outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3)
-//			    & RANGE_MASK];
-//    outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3)
-//			    & RANGE_MASK];	final1
-
-
-//    outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3)
-//			    & RANGE_MASK];
-//    outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3)
-//			    & RANGE_MASK];	final2
-	psubw_r2r(mm3, mm6);				// tmp1-tmp6,final2
-	psraw_i2r(3, mm0);				// outptr[0,1],[1,1],[2,1],[3,1]
-
-	psraw_i2r(3, mm6);				// outptr[0,6],[1,6],[2,6],[3,6]
-	
-	packuswb_r2r(mm4, mm0);			// out[0,1],[1,1],[2,1],[3,1],[0,7],[1,7],[2,7],[3,7]
-	
-	movq_m2r(*(wsptr+2), mm5);		// tmp2,final3
-	packuswb_r2r(mm6, mm2);			// out[0,0],[1,0],[2,0],[3,0],[0,6],[1,6],[2,6],[3,6]
-
-//    outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3)
-//			    & RANGE_MASK];
-//    outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3)
-//			    & RANGE_MASK];	final3
-	paddw_r2r(mm1, mm7);				// tmp4
-	movq_r2r(mm5, mm3);
-
-	paddw_r2r(mm1, mm5);				// tmp2+tmp5
-	psubw_r2r(mm1, mm3);				// tmp2-tmp5
-
-	psraw_i2r(3, mm5);				// outptr[0,2],[1,2],[2,2],[3,2]
-
-	movq_m2r(*(wsptr+3), mm4);		// tmp3,final4
-	psraw_i2r(3, mm3);				// outptr[0,5],[1,5],[2,5],[3,5]
-
-
-
-//    outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3)
-//			    & RANGE_MASK];
-//    outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3)
-//			    & RANGE_MASK];	final4
-	movq_r2r(mm4, mm6);
-	paddw_r2r(mm7, mm4);				// tmp3+tmp4
-
-	psubw_r2r(mm7, mm6);				// tmp3-tmp4
-	psraw_i2r(3, mm4);				// outptr[0,4],[1,4],[2,4],[3,4]
-
-	// mov			ecx, [dataptr]
-
-	psraw_i2r(3, mm6);				// outptr[0,3],[1,3],[2,3],[3,3]
-
-	packuswb_r2r(mm4, mm5);			// out[0,2],[1,2],[2,2],[3,2],[0,4],[1,4],[2,4],[3,4]
-
-	packuswb_r2r(mm3, mm6);			// out[0,3],[1,3],[2,3],[3,3],[0,5],[1,5],[2,5],[3,5]
-	movq_r2r(mm2, mm4);
-
-	movq_r2r(mm5, mm7);
-	punpcklbw_r2r(mm0, mm2);		// out[0,0],[0,1],[1,0],[1,1],[2,0],[2,1],[3,0],[3,1]
-
-	punpckhbw_r2r(mm0, mm4);		// out[0,6],[0,7],[1,6],[1,7],[2,6],[2,7],[3,6],[3,7]
-	movq_r2r(mm2, mm1);
-
-	punpcklbw_r2r(mm6, mm5);		// out[0,2],[0,3],[1,2],[1,3],[2,2],[2,3],[3,2],[3,3]
-
-	// add		 	dataptr, 4
-
-	punpckhbw_r2r(mm6, mm7);		// out[0,4],[0,5],[1,4],[1,5],[2,4],[2,5],[3,4],[3,5]
-
-	punpcklwd_r2r(mm5, mm2);		// out[0,0],[0,1],[0,2],[0,3],[1,0],[1,1],[1,2],[1,3]
-	
-	// add			ecx, output_col
-
-	movq_r2r(mm7, mm6);
-	punpckhwd_r2r(mm5, mm1);		// out[2,0],[2,1],[2,2],[2,3],[3,0],[3,1],[3,2],[3,3]
-
-	movq_r2r(mm2, mm0);
-	punpcklwd_r2r(mm4, mm6);		// out[0,4],[0,5],[0,6],[0,7],[1,4],[1,5],[1,6],[1,7]
-
-	// mov			idata, [dataptr]
-	
-	punpckldq_r2r(mm6, mm2);		// out[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7]
-
-	// add		 	dataptr, 4
-	 
-	movq_r2r(mm1, mm3);
-
-	// add			idata, output_col 
-	
-	punpckhwd_r2r(mm4, mm7);		// out[2,4],[2,5],[2,6],[2,7],[3,4],[3,5],[3,6],[3,7]
-	
-	movq_r2m(mm2, *(dataptr));
-	
-	punpckhdq_r2r(mm6, mm0);		// out[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7]
-
-	dataptr += rskip;
-	movq_r2m(mm0, *(dataptr));
-
-	punpckldq_r2r(mm7, mm1);		// out[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7]
-	punpckhdq_r2r(mm7, mm3);		// out[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[3,7]
-	
-	dataptr += rskip;
-	movq_r2m(mm1, *(dataptr));
-
-	dataptr += rskip;
-	movq_r2m(mm3, *(dataptr));
-
-/*******************************************************************/
-
-	wsptr += 8;
-
-/*******************************************************************/
-
-//    tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]);
-//    tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]);
-//    tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]);
-//    tmp14 = ((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6]);
-	movq_m2r(*(wsptr), mm0);		// wsptr[0,0],[0,1],[0,2],[0,3]
-
-	movq_m2r(*(wsptr+1), mm1);		// wsptr[0,4],[0,5],[0,6],[0,7]
-	movq_r2r(mm0, mm2);
-	
-	movq_m2r(*(wsptr+2), mm3);		// wsptr[1,0],[1,1],[1,2],[1,3]
-	paddw_r2r(mm1, mm0);				// wsptr[0,tmp10],[xxx],[0,tmp13],[xxx]
-
-	movq_m2r(*(wsptr+3), mm4);		// wsptr[1,4],[1,5],[1,6],[1,7]
-	psubw_r2r(mm1, mm2);				// wsptr[0,tmp11],[xxx],[0,tmp14],[xxx]
-
-	movq_r2r(mm0, mm6);
-	movq_r2r(mm3, mm5);
-	
-	paddw_r2r(mm4, mm3);				// wsptr[1,tmp10],[xxx],[1,tmp13],[xxx]
-	movq_r2r(mm2, mm1);
-
-	psubw_r2r(mm4, mm5);				// wsptr[1,tmp11],[xxx],[1,tmp14],[xxx]
-	punpcklwd_r2r(mm3, mm0);		// wsptr[0,tmp10],[1,tmp10],[xxx],[xxx]
-
-	movq_m2r(*(wsptr+7), mm7);	// wsptr[3,4],[3,5],[3,6],[3,7]
-	punpckhwd_r2r(mm3, mm6);		// wsptr[0,tmp13],[1,tmp13],[xxx],[xxx]
-
-	movq_m2r(*(wsptr+4),	mm3);		// wsptr[2,0],[2,1],[2,2],[2,3]
-	punpckldq_r2r(mm6, mm0);		// wsptr[0,tmp10],[1,tmp10],[0,tmp13],[1,tmp13]
-
-	punpcklwd_r2r(mm5, mm1);		// wsptr[0,tmp11],[1,tmp11],[xxx],[xxx]
-	movq_r2r(mm3, mm4);
-
-	movq_m2r(*(wsptr+6), mm6);	// wsptr[3,0],[3,1],[3,2],[3,3]
-	punpckhwd_r2r(mm5, mm2);		// wsptr[0,tmp14],[1,tmp14],[xxx],[xxx]
-
-	movq_m2r(*(wsptr+5), mm5);	// wsptr[2,4],[2,5],[2,6],[2,7]
-	punpckldq_r2r(mm2, mm1);		// wsptr[0,tmp11],[1,tmp11],[0,tmp14],[1,tmp14]
-
-	paddw_r2r(mm5, mm3);				// wsptr[2,tmp10],[xxx],[2,tmp13],[xxx]
-	movq_r2r(mm6, mm2);
-
-	psubw_r2r(mm5, mm4);				// wsptr[2,tmp11],[xxx],[2,tmp14],[xxx]
-	paddw_r2r(mm7, mm6);				// wsptr[3,tmp10],[xxx],[3,tmp13],[xxx]
-
-	movq_r2r(mm3, mm5);
-	punpcklwd_r2r(mm6, mm3);		// wsptr[2,tmp10],[3,tmp10],[xxx],[xxx]
-	
-	psubw_r2r(mm7, mm2);				// wsptr[3,tmp11],[xxx],[3,tmp14],[xxx]
-	punpckhwd_r2r(mm6, mm5);		// wsptr[2,tmp13],[3,tmp13],[xxx],[xxx]
-
-	movq_r2r(mm4, mm7);
-	punpckldq_r2r(mm5, mm3);		// wsptr[2,tmp10],[3,tmp10],[2,tmp13],[3,tmp13]
-
-	punpcklwd_r2r(mm2, mm4);		// wsptr[2,tmp11],[3,tmp11],[xxx],[xxx]
-
-	punpckhwd_r2r(mm2, mm7);		// wsptr[2,tmp14],[3,tmp14],[xxx],[xxx]
-
-	punpckldq_r2r(mm7, mm4);		// wsptr[2,tmp11],[3,tmp11],[2,tmp14],[3,tmp14]
-	movq_r2r(mm1, mm6);
-
-	//OK
-
-//	mm0 = 	;wsptr[0,tmp10],[1,tmp10],[0,tmp13],[1,tmp13]
-//	mm1 =	;wsptr[0,tmp11],[1,tmp11],[0,tmp14],[1,tmp14]
-
-	movq_r2r(mm0, mm2);
-	punpckhdq_r2r(mm4, mm6);		// wsptr[0,tmp14],[1,tmp14],[2,tmp14],[3,tmp14]
-
-	punpckldq_r2r(mm4, mm1);		// wsptr[0,tmp11],[1,tmp11],[2,tmp11],[3,tmp11]
-	psllw_i2r(2, mm6);
-
-	pmulhw_m2r(fix_141, mm6);
-	punpckldq_r2r(mm3, mm0);		// wsptr[0,tmp10],[1,tmp10],[2,tmp10],[3,tmp10]
-
-	punpckhdq_r2r(mm3, mm2);		// wsptr[0,tmp13],[1,tmp13],[2,tmp13],[3,tmp13]
-	movq_r2r(mm0, mm7);
-
-//    tmp0 = tmp10 + tmp13;
-//    tmp3 = tmp10 - tmp13;
-	paddw_r2r(mm2, mm0);				// [0,tmp0],[1,tmp0],[2,tmp0],[3,tmp0]
-	psubw_r2r(mm2, mm7);				// [0,tmp3],[1,tmp3],[2,tmp3],[3,tmp3]
-
-//    tmp12 = MULTIPLY(tmp14, FIX_1_414213562) - tmp13;
-	psubw_r2r(mm2, mm6);				// wsptr[0,tmp12],[1,tmp12],[2,tmp12],[3,tmp12]
-//    tmp1 = tmp11 + tmp12;
-//    tmp2 = tmp11 - tmp12;
-	movq_r2r(mm1, mm5);
-
-	 //OK
-
-
-    /* Odd part */
-
-//    z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3];
-//    z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3];
-//    z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7];
-//    z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7];
-	movq_m2r(*(wsptr), mm3);		// wsptr[0,0],[0,1],[0,2],[0,3]
-	paddw_r2r(mm6, mm1);				// [0,tmp1],[1,tmp1],[2,tmp1],[3,tmp1]
-
-	movq_m2r(*(wsptr+1),	mm4);		// wsptr[0,4],[0,5],[0,6],[0,7]
-	psubw_r2r(mm6, mm5);				// [0,tmp2],[1,tmp2],[2,tmp2],[3,tmp2]
-
-	movq_r2r(mm3, mm6);
-	punpckldq_r2r(mm4, mm3);		// wsptr[0,0],[0,1],[0,4],[0,5]
-
-	punpckhdq_r2r(mm6, mm4);		// wsptr[0,6],[0,7],[0,2],[0,3]
-	movq_r2r(mm3, mm2);
-
-//Save tmp0 and tmp1 in wsptr
-	movq_r2m(mm0, *(wsptr));		// save tmp0
-	paddw_r2r(mm4, mm2);				// wsptr[xxx],[0,z11],[xxx],[0,z13]
-
-	
-//Continue with z10 --- z13
-	movq_m2r(*(wsptr+2), mm6);		// wsptr[1,0],[1,1],[1,2],[1,3]
-	psubw_r2r(mm4, mm3);				// wsptr[xxx],[0,z12],[xxx],[0,z10]
-
-	movq_m2r(*(wsptr+3), mm0);		// wsptr[1,4],[1,5],[1,6],[1,7]
-	movq_r2r(mm6, mm4);
-
-	movq_r2m(mm1, *(wsptr+1));		// save tmp1
-	punpckldq_r2r(mm0, mm6);		// wsptr[1,0],[1,1],[1,4],[1,5]
-
-	punpckhdq_r2r(mm4, mm0);		// wsptr[1,6],[1,7],[1,2],[1,3]
-	movq_r2r(mm6, mm1);
-	
-//Save tmp2 and tmp3 in wsptr
-	paddw_r2r(mm0, mm6);				// wsptr[xxx],[1,z11],[xxx],[1,z13]
-	movq_r2r(mm2, mm4);
-	
-//Continue with z10 --- z13
-	movq_r2m(mm5, *(wsptr+2));		// save tmp2
-	punpcklwd_r2r(mm6, mm2);		// wsptr[xxx],[xxx],[0,z11],[1,z11]
-
-	psubw_r2r(mm0, mm1);				// wsptr[xxx],[1,z12],[xxx],[1,z10]
-	punpckhwd_r2r(mm6, mm4);		// wsptr[xxx],[xxx],[0,z13],[1,z13]
-
-	movq_r2r(mm3, mm0);
-	punpcklwd_r2r(mm1, mm3);		// wsptr[xxx],[xxx],[0,z12],[1,z12]
-
-	movq_r2m(mm7, *(wsptr+3));		// save tmp3
-	punpckhwd_r2r(mm1, mm0);		// wsptr[xxx],[xxx],[0,z10],[1,z10]
-
-	movq_m2r(*(wsptr+4), mm6);		// wsptr[2,0],[2,1],[2,2],[2,3]
-	punpckhdq_r2r(mm2, mm0);		// wsptr[0,z10],[1,z10],[0,z11],[1,z11]
-
-	movq_m2r(*(wsptr+5), mm7);	// wsptr[2,4],[2,5],[2,6],[2,7]
-	punpckhdq_r2r(mm4, mm3);		// wsptr[0,z12],[1,z12],[0,z13],[1,z13]
-
-	movq_m2r(*(wsptr+6), mm1);	// wsptr[3,0],[3,1],[3,2],[3,3]
-	movq_r2r(mm6, mm4);
-
-	punpckldq_r2r(mm7, mm6);		// wsptr[2,0],[2,1],[2,4],[2,5]
-	movq_r2r(mm1, mm5);
-
-	punpckhdq_r2r(mm4, mm7);		// wsptr[2,6],[2,7],[2,2],[2,3]
-	movq_r2r(mm6, mm2);
-	
-	movq_m2r(*(wsptr+7), mm4);	// wsptr[3,4],[3,5],[3,6],[3,7]
-	paddw_r2r(mm7, mm6);				// wsptr[xxx],[2,z11],[xxx],[2,z13]
-
-	psubw_r2r(mm7, mm2);				// wsptr[xxx],[2,z12],[xxx],[2,z10]
-	punpckldq_r2r(mm4, mm1);		// wsptr[3,0],[3,1],[3,4],[3,5]
-
-	punpckhdq_r2r(mm5, mm4);		// wsptr[3,6],[3,7],[3,2],[3,3]
-	movq_r2r(mm1, mm7);
-
-	paddw_r2r(mm4, mm1);				// wsptr[xxx],[3,z11],[xxx],[3,z13]
-	psubw_r2r(mm4, mm7);				// wsptr[xxx],[3,z12],[xxx],[3,z10]
-
-	movq_r2r(mm6, mm5);
-	punpcklwd_r2r(mm1, mm6);		// wsptr[xxx],[xxx],[2,z11],[3,z11]
-
-	punpckhwd_r2r(mm1, mm5);		// wsptr[xxx],[xxx],[2,z13],[3,z13]
-	movq_r2r(mm2, mm4);
-
-	punpcklwd_r2r(mm7, mm2);		// wsptr[xxx],[xxx],[2,z12],[3,z12]
-
-	punpckhwd_r2r(mm7, mm4);		// wsptr[xxx],[xxx],[2,z10],[3,z10]
-
-	punpckhdq_r2r(mm6, mm4);		// wsptr[2,z10],[3,z10],[2,z11],[3,z11]
-
-	punpckhdq_r2r(mm5, mm2);		// wsptr[2,z12],[3,z12],[2,z13],[3,z13]
-	movq_r2r(mm0, mm5);
-
-	punpckldq_r2r(mm4, mm0);		// wsptr[0,z10],[1,z10],[2,z10],[3,z10]
-
-	punpckhdq_r2r(mm4, mm5);		// wsptr[0,z11],[1,z11],[2,z11],[3,z11]
-	movq_r2r(mm3, mm4);
-
-	punpckhdq_r2r(mm2, mm4);		// wsptr[0,z13],[1,z13],[2,z13],[3,z13]
-	movq_r2r(mm5, mm1);
-
-	punpckldq_r2r(mm2, mm3);		// wsptr[0,z12],[1,z12],[2,z12],[3,z12]
-//    tmp7 = z11 + z13;		/* phase 5 */
-//    tmp8 = z11 - z13;		/* phase 5 */
-	psubw_r2r(mm4, mm1);				// tmp8
-
-	paddw_r2r(mm4, mm5);				// tmp7
-//    tmp21 = MULTIPLY(tmp8, FIX_1_414213562); /* 2*c4 */
-	psllw_i2r(2, mm1);
-
-	psllw_i2r(2, mm0);
-
-	pmulhw_m2r(fix_141, mm1);		// tmp21
-//    tmp20 = MULTIPLY(z12, (FIX_1_082392200- FIX_1_847759065))  /* 2*(c2-c6) */
-//			+ MULTIPLY(z10, - FIX_1_847759065); /* 2*c2 */
-	psllw_i2r(2, mm3);
-	movq_r2r(mm0, mm7);
-
-	pmulhw_m2r(fix_n184, mm7);
-	movq_r2r(mm3, mm6);
-
-	movq_m2r(*(wsptr), mm2);		// tmp0,final1
-
-	pmulhw_m2r(fix_108n184, mm6);
-//	 tmp22 = MULTIPLY(z10,(FIX_1_847759065 - FIX_2_613125930)) /* -2*(c2+c6) */
-//			+ MULTIPLY(z12, FIX_1_847759065); /* 2*c2 */
-	movq_r2r(mm2, mm4);				// final1
-  
-	pmulhw_m2r(fix_184n261, mm0);
-	paddw_r2r(mm5, mm2);				// tmp0+tmp7,final1
-
-	pmulhw_m2r(fix_184, mm3);
-	psubw_r2r(mm5, mm4);				// tmp0-tmp7,final1
-
-//    tmp6 = tmp22 - tmp7;	/* phase 2 */
-	psraw_i2r(3, mm2);				// outptr[0,0],[1,0],[2,0],[3,0],final1
-
-	paddw_r2r(mm6, mm7);				// tmp20
-	psraw_i2r(3, mm4);				// outptr[0,7],[1,7],[2,7],[3,7],final1
-
-	paddw_r2r(mm0, mm3);				// tmp22
-
-//    tmp5 = tmp21 - tmp6;
-	psubw_r2r(mm5, mm3);				// tmp6
-
-//    tmp4 = tmp20 + tmp5;
-	movq_m2r(*(wsptr+1), mm0);		// tmp1,final2
-	psubw_r2r(mm3, mm1);				// tmp5
-
-	movq_r2r(mm0, mm6);				// final2
-	paddw_r2r(mm3, mm0);				// tmp1+tmp6,final2
-
-    /* Final output stage: scale down by a factor of 8 and range-limit */
-
-//    outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3)
-//			    & RANGE_MASK];
-//    outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3)
-//			    & RANGE_MASK];	final1
-
-
-//    outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3)
-//			    & RANGE_MASK];
-//    outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3)
-//			    & RANGE_MASK];	final2
-	psubw_r2r(mm3, mm6);				// tmp1-tmp6,final2
-	psraw_i2r(3, mm0);				// outptr[0,1],[1,1],[2,1],[3,1]
-
-	psraw_i2r(3, mm6);				// outptr[0,6],[1,6],[2,6],[3,6]
-	
-	packuswb_r2r(mm4, mm0);			// out[0,1],[1,1],[2,1],[3,1],[0,7],[1,7],[2,7],[3,7]
-	
-	movq_m2r(*(wsptr+2), mm5);		// tmp2,final3
-	packuswb_r2r(mm6, mm2);			// out[0,0],[1,0],[2,0],[3,0],[0,6],[1,6],[2,6],[3,6]
-
-//    outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3)
-//			    & RANGE_MASK];
-//    outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3)
-//			    & RANGE_MASK];	final3
-	paddw_r2r(mm1, mm7);				// tmp4
-	movq_r2r(mm5, mm3);
-
-	paddw_r2r(mm1, mm5);				// tmp2+tmp5
-	psubw_r2r(mm1, mm3);				// tmp2-tmp5
-
-	psraw_i2r(3, mm5);				// outptr[0,2],[1,2],[2,2],[3,2]
-
-	movq_m2r(*(wsptr+3), mm4);		// tmp3,final4
-	psraw_i2r(3, mm3);				// outptr[0,5],[1,5],[2,5],[3,5]
-
-
-
-//    outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3)
-//			    & RANGE_MASK];
-//    outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3)
-//			    & RANGE_MASK];	final4
-	movq_r2r(mm4, mm6);
-	paddw_r2r(mm7, mm4);				// tmp3+tmp4
-
-	psubw_r2r(mm7, mm6);				// tmp3-tmp4
-	psraw_i2r(3, mm4);				// outptr[0,4],[1,4],[2,4],[3,4]
-
-	psraw_i2r(3, mm6);				// outptr[0,3],[1,3],[2,3],[3,3]
-
-	/*
-   movq_r2m(mm4, *dummy);
-	fprintf(stderr, "3-4 %016llx\n", dummy);
-   movq_r2m(mm4, *dummy);
-	fprintf(stderr, "3+4 %016llx\n", dummy);
-	*/
-	
-
-	packuswb_r2r(mm4, mm5);			// out[0,2],[1,2],[2,2],[3,2],[0,4],[1,4],[2,4],[3,4]
-
-	packuswb_r2r(mm3, mm6);			// out[0,3],[1,3],[2,3],[3,3],[0,5],[1,5],[2,5],[3,5]
-	movq_r2r(mm2, mm4);
-
-	movq_r2r(mm5, mm7);
-	punpcklbw_r2r(mm0, mm2);		// out[0,0],[0,1],[1,0],[1,1],[2,0],[2,1],[3,0],[3,1]
-
-	punpckhbw_r2r(mm0, mm4);		// out[0,6],[0,7],[1,6],[1,7],[2,6],[2,7],[3,6],[3,7]
-	movq_r2r(mm2, mm1);
-
-	punpcklbw_r2r(mm6, mm5);		// out[0,2],[0,3],[1,2],[1,3],[2,2],[2,3],[3,2],[3,3]
-	
-	punpckhbw_r2r(mm6, mm7);		// out[0,4],[0,5],[1,4],[1,5],[2,4],[2,5],[3,4],[3,5]
-
-	punpcklwd_r2r(mm5, mm2);		// out[0,0],[0,1],[0,2],[0,3],[1,0],[1,1],[1,2],[1,3]
-	
-	movq_r2r(mm7, mm6);
-	punpckhwd_r2r(mm5, mm1);		// out[2,0],[2,1],[2,2],[2,3],[3,0],[3,1],[3,2],[3,3]
-
-	movq_r2r(mm2, mm0);
-	punpcklwd_r2r(mm4, mm6);		// out[0,4],[0,5],[0,6],[0,7],[1,4],[1,5],[1,6],[1,7]
-
-	punpckldq_r2r(mm6, mm2);		// out[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7]
-
-	movq_r2r(mm1, mm3);
-
-	punpckhwd_r2r(mm4, mm7);		// out[2,4],[2,5],[2,6],[2,7],[3,4],[3,5],[3,6],[3,7]
-	
-	dataptr += rskip;
-	movq_r2m(mm2, *(dataptr));
-
-	punpckhdq_r2r(mm6, mm0);		// out[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7]
-
-	dataptr += rskip;
-	movq_r2m(mm0, *(dataptr));
-
-	punpckldq_r2r(mm7, mm1);		// out[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7]
-	
-	punpckhdq_r2r(mm7, mm3);		// out[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[3,7]
-
-	dataptr += rskip;
-	movq_r2m(mm1, *(dataptr));
-
-	dataptr += rskip;
-	movq_r2m(mm3, *(dataptr));
-
-#else
-  __s32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
-  __s32 tmp10, tmp11, tmp12, tmp13;
-  __s32 z5, z10, z11, z12, z13;
-  __s16 *inptr;
-  __s32 *wsptr;
-  __u8 *outptr;
-  int ctr;
-  __s32 dcval;
-  __s32 workspace[64];
-
-  inptr = data;
-  wsptr = workspace;
-  for (ctr = 8; ctr > 0; ctr--) {
-    
-    if ((inptr[8] | inptr[16] | inptr[24] |
-	 inptr[32] | inptr[40] | inptr[48] | inptr[56]) == 0) {
-      dcval = inptr[0];
-      wsptr[0] = dcval;
-      wsptr[8] = dcval;
-      wsptr[16] = dcval;
-      wsptr[24] = dcval;
-      wsptr[32] = dcval;
-      wsptr[40] = dcval;
-      wsptr[48] = dcval;
-      wsptr[56] = dcval;
-      
-      inptr++;	
-      wsptr++;
-      continue;
-    } 
-    
-    tmp0 = inptr[0];
-    tmp1 = inptr[16];
-    tmp2 = inptr[32];
-    tmp3 = inptr[48];
-
-    tmp10 = tmp0 + tmp2;
-    tmp11 = tmp0 - tmp2;
-
-    tmp13 = tmp1 + tmp3;
-    tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13;
-
-    tmp0 = tmp10 + tmp13;
-    tmp3 = tmp10 - tmp13;
-    tmp1 = tmp11 + tmp12;
-    tmp2 = tmp11 - tmp12;
-    
-    tmp4 = inptr[8];
-    tmp5 = inptr[24];
-    tmp6 = inptr[40];
-    tmp7 = inptr[56];
-
-    z13 = tmp6 + tmp5;
-    z10 = tmp6 - tmp5;
-    z11 = tmp4 + tmp7;
-    z12 = tmp4 - tmp7;
-
-    tmp7 = z11 + z13;
-    tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
-
-    z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
-    tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
-    tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5;
-
-    tmp6 = tmp12 - tmp7;
-    tmp5 = tmp11 - tmp6;
-    tmp4 = tmp10 + tmp5;
-
-    wsptr[0] = (__s32) (tmp0 + tmp7);
-    wsptr[56] = (__s32) (tmp0 - tmp7);
-    wsptr[8] = (__s32) (tmp1 + tmp6);
-    wsptr[48] = (__s32) (tmp1 - tmp6);
-    wsptr[16] = (__s32) (tmp2 + tmp5);
-    wsptr[40] = (__s32) (tmp2 - tmp5);
-    wsptr[32] = (__s32) (tmp3 + tmp4);
-    wsptr[24] = (__s32) (tmp3 - tmp4);
-
-    inptr++;
-    wsptr++;
-  }
-
-  wsptr = workspace;
-  for (ctr = 0; ctr < 8; ctr++) {
-    outptr = &(odata[ctr*rskip]);
-
-    tmp10 = wsptr[0] + wsptr[4];
-    tmp11 = wsptr[0] - wsptr[4];
-
-    tmp13 = wsptr[2] + wsptr[6];
-    tmp12 = MULTIPLY(wsptr[2] - wsptr[6], FIX_1_414213562) - tmp13;
-
-    tmp0 = tmp10 + tmp13;
-    tmp3 = tmp10 - tmp13;
-    tmp1 = tmp11 + tmp12;
-    tmp2 = tmp11 - tmp12;
-
-    z13 = wsptr[5] + wsptr[3];
-    z10 = wsptr[5] - wsptr[3];
-    z11 = wsptr[1] + wsptr[7];
-    z12 = wsptr[1] - wsptr[7];
-
-    tmp7 = z11 + z13;
-    tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
-
-    z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
-    tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
-    tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5;
-
-    tmp6 = tmp12 - tmp7;
-    tmp5 = tmp11 - tmp6;
-    tmp4 = tmp10 + tmp5;
-
-    outptr[0] = RL(DESCALE(tmp0 + tmp7));
-    outptr[7] = RL(DESCALE(tmp0 - tmp7));
-    outptr[1] = RL(DESCALE(tmp1 + tmp6));
-    outptr[6] = RL(DESCALE(tmp1 - tmp6));
-    outptr[2] = RL(DESCALE(tmp2 + tmp5));
-    outptr[5] = RL(DESCALE(tmp2 - tmp5));
-    outptr[4] = RL(DESCALE(tmp3 + tmp4));
-    outptr[3] = RL(DESCALE(tmp3 - tmp4));
-
-    wsptr += 8;
-  }
-#endif
-}
 /*
 
 Main Routines
@@ -2702,7 +1408,7 @@ Initialise all the cache-aliged data blocks
 
 */
 
-void RTjpeg_init_data(void)
+static void RTjpeg_init_data(void)
 {
  unsigned long dptr;
  
@@ -2733,7 +1439,7 @@ Input: buf -> pointer to 128 ints for quant values store to pass back to
        Q -> quality factor (192=best, 32=worst)
 */
 
-void RTjpeg_init_Q(__u8 Q)
+static void RTjpeg_init_Q(__u8 Q)
 {
  int i;
  __u64 qual;
@@ -2760,7 +1466,6 @@ void RTjpeg_init_Q(__u8 Q)
  RTjpeg_cb8--;
 
  RTjpeg_dct_init();
- RTjpeg_idct_init();
  RTjpeg_quant_init();
 }
 
@@ -2822,37 +1527,6 @@ void RTjpeg_init_compress(__u32 *buf, int width, int height, __u8 Q)
   buf[64+i]=le2me_32(RTjpeg_ciqt[i]);
 }
 
-void RTjpeg_init_decompress(__u32 *buf, int width, int height)
-{
- int i;
-
- RTjpeg_init_data();
- 
- RTjpeg_width=width;
- RTjpeg_height=height;
- RTjpeg_Ywidth = RTjpeg_width>>3;
- RTjpeg_Ysize=width * height;
- RTjpeg_Cwidth = RTjpeg_width>>4;
- RTjpeg_Csize= (width>>1) * height;
-
- for(i=0; i<64; i++)
- {
-  RTjpeg_liqt[i]=le2me_32(buf[i]);
-  RTjpeg_ciqt[i]=le2me_32(buf[i+64]);
- }
-
- RTjpeg_lb8=0;
- while(RTjpeg_liqt[RTjpeg_ZZ[++RTjpeg_lb8]]<=8);
- RTjpeg_lb8--;
- RTjpeg_cb8=0;
- while(RTjpeg_ciqt[RTjpeg_ZZ[++RTjpeg_cb8]]<=8);
- RTjpeg_cb8--;
-
- RTjpeg_idct_init();
-
-// RTjpeg_color_init();
-}
-
 int RTjpeg_compressYUV420(__s8 *sp, unsigned char *bp)
 {
  __s8 * sb;
@@ -2907,210 +1581,6 @@ int RTjpeg_compressYUV420(__s8 *sp, unsigned char *bp)
  return (sp-sb);
 }
 
-int RTjpeg_compressYUV422(__s8 *sp, unsigned char *bp)
-{
- __s8 * sb;
- register __s8 * bp2 = bp + RTjpeg_Ysize;
- register __s8 * bp3 = bp2 + RTjpeg_Csize;
- register int i, j, k;
-
-#if HAVE_MMX
- emms();
-#endif
- sb=sp;
-/* Y */
- for(i=RTjpeg_height; i; i-=8)
- {
-  for(j=0, k=0; j<RTjpeg_width; j+=16, k+=8)
-  {
-   RTjpeg_dctY(bp+j, RTjpeg_block, RTjpeg_Ywidth);
-   RTjpeg_quant(RTjpeg_block, RTjpeg_lqt);
-   sp+=RTjpeg_b2s(RTjpeg_block, sp, RTjpeg_lb8);
-
-   RTjpeg_dctY(bp+j+8, RTjpeg_block, RTjpeg_Ywidth);
-   RTjpeg_quant(RTjpeg_block, RTjpeg_lqt);
-   sp+=RTjpeg_b2s(RTjpeg_block, sp, RTjpeg_lb8);
-
-   RTjpeg_dctY(bp2+k, RTjpeg_block, RTjpeg_Cwidth);
-   RTjpeg_quant(RTjpeg_block, RTjpeg_cqt);
-   sp+=RTjpeg_b2s(RTjpeg_block, sp, RTjpeg_cb8);
-
-   RTjpeg_dctY(bp3+k, RTjpeg_block, RTjpeg_Cwidth);
-   RTjpeg_quant(RTjpeg_block, RTjpeg_cqt);
-   sp+=RTjpeg_b2s(RTjpeg_block, sp, RTjpeg_cb8);
-
-  }
-  bp+=RTjpeg_width<<3;
-  bp2+=RTjpeg_width<<2;
-  bp3+=RTjpeg_width<<2;
-			 
- }
-#if HAVE_MMX
- emms();
-#endif
- return (sp-sb);
-}
-
-int RTjpeg_compress8(__s8 *sp, unsigned char *bp)
-{
- __s8 * sb;
- int i, j;
-
-#if HAVE_MMX
- emms();
-#endif
- 
- sb=sp;
-/* Y */
- for(i=0; i<RTjpeg_height; i+=8)
- {
-  for(j=0; j<RTjpeg_width; j+=8)
-  {
-   RTjpeg_dctY(bp+j, RTjpeg_block, RTjpeg_width);
-   RTjpeg_quant(RTjpeg_block, RTjpeg_lqt);
-   sp+=RTjpeg_b2s(RTjpeg_block, sp, RTjpeg_lb8);
-  }
-  bp+=RTjpeg_width;
- }
-
-#if HAVE_MMX
- emms();
-#endif
- return (sp-sb);
-}
-
-void RTjpeg_decompressYUV422(__s8 *sp, __u8 *bp)
-{
- register __s8 * bp2 = bp + RTjpeg_Ysize;
- register __s8 * bp3 = bp2 + (RTjpeg_Csize);
- int i, j,k;
-
-#if HAVE_MMX
- emms();
-#endif
-
-/* Y */
- for(i=RTjpeg_height; i; i-=8)
- {
-  for(k=0, j=0; j<RTjpeg_width; j+=16, k+=8) {
-   if(*sp==-1)sp++;
-   else
-   { 
-    sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt);
-    RTjpeg_idct(bp+j, RTjpeg_block, RTjpeg_width);
-   }
-   if(*sp==-1)sp++;
-   else
-   { 
-    sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt);
-    RTjpeg_idct(bp+j+8, RTjpeg_block, RTjpeg_width);
-   }
-   if(*sp==-1)sp++;
-   else
-   { 
-    sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_cb8, RTjpeg_ciqt);
-    RTjpeg_idct(bp2+k, RTjpeg_block, RTjpeg_width>>1);
-   } 
-   if(*sp==-1)sp++;
-   else
-   { 
-    sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_cb8, RTjpeg_ciqt);
-    RTjpeg_idct(bp3+k, RTjpeg_block, RTjpeg_width>>1);
-   } 
-  }
-  bp+=RTjpeg_width<<3;
-  bp2+=RTjpeg_width<<2;
-  bp3+=RTjpeg_width<<2;
- }
-#if HAVE_MMX
- emms();
-#endif
-}
-
-void RTjpeg_decompressYUV420(__s8 *sp, __u8 *bp)
-{
- register __s8 * bp1 = bp + (RTjpeg_width<<3);
- register __s8 * bp2 = bp + RTjpeg_Ysize;
- register __s8 * bp3 = bp2 + (RTjpeg_Csize>>1);
- int i, j,k;
-
-#if HAVE_MMX
- emms();
-#endif
-
-/* Y */
- for(i=RTjpeg_height>>1; i; i-=8)
- {
-  for(k=0, j=0; j<RTjpeg_width; j+=16, k+=8) {
-   if(*sp==-1)sp++;
-   else
-   { 
-    sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt);
-    RTjpeg_idct(bp+j, RTjpeg_block, RTjpeg_width);
-   }
-   if(*sp==-1)sp++;
-   else
-   { 
-    sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt);
-    RTjpeg_idct(bp+j+8, RTjpeg_block, RTjpeg_width);
-   }
-   if(*sp==-1)sp++;
-   else
-   { 
-    sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt);
-    RTjpeg_idct(bp1+j, RTjpeg_block, RTjpeg_width);
-   }
-   if(*sp==-1)sp++;
-   else
-   { 
-    sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt);
-    RTjpeg_idct(bp1+j+8, RTjpeg_block, RTjpeg_width);
-   }
-   if(*sp==-1)sp++;
-   else
-   { 
-    sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_cb8, RTjpeg_ciqt);
-    RTjpeg_idct(bp2+k, RTjpeg_block, RTjpeg_width>>1);
-   } 
-   if(*sp==-1)sp++;
-   else
-   { 
-    sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_cb8, RTjpeg_ciqt);
-    RTjpeg_idct(bp3+k, RTjpeg_block, RTjpeg_width>>1);
-   } 
-  }
-  bp+=RTjpeg_width<<4;
-  bp1+=RTjpeg_width<<4;
-  bp2+=RTjpeg_width<<2;
-  bp3+=RTjpeg_width<<2;
- }
-#if HAVE_MMX
- emms();
-#endif
-}
-
-void RTjpeg_decompress8(__s8 *sp, __u8 *bp)
-{
- int i, j;
-
-#if HAVE_MMX
- emms();
-#endif
-
-/* Y */
- for(i=0; i<RTjpeg_height; i+=8)
- {
-  for(j=0; j<RTjpeg_width; j+=8)
-   if(*sp==-1)sp++;
-   else
-   { 
-    sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt);
-    RTjpeg_idct(bp+j, RTjpeg_block, RTjpeg_width);
-   }
-  bp+=RTjpeg_width<<3;
- }
-}
-
 /*
 External Function
 
@@ -3140,7 +1610,7 @@ void RTjpeg_init_mcompress(void)
 
 #if HAVE_MMX
 
-int RTjpeg_bcomp(__s16 *old, mmx_t *mask)
+static int RTjpeg_bcomp(__s16 *old, mmx_t *mask)
 {
  int i;
  mmx_t *mold=(mmx_t *)old;
@@ -3177,23 +1647,19 @@ int RTjpeg_bcomp(__s16 *old, mmx_t *mask)
  
  if(result.q)
  {
-//  if(!RTjpeg_mtest)
-//   for(i=0; i<16; i++)((__u64 *)old)[i]=((__u64 *)RTjpeg_block)[i];
   return 0;
  }
-// printf(".");
  return 1;
 }
 
 #else
-int RTjpeg_bcomp(__s16 *old, __u16 *mask)
+static int RTjpeg_bcomp(__s16 *old, __u16 *mask)
 {
  int i;
 
  for(i=0; i<64; i++)
   if(abs(old[i]-RTjpeg_block[i])>*mask)
   {
-   if(!RTjpeg_mtest)
     for(i=0; i<16; i++)((__u64 *)old)[i]=((__u64 *)RTjpeg_block)[i];
    return 0;
   }
@@ -3201,15 +1667,9 @@ int RTjpeg_bcomp(__s16 *old, __u16 *mask)
 }
 #endif
 
-void RTjpeg_set_test(int i)
-{
- RTjpeg_mtest=i;
-}
-
 int RTjpeg_mcompressYUV420(__s8 *sp, unsigned char *bp, __u16 lmask, __u16 cmask)
 {
  __s8 * sb;
-//rh __s16 *block;
  register __s8 * bp1 = bp + (RTjpeg_width<<3);
  register __s8 * bp2 = bp + RTjpeg_Ysize;
  register __s8 * bp3 = bp2 + (RTjpeg_Csize>>1);
@@ -3296,502 +1756,3 @@ int RTjpeg_mcompressYUV420(__s8 *sp, unsigned char *bp, __u16 lmask, __u16 cmask
 #endif
  return (sp-sb);
 }
-
-
-int RTjpeg_mcompressYUV422(__s8 *sp, unsigned char *bp, __u16 lmask, __u16 cmask)
-{
- __s8 * sb;
- __s16 *block;
- register __s8 * bp2;
- register __s8 * bp3;
- register int i, j, k;
-
-#if HAVE_MMX
- emms();
- RTjpeg_lmask.uq=((__u64)lmask<<48)|((__u64)lmask<<32)|((__u64)lmask<<16)|lmask;
- RTjpeg_cmask.uq=((__u64)cmask<<48)|((__u64)cmask<<32)|((__u64)cmask<<16)|cmask;
-#else
- RTjpeg_lmask=lmask;
- RTjpeg_cmask=cmask;
-#endif
- 
- bp = bp - RTjpeg_width*0;
- bp2 = bp + RTjpeg_Ysize-RTjpeg_width*0;
- bp3 = bp2 + RTjpeg_Csize;
-
- sb=sp;
- block=RTjpeg_old;
-/* Y */
- for(i=RTjpeg_height; i; i-=8)
- {
-  for(j=0, k=0; j<RTjpeg_width; j+=16, k+=8)
-  {
-   RTjpeg_dctY(bp+j, RTjpeg_block, RTjpeg_Ywidth);
-   RTjpeg_quant(RTjpeg_block, RTjpeg_lqt);
-   if(RTjpeg_bcomp(block, &RTjpeg_lmask))
-   {
-    *((__u8 *)sp++)=255;
-   } 
-	else sp+=RTjpeg_b2s(RTjpeg_block, sp, RTjpeg_lb8);
-   block+=64;
-
-   RTjpeg_dctY(bp+j+8, RTjpeg_block, RTjpeg_Ywidth);
-   RTjpeg_quant(RTjpeg_block, RTjpeg_lqt);
-   if(RTjpeg_bcomp(block, &RTjpeg_lmask))
-   {
-    *((__u8 *)sp++)=255;
-   } 
-	else sp+=RTjpeg_b2s(RTjpeg_block, sp, RTjpeg_lb8);
-   block+=64;
-
-   RTjpeg_dctY(bp2+k, RTjpeg_block, RTjpeg_Cwidth);
-   RTjpeg_quant(RTjpeg_block, RTjpeg_cqt);
-   if(RTjpeg_bcomp(block, &RTjpeg_cmask))
-   {
-    *((__u8 *)sp++)=255;
-   } 
-	else sp+=RTjpeg_b2s(RTjpeg_block, sp, RTjpeg_cb8);
-   block+=64;
-
-   RTjpeg_dctY(bp3+k, RTjpeg_block, RTjpeg_Cwidth);
-   RTjpeg_quant(RTjpeg_block, RTjpeg_cqt);
-   if(RTjpeg_bcomp(block, &RTjpeg_cmask))
-   {
-    *((__u8 *)sp++)=255;
-   } 
-	else sp+=RTjpeg_b2s(RTjpeg_block, sp, RTjpeg_cb8);
-   block+=64;
-
-  }
-  bp+=RTjpeg_width<<3;
-  bp2+=RTjpeg_width<<2;
-  bp3+=RTjpeg_width<<2;
- }
- printf ("%d\n", block - RTjpeg_old);
-#if HAVE_MMX
- emms();
-#endif
- return (sp-sb);
-}
-
-int RTjpeg_mcompress8(__s8 *sp, unsigned char *bp, __u16 lmask)
-{
- __s8 * sb;
- __s16 *block;
- int i, j;
-
-#if HAVE_MMX
- emms();
- RTjpeg_lmask.uq=((__u64)lmask<<48)|((__u64)lmask<<32)|((__u64)lmask<<16)|lmask;
-#else
- RTjpeg_lmask=lmask;
-#endif
-
- 
- sb=sp;
- block=RTjpeg_old;
-/* Y */
- for(i=0; i<RTjpeg_height; i+=8)
- {
-  for(j=0; j<RTjpeg_width; j+=8)
-  {
-   RTjpeg_dctY(bp+j, RTjpeg_block, RTjpeg_width);
-   RTjpeg_quant(RTjpeg_block, RTjpeg_lqt);
-   if(RTjpeg_bcomp(block, &RTjpeg_lmask))
-   {
-    *((__u8 *)sp++)=255;
-//    printf("* %d ", sp[-1]);
-   } else sp+=RTjpeg_b2s(RTjpeg_block, sp, RTjpeg_lb8);
-   block+=64;
-  }
-  bp+=RTjpeg_width<<3;
- }
-#if HAVE_MMX
- emms();
-#endif
- return (sp-sb);
-}
-
-void RTjpeg_color_init(void)
-{
-}  
-
-#define KcrR 76284
-#define KcrG 53281
-#define KcbG 25625
-#define KcbB 132252
-#define Ky 76284
-
-void RTjpeg_yuv422rgb(__u8 *buf, __u8 *rgb, int stride)
-{
- int tmp;
- int i, j;
- __s32 y, crR, crG, cbG, cbB;
- __u8 *bufcr, *bufcb, *bufy, *bufoute;
- int yskip;
- 
- yskip=RTjpeg_width;
- 
- bufcb=&buf[RTjpeg_width*RTjpeg_height];
- bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/2];
- bufy=&buf[0];
- bufoute=rgb;
- 
- for(i=0; i<(RTjpeg_height); i++)
- {
-  for(j=0; j<RTjpeg_width; j+=2)
-  {
-   crR=(*bufcr-128)*KcrR;
-   crG=(*(bufcr++)-128)*KcrG;
-   cbG=(*bufcb-128)*KcbG;
-   cbB=(*(bufcb++)-128)*KcbB;
-  
-   y=(bufy[j]-16)*Ky;
-   
-   tmp=(y+crR)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+cbB)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-
-   y=(bufy[j+1]-16)*Ky;
-
-   tmp=(y+crR)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+cbB)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-
-  }
-  bufy+=yskip;
- }
-}
-
-
-void RTjpeg_yuv420rgb(__u8 *buf, __u8 *rgb, int stride)
-{
- int tmp;
- int i, j;
- __s32 y, crR, crG, cbG, cbB;
- __u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto;
- int oskip, yskip;
- 
- if(stride==0)
- 	oskip=RTjpeg_width*3;
- else
- 	oskip=2*stride-RTjpeg_width*3;
- 
- yskip=RTjpeg_width;
- 
- bufcb=&buf[RTjpeg_width*RTjpeg_height];
- bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/4];
- bufy=&buf[0];
- bufoute=rgb;
- bufouto=rgb+RTjpeg_width*3;
- 
- for(i=0; i<(RTjpeg_height>>1); i++)
- {
-  for(j=0; j<RTjpeg_width; j+=2)
-  {
-   crR=(*bufcr-128)*KcrR;
-   crG=(*(bufcr++)-128)*KcrG;
-   cbG=(*bufcb-128)*KcbG;
-   cbB=(*(bufcb++)-128)*KcbB;
-  
-   y=(bufy[j]-16)*Ky;
-   
-   tmp=(y+crR)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+cbB)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-
-   y=(bufy[j+1]-16)*Ky;
-
-   tmp=(y+crR)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+cbB)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-
-   y=(bufy[j+yskip]-16)*Ky;
-
-   tmp=(y+crR)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+cbB)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-
-   y=(bufy[j+1+yskip]-16)*Ky;
-
-   tmp=(y+crR)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+cbB)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   
-  }
-  bufoute+=oskip;
-  bufouto+=oskip;
-  bufy+=yskip<<1;
- }
-}
-
-
-void RTjpeg_yuvrgb32(__u8 *buf, __u8 *rgb, int stride)
-{
- int tmp;
- int i, j;
- __s32 y, crR, crG, cbG, cbB;
- __u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto;
- int oskip, yskip;
- 
- if(stride==0)
- 	oskip=RTjpeg_width*4;
- else
- 	oskip = 2*stride-RTjpeg_width*4;
- yskip=RTjpeg_width;
- 
- bufcb=&buf[RTjpeg_width*RTjpeg_height];
- bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/2];
- bufy=&buf[0];
- bufoute=rgb;
- bufouto=rgb+RTjpeg_width*4;
- 
- for(i=0; i<(RTjpeg_height>>1); i++)
- {
-  for(j=0; j<RTjpeg_width; j+=2)
-  {
-   crR=(*bufcr-128)*KcrR;
-   crG=(*(bufcr++)-128)*KcrG;
-   cbG=(*bufcb-128)*KcbG;
-   cbB=(*(bufcb++)-128)*KcbB;
-  
-   y=(bufy[j]-16)*Ky;
-   
-   tmp=(y+cbB)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+crR)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   bufoute++;
-
-   y=(bufy[j+1]-16)*Ky;
-
-   tmp=(y+cbB)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+crR)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   bufoute++;
-
-   y=(bufy[j+yskip]-16)*Ky;
-
-   tmp=(y+cbB)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+crR)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   bufouto++;
-
-   y=(bufy[j+1+yskip]-16)*Ky;
-
-   tmp=(y+cbB)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+crR)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   bufouto++;
-   
-  }
-  bufoute+=oskip;
-  bufouto+=oskip;
-  bufy+=yskip<<1;
- }
-}
-
-void RTjpeg_yuvrgb24(__u8 *buf, __u8 *rgb, int stride)
-{
- int tmp;
- int i, j;
- __s32 y, crR, crG, cbG, cbB;
- __u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto;
- int oskip, yskip;
- 
- if(stride==0)
- 	oskip=RTjpeg_width*3;
- else
- 	oskip=2*stride - RTjpeg_width*3;
- 	
- yskip=RTjpeg_width;
- 
- bufcb=&buf[RTjpeg_width*RTjpeg_height];
- bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/4];
- bufy=&buf[0];
- bufoute=rgb;
- bufouto=rgb+RTjpeg_width*3;
- 
- for(i=0; i<(RTjpeg_height>>1); i++)
- {
-  for(j=0; j<RTjpeg_width; j+=2)
-  {
-   crR=(*bufcr-128)*KcrR;
-   crG=(*(bufcr++)-128)*KcrG;
-   cbG=(*bufcb-128)*KcbG;
-   cbB=(*(bufcb++)-128)*KcbB;
-  
-   y=(bufy[j]-16)*Ky;
-   
-   tmp=(y+cbB)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+crR)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-
-   y=(bufy[j+1]-16)*Ky;
-
-   tmp=(y+cbB)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+crR)>>16;
-   *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp);
-
-   y=(bufy[j+yskip]-16)*Ky;
-
-   tmp=(y+cbB)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+crR)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-
-   y=(bufy[j+1+yskip]-16)*Ky;
-
-   tmp=(y+cbB)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+crR)>>16;
-   *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp);
-   
-  }
-  bufoute+=oskip;
-  bufouto+=oskip;
-  bufy+=yskip<<1;
- }
-}
-
-void RTjpeg_yuvrgb16(__u8 *buf, __u8 *rgb, int stride)
-{
- int tmp;
- int i, j;
- __s32 y, crR, crG, cbG, cbB;
- __u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto;
- int oskip, yskip;
- unsigned char r, g, b;
- 
- if(stride==0)
- 	oskip=RTjpeg_width*2;
- else
- 	oskip=2*stride-RTjpeg_width*2;
- 	
- yskip=RTjpeg_width;
- 
- bufcb=&buf[RTjpeg_width*RTjpeg_height];
- bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/4];
- bufy=&buf[0];
- bufoute=rgb;
- bufouto=rgb+RTjpeg_width*2;
- 
- for(i=0; i<(RTjpeg_height>>1); i++)
- {
-  for(j=0; j<RTjpeg_width; j+=2)
-  {
-   crR=(*bufcr-128)*KcrR;
-   crG=(*(bufcr++)-128)*KcrG;
-   cbG=(*bufcb-128)*KcbG;
-   cbB=(*(bufcb++)-128)*KcbB;
-  
-   y=(bufy[j]-16)*Ky;
-   
-   tmp=(y+cbB)>>16;
-   b=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   g=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+crR)>>16;
-   r=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(int)((int)b >> 3);
-   tmp|=(int)(((int)g >> 2) << 5);
-   tmp|=(int)(((int)r >> 3) << 11);
-   *(bufoute++)=tmp&0xff;
-   *(bufoute++)=tmp>>8;
-   
-
-   y=(bufy[j+1]-16)*Ky;
-
-   tmp=(y+cbB)>>16;
-   b=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   g=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+crR)>>16;
-   r=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(int)((int)b >> 3);
-   tmp|=(int)(((int)g >> 2) << 5);
-   tmp|=(int)(((int)r >> 3) << 11);
-   *(bufoute++)=tmp&0xff;
-   *(bufoute++)=tmp>>8;
-
-   y=(bufy[j+yskip]-16)*Ky;
-
-   tmp=(y+cbB)>>16;
-   b=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   g=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+crR)>>16;
-   r=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(int)((int)b >> 3);
-   tmp|=(int)(((int)g >> 2) << 5);
-   tmp|=(int)(((int)r >> 3) << 11);
-   *(bufouto++)=tmp&0xff;
-   *(bufouto++)=tmp>>8;
-
-   y=(bufy[j+1+yskip]-16)*Ky;
-
-   tmp=(y+cbB)>>16;
-   b=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y-crG-cbG)>>16;
-   g=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(y+crR)>>16;
-   r=(tmp>255)?255:((tmp<0)?0:tmp);
-   tmp=(int)((int)b >> 3);
-   tmp|=(int)(((int)g >> 2) << 5);
-   tmp|=(int)(((int)r >> 3) << 11);
-   *(bufouto++)=tmp&0xff;
-   *(bufouto++)=tmp>>8;
-
-  }
-  bufoute+=oskip;
-  bufouto+=oskip;
-  bufy+=yskip<<1;
- }
-}
-
-/* fix stride */
-
-void RTjpeg_yuvrgb8(__u8 *buf, __u8 *rgb, int stride)
-{
- memcpy(rgb, buf, RTjpeg_width*RTjpeg_height);
-}
-
diff --git a/libmpcodecs/native/rtjpegn.h b/libmpcodecs/native/rtjpegn.h
index a854818..859b823 100644
--- a/libmpcodecs/native/rtjpegn.h
+++ b/libmpcodecs/native/rtjpegn.h
@@ -35,27 +35,10 @@
 #define __s32 int32_t
 #define __s64 int64_t
 
-extern void RTjpeg_init_Q(__u8 Q);
-extern void RTjpeg_init_compress(__u32 *buf, int width, int height, __u8 Q);
-extern void RTjpeg_init_decompress(__u32 *buf, int width, int height);
-extern int RTjpeg_compressYUV420(__s8 *sp, unsigned char *bp);
-extern int RTjpeg_compressYUV422(__s8 *sp, unsigned char *bp);
-extern void RTjpeg_decompressYUV420(__s8 *sp, __u8 *bp);
-extern void RTjpeg_decompressYUV422(__s8 *sp, __u8 *bp);
-extern int RTjpeg_compress8(__s8 *sp, unsigned char *bp);
-extern void RTjpeg_decompress8(__s8 *sp, __u8 *bp);
-
-extern void RTjpeg_init_mcompress(void);
-extern int RTjpeg_mcompressYUV420(__s8 *sp, unsigned char *bp, __u16 lmask, __u16 cmask);
-extern int RTjpeg_mcompressYUV422(__s8 *sp, unsigned char *bp, __u16 lmask, __u16 cmask);
-extern int RTjpeg_mcompress8(__s8 *sp, unsigned char *bp, __u16 lmask);
-extern void RTjpeg_set_test(int i);
-
-extern void RTjpeg_yuv420rgb(__u8 *buf, __u8 *rgb, int stride);
-extern void RTjpeg_yuv422rgb(__u8 *buf, __u8 *rgb, int stride);
-extern void RTjpeg_yuvrgb8(__u8 *buf, __u8 *rgb, int stride);
-extern void RTjpeg_yuvrgb16(__u8 *buf, __u8 *rgb, int stride);
-extern void RTjpeg_yuvrgb24(__u8 *buf, __u8 *rgb, int stride);
-extern void RTjpeg_yuvrgb32(__u8 *buf, __u8 *rgb, int stride);
+void RTjpeg_init_compress(__u32 *buf, int width, int height, __u8 Q);
+int RTjpeg_compressYUV420(__s8 *sp, unsigned char *bp);
+
+void RTjpeg_init_mcompress(void);
+int RTjpeg_mcompressYUV420(__s8 *sp, unsigned char *bp, __u16 lmask, __u16 cmask);
 
 #endif /* MPLAYER_RTJPEGN_H */
diff --git a/libmpcodecs/vd.c b/libmpcodecs/vd.c
index 4ebb01e..fa2f74e 100644
--- a/libmpcodecs/vd.c
+++ b/libmpcodecs/vd.c
@@ -35,7 +35,6 @@ extern vd_functions_t mpcodecs_vd_vfwex;
 extern vd_functions_t mpcodecs_vd_raw;
 extern vd_functions_t mpcodecs_vd_hmblck;
 extern vd_functions_t mpcodecs_vd_xanim;
-extern vd_functions_t mpcodecs_vd_nuv;
 extern vd_functions_t mpcodecs_vd_mpng;
 extern vd_functions_t mpcodecs_vd_ijpg;
 extern vd_functions_t mpcodecs_vd_mtga;
@@ -53,7 +52,7 @@ extern vd_functions_t mpcodecs_vd_qtvideo;
  * decoder, add it to libavcodec, except for wrappers around external
  * libraries and decoders requiring binary support. */
 
-vd_functions_t* mpcodecs_vd_drivers[] = {
+const vd_functions_t * const mpcodecs_vd_drivers[] = {
         &mpcodecs_vd_null,
 #ifdef CONFIG_LIBAVCODEC
         &mpcodecs_vd_ffmpeg,
@@ -70,7 +69,6 @@ vd_functions_t* mpcodecs_vd_drivers[] = {
         &mpcodecs_vd_lzo,
         &mpcodecs_vd_raw,
         &mpcodecs_vd_hmblck,
-        &mpcodecs_vd_nuv,
 #ifdef CONFIG_XANIM
         &mpcodecs_vd_xanim,
 #endif
diff --git a/libmpcodecs/vd.h b/libmpcodecs/vd.h
index a3d7733..f05241b 100644
--- a/libmpcodecs/vd.h
+++ b/libmpcodecs/vd.h
@@ -18,7 +18,7 @@ typedef struct vd_functions_s
 } vd_functions_t;
 
 // NULL terminated array of all drivers
-extern vd_functions_t* mpcodecs_vd_drivers[];
+extern const vd_functions_t * const mpcodecs_vd_drivers[];
 
 extern int vd_use_slices;
 
diff --git a/libmpcodecs/vd_ffmpeg.c b/libmpcodecs/vd_ffmpeg.c
index 6f9030e..e8e53ca 100644
--- a/libmpcodecs/vd_ffmpeg.c
+++ b/libmpcodecs/vd_ffmpeg.c
@@ -409,7 +409,8 @@ static int init(sh_video_t *sh){
         uninit(sh);
         return 0;
     }
-    // this is necessary in case get_format was never called
+    // this is necessary in case get_format was never called and init_vo is
+    // too late e.g. for H.264 VDPAU
     set_format_params(avctx, avctx->pix_fmt);
     mp_msg(MSGT_DECVIDEO, MSGL_V, "INFO: libavcodec init OK!\n");
     return 1; //mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, IMGFMT_YV12);
@@ -504,6 +505,9 @@ static int init_vo(sh_video_t *sh, enum PixelFormat pix_fmt){
         pix_fmt != ctx->pix_fmt ||
         !ctx->vo_initialized)
     {
+        // this is a special-case HACK for MPEG-1/2 VDPAU that uses neither get_format nor
+        // sets the value correctly in avcodec_open.
+        set_format_params(avctx, avctx->pix_fmt);
         mp_msg(MSGT_DECVIDEO, MSGL_V, "[ffmpeg] aspect_ratio: %f\n", aspect);
         if (sh->aspect == 0 ||
             av_cmp_q(avctx->sample_aspect_ratio,
@@ -715,7 +719,7 @@ static void release_buffer(struct AVCodecContext *avctx, AVFrame *pic){
         }
 #endif
         // release mpi (in case MPI_IMGTYPE_NUMBERED is used, e.g. for VDPAU)
-        mpi->flags &= ~MP_IMGFLAG_IN_USE;
+        mpi->usage_count--;
     }
 
     if(pic->type!=FF_BUFFER_TYPE_USER){
diff --git a/libmpcodecs/vd_nuv.c b/libmpcodecs/vd_nuv.c
deleted file mode 100644
index cb89ddb..0000000
--- a/libmpcodecs/vd_nuv.c
+++ /dev/null
@@ -1,54 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "config.h"
-#include "mp_msg.h"
-
-#include "vd_internal.h"
-
-static vd_info_t info = {
-	"NuppelVideo decoder",
-	"nuv",
-	"A'rpi",
-	"Alex & Panagiotis Issaris <takis at lumumba.luc.ac.be>",
-	"native codecs"
-};
-
-LIBVD_EXTERN(nuv)
-
-// to set/get/query special features/parameters
-static int control(sh_video_t *sh,int cmd,void* arg,...){
-    return CONTROL_UNKNOWN;
-}
-
-// init driver
-static int init(sh_video_t *sh){
-    return mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_I420);
-}
-
-// uninit driver
-static void uninit(sh_video_t *sh){
-}
-
-//mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h);
-
-void decode_nuv(
-  unsigned char *encoded,
-  int encoded_size,
-  unsigned char *decoded,
-  int width,
-  int height);
-
-// decode a frame
-static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
-    mp_image_t* mpi;
-    if(len<=0) return NULL; // skipped frame
-    
-    mpi=mpcodecs_get_image(sh, MP_IMGTYPE_TEMP, 0, 
-	sh->disp_w, sh->disp_h);
-    if(!mpi) return NULL;
-
-    decode_nuv(data, len, mpi->planes[0], sh->disp_w, sh->disp_h);
-
-    return mpi;
-}
diff --git a/libmpcodecs/ve_nuv.c b/libmpcodecs/ve_nuv.c
index 0b67017..af6a1df 100644
--- a/libmpcodecs/ve_nuv.c
+++ b/libmpcodecs/ve_nuv.c
@@ -19,13 +19,12 @@
 #include "mp_image.h"
 #include "vf.h"
 
-#include "libmpdemux/nuppelvideo.h"
+#include "libavutil/intreadwrite.h"
 #include <lzo/lzo1x.h>
 #include "native/rtjpegn.h"
 
 #define LZO_AL(size) (((size) + (sizeof(long) - 1)) / sizeof(long))
-#define LZO_IN_LEN          (1024*1024L)
-#define LZO_OUT_LEN         (LZO_IN_LEN + LZO_IN_LEN / 64 + 16 + 3)
+#define LZO_OUT_LEN(in)     ((in) + (in) / 64 + 16 + 3)
 
 //===========================================================================//
 
@@ -68,6 +67,9 @@ m_option_t nuvopts_conf[]={
 //===========================================================================//
 
 
+#define COMPDATASIZE (128*4)
+#define FRAMEHEADERSIZE 12
+
 static int config(struct vf_instance_s* vf,
         int width, int height, int d_width, int d_height,
 	unsigned int flags, unsigned int outfmt){
@@ -75,14 +77,16 @@ static int config(struct vf_instance_s* vf,
   // We need a buffer wich can holda header and a whole YV12 picture
   // or a RTJpeg table
   vf->priv->buf_size = width*height*3/2+FRAMEHEADERSIZE;
-  if(vf->priv->buf_size < (int)(128*sizeof(long int) + FRAMEHEADERSIZE))
-    vf->priv->buf_size = 128*sizeof(long int) + FRAMEHEADERSIZE;
+  if(vf->priv->buf_size < COMPDATASIZE + FRAMEHEADERSIZE)
+    vf->priv->buf_size = COMPDATASIZE + FRAMEHEADERSIZE;
 
   mux_v->bih->biWidth=width;
   mux_v->bih->biHeight=height;
   mux_v->bih->biSizeImage=mux_v->bih->biWidth*mux_v->bih->biHeight*(mux_v->bih->biBitCount/8);
   mux_v->aspect = (float)d_width/d_height;
   vf->priv->buffer = realloc(vf->priv->buffer,vf->priv->buf_size);
+  if (vf->priv->lzo)
+    vf->priv->zbuffer = realloc(vf->priv->zbuffer, FRAMEHEADERSIZE + LZO_OUT_LEN(vf->priv->buf_size));
   vf->priv->tbl_wrote = 0;
 
   return 1;
@@ -99,29 +103,29 @@ static int query_format(struct vf_instance_s* vf, unsigned int fmt){
 }
 
 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
-  struct rtframeheader* ench = (struct rtframeheader*)vf->priv->buffer;
+  uint8_t *header  = vf->priv->buffer;
   uint8_t* data = vf->priv->buffer + FRAMEHEADERSIZE;
   uint8_t* zdata = vf->priv->zbuffer + FRAMEHEADERSIZE;
-  int len = 0, zlen = 0,r;
+  int len = 0, r;
+  size_t zlen = 0;
 
-  memset(vf->priv->buffer,0,FRAMEHEADERSIZE); // Reset the header
+  memset(header, 0, FRAMEHEADERSIZE); // Reset the header
   if(vf->priv->lzo)
     memset(vf->priv->zbuffer,0,FRAMEHEADERSIZE);
     
   // This has to be don here otherwise tv with sound doesn't work
   if(!vf->priv->tbl_wrote) {    
-    RTjpeg_init_compress((long int*)data,mpi->width,mpi->height,vf->priv->q);
+    RTjpeg_init_compress((uint32_t *)data,mpi->width,mpi->height,vf->priv->q);
     RTjpeg_init_mcompress();
 
-    ench->frametype = 'D'; // compressor data
-    ench->comptype  = 'R'; // compressor data for RTjpeg
-    ench->packetlength = 128*sizeof(long int);
+    header[0] = 'D'; // frametype: compressor data
+    header[1] = 'R'; // comptype:  compressor data for RTjpeg
+    AV_WL32(header + 8, COMPDATASIZE); // packetlength
   
-    le2me_rtframeheader(ench);
     mux_v->buffer=vf->priv->buffer;
-    muxer_write_chunk(mux_v,FRAMEHEADERSIZE + 128*sizeof(long int), 0x10, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
+    muxer_write_chunk(mux_v,FRAMEHEADERSIZE + COMPDATASIZE, 0x10, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
     vf->priv->tbl_wrote = 1;
-    memset(ench,0,FRAMEHEADERSIZE); // Reset the header
+    memset(header, 0, FRAMEHEADERSIZE); // Reset the header
   }
 
   // Raw picture
@@ -129,7 +133,7 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
     len = mpi->width*mpi->height*3/2;
     // Try lzo ???
     if(vf->priv->lzo) {
-      r = lzo1x_1_compress(mpi->planes[0],mpi->width*mpi->height*3/2,
+      r = lzo1x_1_compress(mpi->planes[0],len,
 			   zdata,&zlen,vf->priv->zmem);
       if(r != LZO_E_OK) {
 	mp_msg(MSGT_VFILTER,MSGL_ERR,"LZO compress error\n");
@@ -139,10 +143,10 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
 
     if(zlen <= 0 || zlen > len) {
       memcpy(data,mpi->planes[0],len);
-      ench->comptype = '0';
+      header[1] = '0'; // comptype: uncompressed
     } else { // Use lzo only if it's littler
-      ench = (struct rtframeheader*)vf->priv->zbuffer;
-      ench->comptype = '3';
+      header = vf->priv->zbuffer;
+      header[1] = '3'; //comptype: lzo
       len = zlen;
     }
 
@@ -163,19 +167,18 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
     }
 
     if(zlen <= 0 || zlen > len)
-      ench->comptype = '1';
+      header[1] = '1'; // comptype: RTjpeg
     else {
-      ench = (struct rtframeheader*)vf->priv->zbuffer;
-      ench->comptype = '2';
+      header = vf->priv->zbuffer;
+      header[1] = '2'; // comptype: RTjpeg + LZO
       len = zlen;
     }
 
   }
     
-  ench->frametype = 'V'; // video frame
-  ench->packetlength = len;
-  le2me_rtframeheader(ench);
-  mux_v->buffer=(void*)ench;
+  header[0] = 'V'; // frametype: video frame
+  AV_WL32(header + 8, len); // packetlength
+  mux_v->buffer = header;
   muxer_write_chunk(mux_v, len + FRAMEHEADERSIZE, 0x10, pts, pts);
   return 1;
 }
@@ -216,8 +219,7 @@ static int vf_open(vf_instance_t *vf, char* args){
     if(lzo_init() != LZO_E_OK) {
       mp_msg(MSGT_VFILTER,MSGL_WARN,"LZO init failed: no lzo compression\n");
       vf->priv->lzo = 0;
-    }
-    vf->priv->zbuffer = (lzo_bytep)malloc(FRAMEHEADERSIZE + LZO_OUT_LEN);
+    } else
     vf->priv->zmem = malloc(sizeof(long)*LZO_AL(LZO1X_1_MEM_COMPRESS));
   }
 
diff --git a/libmpcodecs/vf.c b/libmpcodecs/vf.c
index ad72f30..0f286d6 100644
--- a/libmpcodecs/vf.c
+++ b/libmpcodecs/vf.c
@@ -304,7 +304,7 @@ mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype,
     if (number == -1) {
       int i;
       for (i = 0; i < NUM_NUMBERED_MPI; i++)
-        if (!vf->imgctx.numbered_images[i] || !(vf->imgctx.numbered_images[i]->flags & MP_IMGFLAG_IN_USE))
+        if (!vf->imgctx.numbered_images[i] || !vf->imgctx.numbered_images[i]->usage_count)
           break;
       number = i;
     }
@@ -431,7 +431,7 @@ mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype,
 
   mpi->qscale = NULL;
   }
-  mpi->flags |= MP_IMGFLAG_IN_USE;
+  mpi->usage_count++;
 //    printf("\rVF_MPI: %p %p %p %d %d %d    \n",
 //	mpi->planes[0],mpi->planes[1],mpi->planes[2],
 //	mpi->stride[0],mpi->stride[1],mpi->stride[2]);
diff --git a/libmpcodecs/vf_bmovl.c b/libmpcodecs/vf_bmovl.c
index 80b61ca..02f9326 100644
--- a/libmpcodecs/vf_bmovl.c
+++ b/libmpcodecs/vf_bmovl.c
@@ -1,5 +1,5 @@
 /*
- * vf_bmovl.c v0.9.1 - BitMap OVerLay video filter for MPlayer
+ * BitMap OVerLay video filter for MPlayer
  *
  * (C) 2002 Per Wigren <wigren at home.se>
  *
diff --git a/libmpcodecs/vf_decimate.c b/libmpcodecs/vf_decimate.c
index e1cea34..a6eb3da 100644
--- a/libmpcodecs/vf_decimate.c
+++ b/libmpcodecs/vf_decimate.c
@@ -19,7 +19,7 @@ struct vf_priv_s {
 	int max, last, cnt;
 };
 
-#if HAVE_MMX
+#if HAVE_MMX && HAVE_EBX_AVAILABLE
 static int diff_MMX(unsigned char *old, unsigned char *new, int os, int ns)
 {
 	volatile short out[4];
@@ -55,7 +55,7 @@ static int diff_MMX(unsigned char *old, unsigned char *new, int os, int ns)
 		"emms \n\t"
 		: 
 		: "S" (old), "D" (new), "a" ((long)os), "b" ((long)ns), "d" (out)
-		: "memory"
+		: "%ecx", "memory"
 		);
 	return out[0]+out[1]+out[2]+out[3];
 }
@@ -164,7 +164,7 @@ static int open(vf_instance_t *vf, char* args)
 	p->frac = 0.33;
 	if (args) sscanf(args, "%d:%d:%d:%f", &p->max, &p->hi, &p->lo, &p->frac);
 	diff = diff_C;
-#if HAVE_MMX
+#if HAVE_MMX && HAVE_EBX_AVAILABLE
 	if(gCpuCaps.hasMMX) diff = diff_MMX;
 #endif
 	return 1;
diff --git a/libmpcodecs/vf_divtc.c b/libmpcodecs/vf_divtc.c
index 1d55dc1..fa29181 100644
--- a/libmpcodecs/vf_divtc.c
+++ b/libmpcodecs/vf_divtc.c
@@ -33,7 +33,7 @@ struct vf_priv_s
  * diff_MMX and diff_C stolen from vf_decimate.c
  */
 
-#if HAVE_MMX
+#if HAVE_MMX && HAVE_EBX_AVAILABLE
 static int diff_MMX(unsigned char *old, unsigned char *new, int os, int ns)
    {
    volatile short out[4];
@@ -69,7 +69,7 @@ static int diff_MMX(unsigned char *old, unsigned char *new, int os, int ns)
 	"emms \n\t"
 	:
 	: "S" (old), "D" (new), "a" ((long)os), "b" ((long)ns), "d" (out)
-	: "memory"
+	: "%ecx", "memory"
 	);
    return out[0]+out[1]+out[2]+out[3];
    }
@@ -682,11 +682,10 @@ static int open(vf_instance_t *vf, char* args)
    if(!(p->history=calloc(sizeof *p->history, p->window)))
       goto nomem;
 
-   diff=
-#if HAVE_MMX
-      gCpuCaps.hasMMX?diff_MMX:
+   diff = diff_C;
+#if HAVE_MMX && HAVE_EBX_AVAILABLE
+   if(gCpuCaps.hasMMX) diff = diff_MMX;
 #endif
-      diff_C;
 
    free(args);
    return 1;
diff --git a/libmpcodecs/vf_framestep.c b/libmpcodecs/vf_framestep.c
index 956fe03..9f6d331 100644
--- a/libmpcodecs/vf_framestep.c
+++ b/libmpcodecs/vf_framestep.c
@@ -1,6 +1,5 @@
 /*
- * vf_fstep.c - filter to ouput only 1 every n frame, or only the I (key)
- *              frame
+ * filter to ouput only 1 every n frame, or only the I (key)frame
  *
  * The parameters are:
  *
diff --git a/libmpcodecs/vf_tile.c b/libmpcodecs/vf_tile.c
index 8fc4b70..6bb43ea 100644
--- a/libmpcodecs/vf_tile.c
+++ b/libmpcodecs/vf_tile.c
@@ -1,5 +1,5 @@
 /*
- * vf_tile.c - filter to tile a serie of image in a single, bigger, image
+ * filter to tile a serie of image in a single, bigger, image
  *
  * The parameters are:
  *
diff --git a/libmpdemux/demux_mf.c b/libmpdemux/demux_mf.c
index f7c241f..dc990c0 100644
--- a/libmpdemux/demux_mf.c
+++ b/libmpdemux/demux_mf.c
@@ -58,6 +58,8 @@ static int demux_mf_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds){
   return 1;
 }
 
+// force extension/type to have a fourcc
+
 static const struct {
   const char *type;
   uint32_t format;
@@ -65,6 +67,9 @@ static const struct {
   { "bmp",  mmioFOURCC('b', 'm', 'p', ' ') },
   { "jpeg", mmioFOURCC('I', 'J', 'P', 'G') },
   { "jpg",  mmioFOURCC('I', 'J', 'P', 'G') },
+  { "jls",  mmioFOURCC('I', 'J', 'P', 'G') },
+  { "thm",  mmioFOURCC('I', 'J', 'P', 'G') },
+  { "db",   mmioFOURCC('I', 'J', 'P', 'G') },
   { "pcx",  mmioFOURCC('p', 'c', 'x', ' ') },
   { "png",  mmioFOURCC('M', 'P', 'N', 'G') },
   { "ptx",  mmioFOURCC('p', 't', 'x', ' ') },
diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c
index 8217c47..bcb249b 100644
--- a/libmpdemux/demux_mov.c
+++ b/libmpdemux/demux_mov.c
@@ -2192,7 +2192,6 @@ if(trak->pos==0 && trak->stream_header_len>0){
       if (samplenr < 0)
         vo_sub = NULL;
       else if (samplenr != priv->current_sub) {
-        av_unused sh_sub_t *sh = demuxer->sub->sh;
         off_t pos = trak->samples[samplenr].pos;
         int len = trak->samples[samplenr].size;
         double subpts = (double)trak->samples[samplenr].pts / (double)trak->timescale;
diff --git a/libmpdemux/demux_nuv.c b/libmpdemux/demux_nuv.c
deleted file mode 100644
index 2ca1d2b..0000000
--- a/libmpdemux/demux_nuv.c
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
- * NuppelVideo 0.05 file parser
- * for MPlayer
- * by Panagiotis Issaris <takis at lumumba.luc.ac.be>
- *
- * Reworked by alex
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "config.h"
-#include "mp_msg.h"
-#include "help_mp.h"
-#include "stream/stream.h"
-#include "demuxer.h"
-#include "stheader.h"
-#include "nuppelvideo.h" 
-
-
-struct nuv_signature
-{ 
-	char finfo[12];     /* "NuppelVideo" + \0 */
-	char version[5];    /* "0.05" + \0 */
-};
-
-typedef struct nuv_position_t nuv_position_t;
-
-struct nuv_position_t
-{
-	off_t offset;
-	float time;
-	int frame;
-	nuv_position_t* next;
-};
-
-typedef struct nuv_info_t
-{
-	int current_audio_frame;
-	int current_video_frame;
-	nuv_position_t *index_list;
-	nuv_position_t *current_position;
-} nuv_priv_t;
-
-/**
- * \brief find best matching bitrate (in kbps) out of a table
- * \param bitrate bitrate to find best match for
- * \return best match from table
- */
-static int nearestBitrate(int bitrate) {
-  const int rates[17] = {8000, 16000, 24000, 32000, 40000, 48000, 56000,
-                         64000, 80000, 96000, 112000, 128000, 160000,
-                         192000, 224000, 256000, 320000};
-  int i;
-  for (i = 0; i < 16; i++) {
-    if ((rates[i] + rates[i + 1]) / 2 > bitrate)
-      break;
-  }
-  return rates[i];
-}
-
-/**
- * Seek to a position relative to the current position, indicated in time.
- */
-static void demux_seek_nuv ( demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags )
-{
-#define MAX_TIME 1000000
-	nuv_priv_t* priv = demuxer->priv;
-	struct rtframeheader rtjpeg_frameheader;
-	off_t orig_pos;
-	off_t curr_pos;
-	float current_time = 0;
-	float start_time = MAX_TIME;
-	float target_time = start_time + rel_seek_secs * 1000; /* target_time, start_time are ms, rel_seek_secs s */
-
-	orig_pos = stream_tell ( demuxer->stream );
-
-	if ( rel_seek_secs > 0 )
-	{
-		/* Seeking forward */
-
-
-		while(current_time < target_time )
-		{	
-			if (stream_read ( demuxer->stream, (char*)& rtjpeg_frameheader, sizeof ( rtjpeg_frameheader ) ) < sizeof(rtjpeg_frameheader))
-				return; /* EOF */
-			le2me_rtframeheader(&rtjpeg_frameheader);
-
-			if ( rtjpeg_frameheader.frametype == 'V' ) 
-			{
-				priv->current_position->next = (nuv_position_t*) malloc ( sizeof ( nuv_position_t ) );
-				priv->current_position = priv->current_position->next;
-				priv->current_position->frame = priv->current_video_frame++;
-				priv->current_position->time = rtjpeg_frameheader.timecode;
-				priv->current_position->offset = orig_pos;
-				priv->current_position->next = NULL;
-
-				if ( start_time == MAX_TIME )
-				{
-					start_time = rtjpeg_frameheader.timecode;
-					/* Recalculate target time with real start time */
-					target_time = start_time + rel_seek_secs*1000;
-				}
-
-				current_time = rtjpeg_frameheader.timecode;
-
-				curr_pos = stream_tell ( demuxer->stream );
-				stream_seek ( demuxer->stream, curr_pos + rtjpeg_frameheader.packetlength );
-
-				/* Adjust current sequence pointer */
-			}
-			else if ( rtjpeg_frameheader.frametype == 'A' )
-			{	
-				if ( start_time == MAX_TIME )
-				{
-					start_time = rtjpeg_frameheader.timecode;
-					/* Recalculate target time with real start time */
-					target_time = start_time + rel_seek_secs * 1000;
-				}
-				current_time = rtjpeg_frameheader.timecode;
-
-
-				curr_pos = stream_tell ( demuxer->stream );
-				stream_seek ( demuxer->stream, curr_pos + rtjpeg_frameheader.packetlength );
-			}
-		}
-	}
-	else
-	{
-		/* Seeking backward */
-		nuv_position_t* p;
-		start_time = priv->current_position->time;
-
-		/* Recalculate target time with real start time */
-		target_time = start_time + rel_seek_secs * 1000;
-
-
-		if(target_time < 0)
-			target_time = 0;
-
-		// Search the target time in the index list, get the offset
-		// and go to that offset.
-		p = priv->index_list;
-		while ( ( p->next != NULL ) && ( p->time < target_time ) )
-		{
-			p = p->next;
-		}
-		stream_seek ( demuxer->stream, p->offset );
-		priv->current_video_frame = p->frame;
-	}
-}
-
-
-static int demux_nuv_fill_buffer ( demuxer_t *demuxer, demux_stream_t *ds )
-{
-	struct rtframeheader rtjpeg_frameheader;
-	off_t orig_pos;
-	nuv_priv_t* priv = demuxer->priv;
-	int want_audio = (demuxer->audio)&&(demuxer->audio->id!=-2);
-
-	demuxer->filepos = orig_pos = stream_tell ( demuxer->stream );
-	if (stream_read ( demuxer->stream, (char*)& rtjpeg_frameheader, sizeof ( rtjpeg_frameheader ) ) < sizeof(rtjpeg_frameheader))
-	    return 0; /* EOF */
-	le2me_rtframeheader(&rtjpeg_frameheader);
-
-#if 0
-	printf("NUV frame: frametype: %c, comptype: %c, packetlength: %d\n",
-	    rtjpeg_frameheader.frametype, rtjpeg_frameheader.comptype,
-	    rtjpeg_frameheader.packetlength);
-#endif
-
-	/* Skip Seekpoint, Extended header and Sync for now */
-	if ((rtjpeg_frameheader.frametype == 'R') ||
-	    (rtjpeg_frameheader.frametype == 'X') ||
-	    (rtjpeg_frameheader.frametype == 'S'))
-	    return 1;
-	
-	/* Skip seektable and text (these have a payload) */
-	if ((rtjpeg_frameheader.frametype == 'Q') ||
-	    (rtjpeg_frameheader.frametype == 'T')) {
-	  stream_skip(demuxer->stream, rtjpeg_frameheader.packetlength);
-	  return 1;
-	}
-
-	if (((rtjpeg_frameheader.frametype == 'D') &&
-	    (rtjpeg_frameheader.comptype == 'R')) ||
-	    (rtjpeg_frameheader.frametype == 'V'))
-	{
-	    if ( rtjpeg_frameheader.frametype == 'V' )
-	    {
-		priv->current_video_frame++;
-		priv->current_position->next = (nuv_position_t*) malloc(sizeof(nuv_position_t));
-		priv->current_position = priv->current_position->next;
-		priv->current_position->frame = priv->current_video_frame;
-		priv->current_position->time = rtjpeg_frameheader.timecode;
-		priv->current_position->offset = orig_pos;
-		priv->current_position->next = NULL;
-	    }
-	    /* put RTjpeg tables, Video info to video buffer */
-	    stream_seek ( demuxer->stream, orig_pos );
-	    ds_read_packet ( demuxer->video, demuxer->stream, rtjpeg_frameheader.packetlength + 12, 
-		    rtjpeg_frameheader.timecode*0.001, orig_pos, 0 );
-
-
-	} else
-	if (demuxer->audio && (rtjpeg_frameheader.frametype == 'A'))
-	{
-	    priv->current_audio_frame++;
-	    if (want_audio) {
-	      /* put Audio to audio buffer */
-	      ds_read_packet ( demuxer->audio, demuxer->stream,
-			       rtjpeg_frameheader.packetlength, 
-			       rtjpeg_frameheader.timecode*0.001,
-			       orig_pos + 12, 0 );
-	    } else {
-	      /* skip audio block */
-	      stream_skip ( demuxer->stream,
-			    rtjpeg_frameheader.packetlength );
-	    }
-	}
-
-	return 1;
-}
-
-/* Scan for the extended data in MythTV nuv streams */
-static int demux_xscan_nuv(demuxer_t* demuxer, int width, int height) {
-  int i;
-  off_t orig_pos = stream_tell(demuxer->stream);
-  struct rtframeheader rtjpeg_frameheader;
-  struct extendeddata ext;
-  sh_video_t* sh_video = demuxer->video->sh;
-  sh_audio_t* sh_audio = demuxer->audio->sh;
-
-  for (i = 0; i < 2; ++i) {
-    if (stream_read(demuxer->stream, (char*)&rtjpeg_frameheader,
-              sizeof(rtjpeg_frameheader)) < sizeof(rtjpeg_frameheader))
-      goto out;
-    le2me_rtframeheader(&rtjpeg_frameheader);
-
-    if (rtjpeg_frameheader.frametype != 'X')
-      stream_skip(demuxer->stream, rtjpeg_frameheader.packetlength);
-  }
-  
-  if ( rtjpeg_frameheader.frametype != 'X' )
-    goto out;
-
-  if (rtjpeg_frameheader.packetlength != sizeof(ext)) {
-    mp_msg(MSGT_DEMUXER, MSGL_WARN, 
-           "NUV extended frame does not have expected length, ignoring\n");
-    goto out;
-  }
-
-  if (stream_read(demuxer->stream, (char*)&ext, sizeof(ext)) < sizeof(ext))
-    goto out;
-  le2me_extendeddata(&ext);
-
-  if (ext.version != 1) {
-    mp_msg(MSGT_DEMUXER, MSGL_WARN,
-           "NUV extended frame has unknown version number (%d), ignoring\n",
-           ext.version);
-    goto out;
-  }
-
-  mp_msg(MSGT_DEMUXER, MSGL_V, "Detected MythTV stream\n");
-
-  /* Video parameters */
-  mp_msg(MSGT_DEMUXER, MSGL_V, "FOURCC: %c%c%c%c\n",
-         (ext.video_fourcc >> 24) & 0xff,
-         (ext.video_fourcc >> 16) & 0xff,
-         (ext.video_fourcc >> 8) & 0xff,
-         (ext.video_fourcc) & 0xff);
-  sh_video->format = ext.video_fourcc;
-  sh_video->i_bps = ext.lavc_bitrate;
-
-  /* Audio parameters */
-  if (ext.audio_fourcc == mmioFOURCC('L', 'A', 'M', 'E')) {
-    sh_audio->format = 0x55;
-  } else if (ext.audio_fourcc == mmioFOURCC('R', 'A', 'W', 'A')) {
-    sh_audio->format = 0x1;
-  } else {
-    mp_msg(MSGT_DEMUXER, MSGL_WARN,
-           "Unknown audio format 0x%x\n", ext.audio_fourcc);
-  }
-
-  sh_audio->channels = ext.audio_channels;
-  sh_audio->samplerate = ext.audio_sample_rate;
-  sh_audio->i_bps = sh_audio->channels * sh_audio->samplerate *
-                    ext.audio_bits_per_sample;
-  if (sh_audio->format != 0x1)
-    sh_audio->i_bps = nearestBitrate(sh_audio->i_bps /
-                                     ext.audio_compression_ratio);
-  sh_audio->wf->wFormatTag = sh_audio->format;
-  sh_audio->wf->nChannels = sh_audio->channels;
-  sh_audio->wf->nSamplesPerSec = sh_audio->samplerate;
-  sh_audio->wf->nAvgBytesPerSec = sh_audio->i_bps / 8;
-  sh_audio->wf->nBlockAlign = sh_audio->channels * 2;
-  sh_audio->wf->wBitsPerSample = ext.audio_bits_per_sample;
-  sh_audio->wf->cbSize = 0;
-
-  mp_msg(MSGT_DEMUXER, MSGL_V,
-         "channels=%d bitspersample=%d samplerate=%d compression_ratio=%d\n",
-          ext.audio_channels, ext.audio_bits_per_sample,
-          ext.audio_sample_rate, ext.audio_compression_ratio);
-  return 1;
-out:
-  stream_reset(demuxer->stream);
-  stream_seek(demuxer->stream, orig_pos);
-  return 0;
-}
-
-static demuxer_t* demux_open_nuv ( demuxer_t* demuxer )
-{
-	sh_video_t *sh_video = NULL;
-	sh_audio_t *sh_audio = NULL;
-	struct rtfileheader rtjpeg_fileheader;
-	nuv_priv_t* priv = (nuv_priv_t*) malloc ( sizeof ( nuv_priv_t) );
-	demuxer->priv = priv;
-	priv->current_audio_frame = 0;
-	priv->current_video_frame = 0;
-
-
-	/* Go to the start */
-	stream_reset(demuxer->stream);
-	stream_seek(demuxer->stream, 0);
-
-	stream_read ( demuxer->stream, (char*)& rtjpeg_fileheader, sizeof(rtjpeg_fileheader) );
-	le2me_rtfileheader(&rtjpeg_fileheader);
-
-	/* no video */
-	if (rtjpeg_fileheader.videoblocks == 0)
-	{
-	    mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_MPDEMUX_NUV_NoVideoBlocksInFile);
-	    return NULL;
-	}
-
-	/* Create a new video stream header */
-	sh_video = new_sh_video ( demuxer, 0 );
-
-	/* Make sure the demuxer knows about the new video stream header
-	 * (even though new_sh_video() ought to take care of it)
-	 */
-	demuxer->video->sh = sh_video;
-
-	/* Make sure that the video demuxer stream header knows about its
-	 * parent video demuxer stream (this is getting wacky), or else
-	 * video_read_properties() will choke
-         */
-	sh_video->ds = demuxer->video;
-
-	/* Custom fourcc for internal MPlayer use */
-	sh_video->format = mmioFOURCC('N', 'U', 'V', '1');
-
-	sh_video->disp_w = rtjpeg_fileheader.width;
-	sh_video->disp_h = rtjpeg_fileheader.height;
-
-	/* NuppelVideo uses pixel aspect ratio
-           here display aspect ratio is used.
-	   For the moment NuppelVideo only supports 1.0 thus
-	   1.33 == 4:3 aspect ratio.   
-	*/
-	if(rtjpeg_fileheader.aspect == 1.0)
-		sh_video->aspect = (float) 4.0f/3.0f;
-
-	/* Get the FPS */
-	sh_video->fps = rtjpeg_fileheader.fps;
-	sh_video->frametime = 1 / sh_video->fps;
-
-	if (rtjpeg_fileheader.audioblocks != 0)
-	{
-	    sh_audio = new_sh_audio(demuxer, 0);
-	    demuxer->audio->id = 0;
-	    demuxer->audio->sh = sh_audio;
-	    sh_audio->ds = demuxer->audio;
-	    sh_audio->format = 0x1;
-	    sh_audio->channels = 2;
-	    sh_audio->samplerate = 44100;
-	    
-	    sh_audio->wf = malloc(sizeof(WAVEFORMATEX));
-	    memset(sh_audio->wf, 0, sizeof(WAVEFORMATEX));
-	    sh_audio->wf->wFormatTag = sh_audio->format;
-	    sh_audio->wf->nChannels = sh_audio->channels;
-	    sh_audio->wf->wBitsPerSample = 16;
-	    sh_audio->wf->nSamplesPerSec = sh_audio->samplerate;
-	    sh_audio->wf->nAvgBytesPerSec = sh_audio->wf->nChannels*
-		sh_audio->wf->wBitsPerSample*sh_audio->wf->nSamplesPerSec/8;
-	    sh_audio->wf->nBlockAlign = sh_audio->channels * 2;
-	    sh_audio->wf->cbSize = 0;
-	}
-
-	/* Check for extended data (X frame) and read settings from it */
-	if (!demux_xscan_nuv(demuxer, rtjpeg_fileheader.width,
-	                     rtjpeg_fileheader.height))
-	  /* Otherwise assume defaults */
-	  mp_msg(MSGT_DEMUXER, MSGL_V, "No NUV extended frame, using defaults\n");
-
-
-	priv->index_list = (nuv_position_t*) malloc(sizeof(nuv_position_t));
-	priv->index_list->frame = 0;
-	priv->index_list->time = 0;
-	priv->index_list->offset = stream_tell ( demuxer->stream );
-	priv->index_list->next = NULL;
-	priv->current_position = priv->index_list;
-
-	return demuxer;
-}
-
-static int nuv_check_file ( demuxer_t* demuxer )
-{
-	struct nuv_signature ns;
-
-	/* Store original position */
-	off_t orig_pos = stream_tell(demuxer->stream);
-
-	mp_msg ( MSGT_DEMUX, MSGL_V, "Checking for NuppelVideo\n" );
-
-	if(stream_read(demuxer->stream,(char*)&ns,sizeof(ns)) != sizeof(ns))
-		return 0;
-
-	if ( strncmp ( ns.finfo, "NuppelVideo", 12 ) &&
-	     strncmp ( ns.finfo, "MythTVVideo", 12 ) ) 
-		return 0; /* Not a NuppelVideo file */
-	if ( strncmp ( ns.version, "0.05", 5 ) &&
-	     strncmp ( ns.version, "0.06", 5 ) &&
-	     strncmp ( ns.version, "0.07", 5 ) )
-		return 0; /* Wrong version NuppelVideo file */
-
-	/* Return to original position */
-	stream_seek ( demuxer->stream, orig_pos );
-	return DEMUXER_TYPE_NUV;
-}
-
-static void demux_close_nuv(demuxer_t* demuxer) {
-  nuv_priv_t* priv = demuxer->priv;
-  nuv_position_t* pos;
-  if(!priv)
-    return;
-  for(pos = priv->index_list ; pos != NULL ; ) {
-    nuv_position_t* p = pos;
-    pos = pos->next;
-    free(p);
-  }
-  free(priv);
-}
-
-
-const demuxer_desc_t demuxer_desc_nuv = {
-  "NuppelVideo demuxer",
-  "nuv",
-  "NuppelVideo",
-  "Panagiotis Issaris",
-  "",
-  DEMUXER_TYPE_NUV,
-  1, // safe autodetect
-  nuv_check_file,
-  demux_nuv_fill_buffer,
-  demux_open_nuv,
-  demux_close_nuv,
-  demux_seek_nuv,
-  NULL
-};
diff --git a/libmpdemux/demux_ts.c b/libmpdemux/demux_ts.c
index 3d15281..33ffcdb 100644
--- a/libmpdemux/demux_ts.c
+++ b/libmpdemux/demux_ts.c
@@ -1762,7 +1762,8 @@ static int parse_pat(ts_priv_t * priv, int is_start, unsigned char *buff, int si
 		priv->pat.progs[idx].id = progid;
 		priv->pat.progs[idx].pmt_pid = ((base[2]  & 0x1F) << 8) | base[3];
 		mp_msg(MSGT_DEMUX, MSGL_V, "PROG: %d (%d-th of %d), PMT: %d\n", priv->pat.progs[idx].id, i+1, entries, priv->pat.progs[idx].pmt_pid);
-		mp_msg(MSGT_IDENTIFY, MSGL_V, "PROGRAM_ID=%d (0x%02X), PMT_PID: %d(0x%02X)\n", progid, priv->pat.progs[idx].pmt_pid );
+		mp_msg(MSGT_IDENTIFY, MSGL_V, "PROGRAM_ID=%d (0x%02X), PMT_PID: %d(0x%02X)\n",
+			progid, progid, priv->pat.progs[idx].pmt_pid, priv->pat.progs[idx].pmt_pid);
 	}
 
 	return 1;
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 74bbd8e..bfe321b 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -45,7 +45,6 @@ extern const demuxer_desc_t demuxer_desc_mf;
 extern const demuxer_desc_t demuxer_desc_avi;
 extern const demuxer_desc_t demuxer_desc_y4m;
 extern const demuxer_desc_t demuxer_desc_asf;
-extern const demuxer_desc_t demuxer_desc_nuv;
 extern const demuxer_desc_t demuxer_desc_real;
 extern const demuxer_desc_t demuxer_desc_smjpeg;
 extern const demuxer_desc_t demuxer_desc_matroska;
@@ -100,7 +99,6 @@ const demuxer_desc_t *const demuxer_list[] = {
     &demuxer_desc_y4m,
     &demuxer_desc_asf,
     &demuxer_desc_nsv,
-    &demuxer_desc_nuv,
     &demuxer_desc_real,
     &demuxer_desc_smjpeg,
     &demuxer_desc_matroska,
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index 5e4f085..6a1e26d 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -35,7 +35,6 @@
 #define DEMUXER_TYPE_FLI 10
 #define DEMUXER_TYPE_REAL 11
 #define DEMUXER_TYPE_Y4M 12
-#define DEMUXER_TYPE_NUV 13
 #define DEMUXER_TYPE_FILM 14
 #define DEMUXER_TYPE_ROQ 15
 #define DEMUXER_TYPE_MF 16
diff --git a/libmpdemux/ms_hdr.h b/libmpdemux/ms_hdr.h
index 6b81056..89f95ec 100644
--- a/libmpdemux/ms_hdr.h
+++ b/libmpdemux/ms_hdr.h
@@ -27,7 +27,7 @@ typedef struct __attribute__((__packed__)) mpeglayer3waveformat_tag {
 #endif /* _MPEGLAYER3WAVEFORMAT_ */
 
 /* windows.h #includes wingdi.h on MinGW. */
-#if !defined(_BITMAPINFOHEADER_) && !defined(_WINGDI_H)
+#if !defined(_BITMAPINFOHEADER_) && !defined(_WINGDI_)
 #define _BITMAPINFOHEADER_
 typedef struct __attribute__((__packed__))
 {
diff --git a/libmpdemux/nuppelvideo.h b/libmpdemux/nuppelvideo.h
deleted file mode 100644
index e12c1eb..0000000
--- a/libmpdemux/nuppelvideo.h
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
-   nuppelvideo.h taken from NuppelVideo, by
-   (c) Roman Hochleitner roman at mars.tuwien.ac.at
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#ifndef MPLAYER_NUPPELVIDEO_H
-#define MPLAYER_NUPPELVIDEO_H
-
-#include "libavutil/intfloat_readwrite.h"
-
-typedef struct  __attribute__((packed)) rtfileheader
-{
-  char finfo[12];     // "NuppelVideo" + \0
-  char version[5];    // "0.05" + \0
-  char pad1[3];
-  int  width;
-  int  height;
-  int  desiredwidth;  // 0 .. as it is
-  int  desiredheight; // 0 .. as it is
-  char pimode;        // P .. progressive
-		      // I .. interlaced  (2 half pics) [NI]
-  char pad2[3];
-  double aspect;      // 1.0 .. square pixel (1.5 .. e.g. width=480: width*1.5=720
-                      // for capturing for svcd material
-  double fps;
-  int videoblocks;   // count of video-blocks -1 .. unknown   0 .. no video
-  int audioblocks;   // count of audio-blocks -1 .. unknown   0 .. no audio
-  int textsblocks;   // count of text-blocks  -1 .. unknown   0 .. no text
-  int keyframedist;
-} rtfileheader;
-
-typedef struct  __attribute__((packed)) rtframeheader
-{
-   char frametype;			// A .. Audio, V .. Video, S .. Sync, T .. Text
-   					// R .. Seekpoint: String RTjjjjjjjj (use full packet)
-					// D .. Addition Data for Compressors
-   					//      ct: R .. RTjpeg Tables
-
-   char comptype;			// V: 0 .. Uncompressed [NI]
-					//    1 .. RTJpeg
-					//    2 .. RTJpeg with lzo afterwards
-					//    N .. black frame
-					//    L .. simply copy last frame (if lost frames)
-    					// A: 0 .. Uncompressed (44100/sec 16bit 2ch)
-    					//    1 .. lzo compression [NI]
-    					//    2 .. layer2 (packet) [NI]
-    					//    3 .. layer3 (packet) [NI]
-    					//    F .. flac (lossless) [NI]
-    					//    S .. shorten (lossless) [NI]
-					//    N .. null frame loudless
-					//    L .. simply copy last frame (may sound bad) NI
-					// S: B .. Audio and Video sync point [NI]
-                                        //    A .. Audio Sync Information
-					//         timecode == effective dsp-frequency*100
-					//         when reaching this audio sync point
-					//         because many cheap soundcards are unexact 
-					//         and have a range from 44000 to 44250
-					//         instead of the expected exact 44100 S./sec
-					//    V .. Next Video Sync 
-					//         timecode == next video framenumber
-					//    S .. Audio,Video,Text Correlation [NI]
-   char keyframe;			//    0 .. keyframe
-					//    1 .. nr of frame in gop => no keyframe
-
-   char filters;			//    Every bit stands for one type of filter
-					//    1 .. Gauss 5 Pixel (8*m+2*l+2*r+2*a+2*b)/16 [NYI]
-					//    2 .. Gauss 5 Pixel (8*m+1*l+1*r+1*a+1*b)/12 [NYI]
-					//    4 .. Cartoon Filter   [NI]
-					//    8 .. Reserverd Filter [NI]
-					//   16 .. Reserverd Filter [NI]
-					//   32 .. Reserverd Filter [NI]
-					//   64 .. Reserverd Filter [NI]
-					//  128 .. Reserverd Filter [NI]
-
-   int  timecode;			// Timecodeinformation sec*1000 + msecs
- 
-   int  packetlength;                   // V,A,T: length of following data in stream
-   					// S:     length of packet correl. information [NI]
-   					// R:     do not use here! (fixed 'RTjjjjjjjjjjjjjj')
-} rtframeheader;
-
-/* for MythTV */
-typedef struct __attribute__((packed)) extendeddata
-{
-   int version;            // yes, this is repeated from the file header
-   int video_fourcc;       // video encoding method used 
-   int audio_fourcc;       // audio encoding method used
-   // generic data
-   int audio_sample_rate;
-   int audio_bits_per_sample;
-   int audio_channels;
-   // codec specific
-   // mp3lame
-   int audio_compression_ratio;
-   int audio_quality;
-   // rtjpeg
-   int rtjpeg_quality;
-   int rtjpeg_luma_filter;
-   int rtjpeg_chroma_filter;
-   // libavcodec
-   int lavc_bitrate;
-   int lavc_qmin;
-   int lavc_qmax;
-   int lavc_maxqdiff;
-   // unused for later -- total size of 128 integers.
-   // new fields must be added at the end, above this comment.
-   int expansion[113];
-} extendeddata;
-
-#define FRAMEHEADERSIZE sizeof(rtframeheader)
-#define FILEHEADERSIZE  sizeof(rtfileheader)
-
-typedef struct vidbuffertype
-{
-    int sample;
-    int timecode;
-    int freeToEncode;
-    int freeToBuffer;
-    unsigned char *buffer_offset;
-} vidbuffertyp;
-
-typedef struct audbuffertype
-{
-    int sample;
-    int timecode;
-    int freeToEncode;
-    int freeToBuffer;
-    unsigned char *buffer_offset;
-} audbuffertyp;
-
-#define le2me_rtfileheader(h) {					\
-    (h)->width = le2me_32((h)->width);				\
-    (h)->height = le2me_32((h)->height);			\
-    (h)->desiredwidth = le2me_32((h)->desiredwidth);		\
-    (h)->desiredheight = le2me_32((h)->desiredheight);		\
-    (h)->aspect = av_int2dbl(le2me_64(*(uint64_t *)&(h)->aspect));\
-    (h)->fps = av_int2dbl(le2me_64(*(uint64_t *)&(h)->fps));	\
-    (h)->videoblocks = le2me_32((h)->videoblocks);		\
-    (h)->audioblocks = le2me_32((h)->audioblocks);		\
-    (h)->textsblocks = le2me_32((h)->textsblocks);		\
-    (h)->keyframedist = le2me_32((h)->keyframedist);		\
-  }
-#define le2me_rtframeheader(h) {				\
-    (h)->timecode = le2me_32((h)->timecode);			\
-    (h)->packetlength = le2me_32((h)->packetlength);		\
-  }
-#define le2me_extendeddata(h) {					\
-   (h)->version = le2me_32((h)->version);			\
-   (h)->video_fourcc = le2me_32((h)->video_fourcc);		\
-   (h)->audio_fourcc = le2me_32((h)->audio_fourcc);		\
-   (h)->audio_sample_rate = le2me_32((h)->audio_sample_rate);	\
-   (h)->audio_bits_per_sample = le2me_32((h)->audio_bits_per_sample);\
-   (h)->audio_channels = le2me_32((h)->audio_channels);		\
-   (h)->audio_compression_ratio = le2me_32((h)->audio_compression_ratio);\
-   (h)->audio_quality = le2me_32((h)->audio_quality);		\
-   (h)->rtjpeg_quality = le2me_32((h)->rtjpeg_quality);		\
-   (h)->rtjpeg_luma_filter = le2me_32((h)->rtjpeg_luma_filter);	\
-   (h)->rtjpeg_chroma_filter = le2me_32((h)->rtjpeg_chroma_filter);\
-   (h)->lavc_bitrate = le2me_32((h)->lavc_bitrate);		\
-   (h)->lavc_qmin = le2me_32((h)->lavc_qmin);			\
-   (h)->lavc_qmax = le2me_32((h)->lavc_qmax);			\
-   (h)->lavc_maxqdiff = le2me_32((h)->lavc_maxqdiff);		\
-  }
-
-#endif /* MPLAYER_NUPPELVIDEO_H */
diff --git a/libmpeg2/libmpeg2_changes.diff b/libmpeg2/libmpeg2_changes.diff
index 64cfd3c..49f85a2 100644
--- a/libmpeg2/libmpeg2_changes.diff
+++ b/libmpeg2/libmpeg2_changes.diff
@@ -6,7 +6,8 @@
  
 +#include "cpudetect.h"
 +
- #if defined(ARCH_X86) || defined(ARCH_X86_64)
+-#if defined(ARCH_X86) || defined(ARCH_X86_64)
++#if ARCH_X86 || ARCH_X86_64
  static inline uint32_t arch_accel (uint32_t accel)
  {
 +/* Use MPlayer CPU detection instead of libmpeg2 variant. */
@@ -36,6 +37,95 @@
  }
  #endif /* ARCH_X86 || ARCH_X86_64 */
  
+@@ -127,7 +150,7 @@
+ }
+ #endif /* ARCH_X86 || ARCH_X86_64 */
+ 
+-#if defined(ACCEL_DETECT) && (defined(ARCH_PPC) || defined(ARCH_SPARC))
++#if defined(ACCEL_DETECT) && (ARCH_PPC || ARCH_SPARC)
+ #include <signal.h>
+ #include <setjmp.h>
+ 
+@@ -146,7 +169,7 @@
+ }
+ #endif /* ACCEL_DETECT && (ARCH_PPC || ARCH_SPARC) */
+ 
+-#ifdef ARCH_PPC
++#if ARCH_PPC
+ static uint32_t arch_accel (uint32_t accel)
+ {
+ #ifdef ACCEL_DETECT
+@@ -183,7 +206,7 @@
+ }
+ #endif /* ARCH_PPC */
+ 
+-#ifdef ARCH_SPARC
++#if ARCH_SPARC
+ static uint32_t arch_accel (uint32_t accel)
+ {
+     if (accel & MPEG2_ACCEL_SPARC_VIS2)
+@@ -229,7 +252,7 @@
+ }
+ #endif /* ARCH_SPARC */
+ 
+-#ifdef ARCH_ALPHA
++#if ARCH_ALPHA
+ static inline uint32_t arch_accel (uint32_t accel)
+ {
+     if (accel & MPEG2_ACCEL_ALPHA_MVI)
+@@ -253,7 +276,7 @@
+ 
+ uint32_t mpeg2_detect_accel (uint32_t accel)
+ {
+-#if defined (ARCH_X86) || defined (ARCH_X86_64) || defined (ARCH_PPC) || defined (ARCH_ALPHA) || defined (ARCH_SPARC)
++#if ARCH_X86 || ARCH_X86_64 || ARCH_PPC || ARCH_ALPHA || ARCH_SPARC
+     accel = arch_accel (accel);
+ #endif
+     return accel;
+Index: libmpeg2/cpu_state.c
+===================================================================
+--- libmpeg2/cpu_state.c	(revision 28324)
++++ libmpeg2/cpu_state.c	(revision 28325)
+@@ -29,21 +29,21 @@
+ #include "mpeg2.h"
+ #include "attributes.h"
+ #include "mpeg2_internal.h"
+-#if defined(ARCH_X86) || defined(ARCH_X86_64)
++#if ARCH_X86 || ARCH_X86_64
+ #include "mmx.h"
+ #endif
+ 
+ void (* mpeg2_cpu_state_save) (cpu_state_t * state) = NULL;
+ void (* mpeg2_cpu_state_restore) (cpu_state_t * state) = NULL;
+ 
+-#if defined(ARCH_X86) || defined(ARCH_X86_64)
++#if ARCH_X86 || ARCH_X86_64
+ static void state_restore_mmx (cpu_state_t * state)
+ {
+     emms ();
+ }
+ #endif
+ 
+-#ifdef ARCH_PPC
++#if ARCH_PPC
+ #if defined(__APPLE_CC__)	/* apple */
+ #define LI(a,b) "li r" #a "," #b "\n\t"
+ #define STVX0(a,b,c) "stvx v" #a ",0,r" #c "\n\t"
+@@ -115,12 +115,12 @@
+ 
+ void mpeg2_cpu_state_init (uint32_t accel)
+ {
+-#if defined(ARCH_X86) || defined(ARCH_X86_64)
++#if ARCH_X86 || ARCH_X86_64
+     if (accel & MPEG2_ACCEL_X86_MMX) {
+ 	mpeg2_cpu_state_restore = state_restore_mmx;
+     }
+ #endif
+-#ifdef ARCH_PPC
++#if ARCH_PPC
+     if (accel & MPEG2_ACCEL_PPC_ALTIVEC) {
+ 	mpeg2_cpu_state_save = state_save_altivec;
+ 	mpeg2_cpu_state_restore = state_restore_altivec;
 --- libmpeg2/decode.c	2006-06-16 20:12:26.000000000 +0200
 +++ libmpeg2/decode.c	2006-06-16 20:12:50.000000000 +0200
 @@ -345,6 +349,15 @@
@@ -81,7 +171,7 @@
  void mpeg2_idct_init (uint32_t accel)
  {
 -#ifdef ARCH_X86
-+#ifdef HAVE_SSE2
++#if HAVE_SSE2
      if (accel & MPEG2_ACCEL_X86_SSE2) {
  	mpeg2_idct_copy = mpeg2_idct_copy_sse2;
  	mpeg2_idct_add = mpeg2_idct_add_sse2;
@@ -103,7 +193,7 @@
      } else
  #endif
 -#ifdef ARCH_PPC
-+#ifdef HAVE_ALTIVEC
++#if HAVE_ALTIVEC
      if (accel & MPEG2_ACCEL_PPC_ALTIVEC) {
  	mpeg2_idct_copy = mpeg2_idct_copy_altivec;
  	mpeg2_idct_add = mpeg2_idct_add_altivec;
@@ -111,7 +201,7 @@
      } else
  #endif
 -#ifdef ARCH_ALPHA
-+#ifdef HAVE_MVI
++#if HAVE_MVI
      if (accel & MPEG2_ACCEL_ALPHA_MVI) {
  	mpeg2_idct_copy = mpeg2_idct_copy_mvi;
  	mpeg2_idct_add = mpeg2_idct_add_mvi;
@@ -123,46 +213,89 @@
  	int i;
  
  	mpeg2_idct_copy = mpeg2_idct_copy_alpha;
+Index: libmpeg2/idct_alpha.c
+===================================================================
+--- libmpeg2/idct_alpha.c	(revision 28324)
++++ libmpeg2/idct_alpha.c	(revision 28325)
+@@ -24,7 +24,7 @@
+ 
+ #include "config.h"
+ 
+-#ifdef ARCH_ALPHA
++#if ARCH_ALPHA
+ 
+ #include <stdlib.h>
+ #include <inttypes.h>
+Index: libmpeg2/idct_altivec.c
+===================================================================
+--- libmpeg2/idct_altivec.c	(revision 28324)
++++ libmpeg2/idct_altivec.c	(revision 28325)
+@@ -23,7 +23,7 @@
+ 
+ #include "config.h"
+ 
+-#ifdef ARCH_PPC
++#if ARCH_PPC
+ 
+ #ifdef HAVE_ALTIVEC_H
+ #include <altivec.h>
+Index: libmpeg2/idct_mmx.c
+===================================================================
+--- libmpeg2/idct_mmx.c	(revision 28324)
++++ libmpeg2/idct_mmx.c	(revision 28325)
+@@ -23,7 +23,7 @@
+ 
+ #include "config.h"
+ 
+-#if defined(ARCH_X86) || defined(ARCH_X86_64)
++#if ARCH_X86 || ARCH_X86_64
+ 
+ #include <inttypes.h>
+ 
 --- libmpeg2/motion_comp.c	2006-06-16 20:12:26.000000000 +0200
 +++ libmpeg2/motion_comp.c	2006-06-16 20:12:50.000000000 +0200
-@@ -33,16 +37,22 @@
+@@ -33,34 +37,40 @@
  
  void mpeg2_mc_init (uint32_t accel)
  {
 -#ifdef ARCH_X86
-+#ifdef HAVE_MMX2
++#if HAVE_MMX2
      if (accel & MPEG2_ACCEL_X86_MMXEXT)
  	mpeg2_mc = mpeg2_mc_mmxext;
 -    else if (accel & MPEG2_ACCEL_X86_3DNOW)
 +    else
 +#endif
-+#ifdef HAVE_AMD3DNOW
++#if HAVE_AMD3DNOW
 +    if (accel & MPEG2_ACCEL_X86_3DNOW)
  	mpeg2_mc = mpeg2_mc_3dnow;
 -    else if (accel & MPEG2_ACCEL_X86_MMX)
 +    else
 +#endif
-+#ifdef HAVE_MMX
++#if HAVE_MMX
 +    if (accel & MPEG2_ACCEL_X86_MMX)
  	mpeg2_mc = mpeg2_mc_mmx;
      else
  #endif
 -#ifdef ARCH_PPC
-+#ifdef HAVE_ALTIVEC
++#if HAVE_ALTIVEC
      if (accel & MPEG2_ACCEL_PPC_ALTIVEC)
  	mpeg2_mc = mpeg2_mc_altivec;
      else
-@@ -52,15 +62,15 @@
+ #endif
+-#ifdef ARCH_ALPHA
++#if ARCH_ALPHA
+     if (accel & MPEG2_ACCEL_ALPHA)
  	mpeg2_mc = mpeg2_mc_alpha;
      else
  #endif
 -#ifdef ARCH_SPARC
-+#ifdef HAVE_VIS
++#if HAVE_VIS
      if (accel & MPEG2_ACCEL_SPARC_VIS)
  	mpeg2_mc = mpeg2_mc_vis;
      else
  #endif
- #ifdef ARCH_ARM
+-#ifdef ARCH_ARM
++#if ARCH_ARM
 -    if (accel & MPEG2_ACCEL_ARM) {
 +    if (accel & MPEG2_ACCEL_ARM)
  	mpeg2_mc = mpeg2_mc_arm;
@@ -171,6 +304,71 @@
  #endif
  	mpeg2_mc = mpeg2_mc_c;
  }
+Index: libmpeg2/motion_comp_alpha.c
+===================================================================
+--- libmpeg2/motion_comp_alpha.c	(revision 28324)
++++ libmpeg2/motion_comp_alpha.c	(revision 28325)
+@@ -22,7 +22,7 @@
+ 
+ #include "config.h"
+ 
+-#ifdef ARCH_ALPHA
++#if ARCH_ALPHA
+ 
+ #include <inttypes.h>
+ 
+Index: libmpeg2/motion_comp_altivec.c
+===================================================================
+--- libmpeg2/motion_comp_altivec.c	(revision 28324)
++++ libmpeg2/motion_comp_altivec.c	(revision 28325)
+@@ -23,7 +23,7 @@
+ 
+ #include "config.h"
+ 
+-#ifdef ARCH_PPC
++#if ARCH_PPC
+ 
+ #ifdef HAVE_ALTIVEC_H
+ #include <altivec.h>
+Index: libmpeg2/motion_comp_arm.c
+===================================================================
+--- libmpeg2/motion_comp_arm.c	(revision 28324)
++++ libmpeg2/motion_comp_arm.c	(revision 28325)
+@@ -22,7 +22,7 @@
+ 
+ #include "config.h"
+ 
+-#ifdef ARCH_ARM
++#if ARCH_ARM
+ 
+ #include <inttypes.h>
+ 
+Index: libmpeg2/motion_comp_mmx.c
+===================================================================
+--- libmpeg2/motion_comp_mmx.c	(revision 28324)
++++ libmpeg2/motion_comp_mmx.c	(revision 28325)
+@@ -23,7 +23,7 @@
+ 
+ #include "config.h"
+ 
+-#if defined(ARCH_X86) || defined(ARCH_X86_64)
++#if ARCH_X86 || ARCH_X86_64
+ 
+ #include <inttypes.h>
+ 
+Index: libmpeg2/motion_comp_vis.c
+===================================================================
+--- libmpeg2/motion_comp_vis.c	(revision 28324)
++++ libmpeg2/motion_comp_vis.c	(revision 28325)
+@@ -22,7 +22,7 @@
+ 
+ #include "config.h"
+ 
+-#ifdef ARCH_SPARC
++#if ARCH_SPARC
+ 
+ #include <inttypes.h>
+ 
 --- libmpeg2/mpeg2_internal.h	2006-06-16 20:12:26.000000000 +0200
 +++ libmpeg2/mpeg2_internal.h	2006-06-16 20:12:50.000000000 +0200
 @@ -152,6 +156,11 @@
@@ -195,6 +393,15 @@
  };
  
  typedef struct {
+@@ -226,7 +238,7 @@
+ };
+ 
+ typedef struct {
+-#ifdef ARCH_PPC
++#if ARCH_PPC
+     uint8_t regv[12*16];
+ #endif
+     int dummy;
 --- libmpeg2/slice.c	2006-06-16 20:12:26.000000000 +0200
 +++ libmpeg2/slice.c	2006-06-16 20:12:50.000000000 +0200
 @@ -142,6 +146,7 @@
diff --git a/libpostproc/.svnrevision b/libpostproc/.svnrevision
index f8ba6ba..5883118 100644
--- a/libpostproc/.svnrevision
+++ b/libpostproc/.svnrevision
@@ -1 +1 @@
-17737
+18693
diff --git a/libswscale/.svnrevision b/libswscale/.svnrevision
new file mode 100644
index 0000000..440d0d6
--- /dev/null
+++ b/libswscale/.svnrevision
@@ -0,0 +1 @@
+28777
diff --git a/libvo/aclib.c b/libvo/aclib.c
index cae86dd..47c9dea 100644
--- a/libvo/aclib.c
+++ b/libvo/aclib.c
@@ -33,9 +33,6 @@
 //Feel free to fine-tune the above 2, it might be possible to get some speedup with them :)
 
 //#define STATISTICS
-#if ARCH_X86
-#define CAN_COMPILE_X86_ASM
-#endif
 
 //Note: we have MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one
 //Plain C versions
@@ -43,7 +40,7 @@
 //#define COMPILE_C
 //#endif
 
-#ifdef CAN_COMPILE_X86_ASM
+#if ARCH_X86
 
 #if (HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
 #define COMPILE_MMX
@@ -155,14 +152,14 @@
 #include "aclib_template.c"
 #endif
 
-#endif // CAN_COMPILE_X86_ASM
+#endif /* ARCH_X86 */
 
 
 #undef fast_memcpy
 void * fast_memcpy(void * to, const void * from, size_t len)
 {
 #ifdef RUNTIME_CPUDETECT
-#ifdef CAN_COMPILE_X86_ASM
+#if ARCH_X86
 	// ordered per speed fasterst first
 	if(gCpuCaps.hasSSE2)
 		fast_memcpy_SSE(to, from, len);
@@ -173,7 +170,7 @@ void * fast_memcpy(void * to, const void * from, size_t len)
 	else if(gCpuCaps.hasMMX)
 		fast_memcpy_MMX(to, from, len);
 	else
-#endif //CAN_COMPILE_X86_ASM
+#endif
 		memcpy(to, from, len); // prior to mmx we use the standart memcpy
 #else
 #if HAVE_SSE2
@@ -196,7 +193,7 @@ void * fast_memcpy(void * to, const void * from, size_t len)
 void * mem2agpcpy(void * to, const void * from, size_t len)
 {
 #ifdef RUNTIME_CPUDETECT
-#ifdef CAN_COMPILE_X86_ASM
+#if ARCH_X86
 	// ordered per speed fasterst first
 	if(gCpuCaps.hasSSE2)
 		mem2agpcpy_SSE(to, from, len);
@@ -207,7 +204,7 @@ void * mem2agpcpy(void * to, const void * from, size_t len)
 	else if(gCpuCaps.hasMMX)
 		mem2agpcpy_MMX(to, from, len);
 	else
-#endif //CAN_COMPILE_X86_ASM
+#endif
 		memcpy(to, from, len); // prior to mmx we use the standart memcpy
 #else
 #if HAVE_SSE2
diff --git a/libvo/fastmemcpy.h b/libvo/fastmemcpy.h
index fa736b6..16767d9 100644
--- a/libvo/fastmemcpy.h
+++ b/libvo/fastmemcpy.h
@@ -23,20 +23,13 @@
 #include <inttypes.h>
 #include <string.h>
 
-#ifdef CONFIG_FASTMEMCPY
-#if HAVE_MMX || HAVE_MMX2 || HAVE_AMD3DNOW \
-/*    || HAVE_SSE || HAVE_SSE2 */
+#if defined(CONFIG_FASTMEMCPY) && (HAVE_MMX || HAVE_MMX2 || HAVE_AMD3DNOW /* || HAVE_SSE || HAVE_SSE2 */)
 #include <stddef.h>
 
 void * fast_memcpy(void * to, const void * from, size_t len);
 void * mem2agpcpy(void * to, const void * from, size_t len);
 
-#else /* HAVE_MMX/MMX2/3DNOW/SSE/SSE2 */
-#define mem2agpcpy(a,b,c) memcpy(a,b,c)
-#define fast_memcpy(a,b,c) memcpy(a,b,c)
-#endif
-
-#else /* CONFIG_FASTMEMCPY */
+#else
 #define mem2agpcpy(a,b,c) memcpy(a,b,c)
 #define fast_memcpy(a,b,c) memcpy(a,b,c)
 #endif
diff --git a/libvo/font_load_ft.c b/libvo/font_load_ft.c
index ddb6af5..20d673a 100644
--- a/libvo/font_load_ft.c
+++ b/libvo/font_load_ft.c
@@ -56,8 +56,8 @@
 #endif
 
 char *subtitle_font_encoding = NULL;
-float text_font_scale_factor = 5.0;
-float osd_font_scale_factor = 6.0;
+float text_font_scale_factor = 3.5;
+float osd_font_scale_factor = 4.0;
 float subtitle_font_radius = 2.0;
 float subtitle_font_thickness = 2.0;
 // 0 = no autoscale
diff --git a/libvo/osd.c b/libvo/osd.c
index 6660500..42dd4fc 100644
--- a/libvo/osd.c
+++ b/libvo/osd.c
@@ -30,10 +30,6 @@
 #include "cpudetect.h"
 
 #if ARCH_X86
-#define CAN_COMPILE_X86_ASM
-#endif
-
-#ifdef CAN_COMPILE_X86_ASM
 static const uint64_t bFF __attribute__((aligned(8))) = 0xFFFFFFFFFFFFFFFFULL;
 static const unsigned long long mask24lh  __attribute__((aligned(8))) = 0xFFFF000000000000ULL;
 static const unsigned long long mask24hl  __attribute__((aligned(8))) = 0x0000FFFFFFFFFFFFULL;
@@ -45,7 +41,7 @@ static const unsigned long long mask24hl  __attribute__((aligned(8))) = 0x0000FF
 #define COMPILE_C
 #endif
 
-#ifdef CAN_COMPILE_X86_ASM
+#if ARCH_X86
 
 #if (HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
 #define COMPILE_MMX
@@ -58,7 +54,8 @@ static const unsigned long long mask24hl  __attribute__((aligned(8))) = 0x0000FF
 #if (HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
 #define COMPILE_3DNOW
 #endif
-#endif //CAN_COMPILE_X86_ASM
+
+#endif /* ARCH_X86 */
 
 #undef HAVE_MMX
 #undef HAVE_MMX2
@@ -67,7 +64,7 @@ static const unsigned long long mask24hl  __attribute__((aligned(8))) = 0x0000FF
 #define HAVE_MMX2 0
 #define HAVE_AMD3DNOW 0
 
-#ifndef CAN_COMPILE_X86_ASM
+#if ! ARCH_X86
 
 #ifdef COMPILE_C
 #undef HAVE_MMX
@@ -134,11 +131,11 @@ static const unsigned long long mask24hl  __attribute__((aligned(8))) = 0x0000FF
 #include "osd_template.c"
 #endif
 
-#endif //CAN_COMPILE_X86_ASM
+#endif /* ARCH_X86 */
 
 void vo_draw_alpha_yv12(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){
 #ifdef RUNTIME_CPUDETECT
-#ifdef CAN_COMPILE_X86_ASM
+#if ARCH_X86
 	// ordered by speed / fastest first
 	if(gCpuCaps.hasMMX2)
 		vo_draw_alpha_yv12_MMX2(w, h, src, srca, srcstride, dstbase, dststride);
@@ -168,7 +165,7 @@ void vo_draw_alpha_yv12(int w,int h, unsigned char* src, unsigned char *srca, in
 
 void vo_draw_alpha_yuy2(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){
 #ifdef RUNTIME_CPUDETECT
-#ifdef CAN_COMPILE_X86_ASM
+#if ARCH_X86
 	// ordered by speed / fastest first
 	if(gCpuCaps.hasMMX2)
 		vo_draw_alpha_yuy2_MMX2(w, h, src, srca, srcstride, dstbase, dststride);
@@ -198,7 +195,7 @@ void vo_draw_alpha_yuy2(int w,int h, unsigned char* src, unsigned char *srca, in
 
 void vo_draw_alpha_uyvy(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){
 #ifdef RUNTIME_CPUDETECT
-#ifdef CAN_COMPILE_X86_ASM
+#if ARCH_X86
 	// ordered by speed / fastest first
 	if(gCpuCaps.hasMMX2)
 		vo_draw_alpha_uyvy_MMX2(w, h, src, srca, srcstride, dstbase, dststride);
@@ -228,7 +225,7 @@ void vo_draw_alpha_uyvy(int w,int h, unsigned char* src, unsigned char *srca, in
 
 void vo_draw_alpha_rgb24(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){
 #ifdef RUNTIME_CPUDETECT
-#ifdef CAN_COMPILE_X86_ASM
+#if ARCH_X86
 	// ordered by speed / fastest first
 	if(gCpuCaps.hasMMX2)
 		vo_draw_alpha_rgb24_MMX2(w, h, src, srca, srcstride, dstbase, dststride);
@@ -258,7 +255,7 @@ void vo_draw_alpha_rgb24(int w,int h, unsigned char* src, unsigned char *srca, i
 
 void vo_draw_alpha_rgb32(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){
 #ifdef RUNTIME_CPUDETECT
-#ifdef CAN_COMPILE_X86_ASM
+#if ARCH_X86
 	// ordered by speed / fastest first
 	if(gCpuCaps.hasMMX2)
 		vo_draw_alpha_rgb32_MMX2(w, h, src, srca, srcstride, dstbase, dststride);
@@ -303,7 +300,7 @@ void vo_draw_alpha_init(void){
 	if( mp_msg_test(MSGT_OSD,MSGL_V) )
 	{
 #ifdef RUNTIME_CPUDETECT
-#ifdef CAN_COMPILE_X86_ASM
+#if ARCH_X86
 		// ordered per speed fasterst first
 		if(gCpuCaps.hasMMX2)
 			mp_msg(MSGT_OSD,MSGL_INFO,"Using MMX (with tiny bit MMX2) Optimized OnScreenDisplay\n");
diff --git a/libvo/spuenc.c b/libvo/spuenc.c
index 41303ae..7ce2d12 100644
--- a/libvo/spuenc.c
+++ b/libvo/spuenc.c
@@ -1,5 +1,5 @@
 /*
- * subpic_encode.c - encodes a pixmap with RLE
+ * encode a pixmap with RLE
  *
  * Copyright (C) 2000   Alejandro J. Cura <alecu at protocultura.net>
  *
diff --git a/libvo/spuenc.h b/libvo/spuenc.h
index 5f27680..5bc83b3 100644
--- a/libvo/spuenc.h
+++ b/libvo/spuenc.h
@@ -1,5 +1,5 @@
 /*
- * subpic_encode.c - encodes a pixmap with RLE
+ * encode a pixmap with RLE
  *
  * Copyright (C) 2000   Alejandro J. Cura <alecu at protocultura.net>
  *
diff --git a/libvo/video_out.c b/libvo/video_out.c
index 05d2291..fac5ed9 100644
--- a/libvo/video_out.c
+++ b/libvo/video_out.c
@@ -112,6 +112,7 @@ extern vo_functions_t video_out_mpegpes;
 extern vo_functions_t video_out_yuv4mpeg;
 extern vo_functions_t video_out_direct3d;
 extern vo_functions_t video_out_directx;
+extern vo_functions_t video_out_kva;
 extern vo_functions_t video_out_dxr2;
 extern vo_functions_t video_out_dxr3;
 extern vo_functions_t video_out_ivtv;
@@ -146,6 +147,9 @@ const vo_functions_t* const video_out_drivers[] =
 #ifdef CONFIG_DIRECT3D
         &video_out_direct3d,
 #endif
+#ifdef CONFIG_KVA
+        &video_out_kva,
+#endif
 #ifdef CONFIG_COREVIDEO
         &video_out_macosx,
 #endif
diff --git a/libvo/vo_aa.c b/libvo/vo_aa.c
index 5046a8b..514ad25 100644
--- a/libvo/vo_aa.c
+++ b/libvo/vo_aa.c
@@ -578,19 +578,19 @@ static int parse_suboptions(const char *arg) {
     char *pseudoargv[4], *osdcolor = NULL, *subcolor = NULL, **strings,
          *helpmsg = NULL;
     int pseudoargc, displayhelp = 0, *booleans;
-    opt_t extra_opts[] = {
-            {"osdcolor", OPT_ARG_MSTRZ, &osdcolor,    NULL, 0},
-            {"subcolor", OPT_ARG_MSTRZ, &subcolor,    NULL, 0},
-            {"help",     OPT_ARG_BOOL,  &displayhelp, NULL, 0} };
+    const opt_t extra_opts[] = {
+            {"osdcolor", OPT_ARG_MSTRZ, &osdcolor,    NULL},
+            {"subcolor", OPT_ARG_MSTRZ, &subcolor,    NULL},
+            {"help",     OPT_ARG_BOOL,  &displayhelp, NULL} };
     opt_t *subopts = NULL, *p;
-    char *strings_list[] = {"-driver", "-kbddriver", "-mousedriver", "-font",
+    char * const strings_list[] = {"-driver", "-kbddriver", "-mousedriver", "-font",
         "-width", "-height", "-minwidth", "-minheight", "-maxwidth",
         "-maxheight", "-recwidth", "-recheight", "-bright",  "-contrast",
         "-gamma",  "-dimmul", "-boldmul", "-random" };
-    char *booleans_list[] = {"-dim", "-bold", "-reverse", "-normal",
+    char * const booleans_list[] = {"-dim", "-bold", "-reverse", "-normal",
         "-boldfont", "-inverse", "-extended", "-eight", "-dither",
         "-floyd_steinberg", "-error_distribution"};
-    char *nobooleans_list[] = {"-nodim", "-nobold", "-noreverse", "-nonormal",
+    char * const nobooleans_list[] = {"-nodim", "-nobold", "-noreverse", "-nonormal",
         "-noboldfont", "-noinverse", "-noextended", "-noeight", "-nodither",
         "-nofloyd_steinberg", "-noerror_distribution"};
     const int nstrings = sizeof(strings_list) / sizeof(char*);
diff --git a/libvo/vo_directfb2.c b/libvo/vo_directfb2.c
index 133f46a..7aafe09 100644
--- a/libvo/vo_directfb2.c
+++ b/libvo/vo_directfb2.c
@@ -175,7 +175,7 @@ static int preinit(const char *arg)
     strarg_t mode_str = {0, NULL};
     strarg_t par_str = {0, NULL};
     strarg_t dfb_params = {0, NULL};
-    opt_t subopts[] = {
+    const opt_t subopts[] = {
       {"input",       OPT_ARG_BOOL, &use_input,  NULL},
       {"buffermode",  OPT_ARG_STR,  &mode_str,   check_mode},
       {"fieldparity", OPT_ARG_STR,  &par_str,    check_parity},
diff --git a/libvo/vo_gif89a.c b/libvo/vo_gif89a.c
index b7a9894..b480b75 100644
--- a/libvo/vo_gif89a.c
+++ b/libvo/vo_gif89a.c
@@ -104,10 +104,10 @@ static char *gif_filename = NULL;
 // the default output filename
 #define DEFAULT_FILE "out.gif"
 
-static opt_t subopts[] = {
-  {"output",       OPT_ARG_MSTRZ, &gif_filename, NULL, 0},
-  {"fps",          OPT_ARG_FLOAT, &target_fps,   NULL, 0},
-  {NULL, 0, NULL, NULL, 0}
+static const opt_t subopts[] = {
+  {"output",       OPT_ARG_MSTRZ, &gif_filename, NULL},
+  {"fps",          OPT_ARG_FLOAT, &target_fps,   NULL},
+  {NULL, 0, NULL, NULL}
 };
 
 static int preinit(const char *arg)
diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c
index 0ffcab0..2fa0db5 100644
--- a/libvo/vo_gl.c
+++ b/libvo/vo_gl.c
@@ -76,6 +76,13 @@ static GLuint osdtex[MAX_OSD_PARTS];
 static GLuint osdatex[MAX_OSD_PARTS];
 #endif
 static GLuint *eosdtex;
+#define LARGE_EOSD_TEX_SIZE 512
+#define TINYTEX_SIZE 16
+#define TINYTEX_COLS (LARGE_EOSD_TEX_SIZE/TINYTEX_SIZE)
+#define TINYTEX_MAX (TINYTEX_COLS*TINYTEX_COLS)
+#define SMALLTEX_SIZE 32
+#define SMALLTEX_COLS (LARGE_EOSD_TEX_SIZE/SMALLTEX_SIZE)
+#define SMALLTEX_MAX (SMALLTEX_COLS*SMALLTEX_COLS)
 static GLuint largeeosdtex[2];
 //! Display lists that draw the OSD parts
 static GLuint osdDispList[MAX_OSD_PARTS];
@@ -284,6 +291,26 @@ static void clearEOSD(void) {
   eosdtex = NULL;
 }
 
+static void do_render_osd(int);
+
+static inline int is_tinytex(ass_image_t *i, int tinytexcur) {
+  return i->w < TINYTEX_SIZE && i->h < TINYTEX_SIZE && tinytexcur < TINYTEX_MAX;
+}
+
+static inline int is_smalltex(ass_image_t *i, int smalltexcur) {
+  return i->w < SMALLTEX_SIZE && i->h < SMALLTEX_SIZE && smalltexcur < SMALLTEX_MAX;
+}
+
+static inline void tinytex_pos(int tinytexcur, int *x, int *y) {
+  *x = (tinytexcur % TINYTEX_COLS) * TINYTEX_SIZE;
+  *y = (tinytexcur / TINYTEX_COLS) * TINYTEX_SIZE;
+}
+
+static inline void smalltex_pos(int smalltexcur, int *x, int *y) {
+  *x = (smalltexcur % SMALLTEX_COLS) * SMALLTEX_SIZE;
+  *y = (smalltexcur / SMALLTEX_COLS) * SMALLTEX_SIZE;
+}
+
 /**
  * \brief construct display list from ass image list
  * \param img image list to create OSD from.
@@ -309,17 +336,17 @@ static void genEOSD(mp_eosd_images_t *imgs) {
   if (!largeeosdtex[0]) {
     glGenTextures(2, largeeosdtex);
     BindTexture(gl_target, largeeosdtex[0]);
-    glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, 512, 512, 0);
+    glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, LARGE_EOSD_TEX_SIZE, LARGE_EOSD_TEX_SIZE, 0);
     BindTexture(gl_target, largeeosdtex[1]);
-    glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, 512, 512, 0);
+    glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, LARGE_EOSD_TEX_SIZE, LARGE_EOSD_TEX_SIZE, 0);
   }
   for (i = img; i; i = i->next)
   {
     if (i->w <= 0 || i->h <= 0 || i->stride < i->w)
       continue;
-    if (i->w < 16 && i->h < 16 && tinytexcur < 1024)
+    if (is_tinytex(i, tinytexcur))
       tinytexcur++;
-    else if (i->w < 32 && i->h < 32 && smalltexcur < 256)
+    else if (is_smalltex(i, smalltexcur))
       smalltexcur++;
     else
       eosdtexCnt++;
@@ -337,14 +364,12 @@ static void genEOSD(mp_eosd_images_t *imgs) {
       mp_msg(MSGT_VO, MSGL_V, "Invalid dimensions OSD for part!\n");
       continue;
     }
-    if (i->w < 16 && i->h < 16 && tinytexcur < 1024) {
-      x = (tinytexcur & 31) << 4;
-      y = (tinytexcur >> 5) << 4;
+    if (is_tinytex(i, tinytexcur)) {
+      tinytex_pos(tinytexcur, &x, &y);
       BindTexture(gl_target, largeeosdtex[0]);
       tinytexcur++;
-    } else if (i->w < 32 && i->h < 32 && smalltexcur < 256) {
-      x = (smalltexcur & 15) << 5;
-      y = (smalltexcur >> 4) << 5;
+    } else if (is_smalltex(i, smalltexcur)) {
+      smalltex_pos(smalltexcur, &x, &y);
       BindTexture(gl_target, largeeosdtex[1]);
       smalltexcur++;
     } else {
@@ -364,16 +389,14 @@ skip_upload:
     if (i->w <= 0 || i->h <= 0 || i->stride < i->w)
       continue;
     glColor4ub(i->color >> 24, (i->color >> 16) & 0xff, (i->color >> 8) & 0xff, 255 - (i->color & 0xff));
-    if (i->w < 16 && i->h < 16 && tinytexcur < 1024) {
-      x = (tinytexcur & 31) << 4;
-      y = (tinytexcur >> 5) << 4;
-      sx = sy = 512;
+    if (is_tinytex(i, tinytexcur)) {
+      tinytex_pos(tinytexcur, &x, &y);
+      sx = sy = LARGE_EOSD_TEX_SIZE;
       BindTexture(gl_target, largeeosdtex[0]);
       tinytexcur++;
-    } else if (i->w < 32 && i->h < 32 && smalltexcur < 256) {
-      x = (smalltexcur & 15) << 5;
-      y = (smalltexcur >> 4) << 5;
-      sx = sy = 512;
+    } else if (is_smalltex(i, smalltexcur)) {
+      smalltex_pos(smalltexcur, &x, &y);
+      sx = sy = LARGE_EOSD_TEX_SIZE;
       BindTexture(gl_target, largeeosdtex[1]);
       smalltexcur++;
     } else {
@@ -630,8 +653,6 @@ static void create_osd_texture(int x0, int y0, int w, int h,
   osdtexCnt++;
 }
 
-static void do_render_osd(void);
-
 static void draw_osd(void)
 {
   if (!use_osd) return;
@@ -643,7 +664,7 @@ static void draw_osd(void)
     vo_draw_text_ext(osd_w, osd_h, ass_border_x, ass_border_y, ass_border_x, ass_border_y,
                      image_width, image_height, create_osd_texture);
   }
-  if (vo_doublebuffering) do_render_osd();
+  if (vo_doublebuffering) do_render_osd(1);
 }
 
 static void do_render(void) {
@@ -662,8 +683,11 @@ static void do_render(void) {
     glDisableYUVConversion(gl_target, yuvconvtype);
 }
 
-static void do_render_osd(void) {
-  if (osdtexCnt > 0 || eosdDispList) {
+/**
+ * \param type bit 0: render OSD, bit 1: render EOSD
+ */
+static void do_render_osd(int type) {
+  if (((type & 1) && osdtexCnt > 0) || ((type & 2) && eosdDispList)) {
     // set special rendering parameters
     if (!scaled_osd) {
       glMatrixMode(GL_PROJECTION);
@@ -672,11 +696,11 @@ static void do_render_osd(void) {
       glOrtho(0, vo_dwidth, vo_dheight, 0, -1, 1);
     }
     glEnable(GL_BLEND);
-    if (eosdDispList) {
+    if ((type & 2) && eosdDispList) {
       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
       glCallList(eosdDispList);
     }
-    if (osdtexCnt > 0) {
+    if ((type & 1) && osdtexCnt > 0) {
       glColor4ub((osd_color >> 16) & 0xff, (osd_color >> 8) & 0xff, osd_color & 0xff, 0xff - (osd_color >> 24));
       // draw OSD
 #ifndef FAST_OSD
@@ -702,14 +726,14 @@ static void flip_page(void) {
       glClear(GL_COLOR_BUFFER_BIT);
   } else {
     do_render();
-    do_render_osd();
+    do_render_osd(3);
     if (use_glFinish) glFinish();
     else glFlush();
   }
 }
 
 static void redraw(void) {
-  if (vo_doublebuffering) { do_render(); do_render_osd(); }
+  if (vo_doublebuffering) { do_render(); do_render_osd(3); }
   flip_page();
 }
 
@@ -741,6 +765,9 @@ static uint32_t get_image(mp_image_t *mpi) {
     return VO_FALSE;
   }
   if (mpi->flags & MP_IMGFLAG_READABLE) return VO_FALSE;
+  if (mpi->type != MP_IMGTYPE_STATIC && mpi->type != MP_IMGTYPE_TEMP &&
+      (mpi->type != MP_IMGTYPE_NUMBERED || mpi->number))
+    return VO_FALSE;
   if (mesa_buffer) mpi->width = texture_width;
   else if (ati_hack) {
     mpi->width = texture_width;
@@ -949,7 +976,7 @@ uninit(void)
   vo_uninit();
 }
 
-static opt_t subopts[] = {
+static const opt_t subopts[] = {
   {"manyfmts",     OPT_ARG_BOOL, &many_fmts,    NULL},
   {"osd",          OPT_ARG_BOOL, &use_osd,      NULL},
   {"scaled-osd",   OPT_ARG_BOOL, &scaled_osd,   NULL},
@@ -1113,6 +1140,7 @@ static int control(uint32_t request, void *data, ...)
     if (!data)
       return VO_FALSE;
     genEOSD(data);
+    if (vo_doublebuffering) do_render_osd(2);
     return VO_TRUE;
   case VOCTRL_GET_EOSD_RES:
     {
diff --git a/libvo/vo_gl2.c b/libvo/vo_gl2.c
index 28afc77..9509001 100644
--- a/libvo/vo_gl2.c
+++ b/libvo/vo_gl2.c
@@ -844,7 +844,7 @@ uninit(void)
   vo_uninit();
 }
 
-static opt_t subopts[] = {
+static const opt_t subopts[] = {
   {"yuv",          OPT_ARG_INT,  &use_yuv,      (opt_test_f)int_non_neg},
   {"glfinish",     OPT_ARG_BOOL, &use_glFinish, NULL},
   {NULL}
diff --git a/libvo/vo_ivtv.c b/libvo/vo_ivtv.c
index 05f3730..7dd9279 100644
--- a/libvo/vo_ivtv.c
+++ b/libvo/vo_ivtv.c
@@ -59,7 +59,7 @@ static vo_mpegpes_t *pes;
 static int output = -1;
 static char *device = NULL;
 
-static opt_t subopts[] = {
+static const opt_t subopts[] = {
   {"output",   OPT_ARG_INT,       &output,       (opt_test_f)int_non_neg},
   {"device",   OPT_ARG_MSTRZ,     &device,       NULL},
   {NULL}
diff --git a/libvo/vo_jpeg.c b/libvo/vo_jpeg.c
index e1a397e..4ba5178 100644
--- a/libvo/vo_jpeg.c
+++ b/libvo/vo_jpeg.c
@@ -339,20 +339,20 @@ static int int_zero_hundred(int *val)
 
 static int preinit(const char *arg)
 {
-    opt_t subopts[] = {
-        {"progressive", OPT_ARG_BOOL,   &jpeg_progressive_mode, NULL, 0},
-        {"baseline",    OPT_ARG_BOOL,   &jpeg_baseline,         NULL, 0},
+    const opt_t subopts[] = {
+        {"progressive", OPT_ARG_BOOL,   &jpeg_progressive_mode, NULL},
+        {"baseline",    OPT_ARG_BOOL,   &jpeg_baseline,         NULL},
         {"optimize",    OPT_ARG_INT,    &jpeg_optimize,
-                                            (opt_test_f)int_zero_hundred, 0},
+                                            (opt_test_f)int_zero_hundred},
         {"smooth",      OPT_ARG_INT,    &jpeg_smooth,
-                                            (opt_test_f)int_zero_hundred, 0},
+                                            (opt_test_f)int_zero_hundred},
         {"quality",     OPT_ARG_INT,    &jpeg_quality,
-                                            (opt_test_f)int_zero_hundred, 0},
-        {"dpi",         OPT_ARG_INT,    &jpeg_dpi,              NULL, 0},
-        {"outdir",      OPT_ARG_MSTRZ,  &jpeg_outdir,           NULL, 0},
-        {"subdirs",     OPT_ARG_MSTRZ,  &jpeg_subdirs,          NULL, 0},
-        {"maxfiles",    OPT_ARG_INT,    &jpeg_maxfiles, (opt_test_f)int_pos, 0},
-        {NULL, 0, NULL, NULL, 0}
+                                            (opt_test_f)int_zero_hundred},
+        {"dpi",         OPT_ARG_INT,    &jpeg_dpi,              NULL},
+        {"outdir",      OPT_ARG_MSTRZ,  &jpeg_outdir,           NULL},
+        {"subdirs",     OPT_ARG_MSTRZ,  &jpeg_subdirs,          NULL},
+        {"maxfiles",    OPT_ARG_INT,    &jpeg_maxfiles, (opt_test_f)int_pos},
+        {NULL, 0, NULL, NULL}
     };
     const char *info_message = NULL;
 
diff --git a/libvo/vo_kva.c b/libvo/vo_kva.c
new file mode 100644
index 0000000..57df14b
--- /dev/null
+++ b/libvo/vo_kva.c
@@ -0,0 +1,1087 @@
+/*
+ * OS/2 video output driver
+ *
+ * Copyright (c) 2007-2009 by KO Myung-Hun (komh at chollian.net)
+ *
+ * This file is part of MPlayer.
+ *
+ * MPlayer is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MPlayer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with MPlayer; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#define INCL_WIN
+#define INCL_GPI
+#define INCL_DOS
+#include <os2.h>
+
+#include <mmioos2.h>
+#include <fourcc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <float.h>
+
+#include <kva.h>
+
+#include "config.h"
+#include "mp_msg.h"
+#include "help_mp.h"
+#include "video_out.h"
+#include "video_out_internal.h"
+#include "aspect.h"
+
+#include "fastmemcpy.h"
+#include "mp_fifo.h"
+#include "osdep/keycodes.h"
+#include "input/input.h"
+#include "input/mouse.h"
+#include "subopt-helper.h"
+#include "sub.h"
+
+#include "cpudetect.h"
+#include "libswscale/swscale.h"
+#include "libmpcodecs/vf_scale.h"
+
+static const vo_info_t info = {
+    "SNAP/WarpOverlay!/DIVE video output",
+    "kva",
+    "KO Myung-Hun <komh at chollian.net>",
+    ""
+};
+
+LIBVO_EXTERN(kva)
+
+#define WC_MPLAYER  "WC_MPLAYER"
+
+#define SRC_WIDTH   m_int.kvas.szlSrcSize.cx
+#define SRC_HEIGHT  m_int.kvas.szlSrcSize.cy
+
+#define HWNDFROMWINID(wid)    ((wid) + 0x80000000UL)
+
+static const struct keymap m_vk_map[] = {
+    {VK_NEWLINE, KEY_ENTER}, {VK_TAB, KEY_TAB}, {VK_SPACE, ' '},
+
+    // control keys
+    {VK_CTRL,   KEY_CTRL},    {VK_BACKSPACE, KEY_BS},
+    {VK_DELETE, KEY_DELETE},  {VK_INSERT,    KEY_INSERT},
+    {VK_HOME,   KEY_HOME},    {VK_END,       KEY_END},
+    {VK_PAGEUP, KEY_PAGE_UP}, {VK_PAGEDOWN,  KEY_PAGE_DOWN},
+    {VK_ESC,    KEY_ESC},
+
+    // cursor keys
+    {VK_RIGHT, KEY_RIGHT}, {VK_LEFT, KEY_LEFT},
+    {VK_DOWN,  KEY_DOWN},  {VK_UP,   KEY_UP},
+
+    // function keys
+    {VK_F1, KEY_F+1}, {VK_F2,  KEY_F+2},  {VK_F3,  KEY_F+3},  {VK_F4,  KEY_F+4},
+    {VK_F5, KEY_F+5}, {VK_F6,  KEY_F+6},  {VK_F7,  KEY_F+7},  {VK_F8,  KEY_F+8},
+    {VK_F9, KEY_F+9}, {VK_F10, KEY_F+10}, {VK_F11, KEY_F+11}, {VK_F12, KEY_F+12},
+
+    {0, 0}
+};
+
+static const struct keymap m_keypad_map[] = {
+    // keypad keys
+    {0x52, KEY_KP0}, {0x4F, KEY_KP1}, {0x50, KEY_KP2},   {0x51, KEY_KP3},
+    {0x4B, KEY_KP4}, {0x4C, KEY_KP5}, {0x4D, KEY_KP6},   {0x47, KEY_KP7},
+    {0x48, KEY_KP8}, {0x49, KEY_KP9}, {0x53, KEY_KPDEC}, {0x5A, KEY_KPENTER},
+
+    {0, 0}
+};
+
+static const struct keymap m_mouse_map[] = {
+    {WM_BUTTON1DOWN,   MOUSE_BTN0},
+    {WM_BUTTON3DOWN,   MOUSE_BTN1},
+    {WM_BUTTON2DOWN,   MOUSE_BTN2},
+    {WM_BUTTON1DBLCLK, MOUSE_BTN0_DBL},
+    {WM_BUTTON3DBLCLK, MOUSE_BTN1_DBL},
+    {WM_BUTTON2DBLCLK, MOUSE_BTN2_DBL},
+
+    {0, 0}
+};
+
+struct {
+    HAB         hab;
+    HMQ         hmq;
+    HWND        hwndFrame;
+    HWND        hwndClient;
+    HWND        hwndSysMenu;
+    HWND        hwndTitleBar;
+    HWND        hwndMinMax;
+    FOURCC      fcc;
+    int         iImageFormat;
+    int         nChromaShift;
+    KVASETUP    kvas;
+    KVACAPS     kvac;
+    RECTL       rclDst;
+    int         bpp;
+    LONG        lStride;
+    PBYTE       pbImage;
+    BOOL        fFixT23;
+    PFNWP       pfnwpOldFrame;
+    uint8_t    *planes[3];     // y = 0, u = 1, v = 2
+    int         stride[3];
+    BOOL        fHWAccel;
+    RECTL       rclParent;
+    struct SwsContext *sws;
+} m_int;
+
+static inline void setAspectRatio(ULONG ulRatio)
+{
+    m_int.kvas.ulRatio = ulRatio;
+    kvaSetup(&m_int.kvas);
+}
+
+static int query_format_info(int format, PBOOL pfHWAccel, PFOURCC pfcc,
+                             int *pbpp, int *pnChromaShift)
+{
+    BOOL    fHWAccel;
+    FOURCC  fcc;
+    INT     bpp;
+    INT     nChromaShift;
+
+    switch (format) {
+    case IMGFMT_YV12:
+        fHWAccel        = m_int.kvac.ulInputFormatFlags & KVAF_YV12;
+        fcc             = FOURCC_YV12;
+        bpp             = 1;
+        nChromaShift    = 1;
+        break;
+
+    case IMGFMT_YUY2:
+        fHWAccel        = m_int.kvac.ulInputFormatFlags & KVAF_YUY2;
+        fcc             = FOURCC_Y422;
+        bpp             = 2;
+        nChromaShift    = 0;
+        break;
+
+    case IMGFMT_YVU9:
+        fHWAccel        = m_int.kvac.ulInputFormatFlags & KVAF_YVU9;
+        fcc             = FOURCC_YVU9;
+        bpp             = 1;
+        nChromaShift    = 2;
+        break;
+
+    case IMGFMT_BGR24:
+        fHWAccel        = m_int.kvac.ulInputFormatFlags & KVAF_BGR24;
+        fcc             = FOURCC_BGR3;
+        bpp             = 3;
+        nChromaShift    = 0;
+        break;
+
+    case IMGFMT_BGR16:
+        fHWAccel        = m_int.kvac.ulInputFormatFlags & KVAF_BGR16;
+        fcc             = FOURCC_R565;
+        bpp             = 2;
+        nChromaShift    = 0;
+        break;
+
+    case IMGFMT_BGR15:
+        fHWAccel        = m_int.kvac.ulInputFormatFlags & KVAF_BGR15;
+        fcc             = FOURCC_R555;
+        bpp             = 2;
+        nChromaShift    = 0;
+        break;
+
+    default:
+        return 1;
+    }
+
+    if (pfHWAccel)
+        *pfHWAccel = fHWAccel;
+
+    if (pfcc)
+        *pfcc = fcc;
+
+    if (pbpp)
+        *pbpp = bpp;
+
+    if (pnChromaShift)
+        *pnChromaShift = nChromaShift;
+
+    return 0;
+}
+
+static void imgCreate(void)
+{
+    int size = SRC_HEIGHT * m_int.lStride;;
+
+    switch (m_int.iImageFormat) {
+    case IMGFMT_YV12:
+        size += size / 2;
+        break;
+
+    case IMGFMT_YVU9:
+        size += size / 8;
+        break;
+    }
+
+    m_int.pbImage = malloc(size);
+
+    m_int.planes[0] = m_int.pbImage;
+    m_int.stride[0] = m_int.lStride;
+
+    // YV12 or YVU9 ?
+    if (m_int.nChromaShift) {
+        m_int.planes[1] = m_int.planes[0] + SRC_HEIGHT * m_int.stride[0];
+        m_int.stride[1] = m_int.stride[0] >> m_int.nChromaShift;
+
+        m_int.planes[2] = m_int.planes[1] +
+                          (SRC_HEIGHT >> m_int.nChromaShift) * m_int.stride[1];
+        m_int.stride[2] = m_int.stride[1];
+    }
+}
+
+static void imgFree(void)
+{
+    free(m_int.pbImage);
+
+    m_int.pbImage = NULL;
+}
+
+static void imgDisplay(void)
+{
+    PVOID pBuffer;
+    ULONG ulBPL;
+
+    if (!kvaLockBuffer(&pBuffer, &ulBPL)) {
+        uint8_t *dst[3];
+        int      dstStride[3];
+
+        // Get packed or Y
+        dst[0]       = pBuffer;
+        dstStride[0] = ulBPL;
+
+        // YV12 or YVU9 ?
+        if (m_int.nChromaShift) {
+            // Get V
+            dst[2]       = dst[0] + SRC_HEIGHT * dstStride[0];
+            dstStride[2] = dstStride[0] >> m_int.nChromaShift;
+
+            // Get U
+            dst[1]       = dst[2] +
+                           (SRC_HEIGHT >> m_int.nChromaShift ) * dstStride[2];
+            dstStride[1] = dstStride[2];
+        }
+
+        if (m_int.fHWAccel) {
+            int w, h;
+
+            w = m_int.stride[0];
+            h = SRC_HEIGHT;
+
+            // Copy packed or Y
+            mem2agpcpy_pic(dst[0], m_int.planes[0], w, h,
+                           dstStride[0], m_int.stride[0]);
+
+            // YV12 or YVU9 ?
+            if (m_int.nChromaShift) {
+                w >>= m_int.nChromaShift; h >>= m_int.nChromaShift;
+
+                // Copy U
+                mem2agpcpy_pic(dst[1], m_int.planes[1], w, h,
+                               dstStride[1], m_int.stride[1]);
+
+                // Copy V
+                mem2agpcpy_pic(dst[2], m_int.planes[2], w, h,
+                               dstStride[2], m_int.stride[2]);
+            }
+        } else {
+            sws_scale(m_int.sws, m_int.planes, m_int.stride, 0, SRC_HEIGHT,
+                      dst, dstStride);
+        }
+
+        kvaUnlockBuffer();
+    }
+}
+
+// Frame window procedure to work around T23 laptop with S3 video card,
+// which supports upscaling only.
+static MRESULT EXPENTRY NewFrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
+                                        MPARAM mp2)
+{
+    switch (msg) {
+    case WM_QUERYTRACKINFO:
+        {
+        PTRACKINFO  pti = (PTRACKINFO)mp2;
+        RECTL       rcl;
+
+        if (vo_fs)
+            break;
+
+        m_int.pfnwpOldFrame(hwnd, msg, mp1, mp2);
+
+        rcl.xLeft   = 0;
+        rcl.yBottom = 0;
+        rcl.xRight  = SRC_WIDTH  + 1;
+        rcl.yTop    = SRC_HEIGHT + 1;
+
+        WinCalcFrameRect(hwnd, &rcl, FALSE);
+
+        pti->ptlMinTrackSize.x = rcl.xRight - rcl.xLeft;
+        pti->ptlMinTrackSize.y = rcl.yTop   - rcl.yBottom;
+
+        pti->ptlMaxTrackSize.x = vo_screenwidth;
+        pti->ptlMaxTrackSize.y = vo_screenheight;
+
+        return (MRESULT)TRUE;
+        }
+
+    case WM_ADJUSTWINDOWPOS:
+        {
+        PSWP    pswp = (PSWP)mp1;
+        RECTL   rcl;
+
+        if (vo_fs)
+            break;
+
+        if (pswp->fl & SWP_SIZE) {
+            rcl.xLeft   = pswp->x;
+            rcl.yBottom = pswp->y;
+            rcl.xRight  = rcl.xLeft   + pswp->cx;
+            rcl.yTop    = rcl.yBottom + pswp->cy;
+
+            WinCalcFrameRect(hwnd, &rcl, TRUE);
+
+            if (rcl.xRight - rcl.xLeft <= SRC_WIDTH)
+                rcl.xRight = rcl.xLeft + (SRC_WIDTH + 1);
+
+            if (rcl.yTop - rcl.yBottom <= SRC_HEIGHT)
+                rcl.yTop = rcl.yBottom + (SRC_HEIGHT + 1);
+
+            WinCalcFrameRect(hwnd, &rcl, FALSE);
+
+            if (rcl.xRight - rcl.xLeft > vo_screenwidth) {
+                rcl.xLeft  = 0;
+                rcl.xRight = vo_screenwidth;
+            }
+
+            if (rcl.yTop - rcl.yBottom > vo_screenheight) {
+                rcl.yBottom = 0;
+                rcl.yTop    = vo_screenheight;
+            }
+
+            pswp->fl |= SWP_MOVE;
+            pswp->x   = rcl.xLeft;
+            pswp->y   = rcl.yBottom;
+            pswp->cx  = rcl.xRight - rcl.xLeft;
+            pswp->cy  = rcl.yTop   - rcl.yBottom;
+        }
+        break;
+        }
+    }
+
+    return m_int.pfnwpOldFrame(hwnd, msg, mp1, mp2);
+}
+
+static MRESULT EXPENTRY WndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+    // if slave mode, ignore mouse events and deliver them to a parent window
+    if (WinID != -1 &&
+        ((msg >= WM_MOUSEFIRST    && msg <= WM_MOUSELAST) ||
+         (msg >= WM_EXTMOUSEFIRST && msg <= WM_EXTMOUSELAST))) {
+        WinPostMsg(HWNDFROMWINID(WinID), msg, mp1, mp2);
+
+        return (MRESULT)TRUE;
+    }
+
+    switch (msg) {
+    case WM_CLOSE:
+        mplayer_put_key(KEY_CLOSE_WIN);
+
+        return 0;
+
+    case WM_CHAR:
+        {
+        USHORT fsFlags = SHORT1FROMMP(mp1);
+        UCHAR  uchScan =  CHAR4FROMMP(mp1);
+        USHORT usCh    = SHORT1FROMMP(mp2);
+        USHORT usVk    = SHORT2FROMMP(mp2);
+        int    mpkey;
+
+        if (fsFlags & KC_KEYUP)
+            break;
+
+        if (fsFlags & KC_SCANCODE) {
+            mpkey = lookup_keymap_table(m_keypad_map, uchScan);
+            if (mpkey) {
+                // distinguish KEY_KP0 and KEY_KPINS
+                if (mpkey == KEY_KP0 && usCh != '0')
+                    mpkey = KEY_KPINS;
+
+                // distinguish KEY_KPDEC and KEY_KPDEL
+                if (mpkey == KEY_KPDEC && usCh != '.')
+                    mpkey = KEY_KPDEL;
+
+                mplayer_put_key(mpkey);
+
+                return (MRESULT)TRUE;
+            }
+        }
+
+        if (fsFlags & KC_VIRTUALKEY) {
+            mpkey = lookup_keymap_table(m_vk_map, usVk);
+            if (mpkey) {
+                mplayer_put_key(mpkey);
+
+                return (MRESULT)TRUE;
+            }
+        }
+
+        if ((fsFlags & KC_CHAR) && !HIBYTE(usCh))
+            mplayer_put_key(usCh);
+
+        return (MRESULT)TRUE;
+        }
+
+    case WM_BUTTON1DOWN:
+    case WM_BUTTON3DOWN:
+    case WM_BUTTON2DOWN:
+    case WM_BUTTON1DBLCLK:
+    case WM_BUTTON3DBLCLK:
+    case WM_BUTTON2DBLCLK:
+        if (WinQueryFocus(HWND_DESKTOP) != hwnd)
+            WinSetFocus(HWND_DESKTOP, hwnd);
+        else if (!vo_nomouse_input)
+            mplayer_put_key(lookup_keymap_table(m_mouse_map, msg));
+
+        return (MRESULT)TRUE;
+
+    case WM_PAINT:
+        {
+        HPS     hps;
+        RECTL   rcl, rclDst;
+        PRECTL  prcl = NULL;
+        HRGN    hrgn, hrgnDst;
+        RGNRECT rgnCtl;
+
+        // get a current movie area
+        kvaAdjustDstRect(&m_int.kvas.rclSrcRect, &rclDst);
+
+        // get a current invalidated area
+        hps = WinBeginPaint(hwnd, NULLHANDLE, &rcl);
+
+        // create a region for an invalidated area
+        hrgn    = GpiCreateRegion(hps, 1, &rcl);
+        // create a region for a movie area
+        hrgnDst = GpiCreateRegion(hps, 1, &rclDst);
+
+        // exclude a movie area from an invalidated area
+        GpiCombineRegion(hps, hrgn, hrgn, hrgnDst, CRGN_DIFF);
+
+        // get rectangles from the region
+        rgnCtl.ircStart     = 1;
+        rgnCtl.ulDirection  = RECTDIR_LFRT_TOPBOT;
+        GpiQueryRegionRects(hps, hrgn, NULL, &rgnCtl, NULL);
+
+        if (rgnCtl.crcReturned > 0) {
+            rgnCtl.crc = rgnCtl.crcReturned;
+            prcl       = malloc(sizeof(RECTL) * rgnCtl.crcReturned);
+        }
+
+        // draw black bar if needed
+        if (prcl && GpiQueryRegionRects(hps, hrgn, NULL, &rgnCtl, prcl)) {
+            int i;
+
+            for (i = 0; i < rgnCtl.crcReturned; i++)
+                WinFillRect(hps, &prcl[i], CLR_BLACK);
+        }
+
+        free(prcl);
+
+        GpiDestroyRegion(hps, hrgnDst);
+        GpiDestroyRegion(hps, hrgn);
+
+        WinEndPaint(hps);
+
+        return 0;
+        }
+    }
+
+    return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+// Change process type from VIO to PM to use PM APIs.
+static void morphToPM(void)
+{
+    PPIB pib;
+
+    DosGetInfoBlocks(NULL, &pib);
+
+    // Change flag from VIO to PM:
+    if (pib->pib_ultype == 2)
+        pib->pib_ultype = 3;
+}
+
+static int preinit(const char *arg)
+{
+    HWND    hwndParent;
+    ULONG   flFrameFlags;
+    ULONG   kvaMode = 0;
+
+    int     fUseSnap = 0;
+    int     fUseWO   = 0;
+    int     fUseDive = 0;
+    int     fFixT23  = 0;
+
+    const opt_t subopts[] = {
+        {"snap", OPT_ARG_BOOL, &fUseSnap, NULL},
+        {"wo",   OPT_ARG_BOOL, &fUseWO,   NULL},
+        {"dive", OPT_ARG_BOOL, &fUseDive, NULL},
+        {"t23",  OPT_ARG_BOOL, &fFixT23,  NULL},
+        {NULL,              0, NULL,      NULL}
+    };
+
+    PCSZ pcszVideoModeStr[3] = {"DIVE", "WarpOverlay!", "SNAP"};
+
+    if (subopt_parse(arg, subopts) != 0)
+        return -1;
+
+    morphToPM();
+
+    memset(&m_int, 0, sizeof(m_int));
+
+    m_int.hab = WinInitialize(0);
+    m_int.hmq = WinCreateMsgQueue(m_int.hab, 0);
+
+    WinRegisterClass(m_int.hab,
+                     WC_MPLAYER,
+                     WndProc,
+                     CS_SIZEREDRAW | CS_MOVENOTIFY,
+                     sizeof(PVOID));
+
+    if (WinID == -1) {
+        hwndParent   = HWND_DESKTOP;
+        flFrameFlags = FCF_SYSMENU    | FCF_TITLEBAR | FCF_MINMAX |
+                       FCF_SIZEBORDER | FCF_TASKLIST;
+    } else {
+        hwndParent   = HWNDFROMWINID(WinID);
+        flFrameFlags = 0;
+    }
+
+    m_int.hwndFrame =
+        WinCreateStdWindow(hwndParent,          // parent window handle
+                           WS_VISIBLE,          // frame window style
+                           &flFrameFlags,       // window style
+                           WC_MPLAYER,          // class name
+                           "",                  // window title
+                           0L,                  // default client style
+                           NULLHANDLE,          // resource in exe file
+                           1,                   // frame window id
+                           &m_int.hwndClient);  // client window handle
+
+    if (m_int.hwndFrame == NULLHANDLE)
+        return -1;
+
+    m_int.hwndSysMenu  = WinWindowFromID(m_int.hwndFrame, FID_SYSMENU);
+    m_int.hwndTitleBar = WinWindowFromID(m_int.hwndFrame, FID_TITLEBAR);
+    m_int.hwndMinMax   = WinWindowFromID(m_int.hwndFrame, FID_MINMAX);
+
+    m_int.fFixT23 = fFixT23;
+
+    if (m_int.fFixT23)
+        m_int.pfnwpOldFrame = WinSubclassWindow(m_int.hwndFrame,
+                                                NewFrameWndProc);
+
+    if (!!fUseSnap + !!fUseWO + !!fUseDive > 1)
+        mp_msg(MSGT_VO, MSGL_WARN,"KVA: Multiple mode specified!!!\n");
+
+    if (fUseSnap)
+        kvaMode = KVAM_SNAP;
+    else if (fUseWO)
+        kvaMode = KVAM_WO;
+    else if (fUseDive)
+        kvaMode = KVAM_DIVE;
+    else
+        kvaMode = KVAM_AUTO;
+
+    if (kvaInit(kvaMode, m_int.hwndClient, vo_colorkey)) {
+        mp_msg(MSGT_VO, MSGL_ERR, "KVA: Init failed!!!\n");
+
+        return -1;
+    }
+
+    kvaCaps(&m_int.kvac);
+
+    mp_msg(MSGT_VO, MSGL_V, "KVA: Selected video mode = %s\n",
+           pcszVideoModeStr[m_int.kvac.ulMode - 1]);
+
+    kvaDisableScreenSaver();
+
+    // Might cause PM DLLs to be loaded which incorrectly enable SIG_FPE,
+    // so mask off all floating-point exceptions.
+    _control87(MCW_EM, MCW_EM);
+
+    return 0;
+}
+
+static void uninit(void)
+{
+    kvaEnableScreenSaver();
+
+    imgFree();
+
+    sws_freeContext(m_int.sws);
+
+    if (m_int.hwndFrame != NULLHANDLE) {
+        kvaResetAttr();
+        kvaDone();
+
+        if (m_int.fFixT23)
+            WinSubclassWindow(m_int.hwndFrame, m_int.pfnwpOldFrame);
+
+        WinDestroyWindow(m_int.hwndFrame);
+    }
+
+    WinDestroyMsgQueue(m_int.hmq);
+    WinTerminate(m_int.hab);
+}
+
+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)
+{
+    RECTL   rcl;
+
+    mp_msg(MSGT_VO, MSGL_V,
+           "KVA: Using 0x%X (%s) image format, vo_config_count = %d\n",
+           format, vo_format_name(format), vo_config_count);
+
+    imgFree();
+
+    if (query_format_info(format, &m_int.fHWAccel, &m_int.fcc, &m_int.bpp,
+                          &m_int.nChromaShift))
+        return 1;
+
+    m_int.iImageFormat = format;
+
+    // if there is no hw accel for given format,
+    // try any format supported by hw accel
+    if (!m_int.fHWAccel) {
+        int dstFormat = 0;
+
+        sws_freeContext(m_int.sws);
+
+        if (m_int.kvac.ulInputFormatFlags & KVAF_YV12)
+            dstFormat = IMGFMT_YV12;
+        else if (m_int.kvac.ulInputFormatFlags & KVAF_YUY2)
+            dstFormat = IMGFMT_YUY2;
+        else if (m_int.kvac.ulInputFormatFlags & KVAF_YVU9)
+            dstFormat = IMGFMT_YVU9;
+        else if (m_int.kvac.ulInputFormatFlags & KVAF_BGR24)
+            dstFormat = IMGFMT_BGR24;
+        else if (m_int.kvac.ulInputFormatFlags & KVAF_BGR16)
+            dstFormat = IMGFMT_BGR16;
+        else if (m_int.kvac.ulInputFormatFlags & KVAF_BGR15)
+            dstFormat = IMGFMT_BGR15;
+
+        if (query_format_info(dstFormat, NULL, &m_int.fcc, NULL, NULL))
+            return 1;
+
+        m_int.sws = sws_getContextFromCmdLine(width, height, format,
+                                              width, height, dstFormat);
+    }
+
+    mp_msg(MSGT_VO, MSGL_V, "KVA: Selected FOURCC = %.4s\n", (char *)&m_int.fcc);
+
+    m_int.kvas.ulLength           = sizeof(KVASETUP);
+    m_int.kvas.szlSrcSize.cx      = width;
+    m_int.kvas.szlSrcSize.cy      = height;
+    m_int.kvas.rclSrcRect.xLeft   = 0;
+    m_int.kvas.rclSrcRect.yTop    = 0;
+    m_int.kvas.rclSrcRect.xRight  = width;
+    m_int.kvas.rclSrcRect.yBottom = height;
+    m_int.kvas.ulRatio            = vo_keepaspect ? KVAR_FORCEANY : KVAR_NONE;
+    m_int.kvas.ulAspectWidth      = d_width;
+    m_int.kvas.ulAspectHeight     = d_height;
+    m_int.kvas.fccSrcColor        = m_int.fcc;
+    m_int.kvas.fDither            = TRUE;
+
+    if (kvaSetup(&m_int.kvas)) {
+        mp_msg(MSGT_VO, MSGL_ERR, "KVA: Setup failed!!!\n");
+
+        return 1;
+    }
+
+    m_int.lStride = width * m_int.bpp;
+
+    imgCreate();
+
+    if (WinID == -1) {
+        WinSetWindowText(m_int.hwndFrame, title);
+
+        // initialize 'vo_fs' only once at first config() call
+        if (vo_config_count == 0)
+            vo_fs = flags & VOFLAG_FULLSCREEN;
+
+        // workaround for T23 laptop with S3 Video by Franz Bakan
+        if (!vo_fs && m_int.fFixT23) {
+            d_width++;
+            d_height++;
+        }
+
+        m_int.rclDst.xLeft   = ((LONG)vo_screenwidth  - (LONG)d_width)  / 2;
+        m_int.rclDst.yBottom = ((LONG)vo_screenheight - (LONG)d_height) / 2;
+        m_int.rclDst.xRight  = m_int.rclDst.xLeft   + d_width;
+        m_int.rclDst.yTop    = m_int.rclDst.yBottom + d_height;
+
+        if (vo_fs) {
+            d_width  = vo_screenwidth;
+            d_height = vo_screenheight;
+
+            // when -fs option is used without this, title bar is not highlighted
+            WinSetActiveWindow(HWND_DESKTOP, m_int.hwndFrame);
+
+            WinSetParent(m_int.hwndSysMenu,  HWND_OBJECT, FALSE);
+            WinSetParent(m_int.hwndTitleBar, HWND_OBJECT, FALSE);
+            WinSetParent(m_int.hwndMinMax,   HWND_OBJECT, FALSE);
+
+            setAspectRatio(KVAR_FORCEANY);
+        }
+
+        rcl.xLeft   = ((LONG)vo_screenwidth  - (LONG)d_width) / 2;
+        rcl.yBottom = ((LONG)vo_screenheight - (LONG)d_height) /2 ;
+        rcl.xRight  = rcl.xLeft              + d_width;
+        rcl.yTop    = rcl.yBottom            + d_height;
+    } else {
+        vo_fs = 0;
+
+        WinQueryWindowRect(HWNDFROMWINID(WinID), &m_int.rclDst);
+        rcl = m_int.rclDst;
+    }
+
+    WinCalcFrameRect(m_int.hwndFrame, &rcl, FALSE);
+
+    WinSetWindowPos(m_int.hwndFrame, HWND_TOP,
+                    rcl.xLeft, rcl.yBottom,
+                    rcl.xRight - rcl.xLeft, rcl.yTop - rcl.yBottom,
+                    SWP_SIZE | SWP_MOVE | SWP_ZORDER | SWP_SHOW |
+                    (WinID == -1 ? SWP_ACTIVATE : 0));
+
+    WinInvalidateRect(m_int.hwndFrame, NULL, TRUE);
+
+    return 0;
+}
+
+static uint32_t get_image(mp_image_t *mpi)
+{
+    if (m_int.iImageFormat != mpi->imgfmt)
+        return VO_FALSE;
+
+    if (mpi->type == MP_IMGTYPE_STATIC || mpi->type == MP_IMGTYPE_TEMP) {
+        if (mpi->flags & MP_IMGFLAG_PLANAR) {
+            mpi->planes[1] = m_int.planes[1];
+            mpi->planes[2] = m_int.planes[2];
+
+            mpi->stride[1] = m_int.stride[1];
+            mpi->stride[2] = m_int.stride[2];
+        }
+
+        mpi->planes[0] = m_int.planes[0];
+        mpi->stride[0] = m_int.stride[0];
+        mpi->flags    |= MP_IMGFLAG_DIRECT;
+
+        return VO_TRUE;
+    }
+
+    return VO_FALSE;
+}
+
+static uint32_t draw_image(mp_image_t *mpi)
+{
+    // if -dr or -slices then do nothing:
+    if (mpi->flags & (MP_IMGFLAG_DIRECT | MP_IMGFLAG_DRAW_CALLBACK))
+        return VO_TRUE;
+
+    draw_slice(mpi->planes, mpi->stride, mpi->w, mpi->h, mpi->x, mpi->y);
+
+    return VO_TRUE;
+}
+
+static int query_format(uint32_t format)
+{
+    BOOL fHWAccel;
+    int  res;
+
+    if (query_format_info(format, &fHWAccel, NULL, NULL, NULL))
+        return 0;
+
+    res = VFCAP_CSP_SUPPORTED | VFCAP_OSD;
+    if (fHWAccel) {
+        res |= VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_HWSCALE_UP;
+
+        if (!m_int.fFixT23)
+            res |= VFCAP_HWSCALE_DOWN;
+    }
+
+    return res;
+}
+
+static int fs_toggle(void)
+{
+    RECTL   rcl;
+
+    vo_fs = !vo_fs;
+
+    if (vo_fs) {
+        SWP swp;
+
+        WinQueryWindowPos(m_int.hwndFrame, &swp);
+        m_int.rclDst.xLeft   = swp.x;
+        m_int.rclDst.yBottom = swp.y;
+        m_int.rclDst.xRight  = m_int.rclDst.xLeft   + swp.cx;
+        m_int.rclDst.yTop    = m_int.rclDst.yBottom + swp.cy;
+        WinCalcFrameRect(m_int.hwndFrame, &m_int.rclDst, TRUE);
+
+        if (WinID != -1)
+            WinSetParent(m_int.hwndFrame, HWND_DESKTOP, FALSE);
+
+        WinSetParent(m_int.hwndSysMenu,  HWND_OBJECT, FALSE);
+        WinSetParent(m_int.hwndTitleBar, HWND_OBJECT, FALSE);
+        WinSetParent(m_int.hwndMinMax,   HWND_OBJECT, FALSE);
+
+        rcl.xLeft   = 0;
+        rcl.yBottom = 0;
+        rcl.xRight  = vo_screenwidth;
+        rcl.yTop    = vo_screenheight;
+
+        setAspectRatio(KVAR_FORCEANY);
+    } else {
+        if (WinID != -1)
+            WinSetParent(m_int.hwndFrame, HWNDFROMWINID(WinID), TRUE);
+
+        WinSetParent(m_int.hwndSysMenu,  m_int.hwndFrame, FALSE);
+        WinSetParent(m_int.hwndTitleBar, m_int.hwndFrame, FALSE);
+        WinSetParent(m_int.hwndMinMax,   m_int.hwndFrame, FALSE);
+
+        rcl = m_int.rclDst;
+
+        setAspectRatio(vo_keepaspect ? KVAR_FORCEANY : KVAR_NONE);
+    }
+
+    WinCalcFrameRect(m_int.hwndFrame, &rcl, FALSE);
+
+    WinSetWindowPos(m_int.hwndFrame, HWND_TOP,
+                    rcl.xLeft, rcl.yBottom,
+                    rcl.xRight - rcl.xLeft, rcl.yTop - rcl.yBottom,
+                    SWP_SIZE | SWP_MOVE | SWP_ZORDER | SWP_SHOW |
+                    (WinID == -1 ? SWP_ACTIVATE : 0));
+
+    return VO_TRUE;
+}
+
+static int color_ctrl_set(char *what, int value)
+{
+    ULONG   ulAttr;
+    ULONG   ulValue;
+
+    if (!strcmp(what, "brightness"))
+        ulAttr = KVAA_BRIGHTNESS;
+    else if (!strcmp(what, "contrast"))
+        ulAttr = KVAA_CONTRAST;
+    else if (!strcmp(what, "hue"))
+        ulAttr = KVAA_HUE;
+    else if (!strcmp(what, "saturation"))
+        ulAttr = KVAA_SATURATION;
+    else
+        return VO_NOTIMPL;
+
+    ulValue = (value + 100) * 255 / 200;
+
+    if (kvaSetAttr(ulAttr, &ulValue))
+        return VO_NOTIMPL;
+
+    return VO_TRUE;
+}
+
+static int color_ctrl_get(char *what, int *value)
+{
+    ULONG   ulAttr;
+    ULONG   ulValue;
+
+    if (!strcmp(what, "brightness"))
+        ulAttr = KVAA_BRIGHTNESS;
+    else if (!strcmp(what, "contrast"))
+        ulAttr = KVAA_CONTRAST;
+    else if (!strcmp(what, "hue"))
+        ulAttr = KVAA_HUE;
+    else if (!strcmp(what, "saturation"))
+        ulAttr = KVAA_SATURATION;
+    else
+        return VO_NOTIMPL;
+
+    if (kvaQueryAttr(ulAttr, &ulValue))
+        return VO_NOTIMPL;
+
+    // add 1 to adjust range
+    *value = ((ulValue + 1) * 200 / 255) - 100;
+
+    return VO_TRUE;
+}
+
+static int control(uint32_t request, void *data, ...)
+{
+    switch (request) {
+    case VOCTRL_GET_IMAGE:
+        return get_image(data);
+
+    case VOCTRL_DRAW_IMAGE:
+        return draw_image(data);
+
+    case VOCTRL_QUERY_FORMAT:
+        return query_format(*(uint32_t *)data);
+
+    case VOCTRL_FULLSCREEN:
+        return fs_toggle();
+
+    case VOCTRL_SET_EQUALIZER:
+        {
+        va_list ap;
+        int     value;
+
+        va_start(ap, data);
+        value = va_arg(ap, int);
+        va_end(ap);
+
+        return color_ctrl_set(data, value);
+        }
+
+    case VOCTRL_GET_EQUALIZER:
+        {
+        va_list ap;
+        int     *value;
+
+        va_start(ap, data);
+        value = va_arg(ap, int *);
+        va_end(ap);
+
+        return color_ctrl_get(data, value);
+        }
+
+    case VOCTRL_UPDATE_SCREENINFO:
+        vo_screenwidth  = m_int.kvac.cxScreen;
+        vo_screenheight = m_int.kvac.cyScreen;
+
+        aspect_save_screenres(vo_screenwidth, vo_screenheight);
+
+        return VO_TRUE;
+    }
+
+    return VO_NOTIMPL;
+}
+
+static int draw_frame(uint8_t *src[])
+{
+    return VO_ERROR;
+}
+
+static int draw_slice(uint8_t *src[], int stride[], int w, int h, int x, int y)
+{
+    uint8_t *s;
+    uint8_t *d;
+
+    // copy packed or Y
+    d = m_int.planes[0] + m_int.stride[0] * y + x;
+    s = src[0];
+    mem2agpcpy_pic(d, s, w * m_int.bpp, h, m_int.stride[0], stride[0]);
+
+    // YV12 or YVU9
+    if (m_int.nChromaShift) {
+        w >>= m_int.nChromaShift; h >>= m_int.nChromaShift;
+        x >>= m_int.nChromaShift; y >>= m_int.nChromaShift;
+
+        // copy U
+        d = m_int.planes[1] + m_int.stride[1] * y + x;
+        s = src[1];
+        mem2agpcpy_pic(d, s, w, h, m_int.stride[1], stride[1]);
+
+        // copy V
+        d = m_int.planes[2] + m_int.stride[2] * y + x;
+        s = src[2];
+        mem2agpcpy_pic(d, s, w, h, m_int.stride[2], stride[2]);
+    }
+
+    return 0;
+}
+
+#define vo_draw_alpha(imgfmt) \
+    vo_draw_alpha_##imgfmt(w, h, src, srca, stride, \
+                           m_int.planes[0] + m_int.stride[0] * y0 + m_int.bpp * x0, \
+                           m_int.stride[0])
+
+static void draw_alpha(int x0, int y0, int w, int h,
+                       unsigned char *src, unsigned char *srca, int stride)
+{
+    switch (m_int.iImageFormat) {
+    case IMGFMT_YV12:
+    case IMGFMT_YVU9:
+        vo_draw_alpha(yv12);
+        break;
+
+    case IMGFMT_YUY2:
+        vo_draw_alpha(yuy2);
+        break;
+
+    case IMGFMT_BGR24:
+        vo_draw_alpha(rgb24);
+        break;
+
+    case IMGFMT_BGR16:
+        vo_draw_alpha(rgb16);
+        break;
+
+    case IMGFMT_BGR15:
+        vo_draw_alpha(rgb15);
+        break;
+    }
+}
+
+static void draw_osd(void)
+{
+    vo_draw_text(SRC_WIDTH, SRC_HEIGHT, draw_alpha);
+}
+
+static void flip_page(void)
+{
+    imgDisplay();
+}
+
+static void check_events(void)
+{
+    QMSG    qm;
+
+    // On slave mode, we need to change our window size according to a
+    // parent window size
+    if (WinID != -1) {
+        RECTL rcl;
+
+        WinQueryWindowRect(HWNDFROMWINID(WinID), &rcl);
+
+        if (rcl.xLeft   != m_int.rclParent.xLeft   ||
+            rcl.yBottom != m_int.rclParent.yBottom ||
+            rcl.xRight  != m_int.rclParent.xRight  ||
+            rcl.yTop    != m_int.rclParent.yTop) {
+            WinSetWindowPos(m_int.hwndFrame, NULLHANDLE,
+                            rcl.xLeft, rcl.yBottom,
+                            rcl.xRight - rcl.xLeft, rcl.yTop - rcl.yBottom,
+                            SWP_SIZE | SWP_MOVE);
+
+            m_int.rclParent = rcl;
+        }
+    }
+
+    while (WinPeekMsg(m_int.hab, &qm, NULLHANDLE, 0, 0, PM_REMOVE))
+        WinDispatchMsg(m_int.hab, &qm);
+}
diff --git a/libvo/vo_macosx.m b/libvo/vo_macosx.m
index 1cd1d43..8a23819 100644
--- a/libvo/vo_macosx.m
+++ b/libvo/vo_macosx.m
@@ -1,4 +1,7 @@
 /*
+ * Mac OS X video output driver
+ * Copyright (c) 2005 Nicolas Plourde <nicolasplourde at gmail.com>
+ *
  * This file is part of MPlayer.
  *
  * MPlayer is free software; you can redistribute it and/or modify
@@ -16,14 +19,6 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-/*
-	vo_macosx.m
-	by Nicolas Plourde <nicolasplourde at gmail.com>
-	
-	MPlayer Mac OSX video out module.
- 	Copyright (c) Nicolas Plourde - 2005
-*/
-
 #import "vo_macosx.h"
 #include <sys/types.h>
 #include <sys/ipc.h>
@@ -100,7 +95,7 @@ static BOOL isLeopardOrLater;
 
 static vo_info_t info = 
 {
-	"Mac OSX Core Video",
+	"Mac OS X Core Video",
 	"macosx",
 	"Nicolas Plourde <nicolas.plourde at gmail.com>",
 	""
@@ -132,7 +127,7 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_
 	}
 	else
 	{
-		mp_msg(MSGT_VO, MSGL_FATAL, "Get device error: Device ID %d do not exist, falling back to main device.\n", screen_id);
+		mp_msg(MSGT_VO, MSGL_FATAL, "Get device error: Device ID %d does not exist, falling back to main device.\n", screen_id);
 		screen_handle = [screen_array objectAtIndex:0];
 		screen_id = -1;
 	}
@@ -217,7 +212,7 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_
 			return 1;
 		}		
 		
-		//connnect to mplayerosx
+		//connect to mplayerosx
 		mplayerosxProxy=[NSConnection rootProxyForConnectionWithRegisteredName:[NSString stringWithCString:buffer_name] host:nil];
 		if ([mplayerosxProxy conformsToProtocol:@protocol(MPlayerOSXVOProto)]) {
 			[mplayerosxProxy setProtocolForProxy:@protocol(MPlayerOSXVOProto)];
@@ -362,7 +357,7 @@ static int preinit(const char *arg)
 				"Example: mplayer -vo macosx:device_id=1:shared_buffer:buffer_name=mybuff\n"
 				"\nOptions:\n"
 				"  device_id=<0-...>\n"
-				"    Set screen device id for fullscreen.\n"
+				"    Set screen device ID for fullscreen.\n"
 				"  shared_buffer\n"
 				"    Write output to a shared memory buffer instead of displaying it.\n"
 				"  buffer_name=<name>\n"
@@ -813,7 +808,7 @@ static int control(uint32_t request, void *data, ...)
 	
 	curTime  = TickCount()/60;
 
-	//auto hide mouse cursor (and future on-screen control?)
+	//automatically hide mouse cursor (and future on-screen control?)
 	if(isFullscreen && !mouseHide && !isRootwin)
 	{
 		if( ((curTime - lastMouseHide) >= 5) || (lastMouseHide == 0) )
@@ -964,8 +959,8 @@ static int control(uint32_t request, void *data, ...)
 		return;
 	[NSApp sendEvent:event];
 	// Without SDL's bootstrap code (include SDL.h in mplayer.c),
-	// on Leopard, we got trouble to get the play window auto focused
-	// when app is actived. Following code fix this problem.
+	// on Leopard, we have trouble to get the play window automatically focused
+	// when the app is actived. The Following code fix this problem.
 #ifndef CONFIG_SDL
 	if (isLeopardOrLater && [event type] == NSAppKitDefined
 			&& [event subtype] == NSApplicationActivatedEventType) {
diff --git a/libvo/vo_md5sum.c b/libvo/vo_md5sum.c
index 4fd9cdd..bf506f4 100644
--- a/libvo/vo_md5sum.c
+++ b/libvo/vo_md5sum.c
@@ -107,9 +107,9 @@ static void md5sum_write_error(void) {
 
 static int preinit(const char *arg)
 {
-    opt_t subopts[] = {
-        {"outfile",     OPT_ARG_MSTRZ,    &md5sum_outfile,   NULL, 0},
-        {NULL, 0, NULL, NULL, 0}
+    const opt_t subopts[] = {
+        {"outfile",     OPT_ARG_MSTRZ,    &md5sum_outfile,   NULL},
+        {NULL, 0, NULL, NULL}
     };
 
     mp_msg(MSGT_VO, MSGL_INFO, "%s: %s\n", info.short_name,
diff --git a/libvo/vo_png.c b/libvo/vo_png.c
index 5a2edf7..9f0dbed 100644
--- a/libvo/vo_png.c
+++ b/libvo/vo_png.c
@@ -290,10 +290,10 @@ static int int_zero_to_nine(int *sh)
     return 1;
 }
 
-static opt_t subopts[] = {
-    {"alpha", OPT_ARG_BOOL, &use_alpha, NULL, 0},
+static const opt_t subopts[] = {
+    {"alpha", OPT_ARG_BOOL, &use_alpha, NULL},
     {"z",   OPT_ARG_INT, &z_compression, (opt_test_f)int_zero_to_nine},
-    {"outdir",      OPT_ARG_MSTRZ,  &png_outdir,           NULL, 0},
+    {"outdir",      OPT_ARG_MSTRZ,  &png_outdir,           NULL},
     {NULL}
 };
 
diff --git a/libvo/vo_pnm.c b/libvo/vo_pnm.c
index ba88db2..9fab71f 100644
--- a/libvo/vo_pnm.c
+++ b/libvo/vo_pnm.c
@@ -120,16 +120,16 @@ static int preinit(const char *arg)
 {
     int ppm_type = 0, pgm_type = 0, pgmyuv_type = 0,
         raw_mode = 0, ascii_mode = 0;
-    opt_t subopts[] = {
-        {"ppm",         OPT_ARG_BOOL,   &ppm_type,      NULL, 0},
-        {"pgm",         OPT_ARG_BOOL,   &pgm_type,      NULL, 0},
-        {"pgmyuv",      OPT_ARG_BOOL,   &pgmyuv_type,   NULL, 0},
-        {"raw",         OPT_ARG_BOOL,   &raw_mode,      NULL, 0},
-        {"ascii",       OPT_ARG_BOOL,   &ascii_mode,    NULL, 0},
-        {"outdir",      OPT_ARG_MSTRZ,  &pnm_outdir,    NULL, 0},
-        {"subdirs",     OPT_ARG_MSTRZ,  &pnm_subdirs,   NULL, 0},
-        {"maxfiles",    OPT_ARG_INT,    &pnm_maxfiles,  (opt_test_f)int_pos, 0},
-        {NULL, 0, NULL, NULL, 0}
+    const opt_t subopts[] = {
+        {"ppm",         OPT_ARG_BOOL,   &ppm_type,      NULL},
+        {"pgm",         OPT_ARG_BOOL,   &pgm_type,      NULL},
+        {"pgmyuv",      OPT_ARG_BOOL,   &pgmyuv_type,   NULL},
+        {"raw",         OPT_ARG_BOOL,   &raw_mode,      NULL},
+        {"ascii",       OPT_ARG_BOOL,   &ascii_mode,    NULL},
+        {"outdir",      OPT_ARG_MSTRZ,  &pnm_outdir,    NULL},
+        {"subdirs",     OPT_ARG_MSTRZ,  &pnm_subdirs,   NULL},
+        {"maxfiles",    OPT_ARG_INT,    &pnm_maxfiles,  (opt_test_f)int_pos},
+        {NULL, 0, NULL, NULL}
     };
     const char *info_message = NULL;
 
diff --git a/libvo/vo_sdl.c b/libvo/vo_sdl.c
index 26b1777..a62a7a2 100644
--- a/libvo/vo_sdl.c
+++ b/libvo/vo_sdl.c
@@ -1526,11 +1526,11 @@ static int preinit(const char *arg)
     char * sdl_driver = NULL;
     int sdl_hwaccel;
     int sdl_forcexv;
-    opt_t subopts[] = {
-	    {"forcexv", OPT_ARG_BOOL,  &sdl_forcexv, NULL, 0},
-	    {"hwaccel", OPT_ARG_BOOL,  &sdl_hwaccel, NULL, 0},
-	    {"driver",  OPT_ARG_MSTRZ, &sdl_driver,  NULL, 0},
-	    {NULL, 0, NULL, NULL, 0}
+    const opt_t subopts[] = {
+	    {"forcexv", OPT_ARG_BOOL,  &sdl_forcexv, NULL},
+	    {"hwaccel", OPT_ARG_BOOL,  &sdl_hwaccel, NULL},
+	    {"driver",  OPT_ARG_MSTRZ, &sdl_driver,  NULL},
+	    {NULL, 0, NULL, NULL}
     };
 
     sdl_forcexv = 1;
diff --git a/libvo/vo_v4l2.c b/libvo/vo_v4l2.c
index 7cecfd7..1f611d8 100644
--- a/libvo/vo_v4l2.c
+++ b/libvo/vo_v4l2.c
@@ -53,7 +53,7 @@ static vo_mpegpes_t *pes;
 static int output = -1;
 static char *device = NULL;
 
-static opt_t subopts[] = {
+static const opt_t subopts[] = {
   {"output",   OPT_ARG_INT,       &output,       (opt_test_f)int_non_neg},
   {"device",   OPT_ARG_MSTRZ,     &device,       NULL},
   {NULL}
diff --git a/libvo/vo_vdpau.c b/libvo/vo_vdpau.c
index 7417c70..963cf17 100644
--- a/libvo/vo_vdpau.c
+++ b/libvo/vo_vdpau.c
@@ -147,14 +147,19 @@ static void                              *vdpau_lib_handle;
 /* output_surfaces[NUM_OUTPUT_SURFACES] is misused for OSD. */
 #define osd_surface output_surfaces[NUM_OUTPUT_SURFACES]
 static VdpOutputSurface                   output_surfaces[NUM_OUTPUT_SURFACES + 1];
+static VdpVideoSurface                    deint_surfaces[3];
+static mp_image_t                        *deint_mpi[2];
 static int                                output_surface_width, output_surface_height;
 
 static VdpVideoMixer                      video_mixer;
 static int                                deint;
 static int                                deint_type;
+static int                                deint_counter;
+static int                                deint_buffer_past_frames;
 static int                                pullup;
 static float                              denoise;
 static float                              sharpen;
+static int                                chroma_deint;
 static int                                top_field_first;
 
 static VdpDecoder                         decoder;
@@ -205,6 +210,15 @@ static VdpProcamp procamp;
 static int                                visible_buf;
 static int                                int_pause;
 
+static void draw_eosd(void);
+
+static void push_deint_surface(VdpVideoSurface surface)
+{
+    deint_surfaces[2] = deint_surfaces[1];
+    deint_surfaces[1] = deint_surfaces[0];
+    deint_surfaces[0] = surface;
+}
+
 static void video_to_output_surface(void)
 {
     VdpTime dummy;
@@ -213,17 +227,19 @@ static void video_to_output_surface(void)
     if (vid_surface_num < 0)
         return;
 
-    // we would need to provide 2 past and 1 future frames to allow advanced
-    // deinterlacing, which is not really possible currently.
+    if (deint < 2 || deint_surfaces[0] == VDP_INVALID_HANDLE)
+        push_deint_surface(surface_render[vid_surface_num].surface);
+
     for (i = 0; i <= !!(deint > 1); i++) {
         int field = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME;
         VdpOutputSurface output_surface;
         if (i) {
+            draw_eosd();
             draw_osd();
             flip_page();
         }
         if (deint)
-            field = top_field_first == i ?
+            field = (top_field_first == i) ^ (deint > 1) ?
                     VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD:
                     VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD;
         output_surface = output_surfaces[surface_num];
@@ -233,12 +249,14 @@ static void video_to_output_surface(void)
         CHECK_ST_WARNING("Error when calling vdp_presentation_queue_block_until_surface_idle")
 
         vdp_st = vdp_video_mixer_render(video_mixer, VDP_INVALID_HANDLE, 0,
-                                        field, 0, NULL,
-                                        surface_render[vid_surface_num].surface,
-                                        0, NULL, &src_rect_vid,
+                                        field, 2, deint_surfaces + 1,
+                                        deint_surfaces[0],
+                                        1, &surface_render[vid_surface_num].surface,
+                                        &src_rect_vid,
                                         output_surface,
                                         NULL, &out_rect_vid, 0, NULL);
         CHECK_ST_WARNING("Error when calling vdp_video_mixer_render")
+        push_deint_surface(surface_render[vid_surface_num].surface);
     }
 }
 
@@ -394,6 +412,9 @@ static int create_vdp_mixer(VdpChromaType vdp_chroma_type) {
     const void * const denoise_value[] = {&denoise};
     static const VdpVideoMixerAttribute sharpen_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL};
     const void * const sharpen_value[] = {&sharpen};
+    static const VdpVideoMixerAttribute skip_chroma_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE};
+    const uint8_t skip_chroma_value = 1;
+    const void * const skip_chroma_value_ptr[] = {&skip_chroma_value};
     static const VdpVideoMixerParameter parameters[VDP_NUM_MIXER_PARAMETER] = {
         VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH,
         VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT,
@@ -404,8 +425,7 @@ static int create_vdp_mixer(VdpChromaType vdp_chroma_type) {
         &vid_height,
         &vdp_chroma_type
     };
-    if (deint == 3)
-        features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL;
+    features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL;
     if (deint == 4)
         features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL;
     if (pullup)
@@ -422,12 +442,16 @@ static int create_vdp_mixer(VdpChromaType vdp_chroma_type) {
     CHECK_ST_ERROR("Error when calling vdp_video_mixer_create")
 
     for (i = 0; i < feature_count; i++) feature_enables[i] = VDP_TRUE;
+    if (deint < 3)
+        feature_enables[0] = VDP_FALSE;
     if (feature_count)
         vdp_video_mixer_set_feature_enables(video_mixer, feature_count, features, feature_enables);
     if (denoise)
         vdp_video_mixer_set_attribute_values(video_mixer, 1, denoise_attrib, denoise_value);
     if (sharpen)
         vdp_video_mixer_set_attribute_values(video_mixer, 1, sharpen_attrib, sharpen_value);
+    if (!chroma_deint)
+        vdp_video_mixer_set_attribute_values(video_mixer, 1, skip_chroma_attrib, skip_chroma_value_ptr);
 
     return 0;
 }
@@ -442,6 +466,15 @@ static void free_video_specific(void) {
     decoder = VDP_INVALID_HANDLE;
     decoder_max_refs = -1;
 
+    for (i = 0; i < 3; i++)
+        deint_surfaces[i] = VDP_INVALID_HANDLE;
+
+    for (i = 0; i < 2; i++)
+        if (deint_mpi[i]) {
+            deint_mpi[i]->usage_count--;
+            deint_mpi[i] = NULL;
+        }
+
     for (i = 0; i < MAX_VIDEO_SURFACES; i++) {
         if (surface_render[i].surface != VDP_INVALID_HANDLE) {
           vdp_st = vdp_video_surface_destroy(surface_render[i].surface);
@@ -457,6 +490,42 @@ static void free_video_specific(void) {
     video_mixer = VDP_INVALID_HANDLE;
 }
 
+static int create_vdp_decoder(int max_refs)
+{
+    VdpStatus vdp_st;
+    VdpDecoderProfile vdp_decoder_profile;
+    if (decoder != VDP_INVALID_HANDLE)
+        vdp_decoder_destroy(decoder);
+    switch (image_format) {
+        case IMGFMT_VDPAU_MPEG1:
+            vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG1;
+            break;
+        case IMGFMT_VDPAU_MPEG2:
+            vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG2_MAIN;
+            break;
+        case IMGFMT_VDPAU_H264:
+            vdp_decoder_profile = VDP_DECODER_PROFILE_H264_HIGH;
+            mp_msg(MSGT_VO, MSGL_V, "[vdpau] Creating H264 hardware decoder for %d reference frames.\n", max_refs);
+            break;
+        case IMGFMT_VDPAU_WMV3:
+            vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_MAIN;
+            break;
+        case IMGFMT_VDPAU_VC1:
+            vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_ADVANCED;
+            break;
+    }
+    vdp_st = vdp_decoder_create(vdp_device, vdp_decoder_profile,
+                                vid_width, vid_height, max_refs, &decoder);
+    CHECK_ST_WARNING("Failed creating VDPAU decoder");
+    if (vdp_st != VDP_STATUS_OK) {
+        decoder = VDP_INVALID_HANDLE;
+        decoder_max_refs = 0;
+        return 0;
+    }
+    decoder_max_refs = max_refs;
+    return 1;
+}
+
 /*
  * connect to X server, create and map window, initialize all
  * VDPAU objects, create different surfaces etc.
@@ -476,6 +545,11 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
 #endif
 
     image_format = format;
+    vid_width    = width;
+    vid_height   = height;
+    free_video_specific();
+    if (IMGFMT_IS_VDPAU(image_format) && !create_vdp_decoder(2))
+        return -1;
 
     int_pause = 0;
     visible_buf = 0;
@@ -521,16 +595,9 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
         vo_fs = 1;
 
     /* -----VDPAU related code here -------- */
-
-    free_video_specific();
-
     if (vdp_flip_queue == VDP_INVALID_HANDLE && win_x11_init_vdpau_flip_queue())
         return -1;
 
-    // video width and height
-    vid_width  = width;
-    vid_height = height;
-
     if (create_vdp_mixer(vdp_chroma_type))
         return -1;
 
@@ -742,7 +809,6 @@ static void draw_osd(void)
 {
     mp_msg(MSGT_VO, MSGL_DBG2, "DRAW_OSD\n");
 
-    draw_eosd();
     vo_draw_text_ext(vo_dwidth, vo_dheight, border_x, border_y, border_x, border_y,
                      vid_width, vid_height, draw_osd_I8A8);
 }
@@ -770,37 +836,10 @@ static int draw_slice(uint8_t *image[], int stride[], int w, int h,
     int max_refs = image_format == IMGFMT_VDPAU_H264 ? rndr->info.h264.num_ref_frames : 2;
     if (!IMGFMT_IS_VDPAU(image_format))
         return VO_FALSE;
-    if (decoder == VDP_INVALID_HANDLE || decoder_max_refs < max_refs) {
-        VdpDecoderProfile vdp_decoder_profile;
-        if (decoder != VDP_INVALID_HANDLE)
-            vdp_decoder_destroy(decoder);
-        decoder = VDP_INVALID_HANDLE;
-        switch (image_format) {
-            case IMGFMT_VDPAU_MPEG1:
-                vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG1;
-                break;
-            case IMGFMT_VDPAU_MPEG2:
-                vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG2_MAIN;
-                break;
-            case IMGFMT_VDPAU_H264:
-                vdp_decoder_profile = VDP_DECODER_PROFILE_H264_HIGH;
-                break;
-            case IMGFMT_VDPAU_WMV3:
-                vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_MAIN;
-                break;
-            case IMGFMT_VDPAU_VC1:
-                vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_ADVANCED;
-                break;
-        }
-        vdp_st = vdp_decoder_create(vdp_device, vdp_decoder_profile, vid_width, vid_height, max_refs, &decoder);
-        CHECK_ST_WARNING("Failed creating VDPAU decoder");
-        if (vdp_st != VDP_STATUS_OK) {
-            decoder = VDP_INVALID_HANDLE;
-            decoder_max_refs = 0;
-            return VO_FALSE;
-        }
-        decoder_max_refs = max_refs;
-    }
+    if ((decoder == VDP_INVALID_HANDLE || decoder_max_refs < max_refs)
+        && !create_vdp_decoder(max_refs))
+        return VO_FALSE;
+    
     vdp_st = vdp_decoder_render(decoder, rndr->surface, (void *)&rndr->info, rndr->bitstream_buffers_used, rndr->bitstream_buffers);
     CHECK_ST_WARNING("Failed VDPAU decoder rendering");
     return VO_TRUE;
@@ -834,10 +873,18 @@ static uint32_t draw_image(mp_image_t *mpi)
     if (IMGFMT_IS_VDPAU(image_format)) {
         struct vdpau_render_state *rndr = mpi->priv;
         vid_surface_num = rndr - surface_render;
+        if (deint_buffer_past_frames) {
+            mpi->usage_count++;
+            if (deint_mpi[1])
+                deint_mpi[1]->usage_count--;
+            deint_mpi[1] = deint_mpi[0];
+            deint_mpi[0] = mpi;
+        }
     } else if (!(mpi->flags & MP_IMGFLAG_DRAW_CALLBACK)) {
         VdpStatus vdp_st;
         void *destdata[3] = {mpi->planes[0], mpi->planes[2], mpi->planes[1]};
-        struct vdpau_render_state *rndr = get_surface(0);
+        struct vdpau_render_state *rndr = get_surface(deint_counter);
+        deint_counter = (deint_counter + 1) % 3;
         vid_surface_num = rndr - surface_render;
         vdp_st = vdp_video_surface_put_bits_y_cb_cr(rndr->surface,
                                                     VDP_YCBCR_FORMAT_YV12,
@@ -947,8 +994,9 @@ static void uninit(void)
     dlclose(vdpau_lib_handle);
 }
 
-static opt_t subopts[] = {
+static const opt_t subopts[] = {
     {"deint",   OPT_ARG_INT,   &deint,   (opt_test_f)int_non_neg},
+    {"chroma-deint", OPT_ARG_BOOL,  &chroma_deint,  NULL},
     {"pullup",  OPT_ARG_BOOL,  &pullup,  NULL},
     {"denoise", OPT_ARG_FLOAT, &denoise, NULL},
     {"sharpen", OPT_ARG_FLOAT, &sharpen, NULL},
@@ -962,11 +1010,14 @@ static const char help_msg[] =
     "  deint (all modes > 0 respect -field-dominance)\n"
     "    0: no deinterlacing\n"
     "    1: only show first field\n"
-    "    2: bob deinterlacing (current fallback)\n"
-    "    3: temporal deinterlacing (not yet working)\n"
-    "    4: temporal-spatial deinterlacing (not yet working)\n"
+    "    2: bob deinterlacing\n"
+    "    3: temporal deinterlacing (resource-hungry)\n"
+    "    4: temporal-spatial deinterlacing (very resource-hungry)\n"
+    "  chroma-deint\n"
+    "    Operate on luma and chroma when using temporal deinterlacing (default)\n"
+    "    Use nochroma-deint to speed up temporal deinterlacing\n"
     "  pullup\n"
-    "    Try to apply inverse-telecine (needs deinterlacing, not working)\n"
+    "    Try to apply inverse-telecine (needs temporal deinterlacing)\n"
     "  denoise\n"
     "    Apply denoising, argument is strength from 0.0 to 1.0\n"
     "  sharpen\n"
@@ -981,6 +1032,10 @@ static int preinit(const char *arg)
 
     deint = 0;
     deint_type = 3;
+    deint_counter = 0;
+    deint_buffer_past_frames = 0;
+    deint_mpi[0] = deint_mpi[1] = NULL;
+    chroma_deint = 1;
     pullup = 0;
     denoise = 0;
     sharpen = 0;
@@ -990,6 +1045,8 @@ static int preinit(const char *arg)
     }
     if (deint)
         deint_type = deint;
+    if (deint > 1)
+        deint_buffer_past_frames = 1;
 
     vdpau_lib_handle = dlopen(vdpaulibrary, RTLD_LAZY);
     if (!vdpau_lib_handle) {
@@ -1010,7 +1067,7 @@ static int preinit(const char *arg)
     for (i = 0; i < MAX_VIDEO_SURFACES; i++)
         surface_render[i].surface = VDP_INVALID_HANDLE;
     video_mixer = VDP_INVALID_HANDLE;
-    for (i = 0; i < NUM_OUTPUT_SURFACES; i++)
+    for (i = 0; i <= NUM_OUTPUT_SURFACES; i++)
         output_surfaces[i] = VDP_INVALID_HANDLE;
     vdp_flip_queue = VDP_INVALID_HANDLE;
     output_surface_width = output_surface_height = -1;
@@ -1084,6 +1141,19 @@ static int control(uint32_t request, void *data, ...)
             deint = *(int*)data;
             if (deint)
                 deint = deint_type;
+            if (deint_type > 2) {
+                VdpStatus vdp_st;
+                VdpVideoMixerFeature features[1] =
+                    {deint_type == 3 ?
+                     VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL :
+                     VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL};
+                VdpBool feature_enables[1] = {deint ? VDP_TRUE : VDP_FALSE};
+                vdp_st = vdp_video_mixer_set_feature_enables(video_mixer, 1,
+                                                             features,
+                                                             feature_enables);
+                CHECK_ST_WARNING("Error changing deinterlacing settings")
+                deint_buffer_past_frames = 1;
+            }
             return VO_TRUE;
         case VOCTRL_PAUSE:
             return (int_pause = 1);
@@ -1140,6 +1210,7 @@ static int control(uint32_t request, void *data, ...)
             if (!data)
                 return VO_FALSE;
             generate_eosd(data);
+            draw_eosd();
             return VO_TRUE;
         case VOCTRL_GET_EOSD_RES: {
             mp_eosd_res_t *r = data;
diff --git a/libvo/vo_xv.c b/libvo/vo_xv.c
index 47174d4..d9325eb 100644
--- a/libvo/vo_xv.c
+++ b/libvo/vo_xv.c
@@ -295,8 +295,6 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
     current_buf = 0;
     current_ip_buf = 0;
 
-    if ((flags & VOFLAG_FULLSCREEN) && WinID <= 0) vo_fs = 1;
-    
     resize();
 
     return 0;
@@ -611,7 +609,7 @@ static int preinit(const char *arg)
     strarg_t ck_method_arg = { 0, NULL };
     int xv_adaptor = -1;
 
-    opt_t subopts[] =
+    const opt_t subopts[] =
     {  
       /* name         arg type     arg var         test */
       {  "port",      OPT_ARG_INT, &xv_port,       (opt_test_f)int_pos },
diff --git a/libvo/vo_xvmc.c b/libvo/vo_xvmc.c
index 1492bce..1673fa8 100644
--- a/libvo/vo_xvmc.c
+++ b/libvo/vo_xvmc.c
@@ -63,7 +63,7 @@
 #define UNUSED(x) ((void)(x))
 
 #if LIBAVCODEC_BUILD < ((51<<16)+(40<<8)+2)
-#error You need at least libavcodecs v51.40.2
+#error You need at least libavcodec v51.40.2
 #endif
 
 
@@ -226,7 +226,7 @@ return -1;//fail
 //print all info needed to add new format
 static void print_xvimage_format_values(XvImageFormatValues *xifv){
     int i;
-    const msgl=MSGL_DBG4;
+    const int msgl=MSGL_DBG4;
 
     mp_msg(MSGT_VO,msgl,"Format_ID = 0x%X\n",xifv->id);
 
@@ -379,7 +379,7 @@ static int preinit(const char *arg){
     int mc_ver,mc_rev;
     strarg_t ck_src_arg = { 0, NULL };
     strarg_t ck_method_arg = { 0, NULL };
-    opt_t subopts [] =
+    const opt_t subopts [] =
     {
         /* name         arg type      arg var           test */
         {  "port",      OPT_ARG_INT,  &xv_port_request, (opt_test_f)int_pos },
@@ -664,8 +664,6 @@ skip_surface_allocation:
 #endif
     }
 
-    if ((flags & VOFLAG_FULLSCREEN) && WinID <= 0) vo_fs = 1;
-
 //end vo_xv
 
     /* store image dimesions for displaying */
diff --git a/libvo/vo_yuv4mpeg.c b/libvo/vo_yuv4mpeg.c
index 3b7c06c..a7790fc 100644
--- a/libvo/vo_yuv4mpeg.c
+++ b/libvo/vo_yuv4mpeg.c
@@ -513,7 +513,7 @@ static void check_events(void)
 static int preinit(const char *arg)
 {
   int il, il_bf;
-  opt_t subopts[] = {
+  const opt_t subopts[] = {
     {"interlaced",    OPT_ARG_BOOL, &il,    NULL},
     {"interlaced_bf", OPT_ARG_BOOL, &il_bf, NULL},
     {"file",          OPT_ARG_MSTRZ,  &yuv_filename,  NULL},
diff --git a/libvo/vo_zr2.c b/libvo/vo_zr2.c
index f1b6413..d83a8b2 100644
--- a/libvo/vo_zr2.c
+++ b/libvo/vo_zr2.c
@@ -20,7 +20,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-/* $Id: vo_zr2.c 27541 2008-09-07 14:09:51Z diego $ */
+/* $Id: vo_zr2.c 28957 2009-03-15 10:03:09Z diego $ */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -209,11 +209,11 @@ static int preinit(const char *arg) {
 	const char *dev = NULL;
 	char *dev_arg = NULL, *norm_arg = NULL;
 	int norm = VIDEO_MODE_AUTO, prebuf = 0;
-	opt_t subopts[] = { /* don't want warnings with -Wall... */
-		{ "dev",    OPT_ARG_MSTRZ, &dev_arg,   NULL, 	        0 },
-		{ "prebuf", OPT_ARG_BOOL,  &prebuf,    (opt_test_f)pbc, 0 },
-		{ "norm",   OPT_ARG_MSTRZ, &norm_arg,  (opt_test_f)nc,  0 },
-		{ NULL,     0, 		   NULL,       NULL, 	        0 }
+	const opt_t subopts[] = { /* don't want warnings with -Wall... */
+		{ "dev",    OPT_ARG_MSTRZ, &dev_arg,   NULL 	       },
+		{ "prebuf", OPT_ARG_BOOL,  &prebuf,    (opt_test_f)pbc },
+		{ "norm",   OPT_ARG_MSTRZ, &norm_arg,  (opt_test_f)nc  },
+		{ NULL,     0, 		   NULL,       NULL 	       }
 	};
 
 	VERBOSE("preinit() called with arg: %s\n", arg);
diff --git a/libvo/w32_common.c b/libvo/w32_common.c
index e482536..a9abab2 100644
--- a/libvo/w32_common.c
+++ b/libvo/w32_common.c
@@ -36,7 +36,7 @@ extern int enable_mouse_movements;
 #define MONITOR_DEFAULTTOPRIMARY 1
 #endif
 
-static const char classname[] = "MPlayer - Media player for Win32";
+static const char classname[] = "MPlayer - The Movie Player";
 int vo_vm = 0;
 
 // last non-fullscreen extends
diff --git a/libvo/x11_common.c b/libvo/x11_common.c
index df72ebb..16a97d5 100644
--- a/libvo/x11_common.c
+++ b/libvo/x11_common.c
@@ -1135,6 +1135,12 @@ void vo_x11_create_vo_window(XVisualInfo *vis, int x, int y,
   vo_x11_nofs_sizepos(vo_dx, vo_dy, width, height);
   if (!!vo_fs != !!(flags & VOFLAG_FULLSCREEN))
     vo_x11_fullscreen();
+  else if (vo_fs) {
+    // if we are already in fullscreen do not switch back and forth, just
+    // set the size values right.
+    vo_dwidth  = vo_screenwidth;
+    vo_dheight = vo_screenheight;
+  }
 final:
   if (vo_gc != None)
     XFreeGC(mDisplay, vo_gc);
diff --git a/loader/win32.c b/loader/win32.c
index 2ee9f1e..3aded84 100644
--- a/loader/win32.c
+++ b/loader/win32.c
@@ -63,6 +63,8 @@ for DLL to know too much about its environment.
 #include <sys/types.h>
 #include <dirent.h>
 #include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/timeb.h>
 #ifdef	HAVE_KSTAT
 #include <kstat.h>
 #endif
@@ -3519,7 +3521,7 @@ static HANDLE WINAPI expCreateFileA(LPCSTR cs1,DWORD i1,DWORD i2,
 	free(tmp);
 	return result;
     }
-    if (strstr(cs1, "vp3"))
+    if (strstr(cs1, "vp3") || strstr(cs1, ".fpf"))
     {
 	int r;
 	int flg = 0;
@@ -3537,10 +3539,10 @@ static HANDLE WINAPI expCreateFileA(LPCSTR cs1,DWORD i1,DWORD i2,
 	    flg |= O_RDONLY;
 	else if (GENERIC_WRITE & i1)
 	{
-	    flg |= O_WRONLY;
+	    flg |= O_WRONLY | O_CREAT;
 	    printf("Warning: openning filename %s  %d (flags; 0x%x) for write\n", tmp, r, flg);
 	}
-	r=open(tmp, flg);
+	r=open(tmp, flg, S_IRWXU);
 	free(tmp);
 	return r;
     }
diff --git a/m_option.c b/m_option.c
index 71ad216..8504f25 100644
--- a/m_option.c
+++ b/m_option.c
@@ -173,7 +173,6 @@ static int parse_int(const m_option_t* opt,const char *name, char *param, void*
 }
 
 static char* print_int(const m_option_t* opt,  const void* val) {
-  opt = NULL;
   if (opt->type->size == sizeof(int64_t))
     return dup_printf("%"PRId64, *(const int64_t *)val);
   return dup_printf("%d",VAL(val));
diff --git a/mp3lib/decode_mmx.c b/mp3lib/decode_mmx.c
index 55dc6a9..67a7cdb 100644
--- a/mp3lib/decode_mmx.c
+++ b/mp3lib/decode_mmx.c
@@ -12,9 +12,9 @@
 #define real float /* ugly - but only way */
 
 extern void (*dct64_MMX_func)(short*, short*, real*);
-static unsigned long long attribute_used __attribute__((aligned(8))) null_one = 0x0000ffff0000ffffULL;
-static unsigned long long attribute_used __attribute__((aligned(8))) one_null = 0xffff0000ffff0000ULL;
-unsigned int __attribute__((aligned(16))) costab_mmx[] =
+static const unsigned long long attribute_used __attribute__((aligned(8))) null_one = 0x0000ffff0000ffffULL;
+static const unsigned long long attribute_used __attribute__((aligned(8))) one_null = 0xffff0000ffff0000ULL;
+const unsigned int __attribute__((aligned(16))) costab_mmx[] =
 {
 	1056974725,
 	1057056395,
@@ -54,7 +54,7 @@ unsigned int __attribute__((aligned(16))) costab_mmx[] =
   make_decode_tables_MMX(32768), which had been implemented in (deleted since
   r23383) tabinit_MMX.c.
   */
-static short __attribute__((aligned(8))) mp3lib_decwins[] =
+static const short __attribute__((aligned(8))) mp3lib_decwins[] =
 {
 	     0,	     7,	    54,	   114,	   510,	  1288,	  1644,	  9372,
 	 18760,	 -9373,	  1644,	 -1289,	   510,	  -115,	    54,	    -8,
@@ -191,7 +191,7 @@ int synth_1to1_MMX(real *bandPtr, int channel, short *samples)
     static short buffs[2][2][0x110] __attribute__((aligned(8)));
     static int bo = 1;
     short *b0, (*buf)[0x110], *a, *b;
-    short* window;
+    const short* window;
     int bo1, i = 8;
 
     if (channel == 0) {
diff --git a/mp3lib/layer3.c b/mp3lib/layer3.c
index 70bf08f..dd4502d 100644
--- a/mp3lib/layer3.c
+++ b/mp3lib/layer3.c
@@ -1,7 +1,7 @@
 /*
  * Modified for use with MPlayer, for details see the changelog at
  * http://svn.mplayerhq.hu/mplayer/trunk/
- * $Id: layer3.c 23485 2007-06-06 05:16:08Z zuxy $
+ * $Id: layer3.c 28866 2009-03-07 09:14:45Z reimar $
  */
 
 /* 
@@ -44,16 +44,16 @@ static real cos9[3],cos18[3];
 #endif
 
 struct bandInfoStruct {
-  int longIdx[23];
-  int longDiff[22];
-  int shortIdx[14];
-  int shortDiff[13];
+  uint16_t longIdx[23];
+  uint8_t  longDiff[22];
+  uint16_t shortIdx[14];
+  uint8_t  shortDiff[13];
 };
 
 static int longLimit[9][23];
 static int shortLimit[9][14];
 
-static struct bandInfoStruct bandInfo[9] = { 
+static const struct bandInfoStruct bandInfo[9] = { 
 
 /* MPEG 1.0 */
  { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576},
@@ -132,7 +132,7 @@ static void init_layer3(int down_sample_sblimit)
 
   for (i=0;i<8;i++)
   {
-    static double Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037};
+    static const double Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037};
     double sq=sqrt(1.0+Ci[i]*Ci[i]);
     aa_cs[i] = 1.0/sq;
     aa_ca[i] = Ci[i]/sq;
@@ -180,7 +180,7 @@ static void init_layer3(int down_sample_sblimit)
   }
 
   for(j=0;j<4;j++) {
-    static int len[4] = { 36,36,12,36 };
+    static const int len[4] = { 36,36,12,36 };
     for(i=0;i<len[j];i+=2)
       win1[j][i] = + win[j][i];
     for(i=1;i<len[j];i+=2)
@@ -213,10 +213,10 @@ static void init_layer3(int down_sample_sblimit)
 
   for(j=0;j<9;j++)
   {
-   struct bandInfoStruct *bi = &bandInfo[j];
+   const struct bandInfoStruct *bi = &bandInfo[j];
    int *mp;
    int cb,lwin;
-   int *bdf;
+   const uint8_t *bdf;
 
    mp = map[j][0] = mapbuf0[j];
    bdf = bi->longDiff;
@@ -984,7 +984,7 @@ static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac,
    struct gr_info_s *gr_info,int sfreq,int ms_stereo,int lsf)
 {
       real (*xr)[SBLIMIT*SSLIMIT] = (real (*)[SBLIMIT*SSLIMIT] ) xr_buf;
-      struct bandInfoStruct *bi = &bandInfo[sfreq];
+      const struct bandInfoStruct *bi = &bandInfo[sfreq];
 
       const real *tab1,*tab2;
 
diff --git a/mplayer.c b/mplayer.c
index 1b6a350..81fc389 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -2346,8 +2346,7 @@ static void pause_loop(void)
     if (mpctx->audio_out && mpctx->sh_audio)
 	mpctx->audio_out->pause();	// pause audio, keep data if possible
 
-    while ( (cmd = mp_input_get_cmd(20, 1, 1)) == NULL
-            || cmd->id == MP_CMD_SET_MOUSE_POS || cmd->pausing == 4) {
+    while ( (cmd = mp_input_get_cmd(20, 1, 1)) == NULL || cmd->pausing == 4) {
 	if (cmd) {
 	  cmd = mp_input_get_cmd(0,1,0);
 	  run_command(mpctx, cmd);
diff --git a/osdep/getch2-os2.c b/osdep/getch2-os2.c
index ef2dcf2..abb7f2e 100644
--- a/osdep/getch2-os2.c
+++ b/osdep/getch2-os2.c
@@ -1,5 +1,5 @@
 /*
- * getch2-os2.c : OS/2 TermIO for MPlayer
+ * OS/2 TermIO
  *
  * Copyright (c) 2007 KO Myung-Hun (komh at chollian.net)
  *
diff --git a/osdep/getch2.h b/osdep/getch2.h
index 9b6e793..f6f416b 100644
--- a/osdep/getch2.h
+++ b/osdep/getch2.h
@@ -2,6 +2,8 @@
  * GyS-TermIO v2.0 (for GySmail v3)
  * a very small replacement of ncurses library
  *
+ * copyright (C) 1999 A'rpi/ESP-team
+ *
  * This file is part of MPlayer.
  *
  * MPlayer is free software; you can redistribute it and/or modify
diff --git a/stream/asf_streaming.c b/stream/asf_streaming.c
index 64a8152..c3e70a4 100644
--- a/stream/asf_streaming.c
+++ b/stream/asf_streaming.c
@@ -84,7 +84,8 @@ static int asf_streaming_start( stream_t *stream, int *demuxer_type) {
 
     //Is protocol http, http_proxy, or mms? 
     if (!strcasecmp(proto, "http_proxy") || !strcasecmp(proto, "http") ||
-	!strcasecmp(proto, "mms") || !strcasecmp(proto, "mmshttp"))
+	!strcasecmp(proto, "mms") || !strcasecmp(proto, "mmsh") ||
+	!strcasecmp(proto, "mmshttp"))
     {
 		mp_msg(MSGT_NETWORK,MSGL_V,"Trying ASF/HTTP...\n");
 		fd = asf_http_streaming_start( stream, demuxer_type );
@@ -148,7 +149,7 @@ extern int audio_id;
 extern int video_id;
 
 static void close_s(stream_t *stream) {
-	close(stream->fd);
+	closesocket(stream->fd);
 	stream->fd=-1;
 }
 
@@ -847,7 +848,7 @@ const stream_info_t stream_info_asf = {
   "Bertrand, Reimar Doeffinger, Albeu",
   "originally based on work by Majormms (is that code still there?)",
   open_s,
-  {"mms", "mmsu", "mmst", "http", "http_proxy", "mmshttp", NULL},
+  {"mms", "mmsu", "mmst", "http", "http_proxy", "mmsh", "mmshttp", NULL},
   NULL,
   0 // Urls are an option string
 };
diff --git a/stream/freesdp/parser.c b/stream/freesdp/parser.c
index c17041b..bf6f985 100644
--- a/stream/freesdp/parser.c
+++ b/stream/freesdp/parser.c
@@ -1644,7 +1644,7 @@ const char *
 fsdp_get_media_format (const fsdp_media_description_t * dsc,
 		       unsigned int index)
 {
-  if (!dsc || (index < dsc->formats_count))
+  if (!dsc || (index < dsc->formats_count - 1))
     return NULL;
   return dsc->formats[index];
 }
diff --git a/stream/librtsp/rtsp_rtp.c b/stream/librtsp/rtsp_rtp.c
index 0c00e5b..66c7be4 100644
--- a/stream/librtsp/rtsp_rtp.c
+++ b/stream/librtsp/rtsp_rtp.c
@@ -507,7 +507,8 @@ rtp_setup_and_play (rtsp_t *rtsp_session)
   }
 
   /* only MPEG-TS is supported at the moment */
-  if (!strstr (fsdp_get_media_format (med_dsc, 0),
+  if (!fsdp_get_media_format (med_dsc, 0) ||
+      !strstr (fsdp_get_media_format (med_dsc, 0),
                RTSP_MEDIA_CONTAINER_MPEG_TS))
   {
     fsdp_description_delete (dsc);
diff --git a/stream/tv.c b/stream/tv.c
index 58321d5..7e8ae53 100644
--- a/stream/tv.c
+++ b/stream/tv.c
@@ -439,6 +439,12 @@ static int open_tv(tvi_handle_t *tvh)
 #endif
 
     /* limits on w&h are norm-dependent -- JM */
+    if (tvh->tv_param->width != -1 && tvh->tv_param->height != -1) {
+        // first tell the driver both width and height, some drivers do not support setting them independently.
+        int dim[2];
+        dim[0] = tvh->tv_param->width; dim[1] = tvh->tv_param->height;
+        funcs->control(tvh->priv, TVI_CONTROL_VID_SET_WIDTH_HEIGHT, dim);
+    }
     /* set width */
     if (tvh->tv_param->width != -1)
     {
diff --git a/stream/tv.h b/stream/tv.h
index 37c63b7..c7ffae0 100644
--- a/stream/tv.h
+++ b/stream/tv.h
@@ -175,6 +175,7 @@ typedef struct {
 #define TVI_CONTROL_VID_SET_PICTURE	0x11e
 #define TVI_CONTROL_VID_SET_GAIN	0x11f
 #define TVI_CONTROL_VID_GET_GAIN	0x120
+#define TVI_CONTROL_VID_SET_WIDTH_HEIGHT	0x121
 
 /* TUNER controls */
 #define TVI_CONTROL_TUN_GET_FREQ	0x201
diff --git a/stream/tvi_v4l2.c b/stream/tvi_v4l2.c
index 0742135..c890d7a 100644
--- a/stream/tvi_v4l2.c
+++ b/stream/tvi_v4l2.c
@@ -780,6 +780,14 @@ static int control(priv_t *priv, int cmd, void *arg)
         return TVI_CONTROL_TRUE;
     case TVI_CONTROL_VID_CHK_WIDTH:
         return TVI_CONTROL_TRUE;
+    case TVI_CONTROL_VID_SET_WIDTH_HEIGHT:
+        if (getfmt(priv) < 0) return TVI_CONTROL_FALSE;
+        priv->format.fmt.pix.width = ((int *)arg)[0];
+        priv->format.fmt.pix.height = ((int *)arg)[1];
+        priv->format.fmt.pix.field = V4L2_FIELD_ANY;
+        if (ioctl(priv->video_fd, VIDIOC_S_FMT, &priv->format) < 0)
+            return TVI_CONTROL_FALSE;
+        return TVI_CONTROL_TRUE;
     case TVI_CONTROL_VID_SET_WIDTH:
         if (getfmt(priv) < 0) return TVI_CONTROL_FALSE;
         priv->format.fmt.pix.width = *(int *)arg;
@@ -1126,7 +1134,7 @@ static int uninit(priv_t *priv)
         struct v4l2_buffer buf;
 
         /* get performance */
-        frames = 1 + lrintf((double)(priv->curr_frame - priv->first_frame) / (1e6 * getfps(priv)));
+        frames = 1 + lrintf((double)(priv->curr_frame - priv->first_frame) / 1e6 * getfps(priv));
         dropped = frames - priv->frames;
 
         /* turn off streaming */
diff --git a/sub_cc.c b/sub_cc.c
index 2acebf0..3a420ed 100644
--- a/sub_cc.c
+++ b/sub_cc.c
@@ -1,5 +1,5 @@
 /*
- * sub_cc.c - Decoder for Closed Captions
+ * decoder for Closed Captions
  *
  * This decoder relies on MPlayer's OSD to display subtitles.
  * Be warned that the decoding is somewhat preliminary, though it basically works.
@@ -130,7 +130,7 @@ static void append_char(char c)
 	{
 		if(cursor_pos==CC_MAX_LINE_LENGTH-1)
 		{
-			fprintf(stderr,"sub_cc.c: append_char() reached CC_MAX_LINE_LENGTH!\n");
+			fprintf(stderr,"CC: append_char() reached CC_MAX_LINE_LENGTH!\n");
 			return;
 		}
 		bb->text[bb->lines - 1][cursor_pos++]=c;
diff --git a/subopt-helper.c b/subopt-helper.c
index d1a1692..6f4bcf6 100644
--- a/subopt-helper.c
+++ b/subopt-helper.c
@@ -45,18 +45,11 @@ static char const * parse_float( char const * const str, float * const valp );
  *         else a non-zero value is returned.
  *
  */
-int subopt_parse( char const * const str, opt_t * opts )
+int subopt_parse( char const * const str, const opt_t * opts )
 {
   int parse_err = 0, idx;
   unsigned int parse_pos = 0;
 
-  /* Initialize set member to false.          *
-   * It is set to true if it was found in str */
-  for ( idx=0; opts[idx].name; ++idx )
-  {
-    opts[idx].set = 0;
-  }
-
   if ( str )
   {
     while ( str[parse_pos] && !parse_err )
@@ -101,7 +94,7 @@ int subopt_parse( char const * const str, opt_t * opts )
         if( strncmp( &str[parse_pos], opts[idx].name, opt_len ) == 0 )
         {
           /* option was found */
-          opts[idx].set = 1; next = 1;
+          next = 1;
 
           assert( opts[idx].valp && "Need a pointer to store the arg!" );
 
@@ -196,7 +189,7 @@ else if ( substr_len == opt_len+2 )
                   strncmp( &str[parse_pos+2], opts[idx].name, opt_len ) == 0 )
         {
           /* option was found but negated */
-          opts[idx].set = 1; next = 1;
+          next = 1;
 
           /* set arg to false */
           *((int *)(opts[idx].valp)) = 0;
diff --git a/subopt-helper.h b/subopt-helper.h
index cd435d4..ea6bdd5 100644
--- a/subopt-helper.h
+++ b/subopt-helper.h
@@ -24,13 +24,10 @@ typedef struct opt_s
   int type;    ///< option type as defined in subopt-helper.h
   void * valp; ///< pointer to the mem where the value should be stored
   opt_test_f test; ///< argument test func ( optional )
-  int set;     ///< Is set internally by the parser if the option was found.
-               ///< Don't use it at initialization of your opts, it will be
-               ///< overriden anyway!
 } opt_t;
 
 /** parses the string for the options specified in opt */
-int subopt_parse( char const * const str, opt_t * opts );
+int subopt_parse( char const * const str, const opt_t * opts );
 
 
 /*------------------ arg specific types and declaration -------------------*/
diff --git a/tremor/tremor.diff b/tremor/tremor.diff
index 393889a..2838721 100644
--- a/tremor/tremor.diff
+++ b/tremor/tremor.diff
@@ -166,3 +166,13 @@
 +#endif /* 0 */
 +
  #endif  /* _OS_TYPES_H */
+--- mapping0.c	(revision 28274)
++++ mapping0.c	(revision 28275)
+@@ -19,6 +20,7 @@
+ #include <string.h>
+ #include <math.h>
+ #include "ogg.h"
++#include "os.h"
+ #include "ivorbiscodec.h"
+ #include "mdct.h"
+ #include "codec_internal.h"
diff --git a/version.sh b/version.sh
index eb302c9..dee9bcf 100755
--- a/version.sh
+++ b/version.sh
@@ -8,9 +8,14 @@ svn_revision=$(cat snapshot_version 2> /dev/null)
 test $svn_revision || svn_revision=$(LC_ALL=C svn info 2> /dev/null | grep Revision | cut -d' ' -f2)
 test $svn_revision || svn_revision=$(grep revision .svn/entries 2>/dev/null | cut -d '"' -f2)
 test $svn_revision || svn_revision=$(sed -n -e '/^dir$/{n;p;q;}' .svn/entries 2>/dev/null)
+test $svn_revision && svn_revision=SVN-r$svn_revision
 test $svn_revision || svn_revision=UNKNOWN
 
-NEW_REVISION="#define VERSION \"SVN-r${svn_revision}${extra}\""
+# releases extract the version number from the VERSION file
+version=$(cat VERSION 2> /dev/null)
+test $version || version=$svn_revision
+
+NEW_REVISION="#define VERSION \"${version}${extra}\""
 OLD_REVISION=$(cat version.h 2> /dev/null)
 TITLE='#define MP_TITLE "%s "VERSION" (C) 2000-2009 MPlayer Team\n"'
 

-- 
mplayer packaging



More information about the pkg-multimedia-commits mailing list