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