         dispatchEvent(new ValueEvent(MediaPlayerCodes.SIZE, _size.clone()));
     }
 
-    protected function handlePositionCheck (event :TimerEvent) :void
-    {
-        dispatchEvent(new ValueEvent(MediaPlayerCodes.POSITION, getPosition()));
+    protected function handlePositionCheck (event :TimerEvent = null) :void
+    {
+        const pos :Number = getPosition();
+        if (!_gotDurationFromMetadata && (isNaN(_duration) || (pos > _duration))) {
+            _duration = pos;
+            dispatchEvent(new ValueEvent(MediaPlayerCodes.DURATION, _duration));
+        }
+        dispatchEvent(new ValueEvent(MediaPlayerCodes.POSITION, pos));
     }
 
     protected function handleNetStatus (event :NetStatusEvent) :void

    protected var _size :Point;

    protected var _duration :Number = NaN;

    protected var _volume :Number = 1;


    {
        if ("duration" in info) {
            _duration = Number(info.duration);
            _gotDurationFromMetadata = true;
            if (!isNaN(_duration)) {
                dispatchEvent(new ValueEvent(MediaPlayerCodes.DURATION, _duration));
            }
