public void PlayFile()
        {
            MLVReader reader = null;
            Graphics picGraph = null;
            int lastFrameNumber = 1;

            string suffix = FileName.ToLower().Substring(FileName.Length - 4, 2);

            try
            {
                if (suffix == ".m")
                {
                    reader = new MLVReader(FileName, Handler.BlockHandler);
                }
                else
                {
                    reader = new RAWReader(FileName, Handler.BlockHandler);
                }
            }
            catch (ArgumentException)
            {
                MessageBox.Show("Failed to load file");
                PlayThread = null;
                return;
            }

            Invoke(new Action(() =>
            {
                trackBarPosition.Minimum = 1;
                trackBarPosition.Maximum = 1;
                trackBarPosition.Value = 1;
            }));
            try
            {
                while (true)
                {
                    while (reader.ReadBlock())
                    {
                        if (Handler.FileHeader.videoClass != 0x01)
                        {
                            MessageBox.Show("This video has an unsupported format (" + Handler.FileHeader.videoClass + ")");
                            reader.Close();
                            return;
                        }

                        ForceReread = false;

                        /* create info string */
                        string metaData = CreateMetaData();

                        if (Handler.FrameUpdated)
                        {
                            Invoke(new Action(() =>
                            {
                                try
                                {
                                    txtInfo.Text = metaData.ToString();
                                    trackBarPosition.Maximum = (int)reader.HighestVideoFrameNumber + 1;

                                    FramePositionWarning = "";

                                    if (trackBarPosition.Value == lastFrameNumber)
                                    {
                                        trackBarPosition.Value = (int)Math.Min(trackBarPosition.Maximum, Handler.VidfHeader.frameNumber + 1);
                                    }
                                    else
                                    {
                                        int block = reader.GetVideoFrameBlockNumber((uint)trackBarPosition.Value - 1);

                                        if (block >= 0)
                                        {
                                            reader.CurrentBlockNumber = (int)block;
                                        }
                                        else
                                        {
                                            FramePositionWarning = "  |  This particular frame is not part of the footage. Maybe some chunks missing?";
                                        }
                                    }

                                    lastFrameNumber = (int)Handler.VidfHeader.frameNumber + 1;

                                    Bitmap frame = Handler.CurrentFrame;

                                    string advText = "File: '" + reader.FileNames[reader.FileNum] + "' Offset: 0x" + reader.FilePos.ToString("X8") + " FrameSpace: 0x" + (Handler.VidfHeader.frameSpace-Handler.RawFixOffset).ToString("X4");

                                    lblPosition.Text = "Current position: " + (Handler.VidfHeader.frameNumber + 1) + "/" + (reader.TotalVideoFrameCount) + FramePositionWarning;
                                    lblPosition.Text += "    |    " + advText;

                                    /* update picturebox - this is very slow and inefficient */
                                    if (frame != null)
                                    {
                                        if (pictureBox.Image == null || pictureBox.Image.Size != frame.Size)
                                        {
                                            if (picGraph != null)
                                            {
                                                picGraph.Dispose();
                                            }
                                            Bitmap bmp = new Bitmap(frame);
                                            picGraph = Graphics.FromImage(bmp);
                                            pictureBox.Image = bmp;
                                        }
                                        picGraph.DrawImage(frame, 0, 0, frame.Size.Width, Handler.CurrentFrame.Size.Height);
                                        pictureBox.Refresh();
                                    }
                                }
                                catch (Exception e)
                                {
                                    MessageBox.Show("Exception: " + e);
                                }
                            }));
                        }

                        if (Paused && reader.LastType == "VIDF")
                        {
                            while (Paused)
                            {
                                bool reread = false;

                                Thread.Sleep(100);
                                Invoke(new Action(() =>
                                {
                                    try
                                    {
                                        if (trackBarPosition.Value != lastFrameNumber || ForceReread)
                                        {
                                            int block = reader.GetVideoFrameBlockNumber((uint)trackBarPosition.Value - 1);

                                            if (block >= 0)
                                            {
                                                reader.CurrentBlockNumber = (int)block;
                                            }
                                            reread = true;
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        MessageBox.Show("Exception: " + e);
                                    }
                                }));

                                if (reread)
                                {
                                    break;
                                }
                            }
                        }
                        else
                        {
                            if (reader.CurrentBlockNumber < reader.MaxBlockNumber - 1)
                            {
                                reader.CurrentBlockNumber++;
                            }
                            else
                            {
                                reader.CurrentBlockNumber = 0;
                                Invoke(new Action(() =>
                                {
                                    trackBarPosition.Value = (int)Math.Min(trackBarPosition.Maximum, Handler.VidfHeader.frameNumber + 1);
                                }));
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                reader.Close();
                throw ex;
            }
        }
        public void PlayFile()
        {
            MLVReader reader          = null;
            Graphics  picGraph        = null;
            int       lastFrameNumber = 1;

            string suffix = FileName.ToLower().Substring(FileName.Length - 4, 2);

            try
            {
                if (suffix == ".m")
                {
                    reader = new MLVReader(FileName, Handler.BlockHandler);
                }
                else
                {
                    reader = new RAWReader(FileName, Handler.BlockHandler);
                }
            }
            catch (ArgumentException)
            {
                MessageBox.Show("Failed to load file");
                PlayThread = null;
                return;
            }

            Invoke(new Action(() =>
            {
                trackBarPosition.Minimum = 1;
                trackBarPosition.Maximum = 1;
                trackBarPosition.Value   = 1;
            }));
            try
            {
                while (true)
                {
                    while (reader.ReadBlock())
                    {
                        if (Handler.FileHeader.videoClass != 0x01)
                        {
                            MessageBox.Show("This video has an unsupported format (" + Handler.FileHeader.videoClass + ")");
                            reader.Close();
                            return;
                        }

                        ForceReread = false;

                        /* create info string */
                        string metaData = CreateMetaData();

                        if (Handler.FrameUpdated)
                        {
                            Invoke(new Action(() =>
                            {
                                try
                                {
                                    txtInfo.Text             = metaData.ToString();
                                    trackBarPosition.Maximum = (int)reader.HighestVideoFrameNumber + 1;

                                    FramePositionWarning = "";

                                    if (trackBarPosition.Value == lastFrameNumber)
                                    {
                                        trackBarPosition.Value = (int)Math.Min(trackBarPosition.Maximum, Handler.VidfHeader.frameNumber + 1);
                                    }
                                    else
                                    {
                                        int block = reader.GetVideoFrameBlockNumber((uint)trackBarPosition.Value - 1);

                                        if (block >= 0)
                                        {
                                            reader.CurrentBlockNumber = (int)block;
                                        }
                                        else
                                        {
                                            FramePositionWarning = "  |  This particular frame is not part of the footage. Maybe some chunks missing?";
                                        }
                                    }

                                    lastFrameNumber = (int)Handler.VidfHeader.frameNumber + 1;

                                    Bitmap frame = Handler.CurrentFrame;

                                    string advText = "File: '" + reader.FileNames[reader.FileNum] + "' Offset: 0x" + reader.FilePos.ToString("X8") + " FrameSpace: 0x" + (Handler.VidfHeader.frameSpace - Handler.RawFixOffset).ToString("X4");

                                    lblPosition.Text  = "Current position: " + (Handler.VidfHeader.frameNumber + 1) + "/" + (reader.TotalVideoFrameCount) + FramePositionWarning;
                                    lblPosition.Text += "    |    " + advText;

                                    /* update picturebox - this is very slow and inefficient */
                                    if (frame != null)
                                    {
                                        if (pictureBox.Image == null || pictureBox.Image.Size != frame.Size)
                                        {
                                            if (picGraph != null)
                                            {
                                                picGraph.Dispose();
                                            }
                                            Bitmap bmp       = new Bitmap(frame);
                                            picGraph         = Graphics.FromImage(bmp);
                                            pictureBox.Image = bmp;
                                        }
                                        picGraph.DrawImage(frame, 0, 0, frame.Size.Width, Handler.CurrentFrame.Size.Height);
                                        pictureBox.Refresh();
                                    }
                                }
                                catch (Exception e)
                                {
                                    MessageBox.Show("Exception: " + e);
                                }
                            }));
                        }

                        if (Paused && reader.LastType == "VIDF")
                        {
                            while (Paused)
                            {
                                bool reread = false;

                                Thread.Sleep(100);
                                Invoke(new Action(() =>
                                {
                                    try
                                    {
                                        if (trackBarPosition.Value != lastFrameNumber || ForceReread)
                                        {
                                            int block = reader.GetVideoFrameBlockNumber((uint)trackBarPosition.Value - 1);

                                            if (block >= 0)
                                            {
                                                reader.CurrentBlockNumber = (int)block;
                                            }
                                            reread = true;
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        MessageBox.Show("Exception: " + e);
                                    }
                                }));

                                if (reread)
                                {
                                    break;
                                }
                            }
                        }
                        else
                        {
                            if (reader.CurrentBlockNumber < reader.MaxBlockNumber - 1)
                            {
                                reader.CurrentBlockNumber++;
                            }
                            else
                            {
                                reader.CurrentBlockNumber = 0;
                                Invoke(new Action(() =>
                                {
                                    trackBarPosition.Value = (int)Math.Min(trackBarPosition.Maximum, Handler.VidfHeader.frameNumber + 1);
                                }));
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                reader.Close();
                throw ex;
            }
        }
        private void DisplayFunc()
        {
            Graphics picGraph = null;

            Handler.UseCorrectionMatrices = false;
            Handler.SelectDebayer(2);

            string suffix = FileInfo.Extension.ToLower().Substring(0, 2);

            try
            {
                if (suffix == ".m")
                {
                    Reader = new MLVReader(FileInfo.FullName, Handler.BlockHandler);
                }
                else
                {
                    Reader = new RAWReader(FileInfo.FullName, Handler.BlockHandler);
                }
            }
            catch (ArgumentException)
            {
                SetText("Load failed");
                DisplayThread = null;
                return;
            }

            try
            {
                while (true)
                {
                    while (Reader.ReadBlock())
                    {
                        if (Handler.FileHeader.videoClass != 0x01)
                        {
                            SetText("Not supported");
                            Reader.Close();
                            DisplayThread = null;
                            return;
                        }

                        UpdateMetadata();

                        if (Handler.FrameUpdated)
                        {
                            try
                            {
                                Invoke(new Action(() =>
                                {
                                    try
                                    {
                                        Bitmap frame = Handler.CurrentFrame;

                                        /* update picturebox - this is very slow and inefficient */
                                        if (frame != null)
                                        {
                                            if (pictureBox.Image == null || pictureBox.Image.Size != frame.Size)
                                            {
                                                if (picGraph != null)
                                                {
                                                    picGraph.Dispose();
                                                }
                                                Bitmap bmp = new Bitmap(frame);
                                                picGraph = Graphics.FromImage(bmp);
                                                pictureBox.Image = bmp;
                                            }
                                            picGraph.DrawImage(frame, 0, 0, frame.Size.Width, Handler.CurrentFrame.Size.Height);
                                            pictureBox.Refresh();
                                        }

                                        textLabel.Text = FileInfo.Name + Environment.NewLine + "(Frame " + (Handler.VidfHeader.frameNumber + 1) + "/" + (Reader.HighestVideoFrameNumber + 1) + ")";

                                        if (Reader.FrameErrors > 0)
                                        {
                                            textLabel.BackColor = Color.Red;
                                            textLabel.Text += " (Errors)";

                                            if (Reader.FrameMissingErrors > 0)
                                            {
                                                SetMetadata("Error: Missing frames", Reader.FrameMissingErrors + " frame IDs are missing in the MLV. If this is a multi-chunk video, make sure you have all chunks in the same place.");
                                            }
                                            if(Reader.FrameRedundantErrors > 0)
                                            {
                                                SetMetadata("Error: Redundant frames", Reader.FrameRedundantErrors + " frames with same ID appeared more than once in the MLV. Report please.");
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        SetText(e);
                                    }
                                }));
                            }
                            catch (Exception ex)
                            {
                            }

                            /* videos that are not selected, run very slowly */
                            if (!Selected)
                            {
                                Thread.Sleep(1000);
                            }

                            if (SingleStep)
                            {
                                SingleStep = false;
                                Paused = true;
                            }

                            /* dont break when there was no preview frame processed yet */
                            while (Paused && pictureBox.Image != null)
                            {
                                Thread.Sleep(50);
                            }
                        }

                        if (Reader.CurrentBlockNumber < Reader.MaxBlockNumber - 1)
                        {
                            Reader.CurrentBlockNumber++;
                        }
                        else
                        {
                            if (pictureBox.Image == null)
                            {
                                SetText("Contains no video");
                                DisplayThread = null;
                                return;
                            }
                            Reader.CurrentBlockNumber = 0;
                        }

                        if (NextBlockNumber >= 0)
                        {
                            Reader.CurrentBlockNumber = NextBlockNumber;
                            NextBlockNumber = -1;
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Reader.Close();
                throw ex;
            }
            catch (IOException ex)
            {
                SetText(ex);
                return;
            }
            catch (Exception ex)
            {
                SetText(ex);
                return;
            }
        }