public void BuildPacket(byte[] buffer)
        {
            Debug.Assert(_outputBuffer.CurPacketSize() == 0);

            // Set up the RTP header:
            uint rtpHdr = 0x80000000;             // RTP version 2; marker ('M') bit not set (by default; it can be set later)

            rtpHdr |= (uint)(_rtPayloadType << 16);
            rtpHdr |= _sequenceNumber;             // sequence number
            _outputBuffer.WriteWord(rtpHdr);

            // Note where the RTP timestamp will go.
            // (We can't fill this in until we start packing payload frames.)
            _timestampPosition = (int)_outputBuffer.CurPacketSize();
            _outputBuffer.SkipBytes(4);             // leave a hole for the timestamp

            _outputBuffer.WriteWord(SSRC());

            // Allow for a special, payload-format-specific header following the
            // RTP header:
            _specialHeaderPosition = (int)_outputBuffer.CurPacketSize();
            _specialHeaderSize     = specialHeaderSize();
            _outputBuffer.SkipBytes(_specialHeaderSize);

            // First, skip over the space we'll use for any frame-specific header:
            _curFrameSpecificHeaderPosition = (int)_outputBuffer.CurPacketSize();
            _curFrameSpecificHeaderSize     = frameSpecificHeaderSize();
            _outputBuffer.SkipBytes(_curFrameSpecificHeaderSize);
            _totalFrameSpecificHeaderSizes += _curFrameSpecificHeaderSize;

            // Then add the payload
            _outputBuffer.AddBuffer(buffer);
        }