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

        }
Esempio n. 3
0
 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;
 }
Esempio n. 5
0
 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));
 }
Esempio n. 6
0
 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);
        }