private void HandleFlvTags(RTMPPacket packet) { // go through FLV packets and handle metadata packets int pos = 0; uint nTimeStamp = packet.TimeStamp; while (pos + 11 < packet.BodySize) { int dataSize = RTMPHelper.ReadInt24(packet.Body, pos + 1); // size without header (11) and prevTagSize (4) if (pos + 11 + dataSize + 4 > packet.BodySize) { LibRTMPLogger.Log(LibRTMPLogLevel.Warning, "[CDR.LibRTMP.NetConnection.HandleFlvTags] Stream corrupt?!"); break; } if (packet.Body[pos] == 0x12) { // Create "fake packet" convert to a metadatapacket RTMPPacket tmpPacket = (RTMPPacket)packet.Clone(); tmpPacket.PacketType = PacketType.Metadata; byte[] newBody = new byte[dataSize]; Buffer.BlockCopy(packet.Body, pos + 11, newBody, 0, dataSize); tmpPacket.Body = newBody; tmpPacket.BodySize = Convert.ToUInt32(dataSize); HandleMetadata(tmpPacket); } else if (packet.Body[pos] == 8 || packet.Body[pos] == 9) { nTimeStamp = (uint)RTMPHelper.ReadInt24(packet.Body, pos + 4); nTimeStamp |= (uint)(packet.Body[pos + 7] << 24); } pos += (11 + dataSize + 4); } }