diff -wurB MPlayer-20050121-orig/cfg-common.h MPlayer-20050121/cfg-common.h
--- MPlayer-20050121-orig/cfg-common.h	2005-01-22 05:09:56.000000000 +0100
+++ MPlayer-20050121/cfg-common.h	2005-01-22 06:03:58.000000000 +0100
@@ -263,6 +263,7 @@
 	{"spuaa", &spu_aamode, CONF_TYPE_INT, CONF_RANGE, 0, 31, NULL},
 	{"spugauss", &spu_gaussvar, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 3.0, NULL},
         {"spu-scale", &spu_scale_factor, CONF_TYPE_FLOAT, CONF_RANGE, 0.1, 4.0, NULL},
+        {"spu-keep-aspect", &spu_original_aspect, CONF_TYPE_FLAG, 0, 0, 1, NULL},
 #ifdef HAVE_FREETYPE
 	{"subfont-encoding", &subtitle_font_encoding, CONF_TYPE_STRING, 0, 0, 0, NULL},
  	{"subfont-text-scale", &text_font_scale_factor, CONF_TYPE_FLOAT, CONF_RANGE, 0, 100, NULL},
diff -wurB MPlayer-20050121-orig/DOCS/man/en/mplayer.1 MPlayer-20050121/DOCS/man/en/mplayer.1
--- MPlayer-20050121-orig/DOCS/man/en/mplayer.1	2005-01-22 05:09:56.000000000 +0100
+++ MPlayer-20050121/DOCS/man/en/mplayer.1	2005-01-22 06:09:35.000000000 +0100
@@ -1478,6 +1478,11 @@
 Higher means more blur (default: 1.0).
 .
 .TP
+.B \-spu-keep-aspect (OSD only)
+Keep aspect ratio of the DVD/\:VOBsub subtitles.
+If this is off (disabled), the aspect ratio of the movie is applied to the subtitles.
+.
+.TP
 .B \-sub <subtitlefile1,subtitlefile2,...>
 Use/\:display these subtitle files.
 Only one file can be displayed at the same time.
diff -wurB MPlayer-20050121-orig/libvo/sub.h MPlayer-20050121/libvo/sub.h
--- MPlayer-20050121-orig/libvo/sub.h	2005-01-22 05:09:56.000000000 +0100
+++ MPlayer-20050121/libvo/sub.h	2005-01-22 06:01:36.000000000 +0100
@@ -107,6 +107,7 @@
 extern int spu_aamode;
 extern float spu_gaussvar;
 extern float spu_scale_factor;
+extern int spu_original_aspect;
 
 //extern void vo_draw_text_osd(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride));
 //extern void vo_draw_text_progbar(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride));
diff -wurB MPlayer-20050121-orig/spudec.c MPlayer-20050121/spudec.c
--- MPlayer-20050121-orig/spudec.c	2005-01-22 05:09:56.000000000 +0100
+++ MPlayer-20050121/spudec.c	2005-01-22 06:01:36.000000000 +0100
@@ -41,6 +41,7 @@
 float spu_gaussvar = 1.0;
 extern int sub_pos;
 float spu_scale_factor = 1;
+int spu_original_aspect = 0;
 
 typedef struct packet_t packet_t;
 struct packet_t {
@@ -642,22 +643,25 @@
   unsigned int scaled_start_row;
   unsigned int scaled_end_row;
   unsigned int scaled_sub_pos;
+  unsigned int spu_target_y;
   float scale_factor = spu_scale_factor;
   spu = (spudec_handle_t *)me;
-  if (spu->orig_frame_width != dxs || spu->orig_frame_height != dys || spu_scale_factor != 1) {
+  spu_target_y = dxs 
+    * ((float)(spu_original_aspect ? ((float)spu->orig_frame_height/spu->orig_frame_width) : ((float)dys / dxs)));
+  if (spu->orig_frame_width != dxs || spu->orig_frame_height != spu_target_y || spu_scale_factor != 1) {
     /* scaled_x = scalex * x / 0x100
        scaled_y = scaley * y / 0x100
        order of operations is important because of rounding. */
     unsigned int xlimit = dxs * sub_width_p / 100;
     spu->scalex = 0x100 * dxs * scale_factor / spu->orig_frame_width;
-    spu->scaley = 0x100 * dys * scale_factor / spu->orig_frame_height;
+    spu->scaley = 0x100 * spu_target_y * scale_factor / spu->orig_frame_height;
     if ((spu->scaled_width = spu->width * spu->scalex / 0x100) > xlimit) {
       scale_factor = (float)(spu->scaled_width = xlimit) * spu->orig_frame_width / (spu->width * dxs);
       spu->scalex = 0x100 * spu->scaled_width / spu->width;
-      spu->scaley = 0x100 * dys * scale_factor / spu->orig_frame_height;
+      spu->scaley = 0x100 * spu_target_y * scale_factor / spu->orig_frame_height;
     }
     if ((spu->scaled_height = spu->height * spu->scaley / 0x100) > dys) {
-      scale_factor = (float)(spu->scaled_height = dys) * spu->orig_frame_height / (spu->height * dys);
+      scale_factor = (float)(spu->scaled_height = dys) * spu->orig_frame_height / (spu->height * spu_target_y);
       spu->scaley = 0x100 * spu->scaled_height / spu->height;
       spu->scalex = 0x100 * dxs * scale_factor / spu->orig_frame_width;
     }
