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);
            }
        }