 
 			if(type == 9)
 			{
-				if(timestamp < flvLowWaterVideo - filterThresholdMs && !alwaysPass)
+				var videoWasBelowWatermark:Boolean = (timestamp < flvLowWaterVideo - filterThresholdMs);
+				var willSkip:Boolean = false;
+
+				if(flvRecoveringIFrame)
+				{
+					// Skip until we encounter an I-frame past the filter threshold.
+					willSkip = true;
+					if(isKeyFrame && !videoWasBelowWatermark)
+					{
+						// We got past filter and saw an I-frame... stop recovery.
+						flvRecoveringIFrame = false;
+						willSkip = false;
+					}
+				}
+				else
+				{
+					if(videoWasBelowWatermark && !alwaysPass)
+					{
+						flvRecoveringIFrame = true;
+						willSkip = true;
+					}
+				}
+
+				if(willSkip)
 				{
 					trace("SKIPPING TOO LOW FLV VID TS @ " + timestamp);
 					if(SEND_LOGS)

			}
			else if(type == 8)
			{
				if(timestamp < flvLowWaterAudio - filterThresholdMs)
				{
					trace("SKIPPING TOO LOW FLV AUD TS @ " + timestamp);
					if(SEND_LOGS)

				
		public static var flvLowWaterAudio:uint = 0;
		public static var flvLowWaterVideo:uint = 0;
		public static var flvRecoveringIFrame:Boolean = false;
		public const filterThresholdMs:uint = 0;

		private function clearFLVWaterMarkFilter():void
		{
			flvLowWaterAudio = 0;
			flvLowWaterVideo = 0;
			flvRecoveringIFrame = false;
		}

		private function handleFLVMessage(timestamp:uint, message:ByteArray):void
		{
