3 This file is part of the HandBrake source code.
\r
4 Homepage: <http://handbrake.fr/>.
\r
5 It may be used under the terms of the GNU General Public License. */
\r
8 using System.Collections.Generic;
\r
9 using System.Drawing;
\r
10 using System.Windows.Forms;
\r
12 using System.Diagnostics;
\r
13 using System.Threading;
\r
14 using Handbrake.Functions;
\r
15 using Handbrake.Presets;
\r
16 using Handbrake.Queue;
\r
17 using Handbrake.Parsing;
\r
21 public partial class frmMain : Form
\r
23 // Objects which may be used by one or more other objects
\r
24 QueueHandler encodeQueue = new QueueHandler();
\r
25 PresetsHandler presetHandler = new PresetsHandler();
\r
26 QueryGenerator queryGen = new QueryGenerator();
\r
28 // Globals: Mainly used for tracking.
\r
29 Title selectedTitle;
\r
31 private frmQueue queueWindow;
\r
32 private frmPreview qtpreview;
\r
33 private Form splash;
\r
34 public int maxWidth;
\r
35 public int maxHeight;
\r
38 private delegate void UpdateWindowHandler();
\r
39 private delegate void UpdateStatusChanger();
\r
41 // Applicaiton Startup ************************************************
\r
43 #region Application Startup
\r
46 // Load and setup the splash screen in this thread
\r
47 splash = new frmSplashScreen();
\r
49 Label lblStatus = new Label { Size = new Size(250, 20), Location = new Point(10, 280) };
\r
50 splash.Controls.Add(lblStatus);
\r
52 InitializeComponent();
\r
54 // Update the users config file with the CLI version data.
\r
55 lblStatus.Text = "Setting Version Data ...";
\r
56 Application.DoEvents();
\r
57 Main.setCliVersionData();
\r
59 // Show the form, but leave disabled until preloading is complete then show the main form
\r
60 this.Enabled = false;
\r
62 Application.DoEvents(); // Forces frmMain to draw
\r
64 // Check for new versions, if update checking is enabled
\r
65 if (Properties.Settings.Default.updateStatus == "Checked")
\r
67 lblStatus.Text = "Checking for updates ...";
\r
68 Application.DoEvents();
\r
70 Thread updateCheckThread = new Thread(startupUpdateCheck);
\r
71 updateCheckThread.Start();
\r
74 // Setup the GUI components
\r
75 lblStatus.Text = "Setting up the GUI ...";
\r
76 Application.DoEvents();
\r
77 loadPresetPanel(); // Load the Preset Panel
\r
78 treeView_presets.ExpandAll();
\r
79 lbl_encode.Text = "";
\r
81 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
82 if (Properties.Settings.Default.QueryEditorTab != "Checked")
\r
83 tabs_panel.TabPages.RemoveAt(6); // Remove the query editor tab if the user does not want it enabled.
\r
85 // Load the user's default settings or Normal Preset
\r
86 if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")
\r
88 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
90 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
91 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
95 //Ok, Reset all the H264 widgets before changing the preset
\r
96 x264Panel.reset2Defaults();
\r
98 // Send the query from the file to the Query Parser class, then load the preset
\r
99 QueryParser presetQuery = QueryParser.Parse(query);
\r
100 PresetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
102 // The x264 widgets will need updated, so do this now:
\r
103 x264Panel.X264_StandardizeOptString();
\r
104 x264Panel.X264_SetCurrentSettingsInPanel();
\r
108 loadNormalPreset();
\r
111 loadNormalPreset();
\r
113 // Enabled GUI tooltip's if Required
\r
114 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
115 ToolTip.Active = true;
\r
118 lblStatus.Text = "Loading Complete!";
\r
119 Application.DoEvents();
\r
122 this.Enabled = true;
\r
124 // Event Handlers and Queue Recovery
\r
129 // Startup Functions
\r
130 private void startupUpdateCheck()
\r
134 if (InvokeRequired)
\r
136 BeginInvoke(new UpdateStatusChanger(startupUpdateCheck));
\r
140 Boolean update = Main.updateCheck(false);
\r
143 frmUpdater updateWindow = new frmUpdater();
\r
144 updateWindow.Show();
\r
147 catch (Exception exc)
\r
149 MessageBox.Show(splash, "Unable to perform update check. If this problem persists, you can turn of update checking in the program options. \nError Information: \n\n" + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
152 private void queueRecovery()
\r
154 if (Main.check_queue_recovery())
\r
156 DialogResult result = MessageBox.Show("HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?", "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
158 if (result == DialogResult.Yes)
\r
159 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
162 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
163 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
164 if (File.Exists(queuePath))
\r
165 File.Delete(queuePath);
\r
172 // Encoding Events for setting up the GUI
\r
173 private void events()
\r
175 // Handle Window Resize
\r
176 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
177 this.Resize += new EventHandler(frmMain_Resize);
\r
179 // Handle Encode Start / Finish / Pause
\r
180 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
181 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
182 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
184 // Handle a file being draged onto the GUI.
\r
185 this.DragEnter += new DragEventHandler(frmMain_DragEnter);
\r
186 this.DragDrop += new DragEventHandler(frmMain_DragDrop);
\r
189 private static void frmMain_DragEnter(object sender, DragEventArgs e)
\r
191 if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
\r
192 e.Effect = DragDropEffects.All;
\r
194 private void frmMain_DragDrop(object sender, DragEventArgs e)
\r
196 string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
\r
197 if (fileList != null)
\r
199 if (fileList[0].StartsWith("\\"))
\r
200 MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
203 if (fileList[0] != "")
\r
205 setupGUIforScan(fileList[0]);
\r
206 startScan(fileList[0]);
\r
209 text_source.Text = "Click 'Source' to continue";
\r
213 private void encodeStarted(object sender, EventArgs e)
\r
215 lastAction = "encode";
\r
216 setEncodeStarted();
\r
218 // Experimental HBProc Process Monitoring.
\r
219 if (Properties.Settings.Default.enocdeStatusInGui == "Checked")
\r
221 HBProcess = encodeQueue.hbProc;
\r
222 Thread EncodeMon = new Thread(encodeMonitorThread);
\r
226 private void encodeEnded(object sender, EventArgs e)
\r
228 setEncodeFinished();
\r
230 private void encodePaused(object sender, EventArgs e)
\r
232 setEncodeFinished();
\r
236 // User Interface Menus / Tool Strips *********************************
\r
239 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
243 private void mnu_exit_Click(object sender, EventArgs e)
\r
245 Application.Exit();
\r
250 private void mnu_encode_Click(object sender, EventArgs e)
\r
252 queueWindow.Show();
\r
254 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
257 file = lastAction == "scan" ? "last_scan_log.txt" : "last_encode_log.txt";
\r
259 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeQueue);
\r
260 dvdInfoWindow.Show();
\r
262 private void mnu_options_Click(object sender, EventArgs e)
\r
264 Form Options = new frmOptions();
\r
265 Options.ShowDialog();
\r
269 #region Presets Menu
\r
270 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
272 presetHandler.updateBuiltInPresets();
\r
274 if (treeView_presets.Nodes.Count == 0)
\r
275 MessageBox.Show("Unable to load the presets.xml file. Please select \"Update Built-in Presets\" from the Presets Menu \nMake sure you are running the program in Admin mode if running on Vista. See Windows FAQ for details!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
277 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
279 treeView_presets.ExpandAll();
\r
281 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
283 // Empty the preset file
\r
284 string presetsFile = Application.StartupPath + "\\presets.xml";
\r
285 if (File.Exists(presetsFile))
\r
286 File.Delete(presetsFile);
\r
290 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
294 catch (Exception exc)
\r
296 MessageBox.Show("An error has occured during the preset removal process.\n If you are using Windows Vista, you may need to run under Administrator Mode to complete this task. \n" + exc);
\r
299 // Reload the preset panel
\r
302 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
304 loadNormalPreset();
\r
306 private void btn_new_preset_Click(object sender, EventArgs e)
\r
308 // Remember each nodes expanded status so we can reload it
\r
309 List<Boolean> nodeStatus = saveTreeViewState();
\r
310 nodeStatus.Add(true);
\r
312 Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);
\r
313 preset.ShowDialog();
\r
315 // Now reload the TreeView states
\r
316 loadTreeViewStates(nodeStatus);
\r
321 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
323 Process.Start("http://forum.handbrake.fr/");
\r
325 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
327 Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
329 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
331 Process.Start("http://handbrake.fr");
\r
333 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
335 Boolean update = Main.updateCheck(true);
\r
338 frmUpdater updateWindow = new frmUpdater();
\r
339 updateWindow.Show();
\r
342 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
344 private void mnu_about_Click(object sender, EventArgs e)
\r
346 Form About = new frmAbout();
\r
347 About.ShowDialog();
\r
352 private void mnu_qptest_Click(object sender, EventArgs e)
\r
354 QueryParserTester qptest = new QueryParserTester();
\r
360 // Right Click Menu Code
\r
361 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
363 treeView_presets.ExpandAll();
\r
365 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
367 treeView_presets.CollapseAll();
\r
369 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
371 DialogResult result = MessageBox.Show("Do you wish to include picture settings when updating the preset: " + treeView_presets.SelectedNode.Text, "Update Preset", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
\r
372 if (result == DialogResult.Yes)
\r
373 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, QueryGenerator.generateTabbedComponentsQuery(this), true);
\r
374 else if (result == DialogResult.No)
\r
375 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, QueryGenerator.generateTabbedComponentsQuery(this), false);
\r
377 private void pmnu_delete_click(object sender, EventArgs e)
\r
379 if (treeView_presets.SelectedNode != null)
\r
381 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
383 // Remember each nodes expanded status so we can reload it
\r
384 List<Boolean> nodeStatus = saveTreeViewState();
\r
386 // Now reload the preset panel
\r
389 // Now reload the TreeView states
\r
390 loadTreeViewStates(nodeStatus);
\r
392 treeView_presets.Select();
\r
394 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
396 // Make sure that the save menu is always disabled by default
\r
397 pmnu_saveChanges.Enabled = false;
\r
399 // Now enable the save menu if the selected preset is a user preset
\r
400 if (treeView_presets.SelectedNode != null)
\r
402 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
404 pmnu_saveChanges.Enabled = true;
\r
407 treeView_presets.Select();
\r
410 // Presets Management
\r
411 private void btn_addPreset_Click(object sender, EventArgs e)
\r
413 // Remember each nodes expanded status so we can reload it
\r
414 List<Boolean> nodeStatus = saveTreeViewState();
\r
415 nodeStatus.Add(true);
\r
417 // Now add the new preset
\r
418 Form preset = new frmAddPreset(this, QueryGenerator.generateTabbedComponentsQuery(this), presetHandler);
\r
419 preset.ShowDialog();
\r
421 // Now reload the TreeView states
\r
422 loadTreeViewStates(nodeStatus);
\r
424 private void btn_removePreset_Click(object sender, EventArgs e)
\r
426 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
427 if (result == DialogResult.Yes)
\r
429 if (treeView_presets.SelectedNode != null)
\r
430 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
432 // Remember each nodes expanded status so we can reload it
\r
433 List<Boolean> nodeStatus = saveTreeViewState();
\r
435 // Now reload the preset panel
\r
438 // Now reload the TreeView states
\r
439 loadTreeViewStates(nodeStatus);
\r
441 treeView_presets.Select();
\r
443 private void btn_setDefault_Click(object sender, EventArgs e)
\r
445 if (treeView_presets.SelectedNode != null)
\r
447 DialogResult result = MessageBox.Show("Are you sure you wish to set this preset as the default?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
448 if (result == DialogResult.Yes)
\r
450 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
451 Properties.Settings.Default.Save();
\r
452 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
456 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
458 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
460 if (e.Button == MouseButtons.Right)
\r
461 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
462 else if (e.Button == MouseButtons.Left)
\r
464 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
466 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
471 treeView_presets.Select();
\r
473 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
477 private void selectPreset()
\r
479 if (treeView_presets.SelectedNode != null)
\r
481 // Ok, so, we've selected a preset. Now we want to load it.
\r
482 string presetName = treeView_presets.SelectedNode.Text;
\r
483 if (presetHandler.getPreset(presetName) != null)
\r
485 string query = presetHandler.getPreset(presetName).Query;
\r
486 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
490 //Ok, Reset all the H264 widgets before changing the preset
\r
491 x264Panel.reset2Defaults();
\r
493 // Send the query from the file to the Query Parser class
\r
494 QueryParser presetQuery = QueryParser.Parse(query);
\r
496 // Now load the preset
\r
497 PresetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
499 // The x264 widgets will need updated, so do this now:
\r
500 x264Panel.X264_StandardizeOptString();
\r
501 x264Panel.X264_SetCurrentSettingsInPanel();
\r
503 if (maxWidth != 0 && maxHeight != 0)
\r
504 lbl_max.Text = "Max Width / Height";
\r
505 else if (maxWidth != 0)
\r
506 lbl_max.Text = "Max Width";
\r
513 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
515 if (e.KeyCode == Keys.Delete)
\r
517 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
518 if (result == DialogResult.Yes)
\r
520 if (treeView_presets.SelectedNode != null)
\r
521 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
523 // Remember each nodes expanded status so we can reload it
\r
524 List<Boolean> nodeStatus = new List<Boolean>();
\r
525 foreach (TreeNode node in treeView_presets.Nodes)
\r
526 nodeStatus.Add(node.IsExpanded);
\r
528 // Now reload the preset panel
\r
531 // And finally, re-expand any of the nodes if required
\r
533 foreach (TreeNode node in treeView_presets.Nodes)
\r
543 private List<Boolean> saveTreeViewState()
\r
545 // Remember each nodes expanded status so we can reload it
\r
546 List<Boolean> nodeStatus = new List<Boolean>();
\r
547 foreach (TreeNode node in treeView_presets.Nodes)
\r
549 nodeStatus.Add(node.IsExpanded);
\r
550 foreach (TreeNode subNode in node.Nodes)
\r
551 nodeStatus.Add(node.IsExpanded);
\r
555 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
557 // And finally, re-expand any of the nodes if required
\r
559 foreach (TreeNode node in treeView_presets.Nodes)
\r
564 foreach (TreeNode subNode in node.Nodes)
\r
573 private void loadNormalPreset()
\r
575 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
577 foreach (TreeNode node in treenode.Nodes)
\r
579 if (node.Text.Equals("Normal"))
\r
580 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
587 private void btn_source_Click(object sender, EventArgs e)
\r
589 if (Properties.Settings.Default.drive_detection == "Checked")
\r
591 mnu_dvd_drive.Visible = true;
\r
592 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
593 driveInfoThread.Start();
\r
596 mnu_dvd_drive.Visible = false;
\r
598 private void btn_start_Click(object sender, EventArgs e)
\r
600 if (btn_start.Text == "Stop")
\r
602 DialogResult result = MessageBox.Show("Are you sure you wish to cancel the encode? Please note that this may break the encoded file. \nTo safely cancel your encode, press ctrl-c on your keyboard in the CLI window. This *may* allow you to preview your encoded content.", "Cancel Encode?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
604 if (result == DialogResult.Yes)
\r
607 encodeQueue.pauseEncode();
\r
608 encodeQueue.endEncode();
\r
611 setEncodeFinished();
\r
616 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
618 // Set the last action to encode.
\r
619 // This is used for tracking which file to load in the activity window
\r
620 lastAction = "encode";
\r
622 String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateTheQuery(this);
\r
624 if (encodeQueue.count() == 0)
\r
626 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
627 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
629 queueWindow.setQueue();
\r
630 if (encodeQueue.count() > 1)
\r
631 queueWindow.Show(false);
\r
633 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
634 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
636 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
637 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
640 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
643 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
644 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
647 String query = queryGen.GenerateTheQuery(this);
\r
648 if (rtf_query.Text != "")
\r
649 query = rtf_query.Text;
\r
652 if (encodeQueue.checkDestinationPath(text_destination.Text))
\r
654 DialogResult result = MessageBox.Show("There is already a queue item for this destination path. \n\n If you continue, the encode will be overwritten. Do you wish to continue?",
\r
655 "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
\r
656 if (result == DialogResult.Yes)
\r
657 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
661 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
663 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
664 queueWindow.Show();
\r
667 private void btn_showQueue_Click(object sender, EventArgs e)
\r
669 queueWindow.Show();
\r
671 private void tb_preview_Click(object sender, EventArgs e)
\r
673 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
674 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
677 if (qtpreview == null)
\r
679 qtpreview = new frmPreview(this);
\r
682 else if (qtpreview.IsDisposed)
\r
684 qtpreview = new frmPreview(this);
\r
688 MessageBox.Show(qtpreview, "The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
691 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
693 String file = lastAction == "scan" ? "last_scan_log.txt" : "last_encode_log.txt";
\r
695 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeQueue);
\r
696 ActivityWindow.Show();
\r
700 #region System Tray Icon
\r
701 private void frmMain_Resize(object sender, EventArgs e)
\r
703 if (FormWindowState.Minimized == this.WindowState)
\r
705 notifyIcon.Visible = true;
\r
706 if (!encodeQueue.isEncoding)
\r
708 notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";
\r
709 notifyIcon.ShowBalloonTip(500);
\r
713 else if (FormWindowState.Normal == this.WindowState)
\r
714 notifyIcon.Visible = false;
\r
716 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
718 this.Visible = true;
\r
720 this.WindowState = FormWindowState.Normal;
\r
721 notifyIcon.Visible = false;
\r
723 private void btn_restore_Click(object sender, EventArgs e)
\r
725 this.Visible = true;
\r
727 this.WindowState = FormWindowState.Normal;
\r
728 notifyIcon.Visible = false;
\r
732 #region Tab Control
\r
735 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
737 // Enable the creation of chapter markers.
\r
738 Check_ChapterMarkers.Enabled = true;
\r
740 // Set the last action to scan.
\r
741 // This is used for tracking which file to load in the activity window
\r
742 lastAction = "scan";
\r
743 text_source.Text = "";
\r
745 if (DVD_Open.ShowDialog() == DialogResult.OK)
\r
747 String filename = DVD_Open.SelectedPath;
\r
749 if (filename.StartsWith("\\"))
\r
750 MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
753 if (filename != "")
\r
755 setupGUIforScan(filename);
\r
756 startScan(filename);
\r
759 text_source.Text = "Click 'Source' to continue";
\r
763 text_source.Text = "Click 'Source' to continue";
\r
765 private void btn_file_source_Click(object sender, EventArgs e)
\r
767 // Set the last action to scan.
\r
768 // This is used for tracking which file to load in the activity window
\r
769 lastAction = "scan";
\r
770 text_source.Text = "";
\r
772 if (ISO_Open.ShowDialog() == DialogResult.OK)
\r
774 String filename = ISO_Open.FileName;
\r
775 if (filename.StartsWith("\\"))
\r
777 "Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer",
\r
778 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
781 if (filename != "")
\r
783 setupGUIforScan(filename);
\r
784 startScan(filename);
\r
787 text_source.Text = "Click 'Source' to continue";
\r
791 text_source.Text = "Click 'Source' to continue";
\r
793 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
795 // Enable the creation of chapter markers.
\r
796 Check_ChapterMarkers.Enabled = true;
\r
798 // Set the last action to scan.
\r
799 // This is used for tracking which file to load in the activity window
\r
800 lastAction = "scan";
\r
802 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
804 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
805 String filename = path[0];
\r
806 setupGUIforScan(filename);
\r
807 startScan(filename);
\r
810 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
811 if (drp_dvdtitle.Items.Count == 0)
\r
812 MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source.\nYour Source may be copy protected, badly mastered or a format which HandBrake does not support. \nPlease refer to the Documentation and FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
\r
814 lbl_encode.Text = "";
\r
816 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
818 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
819 MessageBox.Show("There are no titles to select. Please load a source file by clicking the 'Source' button above before trying to select a title.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
\r
821 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
823 // Reset some values on the form
\r
824 lbl_Aspect.Text = "Select a Title";
\r
825 //lbl_RecomendedCrop.Text = "Select a Title";
\r
826 drop_chapterStart.Items.Clear();
\r
827 drop_chapterFinish.Items.Clear();
\r
829 // If the dropdown is set to automatic nothing else needs to be done.
\r
830 // Otheriwse if its not, title data has to be loased from parsing.
\r
831 if (drp_dvdtitle.Text != "Automatic")
\r
833 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
835 // Set the Aspect Ratio
\r
836 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();
\r
837 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;
\r
838 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
840 // Set the Recommended Cropping values
\r
841 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
842 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
843 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
844 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
846 // Populate the Angles dropdown
\r
847 drop_angle.Items.Clear();
\r
848 if (Properties.Settings.Default.dvdnav == "Checked")
\r
850 drop_angle.Visible = true;
\r
851 lbl_angle.Visible = true;
\r
852 drop_angle.Items.AddRange(selectedTitle.Angles.ToArray());
\r
853 if (drop_angle.Items.Count != 0)
\r
854 drop_angle.SelectedIndex = 0;
\r
858 drop_angle.Visible = false;
\r
859 lbl_angle.Visible = false;
\r
862 // Populate the Start chapter Dropdown
\r
863 drop_chapterStart.Items.Clear();
\r
864 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
865 if (drop_chapterStart.Items.Count > 0)
\r
866 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
868 // Populate the Final Chapter Dropdown
\r
869 drop_chapterFinish.Items.Clear();
\r
870 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
871 if (drop_chapterFinish.Items.Count > 0)
\r
872 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
874 // Populate the Audio Channels Dropdown
\r
875 drp_track1Audio.Items.Clear();
\r
876 drp_track1Audio.Items.Add("Automatic");
\r
877 drp_track1Audio.Items.Add("None");
\r
878 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());
\r
879 drp_track1Audio.SelectedIndex = 0;
\r
881 // Populate the Subtitles dropdown
\r
882 drp_subtitle.Items.Clear();
\r
883 drp_subtitle.Items.Add("None");
\r
884 drp_subtitle.Items.Add("Autoselect");
\r
885 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
886 if (drp_subtitle.Items.Count > 0)
\r
887 drp_subtitle.Text = drp_subtitle.Items[0].ToString();
\r
891 // Run the autoName & chapterNaming functions
\r
892 if (Properties.Settings.Default.autoNaming == "Checked")
\r
894 string autoPath = Main.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
895 if (autoPath != null)
\r
896 text_destination.Text = autoPath;
\r
898 MessageBox.Show("You currently have automatic file naming enabled for the destination box, but you do not have a default direcotry set. You should set this in the program options (see Tools Menu)", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
901 data_chpt.Rows.Clear();
\r
902 if (selectedTitle.Chapters.Count != 1)
\r
904 DataGridView chapterGridView = Main.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
905 if (chapterGridView != null)
\r
906 data_chpt = chapterGridView;
\r
910 Check_ChapterMarkers.Checked = false;
\r
911 Check_ChapterMarkers.Enabled = false;
\r
914 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
915 data_chpt.Columns[0].Width = 166;
\r
916 data_chpt.Columns[0].Width = 165;
\r
918 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
920 int c_start, c_end;
\r
922 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
923 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
925 int.TryParse(drop_chapterStart.Text, out c_start);
\r
926 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
930 if (c_start > c_end)
\r
931 drop_chapterFinish.Text = c_start.ToString();
\r
934 lbl_duration.Text = Main.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
936 // Run the Autonaming function
\r
937 if (Properties.Settings.Default.autoNaming == "Checked")
\r
938 text_destination.Text = Main.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
940 // Disable chapter markers if only 1 chapter is selected.
\r
941 if (c_start == c_end)
\r
943 Check_ChapterMarkers.Checked = false;
\r
944 Check_ChapterMarkers.Enabled = false;
\r
947 Check_ChapterMarkers.Enabled = true;
\r
949 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
951 int c_start, c_end;
\r
953 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
954 drop_chapterStart.SelectedIndex = 1;
\r
956 int.TryParse(drop_chapterStart.Text, out c_start);
\r
957 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
961 if (c_end < c_start)
\r
962 drop_chapterFinish.Text = c_start.ToString();
\r
965 lbl_duration.Text = Main.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
967 // Run the Autonaming function
\r
968 if (Properties.Settings.Default.autoNaming == "Checked")
\r
969 text_destination.Text = Main.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
971 // Add more rows to the Chapter menu if needed.
\r
972 if (Check_ChapterMarkers.Checked)
\r
974 int i = data_chpt.Rows.Count, finish = 0;
\r
976 if (drop_chapterFinish.Text != "Auto")
\r
977 int.TryParse(drop_chapterFinish.Text, out finish);
\r
981 int n = data_chpt.Rows.Add();
\r
982 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
983 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
984 data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
\r
985 data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
\r
990 // Disable chapter markers if only 1 chapter is selected.
\r
991 if (c_start == c_end)
\r
993 Check_ChapterMarkers.Checked = false;
\r
994 Check_ChapterMarkers.Enabled = false;
\r
997 Check_ChapterMarkers.Enabled = true;
\r
1001 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
1003 // This removes the file extension from the filename box on the save file dialog.
\r
1004 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
1005 DVD_Save.FileName = Path.GetFileNameWithoutExtension(text_destination.Text);
\r
1007 if (Path.IsPathRooted(text_destination.Text))
\r
1008 DVD_Save.InitialDirectory = Path.GetDirectoryName(text_destination.Text);
\r
1010 // Show the dialog and set the main form file path
\r
1011 if (drop_format.SelectedIndex.Equals(0))
\r
1012 DVD_Save.FilterIndex = 1;
\r
1013 else if (drop_format.SelectedIndex.Equals(1))
\r
1014 DVD_Save.FilterIndex = 2;
\r
1015 else if (drop_format.SelectedIndex.Equals(2))
\r
1016 DVD_Save.FilterIndex = 3;
\r
1018 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
1020 if (DVD_Save.FileName.StartsWith("\\"))
\r
1021 MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
1024 // Add a file extension manually, as FileDialog.AddExtension has issues with dots in filenames
\r
1025 switch (DVD_Save.FilterIndex)
\r
1028 if (!Path.GetExtension(DVD_Save.FileName).Equals(".mp4", StringComparison.InvariantCultureIgnoreCase))
\r
1029 DVD_Save.FileName += ".mp4";
\r
1032 if (!Path.GetExtension(DVD_Save.FileName).Equals(".m4v", StringComparison.InvariantCultureIgnoreCase))
\r
1033 DVD_Save.FileName += ".m4v";
\r
1036 if (!Path.GetExtension(DVD_Save.FileName).Equals(".mkv", StringComparison.InvariantCultureIgnoreCase))
\r
1037 DVD_Save.FileName += ".mkv";
\r
1043 text_destination.Text = DVD_Save.FileName;
\r
1045 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
1046 if (Check_ChapterMarkers.Checked)
\r
1047 drop_format.SelectedIndex = 1;
\r
1051 private void text_destination_TextChanged(object sender, EventArgs e)
\r
1053 string path = text_destination.Text;
\r
1054 if (path.EndsWith(".mp4"))
\r
1055 drop_format.SelectedIndex = 0;
\r
1056 else if (path.EndsWith(".m4v"))
\r
1057 drop_format.SelectedIndex = 1;
\r
1058 else if (path.EndsWith(".mkv"))
\r
1059 drop_format.SelectedIndex = 2;
\r
1062 // Output Settings
\r
1063 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
1065 if (drop_format.SelectedIndex == 0)
\r
1066 setExtension(".mp4");
\r
1067 else if (drop_format.SelectedIndex == 1)
\r
1068 setExtension(".m4v");
\r
1069 else if (drop_format.SelectedIndex == 2)
\r
1070 setExtension(".mkv");
\r
1072 setAudioByContainer(drop_format.Text);
\r
1073 setVideoByContainer(drop_format.Text);
\r
1075 private void setExtension(string newExtension)
\r
1077 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
1078 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
1079 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
1083 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1085 setContainerOpts();
\r
1087 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1088 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1090 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1091 check_turbo.Enabled = true;
\r
1093 h264Tab.Enabled = true;
\r
1094 if ((drop_format.Text.Contains("MP4")) || (drop_format.Text.Contains("M4V")))
\r
1095 check_iPodAtom.Enabled = true;
\r
1097 check_iPodAtom.Enabled = false;
\r
1101 check_turbo.CheckState = CheckState.Unchecked;
\r
1102 check_turbo.Enabled = false;
\r
1103 h264Tab.Enabled = false;
\r
1104 x264Panel.x264Query = "";
\r
1105 check_iPodAtom.Enabled = false;
\r
1106 check_iPodAtom.Checked = false;
\r
1109 // Setup the CQ Slider
\r
1110 switch (drp_videoEncoder.Text)
\r
1112 case "MPEG-4 (FFmpeg)":
\r
1113 slider_videoQuality.Minimum = 1;
\r
1114 slider_videoQuality.Maximum = 31;
\r
1115 slider_videoQuality.Value = 1;
\r
1116 SliderValue.Text = "0% QP: 31.00";
\r
1118 case "H.264 (x264)":
\r
1119 slider_videoQuality.Minimum = 0;
\r
1120 slider_videoQuality.Value = 0;
\r
1121 slider_videoQuality.TickFrequency = 1;
\r
1122 SliderValue.Text = "0% RF: 51.00";
\r
1123 String step = Properties.Settings.Default.x264cqstep;
\r
1127 slider_videoQuality.Maximum = 255;
\r
1130 slider_videoQuality.Maximum = 204;
\r
1133 slider_videoQuality.Maximum = 155;
\r
1136 slider_videoQuality.Maximum = 102;
\r
1139 slider_videoQuality.Maximum = 51;
\r
1142 slider_videoQuality.Maximum = 51;
\r
1146 case "VP3 (Theora)":
\r
1147 slider_videoQuality.Minimum = 0;
\r
1148 slider_videoQuality.Maximum = 63;
\r
1149 slider_videoQuality.Value = 0;
\r
1150 SliderValue.Text = "0% QP: 0.00";
\r
1155 /// Set the container format options
\r
1157 public void setContainerOpts()
\r
1159 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1161 check_largeFile.Enabled = true;
\r
1162 check_optimiseMP4.Enabled = true;
\r
1163 check_iPodAtom.Enabled = true;
\r
1167 check_largeFile.Enabled = false;
\r
1168 check_optimiseMP4.Enabled = false;
\r
1169 check_iPodAtom.Enabled = false;
\r
1170 check_largeFile.Checked = false;
\r
1171 check_optimiseMP4.Checked = false;
\r
1172 check_iPodAtom.Checked = false;
\r
1175 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1177 switch (drp_videoEncoder.Text)
\r
1179 case "MPEG-4 (FFmpeg)":
\r
1180 double rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1181 double max = slider_videoQuality.Maximum;
\r
1182 double min = slider_videoQuality.Minimum;
\r
1183 double val = ((max - min) - (rfValue - min)) / (max - min);
\r
1184 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1186 case "H.264 (x264)":
\r
1188 System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
\r
1189 double.TryParse(Properties.Settings.Default.x264cqstep,
\r
1190 System.Globalization.NumberStyles.Number,
\r
1193 rfValue = 51.0 - slider_videoQuality.Value * divided;
\r
1194 max = slider_videoQuality.Maximum * divided;
\r
1195 min = slider_videoQuality.Minimum;
\r
1196 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1197 rfValue = Math.Round(rfValue, 2);
\r
1198 SliderValue.Text = Math.Round((val * 100), 2) + "% RF:" + rfValue;
\r
1200 case "VP3 (Theora)":
\r
1201 rfValue = slider_videoQuality.Value;
\r
1202 double value = rfValue / 63;
\r
1203 SliderValue.Text = Math.Round((value * 100), 2) + "% QP:" + slider_videoQuality.Value;
\r
1207 private void radio_targetFilesize_CheckedChanged(object sender, EventArgs e)
\r
1209 text_bitrate.Enabled = false;
\r
1210 text_filesize.Enabled = true;
\r
1211 slider_videoQuality.Enabled = false;
\r
1213 check_2PassEncode.Enabled = true;
\r
1215 private void radio_avgBitrate_CheckedChanged(object sender, EventArgs e)
\r
1217 text_bitrate.Enabled = true;
\r
1218 text_filesize.Enabled = false;
\r
1219 slider_videoQuality.Enabled = false;
\r
1221 check_2PassEncode.Enabled = true;
\r
1223 private void radio_cq_CheckedChanged(object sender, EventArgs e)
\r
1225 text_bitrate.Enabled = false;
\r
1226 text_filesize.Enabled = false;
\r
1227 slider_videoQuality.Enabled = true;
\r
1229 check_2PassEncode.Enabled = false;
\r
1230 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1232 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1234 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1236 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1237 check_turbo.Enabled = true;
\r
1241 check_turbo.Enabled = false;
\r
1242 check_turbo.CheckState = CheckState.Unchecked;
\r
1247 private void text_width_TextChanged(object sender, EventArgs e)
\r
1249 if (text_width.Text == "")
\r
1250 text_width.BackColor = Color.White;
\r
1252 maxWidth = 0; maxHeight = 0; // Reset max width so that it's not using the MaxWidth -X. Quick hack to allow -X for preset usage.
\r
1253 lbl_max.Text = "";
\r
1256 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1259 text_width.BackColor = (width % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1261 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1263 if (drp_anamorphic.Text == "None")
\r
1265 int height = Main.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1267 text_height.Text = height.ToString();
\r
1272 private void text_height_TextChanged(object sender, EventArgs e)
\r
1274 if (text_height.Text == "")
\r
1275 text_height.BackColor = Color.White;
\r
1277 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1278 if (maxWidth != 0)
\r
1279 lbl_max.Text = "Max Width";
\r
1281 lbl_max.Text = "";
\r
1284 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1286 text_height.BackColor = (height % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1288 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1290 text_left.Enabled = true;
\r
1291 text_right.Enabled = true;
\r
1292 text_top.Enabled = true;
\r
1293 text_bottom.Enabled = true;
\r
1294 if (selectedTitle != null)
\r
1296 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1297 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1298 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1299 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1303 text_left.Text = "0";
\r
1304 text_right.Text = "0";
\r
1305 text_top.Text = "0";
\r
1306 text_bottom.Text = "0";
\r
1309 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1311 text_left.Enabled = false;
\r
1312 text_right.Enabled = false;
\r
1313 text_top.Enabled = false;
\r
1314 text_bottom.Enabled = false;
\r
1316 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1318 if (drp_anamorphic.SelectedIndex == 1)
\r
1320 text_height.BackColor = Color.LightGray;
\r
1321 text_width.BackColor = Color.LightGray;
\r
1322 text_height.Text = "";
\r
1323 text_width.Text = "";
\r
1324 text_height.Enabled = false;
\r
1325 text_width.Enabled = false;
\r
1328 if (drp_anamorphic.SelectedIndex == 2)
\r
1330 text_height.Text = "";
\r
1331 text_height.Enabled = false;
\r
1332 text_height.BackColor = Color.LightGray;
\r
1334 text_width.Enabled = true;
\r
1335 text_width.BackColor = Color.White;
\r
1338 if (drp_anamorphic.SelectedIndex == 0)
\r
1340 text_height.BackColor = Color.White;
\r
1341 text_width.BackColor = Color.White;
\r
1342 text_height.Enabled = true;
\r
1343 text_width.Enabled = true;
\r
1348 private void ctl_decomb_changed(object sender, EventArgs e)
\r
1350 if (ctl_decomb.getDropValue != "Off")
\r
1351 if (ctl_deinterlace.getDropValue != "None")
\r
1352 ctl_deinterlace.setOption("None");
\r
1354 private void ctl_deinterlace_changed(object sender, EventArgs e)
\r
1356 if (ctl_detelecine.getDropValue != "None")
\r
1357 if (ctl_decomb.getDropValue != "Off")
\r
1358 ctl_decomb.setOption("Off");
\r
1360 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1362 lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
\r
1366 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1368 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1370 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1371 lv_audioList.Select();
\r
1374 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1376 if (drp_audenc_1.Text.Contains("AC3") || drp_audenc_1.Text.Contains("DTS"))
\r
1378 drp_audmix_1.Enabled = false;
\r
1379 drp_audbit_1.Enabled = false;
\r
1380 drp_audsr_1.Enabled = false;
\r
1382 drp_audmix_1.SelectedIndex = 0;
\r
1383 drp_audbit_1.SelectedIndex = 0;
\r
1384 drp_audsr_1.SelectedIndex = 0;
\r
1388 drp_audmix_1.Enabled = true;
\r
1389 drp_audbit_1.Enabled = true;
\r
1390 drp_audsr_1.Enabled = true;
\r
1392 drp_audmix_1.Text = "Automatic";
\r
1393 drp_audbit_1.Text = "160";
\r
1394 drp_audsr_1.Text = "Auto";
\r
1397 if (drp_audenc_1.Text.Contains("AAC"))
\r
1399 setMixDownAllOptions(drp_audmix_1);
\r
1400 setBitrateSelections160(drp_audbit_1);
\r
1404 setMixDownNotAAC(drp_audmix_1);
\r
1405 setBitrateSelections320(drp_audbit_1);
\r
1408 // Update an item in the Audio list if required.
\r
1409 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1411 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1412 lv_audioList.Select();
\r
1415 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1417 if ((drp_audenc_1.Text.Contains("AAC")) && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1418 setBitrateSelections384(drp_audbit_1);
\r
1419 else if ((drp_audenc_1.Text.Contains("AAC")) && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1420 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\r
1422 // Update an item in the Audio list if required.
\r
1423 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1425 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;
\r
1426 lv_audioList.Select();
\r
1429 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1431 // Update an item in the Audio list if required.
\r
1432 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1434 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1435 lv_audioList.Select();
\r
1438 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1440 // Update an item in the Audio list if required.
\r
1441 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1443 if (drp_audenc_1.Text.Contains("AC3"))
\r
1444 drp_audbit_1.Text = "Auto";
\r
1445 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1446 lv_audioList.Select();
\r
1449 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1452 if (tb_drc.Value == 0) value = 0;
\r
1454 value = ((tb_drc.Value - 1) / 10.0) + 1;
\r
1456 lbl_drc.Text = value.ToString();
\r
1458 // Update an item in the Audio list if required.
\r
1459 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1461 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;
\r
1462 lv_audioList.Select();
\r
1466 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1468 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1469 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1470 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1471 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1472 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1473 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1474 newTrack.SubItems.Add(lbl_drc.Text);
\r
1476 // Select the newly added track and select the control
\r
1477 lv_audioList.Items.Add(newTrack);
\r
1478 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1479 lv_audioList.Select();
\r
1481 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1483 removeAudioTrack();
\r
1485 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1487 if (lv_audioList.SelectedIndices.Count != 0)
\r
1489 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1490 int index = item.Index;
\r
1493 if (lv_audioList.Items.Count > index && index >= 0)
\r
1495 lv_audioList.Items.Remove(item);
\r
1496 lv_audioList.Items.Insert(index, item);
\r
1497 item.Selected = true;
\r
1498 lv_audioList.Focus();
\r
1502 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1504 if (lv_audioList.SelectedIndices.Count != 0)
\r
1506 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1507 int index = item.Index;
\r
1510 if (index < lv_audioList.Items.Count)
\r
1512 lv_audioList.Items.Remove(item);
\r
1513 lv_audioList.Items.Insert(index, item);
\r
1514 item.Selected = true;
\r
1515 lv_audioList.Focus();
\r
1520 private void audioList_remove_Click(object sender, EventArgs e)
\r
1522 removeAudioTrack();
\r
1524 private void removeAudioTrack()
\r
1526 // Remove the Item and reselect the control if the following conditions are met.
\r
1527 if (lv_audioList.SelectedItems.Count != 0)
\r
1529 // Record the current selected index.
\r
1530 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1532 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1534 // Now reslect the correct item and give focus to the audio list.
\r
1535 if (lv_audioList.Items.Count != 0)
\r
1537 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1538 lv_audioList.Items[currentPosition].Selected = true;
\r
1539 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1540 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1542 lv_audioList.Select();
\r
1546 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1548 // Set the dropdown controls based on the selected item in the Audio List.
\r
1549 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1551 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1552 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1553 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1554 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1555 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1556 double drcValue; int drcCalculated;
\r
1557 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1558 if (drcValue == 0) drcCalculated = 0;
\r
1560 drcValue = ((drcValue * 10) + 1) - 10;
\r
1561 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1562 tb_drc.Value = drcCalculated;
\r
1566 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1568 if (drp_subtitle.Text.Contains("None"))
\r
1570 check_forced.Enabled = false;
\r
1571 check_forced.Checked = false;
\r
1574 check_forced.Enabled = true;
\r
1577 // Chapter Marker Tab
\r
1578 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1580 if (Check_ChapterMarkers.Checked)
\r
1582 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1583 data_chpt.Rows.Clear();
\r
1584 data_chpt.Enabled = true;
\r
1585 DataGridView chapterGridView = Main.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1586 if (chapterGridView != null)
\r
1587 data_chpt = chapterGridView;
\r
1591 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1592 data_chpt.Rows.Clear();
\r
1593 data_chpt.Enabled = false;
\r
1597 // Query Editor Tab
\r
1598 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1600 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1602 private void btn_clear_Click(object sender, EventArgs e)
\r
1604 rtf_query.Clear();
\r
1608 // MainWindow Components, Actions and Functions ***********************
\r
1610 #region Source Scan
\r
1611 private static int scanProcessID { get; set; }
\r
1612 private void setupGUIforScan(String filename)
\r
1614 text_source.Text = filename;
\r
1616 foreach (Control ctrl in Controls)
\r
1618 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1619 ctrl.Enabled = false;
\r
1621 lbl_encode.Visible = true;
\r
1622 lbl_encode.Text = "Scanning ...";
\r
1623 gb_source.Text = "Source: Scanning ...";
\r
1624 btn_source.Enabled = false;
\r
1625 btn_start.Enabled = false;
\r
1626 btn_showQueue.Enabled = false;
\r
1627 btn_add2Queue.Enabled = false;
\r
1628 tb_preview.Enabled = false;
\r
1629 mnu_killCLI.Visible = true;
\r
1631 private void startScan(String filename)
\r
1635 lbl_encode.Visible = true;
\r
1636 lbl_encode.Text = "Scanning...";
\r
1637 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1639 catch (Exception exc)
\r
1641 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1644 private void scanProcess(object state)
\r
1648 string inputFile = (string)state;
\r
1649 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1650 string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
\r
1651 string dvdInfoPath = Path.Combine(logDir, "last_scan_log.txt");
\r
1653 // Make we don't pick up a stale last_encode_log.txt (and that we have rights to the file)
\r
1654 if (File.Exists(dvdInfoPath))
\r
1655 File.Delete(dvdInfoPath);
\r
1657 String dvdnav = string.Empty;
\r
1658 if (Properties.Settings.Default.dvdnav == "Checked")
\r
1659 dvdnav = " --dvdnav";
\r
1660 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 {2} -v >""{3}"" 2>&1""", handbrakeCLIPath, inputFile, dvdnav, dvdInfoPath);
\r
1662 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine) { WindowStyle = ProcessWindowStyle.Hidden };
\r
1664 Boolean cleanExit = true;
\r
1665 using (hbproc = Process.Start(hbParseDvd))
\r
1667 Process[] before = Process.GetProcesses(); // Get a list of running processes before starting.
\r
1668 scanProcessID = Main.getCliProcess(before);
\r
1669 hbproc.WaitForExit();
\r
1670 if (hbproc.ExitCode != 0)
\r
1671 cleanExit = false;
\r
1674 if (cleanExit) // If 0 exit code, CLI exited cleanly.
\r
1676 if (!File.Exists(dvdInfoPath))
\r
1678 throw new Exception(
\r
1679 "Unable to retrieve the DVD Info. last_scan_log.txt is missing. \nExpected location of last_scan_log.txt: \n" +
\r
1683 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1685 thisDVD = DVD.Parse(sr);
\r
1690 updateUIafterScan();
\r
1693 catch (Exception exc)
\r
1695 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1699 private void updateUIafterScan()
\r
1703 if (InvokeRequired)
\r
1705 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1709 // Setup some GUI components
\r
1710 drp_dvdtitle.Items.Clear();
\r
1711 if (thisDVD.Titles.Count != 0)
\r
1712 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1713 drp_dvdtitle.Text = "Automatic";
\r
1714 drop_chapterFinish.Text = "Auto";
\r
1715 drop_chapterStart.Text = "Auto";
\r
1717 // Now select the longest title
\r
1718 if (thisDVD.Titles.Count != 0)
\r
1719 drp_dvdtitle.SelectedItem = Main.selectLongestTitle(drp_dvdtitle);
\r
1721 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1722 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1723 Check_ChapterMarkers.Enabled = true;
\r
1726 Check_ChapterMarkers.Enabled = false;
\r
1727 Check_ChapterMarkers.Checked = false;
\r
1728 data_chpt.Rows.Clear();
\r
1731 // If no titles were found, Display an error message
\r
1732 if (drp_dvdtitle.Items.Count == 0)
\r
1733 MessageBox.Show("No Title(s) found. \n\nYour Source may be copy protected, badly mastered or a format which HandBrake does not support. \nPlease refer to the Documentation and FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
\r
1735 // Enable the GUI components and enable any disabled components
\r
1738 catch (Exception exc)
\r
1740 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1744 private void enableGUI()
\r
1748 if (InvokeRequired)
\r
1749 BeginInvoke(new UpdateWindowHandler(enableGUI));
\r
1750 lbl_encode.Text = "Scan Completed";
\r
1751 gb_source.Text = "Source";
\r
1752 foreach (Control ctrl in Controls)
\r
1753 ctrl.Enabled = true;
\r
1754 btn_start.Enabled = true;
\r
1755 btn_showQueue.Enabled = true;
\r
1756 btn_add2Queue.Enabled = true;
\r
1757 tb_preview.Enabled = true;
\r
1758 btn_source.Enabled = true;
\r
1759 mnu_killCLI.Visible = false;
\r
1761 catch (Exception exc)
\r
1763 MessageBox.Show("frmMain.cs - enableGUI() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1766 private void killScan()
\r
1773 Process[] prs = Process.GetProcesses();
\r
1774 foreach (Process process in prs)
\r
1776 if (process.Id == scanProcessID)
\r
1778 process.Refresh();
\r
1779 if (!process.HasExited)
\r
1784 catch (Exception ex)
\r
1786 MessageBox.Show("Unable to kill HandBrakeCLI.exe \nYou may need to manually kill HandBrakeCLI.exe using the Windows Task Manager if it does not close automatically within the next few minutes. \n\nError Information: \n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1789 private void resetGUI()
\r
1791 drp_dvdtitle.Items.Clear();
\r
1792 drp_dvdtitle.Text = "Automatic";
\r
1793 drop_chapterStart.Items.Clear();
\r
1794 drop_chapterStart.Text = "Auto";
\r
1795 drop_chapterFinish.Items.Clear();
\r
1796 drop_chapterFinish.Text = "Auto";
\r
1797 lbl_duration.Text = "Select a Title";
\r
1798 lbl_src_res.Text = "Select a Title";
\r
1799 lbl_Aspect.Text = "Select a Title";
\r
1800 text_source.Text = "Click 'Source' to continue";
\r
1801 text_destination.Text = "";
\r
1803 selectedTitle = null;
\r
1809 /// Set the GUI to it's finished encoding state.
\r
1811 private void setEncodeFinished()
\r
1815 if (InvokeRequired)
\r
1817 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1821 lbl_encode.Text = "Encoding Finished";
\r
1822 btn_start.Text = "Start";
\r
1823 btn_start.ToolTipText = "Start the encoding process";
\r
1824 btn_start.Image = Properties.Resources.Play;
\r
1826 // If the window is minimized, display the notification in a popup.
\r
1827 if (FormWindowState.Minimized == this.WindowState)
\r
1829 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1830 notifyIcon.ShowBalloonTip(500);
\r
1833 catch (Exception exc)
\r
1835 MessageBox.Show(exc.ToString());
\r
1840 /// Set the GUI to it's started encoding state.
\r
1842 private void setEncodeStarted()
\r
1846 if (InvokeRequired)
\r
1848 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1852 lbl_encode.Visible = true;
\r
1853 lbl_encode.Text = "Encoding in Progress";
\r
1854 btn_start.Text = "Stop";
\r
1855 btn_start.ToolTipText = "Stop the encoding process. \nWarning: This may break your file. Press ctrl-c in the CLI window if you wish it to exit cleanly.";
\r
1856 btn_start.Image = Properties.Resources.stop;
\r
1858 catch (Exception exc)
\r
1860 MessageBox.Show(exc.ToString());
\r
1865 #region DVD Drive Detection
\r
1866 private delegate void ProgressUpdateHandler();
\r
1867 private void getDriveInfoThread()
\r
1871 if (InvokeRequired)
\r
1873 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1877 Boolean foundDrive = false;
\r
1878 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1879 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1881 if (curDrive.DriveType == DriveType.CDRom && curDrive.IsReady)
\r
1883 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1885 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1886 foundDrive = true;
\r
1892 if (foundDrive == false)
\r
1893 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1897 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1902 #region Audio Panel Code Helpers
\r
1903 private void setAudioByContainer(String path)
\r
1905 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1907 string oldval = drp_audenc_1.Text;
\r
1908 drp_audenc_1.Items.Clear();
\r
1909 drp_audenc_1.Items.Add("AAC (faac)");
\r
1910 drp_audenc_1.Items.Add("AC3 Passthru");
\r
1911 if ((oldval != "AAC (faac)") && (oldval != "AC3 Passthru"))
\r
1912 drp_audenc_1.SelectedIndex = 0;
\r
1915 else if (path.Contains("MKV"))
\r
1917 drp_audenc_1.Items.Clear();
\r
1918 drp_audenc_1.Items.Add("AAC (faac)");
\r
1919 drp_audenc_1.Items.Add("MP3 (lame)");
\r
1920 drp_audenc_1.Items.Add("AC3 Passthru");
\r
1921 drp_audenc_1.Items.Add("DTS Passthru");
\r
1922 drp_audenc_1.Items.Add("Vorbis (vorbis)");
\r
1924 if (drp_audenc_1.Text == string.Empty)
\r
1925 drp_audenc_1.SelectedIndex = 0;
\r
1928 // Make sure the table is updated with new audio codecs
\r
1929 foreach (ListViewItem row in lv_audioList.Items)
\r
1931 if (!drp_audenc_1.Items.Contains(row.SubItems[1].Text))
\r
1932 row.SubItems[1].Text = drp_audenc_1.Items[0].ToString();
\r
1935 private void setVideoByContainer(String path)
\r
1939 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1941 oldval = drp_videoEncoder.Text;
\r
1942 drp_videoEncoder.Items.Clear();
\r
1943 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1944 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1945 if (oldval == "VP3 (Theora)")
\r
1946 drp_videoEncoder.SelectedIndex = 1;
\r
1948 drp_videoEncoder.Text = oldval;
\r
1951 else if (path.Contains("MKV"))
\r
1953 oldval = drp_videoEncoder.Text;
\r
1954 drp_videoEncoder.Items.Clear();
\r
1955 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1956 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1957 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1958 drp_videoEncoder.Text = oldval;
\r
1961 private static void setBitrateSelections384(ComboBox dropDown)
\r
1963 dropDown.Items.Clear();
\r
1964 dropDown.Items.Add("32");
\r
1965 dropDown.Items.Add("40");
\r
1966 dropDown.Items.Add("48");
\r
1967 dropDown.Items.Add("56");
\r
1968 dropDown.Items.Add("64");
\r
1969 dropDown.Items.Add("80");
\r
1970 dropDown.Items.Add("86");
\r
1971 dropDown.Items.Add("112");
\r
1972 dropDown.Items.Add("128");
\r
1973 dropDown.Items.Add("160");
\r
1974 dropDown.Items.Add("192");
\r
1975 dropDown.Items.Add("224");
\r
1976 dropDown.Items.Add("256");
\r
1977 dropDown.Items.Add("320");
\r
1978 dropDown.Items.Add("384");
\r
1980 private static void setBitrateSelections320(ComboBox dropDown)
\r
1982 dropDown.Items.Clear();
\r
1983 dropDown.Items.Add("32");
\r
1984 dropDown.Items.Add("40");
\r
1985 dropDown.Items.Add("48");
\r
1986 dropDown.Items.Add("56");
\r
1987 dropDown.Items.Add("64");
\r
1988 dropDown.Items.Add("80");
\r
1989 dropDown.Items.Add("86");
\r
1990 dropDown.Items.Add("112");
\r
1991 dropDown.Items.Add("128");
\r
1992 dropDown.Items.Add("160");
\r
1993 dropDown.Items.Add("192");
\r
1994 dropDown.Items.Add("224");
\r
1995 dropDown.Items.Add("256");
\r
1996 dropDown.Items.Add("320");
\r
1998 private static void setBitrateSelections160(ComboBox dropDown)
\r
2000 dropDown.Items.Clear();
\r
2001 dropDown.Items.Add("32");
\r
2002 dropDown.Items.Add("40");
\r
2003 dropDown.Items.Add("48");
\r
2004 dropDown.Items.Add("56");
\r
2005 dropDown.Items.Add("64");
\r
2006 dropDown.Items.Add("80");
\r
2007 dropDown.Items.Add("86");
\r
2008 dropDown.Items.Add("112");
\r
2009 dropDown.Items.Add("128");
\r
2010 dropDown.Items.Add("160");
\r
2012 private static void setMixDownAllOptions(ComboBox dropdown)
\r
2014 dropdown.Items.Clear();
\r
2015 dropdown.Items.Add("Automatic");
\r
2016 dropdown.Items.Add("Mono");
\r
2017 dropdown.Items.Add("Stereo");
\r
2018 dropdown.Items.Add("Dolby Surround");
\r
2019 dropdown.Items.Add("Dolby Pro Logic II");
\r
2020 dropdown.Items.Add("6 Channel Discrete");
\r
2022 private static void setMixDownNotAAC(ComboBox dropdown)
\r
2024 dropdown.Items.Clear();
\r
2025 dropdown.Items.Add("Automatic");
\r
2026 dropdown.Items.Add("Stereo");
\r
2027 dropdown.Items.Add("Dolby Surround");
\r
2028 dropdown.Items.Add("Dolby Pro Logic II");
\r
2032 #region Public Methods
\r
2034 /// Access the preset Handler and setup the preset panel.
\r
2036 public void loadPresetPanel()
\r
2038 if (presetHandler.checkIfPresetsAreOutOfDate())
\r
2039 if (Properties.Settings.Default.presetNotification == "Unchecked")
\r
2041 "HandBrake has determined your built-in presets are out of date... These presets will now be updated.",
\r
2042 "Preset Update", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
2044 presetHandler.getPresetPanel(ref treeView_presets);
\r
2045 treeView_presets.Update();
\r
2049 /// Either Encode or Scan was last performed.
\r
2051 public string lastAction { get; set; }
\r
2056 /// If the queue is being processed, prompt the user to confirm application close.
\r
2058 /// <param name="e"></param>
\r
2059 protected override void OnFormClosing(FormClosingEventArgs e)
\r
2061 // If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.
\r
2062 if ((encodeQueue.isEncoding) && (!encodeQueue.isPaused) && (encodeQueue.count() > 0))
\r
2064 DialogResult result = MessageBox.Show("HandBrake has queue items to process. Closing HandBrake will not stop the current encoding, but will stop processing the queue.\n\nDo you want to close HandBrake?",
\r
2065 "Close HandBrake?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
2066 if (result == DialogResult.No)
\r
2069 base.OnFormClosing(e);
\r
2073 #region In-GUI Encode Status (Experimental)
\r
2074 private Process HBProcess { get; set; }
\r
2076 private void encodeMonitorThread()
\r
2080 Parser encode = new Parser(HBProcess.StandardOutput.BaseStream);
\r
2081 encode.OnEncodeProgress += encode_OnEncodeProgress;
\r
2082 while (!encode.EndOfStream)
\r
2084 encode.readEncodeStatus();
\r
2087 catch (Exception exc)
\r
2089 MessageBox.Show(exc.ToString());
\r
2093 private void encode_OnEncodeProgress(object Sender, int CurrentTask, int TaskCount, float PercentComplete, float CurrentFps, float AverageFps, TimeSpan TimeRemaining)
\r
2095 if (this.InvokeRequired)
\r
2097 this.BeginInvoke(new EncodeProgressEventHandler(encode_OnEncodeProgress),
\r
2098 new object[] { Sender, CurrentTask, TaskCount, PercentComplete, CurrentFps, AverageFps, TimeRemaining });
\r
2101 lbl_encode.Text = string.Format("Encode Progress: {0}%, FPS: {1}, Avg FPS: {2}, Time Remaining: {3} ", PercentComplete, CurrentFps, AverageFps, TimeRemaining);
\r
2106 // This is the END of the road ****************************************
\r