--- configure	2006-10-30 19:07:32.000000000 +0100
+++ configure	2006-10-30 21:59:50.000000000 +0100
@@ -259,6 +259,7 @@
   --disable-pthreads     Disable Posix threads support [autodetect]
   --disable-ass          Disable internal SSA/ASS subtitles support [autodetect]
   --enable-rpath         Enable runtime linker path for extra libs [disabled]
+  --enable-timestamp	 Enable osd timestamp [disable]
 
 Codecs:
   --enable-gif		 enable gif support [autodetect]
@@ -1723,6 +1724,7 @@
 _pthreads=auto
 _ass=auto
 _rpath=no
+_timestamp=no
 _asmalign_pot=auto
 _color_console=no
 for ac_option do
@@ -2038,6 +2040,8 @@
   --disable-ass)        _ass=no         ;;
   --enable-rpath)       _rpath=yes      ;;
   --disable-rpath)      _rpath=no       ;;
+  --enable-timestamp)	_timestamp=yes	;;
+  --disable-timestamp)	_timestamp=no	;;
   --enable-color-console)  _color_console=yes ;;
   --disable-color-console) _color_console=no  ;;
 
@@ -2997,6 +3001,13 @@
 fi
 echores "$_dynamic_plugins"
 
+echocheck "timestamp"
+if test "$_timestamp" = yes ; then
+  _def_timestamp='#define HAVE_OSD_TIMESTAMP 1'
+else
+  _def_timestamp='#undef HAVE_OSD_TIMESTAMP'
+fi
+echores "$_timestamp"
 
 #echocheck "dynamic linking"
 # FIXME !! make this dynamic detection work and modify at the end (search _ld_dl_dynamic)
@@ -7942,6 +7953,9 @@
 /* Define this if your system has pthreads */
 $_def_pthreads
 
+/* Define this if osd timestamp  */
+$_def_timestamp
+
 /* Define this if you enabled thread support for libavcodec */
 $_def_threads
 
--- mplayer.c	2006-10-30 19:07:32.000000000 +0100
+++ mplayer.c	2006-10-30 21:58:43.000000000 +0100
@@ -1452,10 +1452,25 @@
     mp_osd_msg_t *msg;
     static char osd_text[64] = "";
     static char osd_text_timer[64];
+#ifdef HAVE_OSD_TIMESTAMP
+    static char osd_text_timestamp[64];
+    time_t ttime;
+    struct tm *ptm;
+#endif
     
 #ifdef USE_OSD    
     // we need some mem for vo_osd_text
     vo_osd_text = (unsigned char*)osd_text;
+#ifdef HAVE_OSD_TIMESTAMP
+    if (vo_osd_timestamp_format)
+      {
+      ttime=time(NULL);
+      ptm=localtime(&ttime);
+      strftime(osd_text_timestamp,sizeof(osd_text_timestamp),vo_osd_timestamp_format,ptm);
+      vo_osd_timestamp=osd_text_timestamp;
+      if(sh_video) vo_osd_changed(OSDTYPE_TIMESTAMP);
+      }
+#endif
 #endif
     
     // Look if we have a msg
--- mencoder.c	2006-10-30 19:07:32.000000000 +0100
+++ mencoder.c	2006-10-30 21:58:43.000000000 +0100
@@ -203,6 +203,14 @@
 static sub_data* subdata=NULL;
 float sub_last_pts = -303;
 #endif
+#ifdef USE_OSD    
+#ifdef HAVE_OSD_TIMESTAMP
+int real_time = 1;
+static char osd_text_timestamp[64];
+time_t ttime;
+struct tm *ptm;
+#endif
+#endif
 
 int auto_expand=1;
 int encode_duplicates=1;
@@ -1508,6 +1516,18 @@
      }
  }
 #endif
+#ifdef USE_OSD    
+#ifdef HAVE_OSD_TIMESTAMP
+  if (vo_osd_timestamp_format)
+      {
+      ttime=time(NULL);
+      ptm=localtime(&ttime);
+      strftime(osd_text_timestamp,sizeof(osd_text_timestamp),vo_osd_timestamp_format,ptm);
+      vo_osd_timestamp=osd_text_timestamp;
+      if(sh_video) vo_osd_changed(OSDTYPE_TIMESTAMP);
+      }
+#endif
+#endif
 
  frame_data = (s_frame_data){ .start = NULL, .in_size = 0, .frame_time = 0., .already_read = 0 };
 
--- cfg-common.h	2006-10-30 19:07:32.000000000 +0100
+++ cfg-common.h	2006-10-30 21:58:43.000000000 +0100
@@ -299,6 +299,11 @@
 	{"spualign", &spu_alignment, CONF_TYPE_INT, CONF_RANGE, -1, 2, NULL},
 	{"spuaa", &spu_aamode, CONF_TYPE_INT, CONF_RANGE, 0, 31, NULL},
 	{"spugauss", &spu_gaussvar, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 3.0, NULL},
+	// osd timestamp
+#ifdef HAVE_OSD_TIMESTAMP
+	{"osd-timestamp-format", &vo_osd_timestamp_format, CONF_TYPE_STRING, 0, 0, 0, NULL},
+	{"osd-timestamp-alignment", &vo_osd_timestamp_alignment, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL},
+#endif
 #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},
--- libvo/sub.h	2006-10-30 19:07:09.000000000 +0100
+++ libvo/sub.h	2006-10-30 21:58:43.000000000 +0100
@@ -10,6 +10,7 @@
 #define OSDTYPE_SUBTITLE 2
 #define OSDTYPE_PROGBAR 3
 #define OSDTYPE_SPU 4
+#define OSDTYPE_TIMESTAMP 5
 
 #define OSDFLAG_VISIBLE 1
 #define OSDFLAG_CHANGED 2
@@ -59,6 +60,13 @@
 #include "subreader.h"
 
 extern unsigned char* vo_osd_text;
+extern unsigned char* vo_osd_timestamp;
+extern unsigned char* vo_osd_timestamp_format;
+extern unsigned int vo_osd_timestamp_alignment;
+#define OSD_TIMESTAMP_ALIGNMENT_BOTTOMLEFT	0
+#define OSD_TIMESTAMP_ALIGNMENT_TOPLEFT		1
+#define OSD_TIMESTAMP_ALIGNMENT_TOPRIGHT	2
+#define OSD_TIMESTAMP_ALIGNMENT_BOTTOMRIGHT	3
 
 extern int vo_osd_progbar_type;
 extern int vo_osd_progbar_value;   // 0..255
--- libvo/sub.c	2006-10-30 19:07:09.000000000 +0100
+++ libvo/sub.c	2006-10-30 21:58:43.000000000 +0100
@@ -59,6 +59,11 @@
 font_desc_t* vo_font=NULL;
 
 unsigned char* vo_osd_text=NULL;
+#ifdef HAVE_OSD_TIMESTAMP
+unsigned char* vo_osd_timestamp=NULL;
+unsigned char* vo_osd_timestamp_format=NULL;
+unsigned int vo_osd_timestamp_alignment=0;
+#endif
 int sub_unicode=0;
 int sub_utf8=0;
 int sub_pos=100;
@@ -192,6 +197,69 @@
         }
 }
 
+#ifdef HAVE_OSD_TIMESTAMP
+inline static void vo_update_text_timestamp(mp_osd_obj_t* obj,int dxs,int dys){
+	unsigned char *cp=vo_osd_timestamp;
+	int x=0;
+	int h=0;
+	int font;
+
+        obj->bbox.x1=obj->x=x;
+        obj->bbox.y1=obj->y=10;
+
+        while (*cp){
+          int c=*cp++;
+	  render_one_glyph(vo_font, c);
+	  x+=vo_font->width[c]+vo_font->charspace;
+	  h=get_height(c,h);
+        }
+
+	switch (vo_osd_timestamp_alignment) {
+	  case OSD_TIMESTAMP_ALIGNMENT_TOPLEFT:
+	    obj->bbox.y1=obj->y=10;
+	    obj->bbox.x1=obj->x=20;
+	    obj->bbox.x2=obj->bbox.x1+x-vo_font->charspace;
+	    obj->bbox.y2=obj->bbox.y1+h;
+	    break;
+	  case OSD_TIMESTAMP_ALIGNMENT_TOPRIGHT:
+	    obj->bbox.y1=obj->y=10;
+	    obj->bbox.x1=obj->x=dxs-20-x-vo_font->charspace;
+	    obj->bbox.x2=obj->bbox.x1+x-vo_font->charspace;
+	    obj->bbox.y2=obj->bbox.y1+h;
+	    break;
+	  case OSD_TIMESTAMP_ALIGNMENT_BOTTOMRIGHT:
+	    obj->bbox.y1=obj->y=dys-h-10;
+	    obj->bbox.x1=obj->x=dxs-20-x-vo_font->charspace;
+	    obj->bbox.x2=obj->bbox.x1+x-vo_font->charspace;
+	    obj->bbox.y2=obj->bbox.y1+h;
+	    break;
+	  case OSD_TIMESTAMP_ALIGNMENT_BOTTOMLEFT:
+	  default:
+	    obj->bbox.y1=obj->y=dys-h-10;
+	    obj->bbox.x1=obj->x=20;
+	    obj->bbox.x2=obj->bbox.x1+x-vo_font->charspace;
+	    obj->bbox.y2=obj->bbox.y1+h;
+	  }
+	obj->flags|=OSDFLAG_BBOX;
+
+	alloc_buf(obj);
+
+	cp=vo_osd_timestamp;
+	x = obj->x;
+        while (*cp){
+          int c=*cp++;
+          if ((font=vo_font->font[c])>=0)
+            draw_alpha_buf(obj,x,obj->y,
+			   vo_font->width[c],
+			   vo_font->pic_a[font]->h,
+			   vo_font->pic_b[font]->bmp+vo_font->start[c],
+			   vo_font->pic_a[font]->bmp+vo_font->start[c],
+			   vo_font->pic_a[font]->w);
+          x+=vo_font->width[c]+vo_font->charspace;
+        }
+}
+#endif
+
 int vo_osd_progbar_type=-1;
 int vo_osd_progbar_value=100;   // 0..256
 
@@ -838,6 +906,15 @@
 	    } else
 		obj->flags&=~OSDFLAG_VISIBLE;
 	    break;
+#ifdef HAVE_OSD_TIMESTAMP
+	case OSDTYPE_TIMESTAMP:
+	    if(vo_font && vo_osd_timestamp && vo_osd_timestamp[0]){
+		vo_update_text_timestamp(obj,dxs,dys); // update bbox
+		obj->flags|=OSDFLAG_VISIBLE|OSDFLAG_CHANGED;
+	    } else
+		obj->flags&=~OSDFLAG_VISIBLE;
+	    break;
+#endif
 	}
 	// check bbox:
 	if(!(obj->flags&OSDFLAG_BBOX)){
@@ -884,6 +961,9 @@
     new_osd_obj(OSDTYPE_SUBTITLE);
     new_osd_obj(OSDTYPE_PROGBAR);
     new_osd_obj(OSDTYPE_SPU);
+#ifdef HAVE_OSD_TIMESTAMP
+    new_osd_obj(OSDTYPE_TIMESTAMP);
+#endif
 #ifdef HAVE_FREETYPE
     force_load_font = 1;
 #endif
@@ -920,6 +1000,9 @@
 	    vo_draw_spudec_sub(obj, draw_alpha); // FIXME
 	    break;
 	case OSDTYPE_OSD:
+#ifdef HAVE_OSD_TIMESTAMP
+	case OSDTYPE_TIMESTAMP:
+#endif
 	case OSDTYPE_SUBTITLE:
 	case OSDTYPE_PROGBAR:
 	    vo_draw_text_from_buffer(obj,draw_alpha);
