public bool FeedVideoData(ref MsgHdr message, double absoluteTimestamp) { if (!FeedData(ref message, absoluteTimestamp, false)) { FATAL("Unable to feed video UDP clients"); return(false); } return(true); }
public OutNetRTPUDPH264Stream(RtspProtocol pProtocol, StreamsManager pStreamsManager, string name, bool forceTcp) : base(pProtocol, pStreamsManager, name) { _forceTcp = forceTcp; _maxRTPPacketSize = _forceTcp ? 1500 : MAX_RTP_PACKET_SIZE; _videoData = new MsgHdr { Buffers = new[] { new byte[14],new byte[0], } }; _videoData.Buffers[0][0] = 0x80; _videoData.Buffers[0].Write(8,VideoSSRC); _audioData = new MsgHdr { Buffers = new[] { new byte[14],new byte[16], null } }; _audioData.Buffers[0][0] = 0x80; _audioData.Buffers[0][1] = 0xe0; _audioData.Buffers[0].Write(8, AudioSSRC); }
public OutNetRTPUDPH264Stream(RtspProtocol pProtocol, StreamsManager pStreamsManager, string name, bool forceTcp) : base(pProtocol, pStreamsManager, name) { _forceTcp = forceTcp; _maxRTPPacketSize = _forceTcp ? 1500 : MAX_RTP_PACKET_SIZE; _videoData = new MsgHdr { Buffers = new[] { new byte[14], new byte[0], } }; _videoData.Buffers[0][0] = 0x80; _videoData.Buffers[0].Write(8, VideoSSRC); _audioData = new MsgHdr { Buffers = new[] { new byte[14], new byte[16], null } }; _audioData.Buffers[0][0] = 0x80; _audioData.Buffers[0][1] = 0xe0; _audioData.Buffers[0].Write(8, AudioSSRC); }
public OutboundConnectivity(bool forceTcp, RtspProtocol pRTSPProtocol) { _forceTcp = forceTcp; _rtspProtocol = pRTSPProtocol; _dataMessage = new MsgHdr(); _rtcpMessage = new MsgHdr { Buffers = new[] { new byte[28] } }; _rtcpMessage.Buffers[0][0] = 0x80; _rtcpMessage.Buffers[0][1] = 0xc8; _rtcpMessage.Buffers[0].Write(2, (ushort)6); _rtcpNTP = new BufferWithOffset(_rtcpMessage.Buffers[0], 8); _rtcpRTP = new BufferWithOffset(_rtcpMessage.Buffers[0], 16); _rtcpSPC = new BufferWithOffset(_rtcpMessage.Buffers[0], 20); _rtcpSOC = new BufferWithOffset(_rtcpMessage.Buffers[0], 24); _startupTime = DateTime.Now; }
public bool SendRaw(MsgHdr message, ref RTPClient client, bool isAudio, bool isData) { OutputBuffer.WriteByte((byte)'$'); if (isAudio) { OutputBuffer.WriteByte(isData ? client.audioDataChannel : client.audioRtcpChannel); } else { OutputBuffer.WriteByte(isData ? client.videoDataChannel : client.videoRtcpChannel); } OutputBuffer.Write((ushort)message.Buffers.Sum(x => x.Length)); foreach (var buffer in message.Buffers) { OutputBuffer.WriteBytes(buffer); } return(EnqueueForOutbound(OutputBuffer)); }
public bool SendRaw(MsgHdr message,ref RTPClient client,bool isAudio,bool isData) { OutputBuffer.WriteByte((byte) '$'); if (isAudio) { OutputBuffer.WriteByte(isData ? client.audioDataChannel : client.audioRtcpChannel); } else { OutputBuffer.WriteByte(isData ? client.videoDataChannel : client.videoRtcpChannel); } OutputBuffer.Write((ushort)message.Buffers.Sum(x=>x.Length)); foreach (var buffer in message.Buffers) { OutputBuffer.WriteBytes(buffer); } return EnqueueForOutbound(OutputBuffer); }
public OutboundConnectivity(bool forceTcp, RtspProtocol pRTSPProtocol) { _forceTcp = forceTcp; _rtspProtocol = pRTSPProtocol; _dataMessage = new MsgHdr(); _rtcpMessage = new MsgHdr {Buffers = new[] {new byte[28]}}; _rtcpMessage.Buffers[0][0] = 0x80; _rtcpMessage.Buffers[0][1] = 0xc8; _rtcpMessage.Buffers[0].Write(2, (ushort) 6); _rtcpNTP = new BufferWithOffset(_rtcpMessage.Buffers[0], 8); _rtcpRTP = new BufferWithOffset(_rtcpMessage.Buffers[0], 16); _rtcpSPC = new BufferWithOffset(_rtcpMessage.Buffers[0], 20); _rtcpSOC = new BufferWithOffset(_rtcpMessage.Buffers[0], 24); _startupTime = DateTime.Now; }
public bool FeedData(ref MsgHdr message, double absoluteTimestamp, bool isAudio) { if (absoluteTimestamp == 0)return true; double rate = isAudio ? OutStream.Capabilities.Samplerate : 90000.0; var ssrc = isAudio ? OutStream.AudioSSRC : OutStream.VideoSSRC; var messageLength = message.Buffers.Sum(t => t.Length); if (!_rtpClient.hasAudio &&!_rtpClient.hasVideo) return true; var packetsCount = isAudio ? _rtpClient.audioPacketsCount : _rtpClient.videoPacketsCount; var bytesCount = isAudio ? _rtpClient.audioBytesCount : _rtpClient.videoBytesCount; var startRTP = isAudio ? _rtpClient.audioStartRTP : _rtpClient.videoStartRTP; if (startRTP == 0xffffffff) { startRTP = message.Buffers[0].ReadUInt(4); if (isAudio) _rtpClient.audioStartRTP = startRTP; else _rtpClient.videoStartRTP = startRTP; if (isAudio) _rtpClient.audioStartTS = absoluteTimestamp; else _rtpClient.videoStartTS = absoluteTimestamp; } if ((packetsCount % 500) == 0) { //FINEST("Send %c RTCP: %u", isAudio ? 'A' : 'V', packetsCount); _rtcpMessage.Buffers[0].Write(4,ssrc); //NTP var integerValue = (uint)(absoluteTimestamp / 1000.0); double fractionValue = (absoluteTimestamp / 1000.0 - ((uint)(absoluteTimestamp / 1000.0))) * 4294967296.0; var ntpVal = (ulong)(_startupTime.SecondsFrom1970() + integerValue + 2208988800UL) << 32; ntpVal |= (uint)fractionValue; _rtcpNTP.Buffer.Write(_rtcpNTP.Offset,ntpVal); //RTP var rtp = (ulong)((integerValue + fractionValue / 4294967296.0) * rate); rtp &= 0xffffffff; _rtcpRTP.Buffer.Write(_rtcpRTP.Offset, rtp); //packet count _rtcpSPC.Buffer.Write(_rtcpSPC.Offset, packetsCount); _rtcpSOC.Buffer.Write(_rtcpSOC.Offset, bytesCount); //octet count // FINEST("\n%s", STR(IOBuffer::DumpBuffer(((uint8_t *) _rtcpMessage.MSGHDR_MSG_IOV[0].IOVEC_IOV_BASE), // _rtcpMessage.MSGHDR_MSG_IOV[0].IOVEC_IOV_LEN))); if (_rtpClient.isUdp) { var rtcpSocket = isAudio ? _audioRTCPSocket : _videoRTCPSocket; var rtcpAddress = isAudio ? _rtpClient.audioRtcpAddress : _rtpClient.videoRtcpAddress; if (rtcpSocket.SendTo(_rtcpMessage.TotalBuffer, SocketFlags.None, rtcpAddress) < 0) { FATAL("Unable to send message"); return false; } } else { if (_rtspProtocol != null) { if (!_rtspProtocol.SendRaw(_rtcpMessage,ref _rtpClient, isAudio, false)) { FATAL("Unable to send raw rtcp audio data"); return false; } } } } if (_rtpClient.isUdp) { var dataFd = isAudio ? _audioDataSocket : _videoDataSocket; var dataAddress = isAudio ? _rtpClient.audioDataAddress : _rtpClient.videoDataAddress; if ( dataFd.SendTo(message.TotalBuffer, SocketFlags.None, dataAddress) < 0) { FATAL("Unable to send message"); return false; } } else { if (_rtspProtocol != null) { if (!_rtspProtocol.SendRaw(message,ref _rtpClient,isAudio, true)) { FATAL("Unable to send raw rtcp audio data"); return false; } } } packetsCount++; if (isAudio) _rtpClient.audioPacketsCount = packetsCount; else _rtpClient.videoPacketsCount = packetsCount; bytesCount += (uint)messageLength; if (isAudio) _rtpClient.audioBytesCount = bytesCount; else _rtpClient.videoBytesCount = bytesCount; return true; }
public bool FeedAudioData(ref MsgHdr message,double absoluteTimestamp) { if (!FeedData(ref message, absoluteTimestamp, true)) { FATAL("Unable to feed audio UDP clients"); return false; } return true; }
public bool FeedData(ref MsgHdr message, double absoluteTimestamp, bool isAudio) { if (absoluteTimestamp == 0) { return(true); } double rate = isAudio ? OutStream.Capabilities.Samplerate : 90000.0; var ssrc = isAudio ? OutStream.AudioSSRC : OutStream.VideoSSRC; var messageLength = message.Buffers.Sum(t => t.Length); if (!_rtpClient.hasAudio && !_rtpClient.hasVideo) { return(true); } var packetsCount = isAudio ? _rtpClient.audioPacketsCount : _rtpClient.videoPacketsCount; var bytesCount = isAudio ? _rtpClient.audioBytesCount : _rtpClient.videoBytesCount; var startRTP = isAudio ? _rtpClient.audioStartRTP : _rtpClient.videoStartRTP; if (startRTP == 0xffffffff) { startRTP = message.Buffers[0].ReadUInt(4); if (isAudio) { _rtpClient.audioStartRTP = startRTP; } else { _rtpClient.videoStartRTP = startRTP; } if (isAudio) { _rtpClient.audioStartTS = absoluteTimestamp; } else { _rtpClient.videoStartTS = absoluteTimestamp; } } if ((packetsCount % 500) == 0) { //FINEST("Send %c RTCP: %u", isAudio ? 'A' : 'V', packetsCount); _rtcpMessage.Buffers[0].Write(4, ssrc); //NTP var integerValue = (uint)(absoluteTimestamp / 1000.0); double fractionValue = (absoluteTimestamp / 1000.0 - ((uint)(absoluteTimestamp / 1000.0))) * 4294967296.0; var ntpVal = (ulong)(_startupTime.SecondsFrom1970() + integerValue + 2208988800UL) << 32; ntpVal |= (uint)fractionValue; _rtcpNTP.Buffer.Write(_rtcpNTP.Offset, ntpVal); //RTP var rtp = (ulong)((integerValue + fractionValue / 4294967296.0) * rate); rtp &= 0xffffffff; _rtcpRTP.Buffer.Write(_rtcpRTP.Offset, rtp); //packet count _rtcpSPC.Buffer.Write(_rtcpSPC.Offset, packetsCount); _rtcpSOC.Buffer.Write(_rtcpSOC.Offset, bytesCount); //octet count // FINEST("\n%s", STR(IOBuffer::DumpBuffer(((uint8_t *) _rtcpMessage.MSGHDR_MSG_IOV[0].IOVEC_IOV_BASE), // _rtcpMessage.MSGHDR_MSG_IOV[0].IOVEC_IOV_LEN))); if (_rtpClient.isUdp) { var rtcpSocket = isAudio ? _audioRTCPSocket : _videoRTCPSocket; var rtcpAddress = isAudio ? _rtpClient.audioRtcpAddress : _rtpClient.videoRtcpAddress; if (rtcpSocket.SendTo(_rtcpMessage.TotalBuffer, SocketFlags.None, rtcpAddress) < 0) { FATAL("Unable to send message"); return(false); } } else { if (_rtspProtocol != null) { if (!_rtspProtocol.SendRaw(_rtcpMessage, ref _rtpClient, isAudio, false)) { FATAL("Unable to send raw rtcp audio data"); return(false); } } } } if (_rtpClient.isUdp) { var dataFd = isAudio ? _audioDataSocket : _videoDataSocket; var dataAddress = isAudio ? _rtpClient.audioDataAddress : _rtpClient.videoDataAddress; if (dataFd.SendTo(message.TotalBuffer, SocketFlags.None, dataAddress) < 0) { FATAL("Unable to send message"); return(false); } } else { if (_rtspProtocol != null) { if (!_rtspProtocol.SendRaw(message, ref _rtpClient, isAudio, true)) { FATAL("Unable to send raw rtcp audio data"); return(false); } } } packetsCount++; if (isAudio) { _rtpClient.audioPacketsCount = packetsCount; } else { _rtpClient.videoPacketsCount = packetsCount; } bytesCount += (uint)messageLength; if (isAudio) { _rtpClient.audioBytesCount = bytesCount; } else { _rtpClient.videoBytesCount = bytesCount; } return(true); }