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