private void resetClasses() { embeder = null; extractor = null; GC.Collect(0, GCCollectionMode.Forced); GC.Collect(1, GCCollectionMode.Forced); GC.Collect(2, GCCollectionMode.Forced); }
public async Task ReadAndExtractVideoStream(string path, IProgress <long> reportExtractedData, long SizeToExtract, bool isRGB16) { getFileStamps(path); ErrorEncountered = false; FileStream readVid = new FileStream(path, FileMode.Open, FileAccess.Read); using (readVid) { int fID = 4; long seekOffset = 8; readVid.Seek(seekOffset, SeekOrigin.Begin); byte[] fourcc = new byte[fID]; readVid.Read(fourcc, 0, 4); seekOffset += 4; int chunkSize = 0; int id = 0; int hops = 0; embedsize2 = 0; if (SizeToExtract % 2 != 0 && flag[0] == 0) { embedsize2 = SizeToExtract + 1; } else { embedsize2 = SizeToExtract; } if (FouCC(fourcc) == 1) { extractor = null; extractor = new LSBExtractorClass(embedsize2, isRGB16); while (seekOffset != readVid.Length) { hops++; if (stopOperationFlag) { break; } readVid.Seek(seekOffset, SeekOrigin.Begin); readVid.Read(fourcc, 0, 4); seekOffset += 4; id = FouCC(fourcc); if (id == 2) { readVid.Seek(seekOffset, SeekOrigin.Begin); readVid.Read(fourcc, 0, 4); seekOffset += 4; chunkSize = getEquivalentDecimal(fourcc); readVid.Seek(seekOffset, SeekOrigin.Begin); readVid.Read(fourcc, 0, 4); id = FouCC(fourcc); if (id == 9) { seekOffset += chunkSize; } else if (id == 3) { seekOffset += 4; readVid.Seek(seekOffset, SeekOrigin.Begin); readVid.Read(fourcc, 0, 4); seekOffset += 4; id = FouCC(fourcc); if (id == 4) { readVid.Seek(seekOffset, SeekOrigin.Begin); readVid.Read(fourcc, 0, 4); seekOffset += 4 + getEquivalentDecimal(fourcc); } else if (id == 5) { if (extractor.getExtracted() < embedsize2) { readVid.Seek(seekOffset, SeekOrigin.Begin); readVid.Read(fourcc, 0, 4); seekOffset += 4; chunkSize = getEquivalentDecimal(fourcc); byte[] container = new byte[chunkSize]; readVid.Read(container, 0, chunkSize); processChunkExtract(container); reportExtractedData.Report(getExtracted()); seekOffset += chunkSize; } else { break; } } } } else if (id == 4 || id == 7 || id == 6) { readVid.Seek(seekOffset, SeekOrigin.Begin); readVid.Read(fourcc, 0, 4); seekOffset += 4 + getEquivalentDecimal(fourcc); } else if (id == 5) { if (extractor.getExtracted() < embedsize2) { readVid.Seek(seekOffset, SeekOrigin.Begin); readVid.Read(fourcc, 0, 4); seekOffset += 4; chunkSize = getEquivalentDecimal(fourcc); byte[] container = new byte[chunkSize]; readVid.Read(container, 0, chunkSize); processChunkExtract(container); reportExtractedData.Report(getExtracted()); seekOffset += chunkSize; } else { break; } } else if (id == 8) { seekOffset += 8; } else if (id == 10) { readVid.Seek(seekOffset, SeekOrigin.Begin); readVid.Read(fourcc, 0, 4); chunkSize = getEquivalentDecimal(fourcc); seekOffset += 4 + chunkSize; } else { break; } if (hops % 2 == 0) { await Task.Delay(100); } } } else { ErrorEncountered = true; MessageBox.Show("Unable to read the video file. File maybe corrupted", "Cuttlefish", MessageBoxButtons.OK, MessageBoxIcon.Error); } } setFileStamps(path); readVid.Dispose(); }