diff -wurB 2_MPlayer-20050124-osdasp-vo/Gui/interface.c MPlayer-20050124/Gui/interface.c
--- 2_MPlayer-20050124-osdasp-vo/Gui/interface.c	2005-01-25 01:15:51.000000000 +0100
+++ MPlayer-20050124/Gui/interface.c	2005-01-25 03:03:39.000000000 +0100
@@ -408,7 +408,7 @@
 void guiLoadFont( void )
 {
 #ifdef HAVE_FREETYPE
-  load_font_ft(vo_image_width, vo_image_height);
+  load_font_ft(vo_image_width, vo_image_height, vo_image_aspect);
 #else
  if ( vo_font )
   {
diff -wurB 2_MPlayer-20050124-osdasp-vo/libmenu/vf_menu.c MPlayer-20050124/libmenu/vf_menu.c
--- 2_MPlayer-20050124-osdasp-vo/libmenu/vf_menu.c	2005-01-25 01:15:51.000000000 +0100
+++ MPlayer-20050124/libmenu/vf_menu.c	2005-01-25 03:47:27.000000000 +0100
@@ -248,7 +248,7 @@
   // here is the right place to get screen dimensions
   if (force_load_font) {
     force_load_font = 0;
-    load_font_ft(width,height);
+    load_font_ft(width,height,0);  // FIXME: get the display's real aspect ratio from somewhere!
   }
 #endif
   return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
diff -wurB 2_MPlayer-20050124-osdasp-vo/libvo/font_load_ft.c MPlayer-20050124/libvo/font_load_ft.c
--- 2_MPlayer-20050124-osdasp-vo/libvo/font_load_ft.c	2005-01-25 01:15:51.000000000 +0100
+++ MPlayer-20050124/libvo/font_load_ft.c	2005-01-25 04:51:41.000000000 +0100
@@ -53,6 +53,7 @@
 
 int vo_image_width = 0;
 int vo_image_height = 0;
+float vo_image_aspect = 0;
 int force_load_font;
 
 int using_freetype = 0;
@@ -112,7 +113,7 @@
 }
 
 
-static int check_font(font_desc_t *desc, float ppem, int padding, int pic_idx,
+static int check_font(font_desc_t *desc, float xppem, float yppem, int padding, int pic_idx,
 		      int charset_size, FT_ULong *charset, FT_ULong *charcodes,
 		      int unicode) {
     FT_Error	error;
@@ -136,14 +137,14 @@
 
     /* set size */
     if (FT_IS_SCALABLE(face)) {
-	error = FT_Set_Char_Size(face, 0, floatTof266(ppem), 0, 0);
+	error = FT_Set_Char_Size(face, floatTof266(xppem), floatTof266(yppem), 0, 0);
 	if (error) WARNING("FT_Set_Char_Size failed.");
     } else {
 	int j = 0;
 	int jppem = face->available_sizes[0].height;
 	/* find closest size */
 	for (i = 0; i<face->num_fixed_sizes; ++i) {
-	    if (fabs(face->available_sizes[i].height - ppem) < abs(face->available_sizes[i].height - jppem)) {
+	    if (fabs(face->available_sizes[i].height - yppem) < abs(face->available_sizes[i].height - jppem)) {
 		j = i;
 		jppem = face->available_sizes[i].height;
 	    }
@@ -190,10 +191,10 @@
 //    fprintf(stderr, "font height: %lf\n", (double)(face->bbox.yMax-face->bbox.yMin)/(double)face->units_per_EM*ppem);
 //    fprintf(stderr, "font width: %lf\n", (double)(face->bbox.xMax-face->bbox.xMin)/(double)face->units_per_EM*ppem);
 
-    ymax = (double)(face->bbox.yMax)/(double)face->units_per_EM*ppem+1;
-    ymin = (double)(face->bbox.yMin)/(double)face->units_per_EM*ppem-1;
+    ymax = (double)(face->bbox.yMax)/(double)face->units_per_EM*yppem+1;
+    ymin = (double)(face->bbox.yMin)/(double)face->units_per_EM*yppem-1;
     
-    width = ppem*(face->bbox.xMax-face->bbox.xMin)/face->units_per_EM+3+2*padding;
+    width = xppem*(face->bbox.xMax-face->bbox.xMin)/face->units_per_EM+3+2*padding;
     if (desc->max_width < width) desc->max_width = width;
     width = ALIGN(width);
     desc->pic_b[pic_idx]->charwidth = width;
@@ -609,7 +610,7 @@
 }
 
 
-static int prepare_font(font_desc_t *desc, FT_Face face, float ppem, int pic_idx,
+static int prepare_font(font_desc_t *desc, FT_Face face, float xppem, float yppem, int pic_idx,
 			int charset_size, FT_ULong *charset, FT_ULong *charcodes, int unicode,
 			double thickness, double radius)
 {
@@ -637,7 +638,7 @@
     for (i = 0; i<768; ++i) desc->pic_b[pic_idx]->pal[i] = i/3;
 
 //    ttime = GetTimer();
-    err = check_font(desc, ppem, padding, pic_idx, charset_size, charset, charcodes, unicode);
+    err = check_font(desc, xppem, yppem, padding, pic_idx, charset_size, charset, charcodes, unicode);
 //    ttime=GetTimer()-ttime;
 //    printf("render:   %7lf us\n",ttime);
     if (err) return -1;
@@ -951,7 +952,7 @@
     return f266ToInt(kern.x);
 }
 
-font_desc_t* read_font_desc_ft(char *fname, int movie_width, int movie_height)
+font_desc_t* read_font_desc_ft(char *fname, int movie_width, int movie_height, float movie_aspect)
 {
     font_desc_t *desc;
 
@@ -966,6 +967,8 @@
     int i, j;
     int unicode;
     
+    // aspect_factor: how much our pixels will be distorted. >1 means thin, <1 means fat pixels on display
+    float aspect_factor = movie_aspect ? movie_width / movie_height / movie_aspect : 1;
     float movie_size;
 
     float subtitle_font_ppem;
@@ -976,7 +979,7 @@
 	movie_size = movie_height;
 	break;
     case 2:
-	movie_size = movie_width;
+	movie_size = movie_width / aspect_factor;
 	break;
     case 3:
 	movie_size = sqrt(movie_height*movie_height+movie_width*movie_width);
@@ -988,7 +991,11 @@
 
     subtitle_font_ppem = movie_size*text_font_scale_factor/100.0;
     osd_font_ppem = movie_size*osd_font_scale_factor/100.0;
-
+    /*
+    WARNING("*KP 4 as=%d w=%d h=%d a=%f => s=%f f=%f sub=%f xsub=%f osd=%f xost=%f\n",
+	    subtitle_autoscale, movie_width, movie_height, movie_aspect, movie_size, aspect_factor,
+	    subtitle_font_ppem, subtitle_font_ppem * aspect_factor,
+	    osd_font_ppem, osd_font_ppem * aspect_factor); */
     if (subtitle_font_ppem < 5) subtitle_font_ppem = 5;
     if (osd_font_ppem < 5) osd_font_ppem = 5;
 
@@ -1033,7 +1040,7 @@
 
 //    fprintf(stderr, "fg: prepare t = %lf\n", GetTimer()-t);
 
-    err = prepare_font(desc, face, subtitle_font_ppem, desc->face_cnt-1,
+    err = prepare_font(desc, face, subtitle_font_ppem * aspect_factor, subtitle_font_ppem, desc->face_cnt-1,
 		       charset_size, my_charset, my_charcodes, unicode,
 		       subtitle_font_thickness, subtitle_font_radius);
 
@@ -1053,7 +1060,7 @@
     }
     desc->face_cnt++;
 
-    err = prepare_font(desc, face, osd_font_ppem, desc->face_cnt-1,
+    err = prepare_font(desc, face, osd_font_ppem * aspect_factor, osd_font_ppem, desc->face_cnt-1,
 		       OSD_CHARSET_SIZE, osd_charset, osd_charcodes, 0,
 		       subtitle_font_thickness, subtitle_font_radius);
     
@@ -1120,7 +1127,7 @@
     return 0;
 }
 
-void load_font_ft(int width, int height) 
+void load_font_ft(int width, int height, float aspect) 
 {
 #ifdef HAVE_FONTCONFIG
     FcPattern *fc_pattern;
@@ -1129,10 +1136,11 @@
 #endif
     vo_image_width = width;
     vo_image_height = height;
+    vo_image_aspect = aspect;
 
     // protection against vo_aa font hacks
-    if (vo_font && !vo_font->dynamic) return;
 
+    if (vo_font && !vo_font->dynamic) return;
     if (vo_font) free_font_desc(vo_font);
 
 #ifdef USE_OSD
@@ -1155,12 +1163,12 @@
 	}
 	// s doesn't need to be freed according to fontconfig docs
 	FcPatternGetString(fc_pattern, FC_FILE, 0, &s);
-	vo_font=read_font_desc_ft(s, width, height);
+	vo_font=read_font_desc_ft(s, width, height, aspect);
 	free(fc_pattern);
     }
     else
 #endif
-    vo_font=read_font_desc_ft(font_name, width, height);
+    vo_font=read_font_desc_ft(font_name, width, height, aspect);
 #endif
 }
 
diff -wurB 2_MPlayer-20050124-osdasp-vo/libvo/font_load.h MPlayer-20050124/libvo/font_load.h
--- 2_MPlayer-20050124-osdasp-vo/libvo/font_load.h	2005-01-25 01:15:51.000000000 +0100
+++ MPlayer-20050124/libvo/font_load.h	2005-01-25 03:44:26.000000000 +0100
@@ -74,19 +74,20 @@
 
 extern int vo_image_width;
 extern int vo_image_height;
+extern float vo_image_aspect;
 
 extern int force_load_font;
 
 int init_freetype();
 int done_freetype();
 
-font_desc_t* read_font_desc_ft(char* fname,int movie_width, int movie_height);
+font_desc_t* read_font_desc_ft(char* fname,int movie_width, int movie_height, float movie_aspect);
 void free_font_desc(font_desc_t *desc);
 
 void render_one_glyph(font_desc_t *desc, int c);
 int kerning(font_desc_t *desc, int prevc, int c);
 
-void load_font_ft(int width, int height);
+void load_font_ft(int width, int height, float aspect);
 
 #else
 
diff -wurB 2_MPlayer-20050124-osdasp-vo/libvo/sub.c MPlayer-20050124/libvo/sub.c
--- 2_MPlayer-20050124-osdasp-vo/libvo/sub.c	2005-01-25 01:15:51.000000000 +0100
+++ MPlayer-20050124/libvo/sub.c	2005-01-25 04:30:33.000000000 +0100
@@ -55,6 +55,9 @@
 
 //static int vo_font_loaded=-1;
 font_desc_t* vo_font=NULL;
+int vo_font_xs = 0;
+int vo_font_ys = 0;
+float vo_font_asp = 0;
 
 unsigned char* vo_osd_text=NULL;
 int sub_unicode=0;
@@ -139,23 +142,31 @@
     }
 }
 
-inline static void vo_update_text_osd(mp_osd_obj_t* obj,int dxs,int dys){
+#define OSD_START_X 20;
+#define OSD_START_Y 10;
+
+inline static void vo_update_text_osd(mp_osd_obj_t* obj,int dxs,int dys,float dasp){
 	unsigned char *cp=vo_osd_text;
-	int x=20;
+	int x;
+	int w=0;
 	int h=0;
 	int font;
 
-        obj->bbox.x1=obj->x=x;
-        obj->bbox.y1=obj->y=10;
+	obj->x = OSD_START_X;
+	obj->y = OSD_START_Y;
+	if (dasp) obj->x *= (float)dxs/dys/dasp;
 
         while (*cp){
           int c=*cp++;
 	  render_one_glyph(vo_font, c);
-	  x+=vo_font->width[c]+vo_font->charspace;
+	  w+=vo_font->width[c]+vo_font->charspace;
 	  h=get_height(c,h);
         }
+	w -= vo_font->charspace;
 	
-	obj->bbox.x2=x-vo_font->charspace;
+        obj->bbox.x1 = obj->x;
+        obj->bbox.y1 = obj->y;
+	obj->bbox.x2=obj->bbox.x1+w;
 	obj->bbox.y2=obj->bbox.y1+h;
 	obj->flags|=OSDFLAG_BBOX;
 
@@ -764,9 +775,10 @@
 
 #ifdef HAVE_FREETYPE    
     // here is the right place to get screen dimensions
-    if (!vo_font || force_load_font) {
+    if (!vo_font || force_load_font || vo_font_asp != dasp) {
 	force_load_font = 0;
-	load_font_ft(dxs, dys);
+	load_font_ft(dxs, dys, dasp);
+	vo_font_asp = dasp;
     }
 #endif
 
@@ -791,7 +803,7 @@
 	    break;
 	case OSDTYPE_OSD:
 	    if(vo_font && vo_osd_text && vo_osd_text[0]){
-		vo_update_text_osd(obj,dxs,dys); // update bbox
+		vo_update_text_osd(obj,dxs,dys,dasp); // update bbox
 		obj->flags|=OSDFLAG_VISIBLE|OSDFLAG_CHANGED;
 	    } else
 		obj->flags&=~OSDFLAG_VISIBLE;
