diff --git a/Makefile b/Makefile
index a3b94a59b6bd1749dd3f2861c45691bcf115cc6a..8335a8716fc935d06f02597b9701e1676568664f 100644
--- a/Makefile
+++ b/Makefile
@@ -67,7 +67,7 @@ SRCS = $(OBJS:.o=.c) $(ASM_OBJS:.o=.s)
 FFLIBDIRS = -L./libavformat -L./libavcodec -L./libavutil
 FFLIBS = -lavformat$(BUILDSUF) -lavcodec$(BUILDSUF) -lavutil$(BUILDSUF)
 
-all: lib $(PROGS_G) $(PROGS) $(PROGTEST) $(VHOOK) $(QTFASTSTART) $(DOC)
+all: version.h lib $(PROGS_G) $(PROGS) $(PROGTEST) $(VHOOK) $(QTFASTSTART) $(DOC)
 
 lib:
 	$(MAKE) -C libavutil   all
@@ -90,6 +90,10 @@ ffplay_g$(EXESUF): ffplay.o cmdutils.o .libs
 	cp -p $< $@
 	$(STRIP) $@
 
+.PHONY: version.h
+version.h:
+	$(SRC_PATH)/version.sh
+
 output_example$(EXESUF): output_example.o .libs
 	$(CC) $(FFLIBDIRS) $(LDFLAGS) -o $@ output_example.o $(FFLIBS) $(EXTRALIBS)
 
@@ -220,7 +224,7 @@ distclean: clean
 	$(MAKE) -C libpostproc distclean
 	$(MAKE) -C tests       distclean
 	$(MAKE) -C vhook       distclean
-	rm -f .depend config.mak config.h *.pc
+	rm -f .depend config.mak config.h version.h *.pc
 
 TAGS:
 	etags *.[ch] libavformat/*.[ch] libavcodec/*.[ch]
diff --git a/ffmpeg.c b/ffmpeg.c
index 6653c78a9a8f5e72f00d94dce5a1a97065ef8a80..3834ff6480ee3e15826ed3c1ef4284025e69c070 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -40,6 +40,7 @@
 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
 #include <time.h>
 
+#include "version.h"
 #include "cmdutils.h"
 
 #undef NDEBUG
diff --git a/ffplay.c b/ffplay.c
index 8cffa8f704e6ad34191a109f15fdab200fdd4dcb..7dc5c6033bda108efa9dbf74aec22d416e64578f 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -19,6 +19,7 @@
 #define HAVE_AV_CONFIG_H
 #include "avformat.h"
 
+#include "version.h"
 #include "cmdutils.h"
 
 #include <SDL.h>
diff --git a/ffserver.c b/ffserver.c
index 4fe7b032d71c0d23f538c0445eb7524991bc00f9..cb44f61586b684a260fe117ae5ddf60b3924cde6 100644
--- a/ffserver.c
+++ b/ffserver.c
@@ -39,6 +39,7 @@
 #include <dlfcn.h>
 #endif
 
+#include "version.h"
 #include "ffserver.h"
 
 /* maximum number of simultaneous HTTP connections */
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index d128cb9c1824f8ac3bd350156ae790ca4afc8b53..52283aa34bcc4a1cd39725ad5d7256f37128fbe4 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -14,9 +14,8 @@ extern "C" {
 #include "avutil.h"
 #include <sys/types.h> /* size_t */
 
-//FIXME the following 2 really dont belong in here
+//FIXME: This really doesn't belong in here..
 #define FFMPEG_VERSION_INT      0x000409
-#define FFMPEG_VERSION          "HEAD"
 
 #define AV_STRINGIFY(s)         AV_TOSTRING(s)
 #define AV_TOSTRING(s) #s
diff --git a/version.sh b/version.sh
new file mode 100755
index 0000000000000000000000000000000000000000..cfed406b26f2bb6296a93b6c81e6e9ea646a34b3
--- /dev/null
+++ b/version.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+svn_revision=`svn info | grep Revision | cut -d' ' -f2 || echo UNKNOWN`
+NEW_REVISION="#define FFMPEG_VERSION \"SVN-r$svn_revision\""
+OLD_REVISION=`cat version.h 2> /dev/null`
+
+# Update version.h only on revision changes to avoid spurious rebuilds
+if test "$NEW_REVISION" != "$OLD_REVISION"; then
+    echo "$NEW_REVISION" > version.h
+fi