Exemplo n.º 1
0
        public bool Update(StreamPacket packet)
        {
            UniviewStreamPacket usp = (UniviewStreamPacket)packet;

            _decoder.InputData(usp.DecodeTag, usp.Buffer);
            return(true);
        }
        void run()
        {
            UniviewDecoder decoder = new UniviewDecoder();

            decoder.VideoFrameEvent += univiewVideoFrameEvent;

            int index = 0;
            int wait  = 0;

            while (!_disposeEvent.WaitOne(wait))
            {
                wait = 1;
                if (_records.Length > 0)
                {
                    bool     reposed = false;
                    DateTime startRealTime;
                    DateTime startPlayTime;
                    lock (_playTimeLockObj)
                    {
                        startRealTime = _startRealTime;
                        startPlayTime = _startPlayTime;
                        reposed       = _reposed;
                        _reposed      = false;
                    }

                    if (_playing || reposed)
                    {
                        DateTime curPlayTime = startPlayTime + new TimeSpan((long)Math.Round((DateTime.Now - startRealTime).Ticks * _speed));
                        if (curPlayTime > EndTime)
                        {
                            curPlayTime = EndTime;
                        }

                        Record <UniviewPackage> record = null;
                        if (reposed)
                        {
                            for (index = 0; index < _records.Length; index++)
                            {
                                if (_records[index].Time >= curPlayTime)
                                {
                                    break;
                                }
                            }
                            if (index < _records.Length)
                            {
                                record = _records[index];
                            }
                        }
                        else
                        {
                            int next = index + 1;
                            if (next < _records.Length && _records[next].Time < curPlayTime)
                            {
                                index  = next;
                                record = _records[index];
                            }
                        }

                        if (record != null)
                        {
                            _currentTime = record.Time;
                            decoder.InputData(record.Package.DecodeTag, record.Package.Data);
                            wait = 0;
                        }
                    }
                }
            }
        }