Ejemplo n.º 1
0
        public override bool Seek(double absoluteTimestamp)
        {
#if PARALLEL
            OutStreams.AsParallel().ForAll(x =>
            {
                if (!x.InStream.SignalSeek(ref absoluteTimestamp))
                {
                    Logger.WARN("Unable to signal seek on an outbound stream");
                }
            });
#else
            foreach (
                var baseOutStream in
                OutStreams.Where(
                    baseOutStream => !baseOutStream.SignalSeek(ref absoluteTimestamp)))
            {
                Logger.WARN("Unable to signal seek on an outbound stream");
            }
#endif
            if (!SignalSeek(ref absoluteTimestamp))
            {
                Logger.FATAL("Unable to signal seek");
                return(false);
            }
            return(true);
        }
Ejemplo n.º 2
0
        public override bool Stop()
        {
            if (!SignalStop())
            {
                Logger.FATAL("Unable to signal stop");
                return(false);
            }
#if PARALLEL
            OutStreams.AsParallel().ForAll(x =>
            {
                if (!x.InStream.SignalStop())
                {
                    Logger.WARN("Unable to signal stop on an outbound stream");
                }
            });
#else
            foreach (
                var baseOutStream in
                OutStreams.Where(
                    baseOutStream => !baseOutStream.SignalStop()))
            {
                Logger.WARN("Unable to signal stop on an outbound stream");
            }
#endif
            return(true);
        }
Ejemplo n.º 3
0
        public override bool Play(double absoluteTimestamp, double length)
        {
            if (!SignalPlay(ref absoluteTimestamp, ref length))
            {
                Logger.FATAL("Unable to signal play");
                return(false);
            }

#if PARALLEL
            OutStreams.AsParallel().ForAll(x =>
            {
                if (!x.InStream.SignalPlay(ref absoluteTimestamp, ref length))
                {
                    Logger.WARN("Unable to signal play on an outbound stream");
                }
            });
#else
            foreach (
                var baseOutStream in
                OutStreams.Where(
                    baseOutStream => !baseOutStream.SignalPlay(ref absoluteTimestamp, ref length)))
            {
                Logger.WARN("Unable to signal play on an outbound stream");
            }
#endif
            return(true);
        }
Ejemplo n.º 4
0
        public override bool FeedData(Stream pData, uint dataLength, uint processedLength, uint totalLength, uint absoluteTimestamp, bool isAudio)
        {
            switch (_rtcpPresence)
            {
            case RtcpPresence.Unknown:
                if (_rtcpDetectionInterval == TimeSpan.Zero)
                {
                    WARN("RTCP disabled on stream {0}({1}) with name {2}. A/V drifting may occur over long periods of time", Type.TagToString(), UniqueId, Name);
                    _rtcpPresence = RtcpPresence.Absent;
                    return(true);
                }
                if (_rtcpDetectionStart == DateTime.MinValue)
                {
                    _rtcpDetectionStart = DateTime.Now;
                    return(true);
                }
                if (DateTime.Now - _rtcpDetectionStart > _rtcpDetectionInterval)
                {
                    WARN("Stream {0}({1}) with name {2} doesn't have RTCP. A/V drifting may occur over long periods of time", Type.TagToString(), UniqueId, Name);
                    _rtcpPresence = RtcpPresence.Absent;
                    return(true);
                }

                var audioRTCPPresent = !_hasAudio || _audioNTP != 0;
                var videoRTCPPresent = !_hasVideo || _videoNTP != 0;
                if (audioRTCPPresent && videoRTCPPresent)
                {
                    _rtcpPresence = RtcpPresence.Available;
                }
                return(true);

            case RtcpPresence.Available:
                var rtp = isAudio ? _audioRTP : _videoRTP;
                var ntp = isAudio ? _audioNTP : _videoNTP;
                absoluteTimestamp = (uint)(ntp + absoluteTimestamp - rtp);

                break;

            case RtcpPresence.Absent:
                var firstTimestamp = isAudio ? _audioFirstTimestamp : _videoFirstTimestamp;
                if (firstTimestamp < 0)
                {
                    firstTimestamp = absoluteTimestamp;
                }
                absoluteTimestamp -= (uint)firstTimestamp;
                break;

            default:
                return(false);
            }
            var lastTs = isAudio ? _audioLastTs : _videoLastTs;

            if (-1.0 < lastTs * 100.0 - absoluteTimestamp * 100.0 && lastTs * 100.0 - absoluteTimestamp * 100.0 < 1.0)
            {
                absoluteTimestamp = lastTs;
            }
            if (lastTs > absoluteTimestamp)
            {
                WARN("Back time on {0} ATS:{1} LTS:{2} D:{3}", Name, absoluteTimestamp, lastTs, lastTs - absoluteTimestamp);
                return(true);
            }
            if (isAudio)
            {
                _audioLastTs = absoluteTimestamp;
            }
            else
            {
                _videoLastTs = absoluteTimestamp;
            }
            if (!_avCodecsSent)
            {
                foreach (var temp in OutStreams.Where(x => !x.IsEnqueueForDelete()))
                {
                    SignalOutStreamAttached(temp);
                }

                if (!_avCodecsSent)
                {
                    return(true);
                }
            }
            if (_hasAudio && _hasVideo && ((_audioLastTs == 0) || (_videoLastTs == 0)))
            {
                return(true);
            }

            return(base.FeedData(pData, dataLength, processedLength, totalLength, absoluteTimestamp, isAudio));
        }