コード例 #1
0
 protected override void NewMediaFrame(MediaFrame frame)
 {
     if (_firstTimeTick == 0 && frame.nIsKeyFrame == 1 && frame.nIsAudio == 0)
     {
         _firstTimeTick = frame.nTimetick;
         _startTimeTick = DateTime.Now.Ticks / 10000;
     }
     if (_firstTimeTick == 0)
     {
         return;
     }
     if (_lastTimeTick <= frame.nTimetick)
     {
         _lastTimeTick = frame.nTimetick;
         var span  = DateTime.Now.Ticks / 10000 - _startTimeTick;
         int sleep = (int)((_lastTimeTick - _firstTimeTick) - span);
         //Console.WriteLine((_lastTimeTick - _firstTimeTick) + "   " + span);
         if (sleep > 40)
         {
             sleep = 40;
         }
         if (PlaySync)
         {
             if (sleep > 0)
             {
                 ThreadEx.Sleep(sleep);
             }
         }
     }
     base.NewMediaFrame(frame);
 }
コード例 #2
0
        //private void PlayForward(MediaFrame frame)
        //{
        //    if (frame != null)
        //    {
        //        if (frame.nTimetick < _curPlayMediaTimetick)
        //        {
        //            _isHasBFrame = true;
        //        }
        //        if (_curPlayMediaTimetick < frame.nTimetick)
        //            _curPlayMediaTimetick = frame.nTimetick;
        //    }

        //    if (frame != null)
        //    {
        //        if (!_isHasBFrame)
        //        {
        //            if (Speed == 1)
        //            {
        //                var sleep = (int)(_syncPlayTime);
        //                //if (_queue.Count > (4 + errorsleep))
        //                //{
        //                //    errorsleep +=1;
        //                //    iptvdefaultsleep -= 4;
        //                //}

        //                if (queueCount>6)
        //                {

        //                   // errorsleep = decsleep / 2 + decsleep % 2;
        //                    //if (decsleep != 0)
        //                    //    iptvdefaultsleep -= decsleep / 2 ;
        //                    //else
        //                        iptvdefaultsleep -= 1;// +errorsleep % 2;
        //                    min = iptvdefaultsleep;
        //                    decsleep = 0;
        //                    errorsleep += 1;
        //                }

        //                if (_queue.Count <3)
        //                {
        //                    // decsleep = errorsleep / 2 + errorsleep % 2;
        //                    if (errorsleep != 0)
        //                    {
        //                        iptvdefaultsleep += errorsleep / 2;
        //                    }
        //                    else
        //                        iptvdefaultsleep += 1;// +decsleep % 2; ;
        //                    max = iptvdefaultsleep;

        //                    errorsleep = 0;
        //                    decsleep++;
        //                }

        //                if (iptvdefaultsleep > 100)
        //                {
        //                    iptvdefaultsleep = 100;
        //                }

        //                if (iptvdefaultsleep * queueCount > 1000)
        //                {
        //                    iptvdefaultsleep -= 1;
        //                }

        //                if (iptvdefaultsleep <= 0)
        //                    iptvdefaultsleep = (min + max) / 2 <= 0 ? 40 : (min + max) / 2;
        //                //if (iptvdefaultsleep>40)
        //                //    iptvdefaultsleep = 40;
        //                Thread.Sleep(iptvdefaultsleep);
        //                //Console.Clear();
        //                //Console.WriteLine("tick:" + iptvdefaultsleep + " cachecount:" + queueCount + " lastcount:" + lastcount + " sleep:" + sleep);
        //                lastcount = queueCount;
        //                _lastPlayMediaTimetick = frame.nTimetick;

        //                //}
        //                //else
        //                //{
        //                //    var sleep = (int)((frame.nTimetick - _syncPlayTime));
        //                //    if (sleep > 200)
        //                //        sleep = 40;
        //                //    if (sleep < 0)
        //                //        sleep = 0;
        //                //    Thread.Sleep(sleep);
        //                //    _lastPlayMediaTimetick = frame.nTimetick;
        //                //}
        //            }
        //            else
        //            {
        //                var sysSpan = Environment.TickCount - _lastPlaySystemTime;
        //                var sleep = (int)((frame.nTimetick - _lastPlayMediaTimetick - sysSpan) / Speed);
        //                if (sleep > 200 || sleep < 0)
        //                    sleep = 40;
        //                Thread.Sleep(sleep);
        //                _lastPlayMediaTimetick = frame.nTimetick;
        //            }
        //        }
        //        if (!CheckInit(frame))
        //            return;

        //        _lastPlaySystemTime = Environment.TickCount;

        //        byte[] yuv = _ffimp.VideoDec(frame.Data, _yuvDataBuffer);

        //        //_drawHandle.BeginInvoke(frame.Data, null, null);

        //        Draw(yuv);

        //    }
        //    else
        //    {
        //        ThreadEx.Sleep(10);
        //    }

        //}

        private void PlayBackward(MediaFrame frame)
        {
            if (frame != null)
            {
                if (frame.nIsKeyFrame == 1)
                {
                    if (_stackRewindFrame != null)
                    {
                        _stackRewindFrame.Push(frame);
                        PlayBackward(_stackRewindFrame);
                    }
                    _stackRewindFrame = new Stack <MediaFrame>();
                }
                else
                {
                    if (_stackRewindFrame == null)
                    {
                        _stackRewindFrame = new Stack <MediaFrame>();
                    }
                    _stackRewindFrame.Push(frame);
                }
                _PlayBackwardResetPos = false;
            }
            else
            {
                ThreadEx.Sleep(10);
            }
        }
コード例 #3
0
ファイル: AudioPlayer.cs プロジェクト: zz110/GB28181.Solution
        protected virtual void PlayThread()
        {
            MediaFrame frame = null;

            while (_isworking)
            {
                lock (_queue) {
                    if (_queue.Count > 0 && !_isPaused)
                    {
                        frame = _queue.Dequeue();
                    }
                    else
                    {
                        frame = null;
                    }
                }
                if (frame != null)
                {
                    if (Speed == 1)
                    {
                        var sleep = (int)(frame.NTimetick - _syncPlayTime);

                        if (sleep < -3000)
                        {
                            lock (_queue)
                            {
                                _queue.Clear();
                            }
                        }
                        if (sleep > 0 && !_reseting)
                        {
                            Thread.Sleep(sleep);
                        }
                    }
                    else
                    {
                        var sleep = (int)(frame.NTimetick - _syncPlayTime);
                        if (sleep > 0 && !_reseting)
                        {
                            Thread.Sleep(sleep);
                        }
                    }
                    if (!_reseting)
                    {
                        _Play(frame);
                        lock (_queue) {
                            if (_curPlayTime < frame.NTimetick && !_reseting)
                            {
                                _curPlayTime = frame.NTimetick;
                            }
                        }
                    }
                    _reseting = false;
                }
                else
                {
                    ThreadEx.Sleep(10);
                }
            }
        }
コード例 #4
0
ファイル: ThreadExTests.cs プロジェクト: dadhi/ecsharp
        public void BasicChecks()
        {
            ThreadLocalVariable <int> threadVar = new ThreadLocalVariable <int>(123);
            Thread parent = Thread.CurrentThread;
            bool   eventOccurred = false;
            bool   valueOk = true, eventOk = true;
            bool   stop    = false;
            bool   started = false;

            ThreadEx t = new ThreadEx(delegate(object o)
            {
                started = true;
                try
                {
                    if ((int)o != 123 || threadVar.Value != 123)
                    {
                        valueOk = false;
                    }
                }
                catch
                {
                    valueOk = false;
                }
                while (!stop)
                {
                    GC.KeepAlive("");                     // Waste time
                }
                started = false;
            });

            EventHandler <ThreadStartEventArgs> eh = null;

            ThreadEx.ThreadStarting += (eh = delegate(object o, ThreadStartEventArgs e)
            {
                eventOccurred = true;
                if (e.ChildThread != t || e.ParentThread != parent)
                {
                    eventOk = false;
                }
                ThreadEx.ThreadStarting -= eh;
            });

            Assert.IsFalse(t.IsAlive);
            Assert.AreEqual(System.Threading.ThreadState.Unstarted, t.ThreadState);
            t.Start(123);
            Assert.IsTrue(t.IsAlive);
            Assert.IsTrue(eventOccurred);
            Assert.IsTrue(eventOk);
            while (!started)
            {
                ThreadEx.Sleep(0);
            }
            Assert.AreEqual(System.Threading.ThreadState.Running, t.ThreadState);
            stop = true;
            Assert.IsTrue(t.Join(5000));
            Assert.IsTrue(valueOk);
            Assert.IsFalse(started);
        }
コード例 #5
0
 private void PlayThread()
 {
     _PlayBackwardThread = ThreadEx.ThreadCall(PlayBackwardThread);
     while (_isworking)
     {
         MediaFrame frame = null;
         if (_isForwardPlay)
         {
             lock (_queue) {
                 if (_queue.Count > 0 && !_isPaused)
                 {
                     frame = _queue.Dequeue();
                 }
                 else
                 {
                     frame = null;
                 }
             }
             if (frame != null)
             {
                 PlayForward(frame);
             }
             else
             {
                 ThreadEx.Sleep(10);
             }
         }
         else
         {
             lock (_queue) {
                 if (_queue.Count > 0 && !_isPaused)
                 {
                     frame = _queue.Dequeue();
                 }
                 else
                 {
                     frame = null;
                 }
             }
             if (frame != null)
             {
                 PlayBackward(frame);
             }
             else
             {
                 ThreadEx.Sleep(10);
             }
         }
     }
 }
コード例 #6
0
        private void PlayBackwardThread()
        {
            long lastTick = 0;

            while (_isworking)
            {
                Stack <MediaFrame> stack = null;
                lock (_queue) {
                    if (_queueRewindStack.Count > 0)
                    {
                        stack = _queueRewindStack.Dequeue();
                    }
                }
                if (stack != null)
                {
                    while (stack.Count > 0 && !_PlayBackwardResetPos)
                    {
                        var frame = stack.Pop();
                        //_drawHandle.BeginInvoke(frame.Data, null, null);
                        _drawHandle(frame.Data);
                        if (lastTick == 0)
                        {
                            lastTick = frame.nTimetick;
                        }
                        int sleep = (int)(lastTick - frame.nTimetick);
                        if (sleep < 0 || sleep >= 100)
                        {
                            sleep = 40;
                        }
                        ThreadEx.Sleep(sleep);
                        //Console.WriteLine(sleep + "   " + (lastTick - frame.nTimetick)+"    "+(Environment.TickCount - sysTick));
                        lock (_queue) {
                            if (!_PlayBackwardResetPos)
                            {
                                _curPlayMediaTimetick = lastTick = frame.nTimetick;
                            }
                        }
                        lock (_queue) {
                            _lastPlaySystemTime = Environment.TickCount;
                        }
                    }
                    GC.Collect();
                }
                else
                {
                    ThreadEx.Sleep(10);
                }
            }
        }
コード例 #7
0
            public override int Read(byte[] buffer, int offset, int count)
            {
                while (Length - _lastReadPosition < count)
                {
                    ThreadEx.Sleep();
                }

                int read = 0;

                lock (_sync) {
                    base.Position     = _lastReadPosition;
                    read              = base.Read(buffer, offset, count);
                    _lastReadPosition = Position;
                }
                return(read);
            }
コード例 #8
0
            public override int ReadByte()
            {
                try {
                    while (Length - _lastReadPosition < 1)
                    {
                        ThreadEx.Sleep();
                    }

                    int read = 0;
                    lock (_sync) {
                        base.Position     = _lastReadPosition;
                        read              = base.ReadByte();
                        _lastReadPosition = Position;
                    }
                    return(read);
                } catch (Exception e) {
                    throw;
                }
            }
コード例 #9
0
        private FTPResponse ReadResponse()
        {
            FTPResponse response     = new FTPResponse();
            string      responsetext = "";
            int         bytesrecvd   = 0;

            // make sure any command sent has enough time to respond
#if CF
            ThreadEx.Sleep(750);
#else
            Thread.Sleep(750);
#endif

            for ( ; m_cmdsocket.Available > 0;)
            {
                bytesrecvd    = m_cmdsocket.Receive(m_buffer, m_buffer.Length, 0);
                responsetext += Encoding.ASCII.GetString(m_buffer, 0, bytesrecvd);
            }

            if (responsetext.Length == 0)
            {
                response.ID   = 0;
                response.Text = "";
                return(response);
            }

            string[] message = responsetext.Replace("\r", "").Split('\n');

            // we may have multiple responses,
            // particularly if retriving small amounts of data like directory listings
            // such as the command sent and transfer complete together
            // a response may also have multiple lines
            for (int m = 0; m < message.Length; m++)
            {
                try
                {
                    // is the first line a response?  If so, the first 3 characters
                    // are the response ID number
                    FTPResponse resp = new FTPResponse();
                    try
                    {
                        resp.ID = int.Parse(message[m].Substring(0, 3));
                    }
                    catch (Exception)
                    {
                        resp.ID = 0;
                    }

                    resp.Text = message[m].Substring(4);

                    if (ResponseEvent != null)
                    {
                        foreach (FTPResponseHandler rh in ResponseEvent.GetInvocationList())
                        {
                            rh(resp);
                        }
                    }

                    if (m == 0)
                    {
                        response = resp;
                    }
                }
                catch (Exception)
                {
                    continue;
                }

                return(response);
            }

            // return the first response received
            return(response);
        }
コード例 #10
0
        private void PlayForward(MediaFrame frame)
        {
            if (frame != null)
            {
                if (frame.nTimetick < _curPlayMediaTimetick)
                {
                    _isHasBFrame = true;
                }
                if (_curPlayMediaTimetick < frame.nTimetick)
                {
                    _curPlayMediaTimetick = frame.nTimetick;
                }
            }
            if (frame != null)
            {
                if (!_isHasBFrame)
                {
                    if (Speed == 1)
                    {
                        long a = frame.nTimetick - ccc;

                        if (a < 150)
                        {
                            coutnnn += a - (int)bb;
                            i++;
                            if (i == 20)
                            {
                                b       = (int)coutnnn / 20;
                                i       = 0;
                                coutnnn = 0;
                            }
                        }
                        if (max == 0)
                        {
                            max = b;
                        }
                        if (min == 0)
                        {
                            min = b;
                        }
                        int sleep = (int)b;

                        if (sleep > max)
                        {
                            max = sleep;
                        }
                        if (sleep < min)
                        {
                            min = sleep;
                        }
                        if (_queue.Count < 4)
                        {
                            //int mid = (max + min) / 2;
                            //sleep += 1;
                            //b += 1;
                            if (min != 0 && max != 0 && min != max)
                            {
                                sleep = (min + max) / 2 + (min + max) % 2;
                                b     = sleep;
                                min   = 0;
                                max   = 0;
                            }
                            else
                            {
                                sleep += 1;
                                b     += 1;
                            }
                            //max = mid;
                            //min = mid;
                        }
                        if (_queue.Count > 6)
                        {
                            if (min != 0 && max != 0 && min != max)
                            {
                                sleep = (min + max) / 2;
                                b     = sleep;
                                min   = 0;
                                max   = 0;
                            }
                            else
                            {
                                sleep -= 1;
                                b--;
                            }
                        }
                        if (sleep <= 0)
                        {
                            sleep = 10;
                        }
                        //var sleep = (int)(_syncPlayTime);
                        //if (sleep > 200)
                        //    sleep = 40;
                        //if (sleep < 0)
                        //    sleep = 10;
                        //  Console.WriteLine("tick:" +a+ " cachecount:" + _queue.Count);

                        ccc = frame.nTimetick;

                        // Console.WriteLine("tick:" + sleep + " cachecount:" + _queue.Count);
                        Thread.Sleep(sleep);
                    }
                    else
                    {
                        var sysSpan = Environment.TickCount - _lastPlaySystemTime;
                        var sleep   = (int)((frame.nTimetick - _lastPlayMediaTimetick - sysSpan) / Speed);
                        if (sleep > 200 || sleep < 0)
                        {
                            sleep = 40;
                        }
                        Thread.Sleep(sleep);
                        _lastPlayMediaTimetick = frame.nTimetick;
                    }
                }
                long dd = DateTime.Now.Ticks;
                if (!CheckInit(frame))
                {
                    return;
                }

                byte[] yuv = _ffimp.VideoDec(frame.Data, _yuvDataBuffer);

                //_drawHandle.BeginInvoke(frame.Data, null, null);
                DateTime db = DateTime.Now;
                Draw(yuv);
                bb = (DateTime.Now.Ticks - dd) / 10000;

                Console.WriteLine(DateTime.Now.TimeOfDay + "  Consume: " + (DateTime.Now - db).TotalMilliseconds);
            }
            else
            {
                ThreadEx.Sleep(10);
            }
        }