private void Dispose(bool disposing)
        {
            ReleaseUnmanagedResources();

            if (disposing)
            {
                if (mfSettingsDialog != null)
                {
                    mfSettingsDialog.Dispose();
                    mfSettingsDialog = null;
                }

                if (ffmpegDLLSettingsDialog != null)
                {
                    ffmpegDLLSettingsDialog.Dispose();
                    ffmpegDLLSettingsDialog = null;
                }

                if (webmSettingsDialog != null)
                {
                    webmSettingsDialog.Dispose();
                    webmSettingsDialog = null;
                }

                if (pcmSettingsDialog != null)
                {
                    pcmSettingsDialog.Dispose();
                    pcmSettingsDialog = null;
                }

                if (mp3SettingsDialog != null)
                {
                    mp3SettingsDialog.Dispose();
                    mp3SettingsDialog = null;
                }

                if (dvSettingsDialog != null)
                {
                    dvSettingsDialog.Dispose();
                    dvSettingsDialog = null;
                }

                if (wmaSettingsDialog != null)
                {
                    wmaSettingsDialog.Dispose();
                    wmaSettingsDialog = null;
                }

                if (wmvSettingsDialog != null)
                {
                    wmvSettingsDialog.Dispose();
                    wmvSettingsDialog = null;
                }

                if (mkvSettingsDialog != null)
                {
                    mkvSettingsDialog.Dispose();
                    mkvSettingsDialog = null;
                }

                if (aviSettingsDialog != null)
                {
                    aviSettingsDialog.Dispose();
                    aviSettingsDialog = null;
                }

                if (mp4V10SettingsDialog != null)
                {
                    mp4V10SettingsDialog.Dispose();
                    mp4V10SettingsDialog = null;
                }

                if (gifSettingsDialog != null)
                {
                    gifSettingsDialog.Dispose();
                    gifSettingsDialog = null;
                }

                if (m4aSettingsDialog != null)
                {
                    m4aSettingsDialog.Dispose();
                    m4aSettingsDialog = null;
                }

                if (speexSettingsDialog != null)
                {
                    speexSettingsDialog.Dispose();
                    speexSettingsDialog = null;
                }

                if (oggVorbisSettingsDialog != null)
                {
                    oggVorbisSettingsDialog.Dispose();
                    oggVorbisSettingsDialog = null;
                }

                if (customFormatSettingsDialog != null)
                {
                    customFormatSettingsDialog.Dispose();
                    customFormatSettingsDialog = null;
                }

                if (flacSettingsDialog != null)
                {
                    flacSettingsDialog.Dispose();
                    flacSettingsDialog = null;
                }

                if (ffmpegEXESettingsDialog != null)
                {
                    ffmpegEXESettingsDialog.Dispose();
                    ffmpegEXESettingsDialog = null;
                }
            }
        }
        public void ShowDialog(VFVideoCaptureOutputFormat format, IWin32Window parent, VideoCaptureCore core)
        {
            switch (format)
            {
            case VFVideoCaptureOutputFormat.AVI:
            {
                if (aviSettingsDialog == null)
                {
                    aviSettingsDialog = new AVISettingsDialog(core.Video_Codecs().ToArray(), core.Audio_Codecs().ToArray());
                }

                aviSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.WMV:
            {
                if (wmvSettingsDialog == null)
                {
                    wmvSettingsDialog = new WMVSettingsDialog(core);
                }

                wmvSettingsDialog.WMA = false;
                wmvSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.DV:
            {
                if (dvSettingsDialog == null)
                {
                    dvSettingsDialog = new DVSettingsDialog();
                }

                dvSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.MKVv1:
            {
                if (mkvSettingsDialog == null)
                {
                    mkvSettingsDialog = new AVISettingsDialog(core.Video_Codecs().ToArray(), core.Audio_Codecs().ToArray());
                }

                mkvSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.PCM_ACM:
            {
                if (pcmSettingsDialog == null)
                {
                    pcmSettingsDialog = new PCMSettingsDialog(core.Audio_Codecs().ToArray());
                }

                pcmSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.WMA:
            {
                if (wmaSettingsDialog == null)
                {
                    wmaSettingsDialog = new WMVSettingsDialog(core);
                }

                wmaSettingsDialog.WMA = true;
                wmaSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.MP3:
            {
                if (mp3SettingsDialog == null)
                {
                    mp3SettingsDialog = new MP3SettingsDialog();
                }

                mp3SettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.Custom:
            {
                if (customFormatSettingsDialog == null)
                {
                    customFormatSettingsDialog = new CustomFormatSettingsDialog(core.Video_Codecs().ToArray(), core.Audio_Codecs().ToArray(), core.DirectShow_Filters().ToArray());
                }

                customFormatSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.DirectCaptureDV:
            case VFVideoCaptureOutputFormat.DirectCaptureMPEG:
            case VFVideoCaptureOutputFormat.DirectCaptureAVI:
            case VFVideoCaptureOutputFormat.DirectCaptureMKV:
            {
                MessageBox.Show("No settings available for selected output format.");

                break;
            }

            case VFVideoCaptureOutputFormat.FFMPEG_DLL:
            {
                if (ffmpegDLLSettingsDialog == null)
                {
                    ffmpegDLLSettingsDialog = new FFMPEGDLLSettingsDialog();
                }

                ffmpegDLLSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.WebM:
            {
                if (webmSettingsDialog == null)
                {
                    webmSettingsDialog = new WebMSettingsDialog();
                }

                webmSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.DirectCaptureMP4_GDCL:
            case VFVideoCaptureOutputFormat.DirectCaptureMP4_Monogram:
            {
                MessageBox.Show("No settings available for selected output format.");

                break;
            }

            case VFVideoCaptureOutputFormat.DirectCaptureCustom:
            {
                if (customFormatSettingsDialog == null)
                {
                    customFormatSettingsDialog = new CustomFormatSettingsDialog(core.Video_Codecs().ToArray(), core.Audio_Codecs().ToArray(), core.DirectShow_Filters().ToArray());
                }

                customFormatSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.MP4_CUDA:
            {
                if (mp4V10SettingsDialog == null)
                {
                    mp4V10SettingsDialog = new MP4v10SettingsDialog();
                }

                mp4V10SettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.MP4v8v10:
            {
                if (mp4V10SettingsDialog == null)
                {
                    mp4V10SettingsDialog = new MP4v10SettingsDialog();
                }

                mp4V10SettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.MP4v11:
            {
                if (mfSettingsDialog == null)
                {
                    mfSettingsDialog = new MFSettingsDialog(MFSettingsDialogMode.MP4v11);
                }

                mfSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.Encrypted:
            {
                if (mp4V10SettingsDialog == null)
                {
                    mp4V10SettingsDialog = new MP4v10SettingsDialog();
                }

                mp4V10SettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.FLAC:
            {
                if (flacSettingsDialog == null)
                {
                    flacSettingsDialog = new FLACSettingsDialog();
                }

                flacSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.OggVorbis:
            {
                if (oggVorbisSettingsDialog == null)
                {
                    oggVorbisSettingsDialog = new OggVorbisSettingsDialog();
                }

                oggVorbisSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.Speex:
            {
                if (speexSettingsDialog == null)
                {
                    speexSettingsDialog = new SpeexSettingsDialog();
                }

                speexSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.FFMPEG_EXE:
            {
                if (ffmpegEXESettingsDialog == null)
                {
                    ffmpegEXESettingsDialog = new FFMPEGEXESettingsDialog();
                }

                ffmpegEXESettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.M4A:
            {
                if (m4aSettingsDialog == null)
                {
                    m4aSettingsDialog = new M4ASettingsDialog();
                }

                m4aSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.AnimatedGIF:
            {
                if (gifSettingsDialog == null)
                {
                    gifSettingsDialog = new GIFSettingsDialog();
                }

                gifSettingsDialog.ShowDialog(parent);

                break;
            }

            case VFVideoCaptureOutputFormat.VLC_EXE:
            {
                MessageBox.Show("No settings available for selected output format.");

                break;
            }

            default:
                throw new ArgumentOutOfRangeException(nameof(format), format, null);
            }
        }