public override bool SignalInputData(InputStream inputStream, IPEndPoint address)
{
if (address != _lastAddress)
{
_lastAddress = address;
_validLastAddress = true;
}
var bufferLength = inputStream.AvaliableByteCounts;
var pos = inputStream.Position;
//1. Parse the SR
if (bufferLength < 16) return true;
inputStream.Reader.ReadByte();
var PT = inputStream.Reader.ReadByte();
var len = inputStream.Reader.ReadUInt16();
len = (ushort) ((len + 1) * 4);
if (len > bufferLength)
{
inputStream.IgnoreAll();
return true;
}
switch (PT)
{
case 200:
if (len < 28)
{
Logger.WARN("Invalid RTCP packet length: {0}", len);
inputStream.IgnoreAll();
return true;
}
inputStream.Reader.ReadUInt32();
var ntpSec = inputStream.Reader.ReadUInt32()- 2208988800U;
var ntpFrac = inputStream.Reader.ReadUInt32();
ulong ntpMicroseconds = (ulong)((ntpFrac / (double)(0x100000000L))*1000000.0);
ntpMicroseconds += ((ulong)ntpSec) * 1000000;
var rtpTimestamp = inputStream.Reader.ReadUInt32();
_pConnectivity.ReportSR(ntpMicroseconds, rtpTimestamp, _isAudio);
break;
default:
inputStream.IgnoreAll();
return true;
}
inputStream.Position = pos + 10;
_lsr = inputStream.Reader.ReadUInt32();
inputStream.IgnoreAll();
//2. Send the RR
if (_pConnectivity == null)
{
Logger.FATAL("no connectivity");
return false;
}
if (!_pConnectivity.SendRR(_isAudio))
{
Logger.FATAL("Unable to send RR");
_pConnectivity.EnqueueForDelete();
_pConnectivity = null;
return false;
}
return true;
}
}