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