diff --git a/rtmpdump.c b/rtmpdump.c
index 13741a7..b9523bd 100644
--- a/rtmpdump.c
+++ b/rtmpdump.c
@@ -303,8 +303,48 @@ GetLastKeyframe(FILE * file,	// output file [in]
   // find the last seekable frame
   off_t tsize = 0;
   uint32_t prevTagSize = 0;
+  uint32_t headerSize = 0;
+  uint32_t payloadSize = 0;
+  off_t offset = 0;
+  off_t oldoffset = 0;
+  off_t lastGoodTag = 0;
 
   // go through the file and find the last video keyframe
+  fseek(file, 5, SEEK_SET);
+  if (fread(buffer, 1, 4, file) != 4) {
+  	RTMP_Log(RTMP_LOGERROR, "Couldn't read headerSize from file!");
+  	return RD_FAILED;
+  }
+  headerSize = AMF_DecodeInt32(buffer);
+  offset = headerSize;
+  while (offset < size) {
+  	fseeko(file, offset , SEEK_SET);
+  	if (fread(buffer, 1, 8, file) != 8) {
+  		break;
+  	}
+        prevTagSize = AMF_DecodeInt32(buffer);
+	// if prevTagSize dosent match previous payloadSize this packet is fubar
+	if ( ( prevTagSize != 0 ) && ( prevTagSize != ( payloadSize + 11 ) ) ) 
+		break;
+/*
+avoid this
+
+DEBUG: Packet: prevTagSize 5535d : lastGoodTag 997137924 oldoffset 997143463 offset 1003257860 payloadSize 6114382
+DEBUG: Packet: prevTagSize 3067505264d : lastGoodTag 997143463 oldoffset 1003257860 offset 1006408882 payloadSize 3151007
+DEBUG: Packet: prevTagSize 1520529135d : lastGoodTag 1003257860 oldoffset 1006408882 offset 1021507501 payloadSize 15098604
+DEBUG: Packet: prevTagSize 1933000270d : lastGoodTag 1006408882 oldoffset 1021507501 offset 1037784596 payloadSize 16277080
+DEBUG: Packet: prevTagSize 4182630141d : lastGoodTag 1021507501 oldoffset 1037784596 offset 1040989210 payloadSize 3204599
+DEBUG: Packet: prevTagSize 2634447075d : lastGoodTag 1037784596 oldoffset 1040989210 offset 1052125896 payloadSize 11136671
+DEBUG: Readback Packet: size 1045180416 tzize 7395816 offset 1037784596 prevTagSize -112337155
+
+*/
+  	payloadSize = AMF_DecodeInt24(buffer+5);
+  	lastGoodTag = oldoffset;
+  	oldoffset = offset;
+  	offset += payloadSize + 15; // the back pointer (4)  the tag header (11) and the payload
+      // RTMP_Log(RTMP_LOGDEBUG, "Packet: prevTagSize %u : lastGoodTag %d oldoffset %d offset %d payloadSize %d", (uint32_t)prevTagSize, (int)lastGoodTag, (int)oldoffset, (int)offset, (int)payloadSize);
+  }
+  tsize = size - lastGoodTag - 4; // set tsize to point to offset from end of file of the header of last good tag
   do
     {
       int xread;
@@ -324,6 +364,7 @@ GetLastKeyframe(FILE * file,	// output file [in]
 	}
 
       prevTagSize = AMF_DecodeInt32(buffer);
+      // RTMP_Log(RTMP_LOGDEBUG, "Readback Packet: size %d tzize %d offset %d prevTagSize %d", (int)size, (int)tsize, (int)(size - tsize - 4), (int)prevTagSize);
       //RTMP_Log(RTMP_LOGDEBUG, "Last packet: prevTagSize: %d", prevTagSize);
 
       if (prevTagSize == 0)
