private void ReceiveThreadEntry() { try { OnFrameReceivedCallback callback = new OnFrameReceivedCallback(OnFrameReceived); byte[] readBuffer = new byte[maxBufferReadSize]; int isJpegStartFound = -1; int actualData = 0; int bufferOffset = 0; int savedOffset = 0; //Парсер http-ответа var fileCount = 1; while (true) { int readen = ReadFromInet(readBuffer, actualData, maxBufferReadSize); if (readen > 0) { File.AppendAllText($@"Files\read.txt", $@"try read {maxBufferReadSize - actualData} from {actualData} of max {maxBufferReadSize} {Environment.NewLine}"); actualData += readen; File.AppendAllText($@"Files\read.txt", $@"read {readen} - actualData - {actualData} bufferOffset - {bufferOffset} {Environment.NewLine}"); if (actualData - savedOffset > maxBufferlogSize) { byte[] readed = new byte[maxBufferlogSize]; Array.Copy(readBuffer, savedOffset, readed, 0, maxBufferlogSize); File.WriteAllBytes($@"Files\Streams\1Stream{fileCount}.txt", readed); ++fileCount; savedOffset += maxBufferlogSize; } if (actualData >= maxBufferReadSize) { actualData -= bufferOffset; File.AppendAllText($@"Files\read.txt", $@"ovf actualData - {actualData} bufferOffset - {bufferOffset} {Environment.NewLine}"); //Application.Current.Dispatcher.BeginInvoke(callback, new object[] { readed, true }); Array.Copy(readBuffer, bufferOffset, readBuffer, 0, actualData); bufferOffset = 0; File.AppendAllText($@"Files\read.txt", $@"ovf new actualData - {actualData} bufferOffset - {bufferOffset} {Environment.NewLine}"); } } if (isJpegStartFound == -1) { for (; bufferOffset + 6 <= actualData; bufferOffset++) { if ( readBuffer[bufferOffset] == '\r' && readBuffer[bufferOffset + 1] == '\n' && readBuffer[bufferOffset + 2] == '\r' /*0xFF*/ && readBuffer[bufferOffset + 3] == '\n' /*0xD8*/) { isJpegStartFound = bufferOffset; break; } else if (readBuffer[bufferOffset] == 0x49 && /*I*/ readBuffer[bufferOffset + 1] == 0x2D && /*-*/ readBuffer[bufferOffset + 2] == 0x66 && /*f*/ readBuffer[bufferOffset + 3] == 0x72 && /*r*/ readBuffer[bufferOffset + 4] == 0x61 && /*a*/ readBuffer[bufferOffset + 5] == 0x6D && /*m*/ readBuffer[bufferOffset + 6] == 0x65) /*e*/ { isIFrame = true; } } } else { for (; bufferOffset + 3 <= actualData; bufferOffset++) { if ( readBuffer[bufferOffset] == 0x2D && /*-*/ readBuffer[bufferOffset + 1] == 0x2D && /*-*/ readBuffer[bufferOffset + 2] == 0x6D && /*m*/ readBuffer[bufferOffset + 3] == 0x79) /*y*/ { int frameSize = bufferOffset - isJpegStartFound; if (frameSize > 0) { byte[] frame = new byte[frameSize]; Array.Copy(readBuffer, isJpegStartFound, frame, 0, frameSize); Application.Current.Dispatcher.BeginInvoke(callback, new object[] { frame, isIFrame ? true : false }); isIFrame = false; } isJpegStartFound = -1; bufferOffset++; break; } else if ( readBuffer[bufferOffset] == '\r' && readBuffer[bufferOffset + 1] == '\n' && readBuffer[bufferOffset + 2] == '\r' /*0xFF*/ && readBuffer[bufferOffset + 3] == '\n' /*0xD8*/) { isJpegStartFound = bufferOffset; } } } } } catch (ThreadAbortException ex) { MessageBox.Show(ex.ToString()); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
private void WorkerThreadEntry() { try { OnFrameReceivedCallback callback = new OnFrameReceivedCallback(OnFrameReceived); HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); Stream streamResponse = webResponse.GetResponseStream(); int maxBufferSize = 32 * 1024 * 1024; byte[] readBuffer = new byte[maxBufferSize]; int isJpegStartFound = -1; int actualData = 0; int bufferOffset = 0; //Парсер http-ответа while (true) { int readen = streamResponse.Read(readBuffer, actualData, maxBufferSize - actualData); if (readen == 0) { return; } actualData += readen; if (actualData == maxBufferSize) { actualData -= bufferOffset; Array.Copy(readBuffer, bufferOffset, readBuffer, 0, actualData); bufferOffset = 0; } if (isJpegStartFound == -1) { for (; bufferOffset + 2 < actualData; bufferOffset++) { if (readBuffer[bufferOffset] == '\r' && readBuffer[bufferOffset + 1] == '\n' && readBuffer[bufferOffset + 2] == 0xFF && readBuffer[bufferOffset + 3] == 0xD8) { isJpegStartFound = bufferOffset; break; } } } else { for (; bufferOffset + 1 < actualData; bufferOffset++) { if (readBuffer[bufferOffset] == 0xFF && readBuffer[bufferOffset + 1] == 0xD9) { int frameSize = bufferOffset - isJpegStartFound + 2; byte[] frame = new byte[frameSize]; Array.Copy(readBuffer, isJpegStartFound, frame, 0, frameSize); Application.Current.Dispatcher.BeginInvoke(callback, new object[] { frame }); isJpegStartFound = -1; bufferOffset++; break; } else if (readBuffer[bufferOffset] == 0xFF && readBuffer[bufferOffset + 1] == 0xD8) { isJpegStartFound = bufferOffset; } } } } } catch (ThreadAbortException) { } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }