private void SaveDest(string path)
        {
            bool wasStopped;

            _destPath = path;

            // Aspect Ratio
            try {
                _mp4Mod.PARInfo = GetMPEG4PARFromForm();
            }
            catch {
                MessageBox.Show(this, "The aspect ratio you entered is invalid.", "Error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            // User Data
            _mp4Mod.UserDataList = UDListBoxItems;

            // Packed Bitstream
            _mp4Mod.NewIsPacked = _mp4Mod.IsPacked ^ chkChangePacking.Checked;

            // Interlacing
            _mp4Mod.TopFieldFirst = rbTFF.Checked;

            // Save video
            _waitForm = new frmWait("Saving", "Saving video, please wait...",
                                    new Thread(SaveDestThread));
            _waitForm.ShowDialog(this);
            _waitForm.Dispose();
            _waitForm  = null;
            wasStopped = _aviMod.WasStopped;

            SetupForm(false);

            if (_workEx != null)
            {
                MessageBox.Show(this, _workEx.Message, "Error", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                return;
            }

            if (!wasStopped)
            {
                MessageBox.Show(this, "Video has been saved successfully.", "Done",
                                MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
示例#2
0
        // For work that should block the UI but not the UI thread. The work happens in a
        // new thread and the UI is blocked with a modal dialog.
        public static void RunWork(Form owner, Action <ProgressReporter> action)
        {
            object workSync = new object();

            using var waitForm = new frmWait(workSync);
            ExceptionDispatchInfo exception = null;
            bool   triggered = false;
            Thread thread    = new Thread(() => {
                try {
                    action(waitForm.OnProgress);
                }
                catch (Exception ex) {
                    exception = ExceptionDispatchInfo.Capture(ex);
                }
                lock (workSync) {
                    if (triggered)
                    {
                        waitForm.OnWorkComplete();
                    }
                    triggered = true;
                }
            });

            thread.Start();
            if (thread.Join(2))
            {
                return;
            }
            Monitor.Enter(workSync);
            if (triggered)
            {
                Monitor.Exit(workSync);
            }
            else
            {
                triggered = true;
                waitForm.ShowDialog(owner);
            }
            thread.Join();
            exception?.Throw();
        }
        private void LoadSource(string path)
        {
            SetupForm(false);
            _sourcePath        = path;
            txtSourcePath.Text = path;

            // Load video
            _waitForm = new frmWait("Loading", "Loading video, please wait...",
                                    new Thread(LoadSourceThread));
            _waitForm.ShowDialog(this);
            _waitForm.Dispose();
            _waitForm = null;

            if (_workEx != null)
            {
                SetupForm(false);
                MessageBox.Show(this, _workEx.Message, "Error", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                return;
            }
            else if (_aviMod.WasStopped)
            {
                SetupForm(false);
                return;
            }

            SetupForm(true);

            _updatingUI = true;

            // Aspect Ratio
            switch (_mp4Mod.PARInfo.Type)
            {
            case PARType.VGA_1_1:
                rbPAR_VGA_1_1.Checked = true;
                break;

            case PARType.PAL_4_3:
                rbPAR_PAL_4_3.Checked = true;
                break;

            case PARType.NTSC_4_3:
                rbPAR_NTSC_4_3.Checked = true;
                break;

            case PARType.PAL_16_9:
                rbPAR_PAL_16_9.Checked = true;
                break;

            case PARType.NTSC_16_9:
                rbPAR_NTSC_16_9.Checked = true;
                break;

            case PARType.Custom: {
                double par = (double)_mp4Mod.PARInfo.Width / (double)_mp4Mod.PARInfo.Height;
                double rar = (double)_mp4Mod.FrameWidth / (double)_mp4Mod.FrameHeight;
                double dar = par * rar;

                rbPAR_Custom.Checked = true;
                txtPAR_Width.Text    = _mp4Mod.PARInfo.Width.ToString();
                txtPAR_Height.Text   = _mp4Mod.PARInfo.Height.ToString();

                txtDAR_Width.Text  = dar.ToString("0.###");
                txtDAR_Height.Text = "1";

                break;
            }
            }

            // Packed Bitstream
            lblIsPacked.Text         = _mp4Mod.IsPacked ? "Yes" : "No";
            chkChangePacking.Text    = _mp4Mod.IsPacked ? "Unpack" : "Pack";
            chkChangePacking.Enabled = _mp4Mod.IsPacked || _mp4Mod.ContainsBVOPs;

            // User Data
            _regUDList     = _mp4Mod.UserDataList;
            _autoUDList    = _mp4Mod.SuggestedUserData();
            UDListBoxItems = _regUDList;

            // Interlacing
            bool isInt = _mp4Mod.IsInterlaced;

            lblIsInterlaced.Text = isInt ? "Yes" : "No";
            rbTFF.Enabled        = isInt;
            rbBFF.Enabled        = isInt;
            if (isInt)
            {
                (_mp4Mod.TopFieldFirst ? rbTFF : rbBFF).Checked = true;
            }

            _updatingUI = false;
        }