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