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;
\r
9 using System.Collections.Generic;
\r
10 using System.Drawing;
\r
11 using System.Windows.Forms;
\r
13 using System.Diagnostics;
\r
14 using System.Threading;
\r
15 using Handbrake.Functions;
\r
19 public partial class frmMain : Form
\r
21 // Objects which may be used by one or more other objects
\r
22 private delegate void UpdateWindowHandler();
\r
23 Main hb_common_func = new Main();
\r
24 Encode encodeHandler = new Encode();
\r
25 Queue.QueueHandler encodeQueue = new Queue.QueueHandler();
\r
26 Presets.PresetsHandler presetHandler = new Presets.PresetsHandler();
\r
27 Parsing.Title selectedTitle;
\r
28 Parsing.DVD thisDVD;
\r
30 // Objects belonging to this window only
\r
31 PresetLoader presetLoader = new PresetLoader();
\r
32 x264Panel x264PanelFunctions = new x264Panel();
\r
33 QueryGenerator queryGen = new QueryGenerator();
\r
35 // Globals: Mainly used for tracking.
\r
36 private frmQueue queueWindow;
\r
37 private frmGenPreview vlcpreview;
\r
38 private frmPreview qtpreview;
\r
39 private string lastAction;
\r
40 public int maxWidth;
\r
41 public int maxHeight;
\r
44 // Applicaiton Startup ************************************************
\r
46 #region Application Startup
\r
50 // Load the splash screen in this thread
\r
51 Form splash = new frmSplashScreen();
\r
54 //Create a label that can be updated from the parent thread.
\r
55 Label lblStatus = new Label();
\r
56 lblStatus.Size = new Size(250, 20);
\r
57 lblStatus.Location = new Point(10, 280);
\r
58 splash.Controls.Add(lblStatus);
\r
59 InitializeComponent();
\r
61 // Update the users config file with the CLI version data.
\r
62 lblStatus.Text = "Setting Version Data ...";
\r
63 Application.DoEvents();
\r
64 ArrayList x = hb_common_func.getCliVersionData();
\r
65 Properties.Settings.Default.hb_build = int.Parse(x[1].ToString());
\r
66 Properties.Settings.Default.hb_version = x[0].ToString();
\r
68 // show the form, but leave disabled until preloading is complete then show the main form
\r
69 this.Enabled = false;
\r
71 Application.DoEvents(); // Forces frmMain to draw
\r
73 // update the status
\r
74 if (Properties.Settings.Default.updateStatus == "Checked")
\r
76 lblStatus.Text = "Checking for updates ...";
\r
77 Application.DoEvents();
\r
78 Thread updateCheckThread = new Thread(startupUpdateCheck);
\r
79 updateCheckThread.Start();
\r
82 // Setup the GUI components
\r
83 lblStatus.Text = "Setting up the GUI ...";
\r
84 Application.DoEvents();
\r
85 x264PanelFunctions.reset2Defaults(this); // Initialize all the x264 widgets to their default values
\r
86 loadPresetPanel(); // Load the Preset Panel
\r
87 treeView_presets.ExpandAll();
\r
88 lbl_encode.Text = "";
\r
89 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
90 if (Properties.Settings.Default.QueryEditorTab != "Checked")
\r
91 tabs_panel.TabPages.RemoveAt(5); // Remove the query editor tab if the user does not want it enabled.
\r
93 // Load the user's default settings or Normal Preset
\r
94 if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")
\r
96 // Ok, so, we've selected a preset. Now we want to load it.
\r
97 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
99 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
100 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
104 //Ok, Reset all the H264 widgets before changing the preset
\r
105 x264PanelFunctions.reset2Defaults(this);
\r
107 // Send the query from the file to the Query Parser class, then load the preset
\r
108 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
109 presetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
111 // The x264 widgets will need updated, so do this now:
\r
112 x264PanelFunctions.X264_StandardizeOptString(this);
\r
113 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
117 loadNormalPreset();
\r
120 loadNormalPreset();
\r
122 // Enabled GUI tooltip's if Required
\r
123 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
124 ToolTip.Active = true;
\r
127 lblStatus.Text = "Loading Complete!";
\r
128 Application.DoEvents();
\r
131 this.Enabled = true;
\r
140 // Startup Functions
\r
141 private delegate void updateStatusChanger();
\r
142 private void startupUpdateCheck()
\r
146 if (InvokeRequired)
\r
148 BeginInvoke(new updateStatusChanger(startupUpdateCheck));
\r
152 Boolean update = hb_common_func.updateCheck(false);
\r
155 frmUpdater updateWindow = new frmUpdater();
\r
156 updateWindow.Show();
\r
159 catch (Exception) { /* Do Nothing*/ }
\r
161 private void queueRecovery()
\r
163 if (hb_common_func.check_queue_recovery())
\r
165 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
167 if (result == DialogResult.Yes)
\r
168 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
171 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
172 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
173 if (File.Exists(queuePath))
\r
174 File.Delete(queuePath);
\r
181 // Encoding Events for setting up the GUI
\r
182 private void events()
\r
184 // Handle Window Resize
\r
185 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
186 this.Resize += new EventHandler(frmMain_Resize);
\r
188 // Handle Encode Start
\r
189 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
190 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
191 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
193 private void encodeStarted(object sender, EventArgs e)
\r
195 setLastAction("encode");
\r
196 setEncodeStarted();
\r
198 private void encodeEnded(object sender, EventArgs e)
\r
200 setEncodeFinished();
\r
202 private void encodePaused(object sender, EventArgs e)
\r
204 setEncodeFinished();
\r
208 // User Interface Menus / Tool Strips *********************************
\r
211 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
215 private void mnu_exit_Click(object sender, EventArgs e)
\r
217 Application.Exit();
\r
222 private void mnu_encode_Click(object sender, EventArgs e)
\r
224 queueWindow.setQueue();
\r
225 queueWindow.Show();
\r
227 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
230 if (lastAction == "scan")
\r
231 file = "dvdinfo.dat";
\r
233 file = "hb_encode_log.dat";
\r
235 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeHandler);
\r
236 dvdInfoWindow.Show();
\r
238 private void mnu_options_Click(object sender, EventArgs e)
\r
240 Form Options = new frmOptions();
\r
241 Options.ShowDialog();
\r
245 #region Presets Menu
\r
246 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
248 presetHandler.updateBuiltInPresets();
\r
250 if (treeView_presets.Nodes.Count == 0)
\r
251 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
253 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
255 treeView_presets.ExpandAll();
\r
257 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
259 // Empty the preset file
\r
260 string presetsFile = Application.StartupPath + "\\presets.xml";
\r
261 if (File.Exists(presetsFile))
\r
262 File.Delete(presetsFile);
\r
266 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
270 catch (Exception exc)
\r
272 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
275 // Reload the preset panel
\r
278 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
280 loadNormalPreset();
\r
282 private void btn_new_preset_Click(object sender, EventArgs e)
\r
284 // Remember each nodes expanded status so we can reload it
\r
285 List<Boolean> nodeStatus = saveTreeViewState();
\r
286 nodeStatus.Add(true);
\r
288 Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);
\r
289 preset.ShowDialog();
\r
291 // Now reload the TreeView states
\r
292 loadTreeViewStates(nodeStatus);
\r
297 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
299 Process.Start("http://forum.handbrake.fr/");
\r
301 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
303 Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
305 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
307 Process.Start("http://handbrake.fr");
\r
309 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
311 Boolean update = hb_common_func.updateCheck(true);
\r
312 if (update == true)
\r
314 frmUpdater updateWindow = new frmUpdater();
\r
315 updateWindow.Show();
\r
318 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
320 private void mnu_about_Click(object sender, EventArgs e)
\r
322 Form About = new frmAbout();
\r
323 About.ShowDialog();
\r
328 private void mnu_qptest_Click(object sender, EventArgs e)
\r
330 QueryParserTester qptest = new QueryParserTester();
\r
336 // Right Click Menu Code
\r
337 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
339 treeView_presets.ExpandAll();
\r
341 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
343 treeView_presets.CollapseAll();
\r
345 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
347 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
348 if (result == DialogResult.Yes)
\r
349 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);
\r
350 else if (result == DialogResult.No)
\r
351 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);
\r
353 private void pmnu_delete_click(object sender, EventArgs e)
\r
355 if (treeView_presets.SelectedNode != null)
\r
357 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
359 // Remember each nodes expanded status so we can reload it
\r
360 List<Boolean> nodeStatus = saveTreeViewState();
\r
362 // Now reload the preset panel
\r
365 // Now reload the TreeView states
\r
366 loadTreeViewStates(nodeStatus);
\r
368 treeView_presets.Select();
\r
370 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
372 // Make sure that the save menu is always disabled by default
\r
373 pmnu_saveChanges.Enabled = false;
\r
375 // Now enable the save menu if the selected preset is a user preset
\r
376 if (treeView_presets.SelectedNode != null)
\r
378 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
380 pmnu_saveChanges.Enabled = true;
\r
383 treeView_presets.Select();
\r
386 // Presets Management
\r
387 private void btn_addPreset_Click(object sender, EventArgs e)
\r
389 // Remember each nodes expanded status so we can reload it
\r
390 List<Boolean> nodeStatus = saveTreeViewState();
\r
391 nodeStatus.Add(true);
\r
393 // Now add the new preset
\r
394 Form preset = new frmAddPreset(this, queryGen.generateTabbedComponentsQuery(this), presetHandler);
\r
395 preset.ShowDialog();
\r
397 // Now reload the TreeView states
\r
398 loadTreeViewStates(nodeStatus);
\r
400 private void btn_removePreset_Click(object sender, EventArgs e)
\r
402 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
403 if (result == DialogResult.Yes)
\r
405 if (treeView_presets.SelectedNode != null)
\r
406 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
408 // Remember each nodes expanded status so we can reload it
\r
409 List<Boolean> nodeStatus = saveTreeViewState();
\r
411 // Now reload the preset panel
\r
414 // Now reload the TreeView states
\r
415 loadTreeViewStates(nodeStatus);
\r
417 treeView_presets.Select();
\r
419 private void btn_setDefault_Click(object sender, EventArgs e)
\r
421 if (treeView_presets.SelectedNode != null)
\r
423 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
424 Properties.Settings.Default.Save();
\r
425 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
428 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
430 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
432 if (e.Button == MouseButtons.Right)
\r
433 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
434 else if (e.Button == MouseButtons.Left)
\r
436 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
438 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
443 treeView_presets.Select();
\r
445 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
449 private void selectPreset()
\r
451 if (treeView_presets.SelectedNode != null)
\r
453 // Ok, so, we've selected a preset. Now we want to load it.
\r
454 string presetName = treeView_presets.SelectedNode.Text;
\r
455 if (presetHandler.getPreset(presetName) != null)
\r
457 string query = presetHandler.getPreset(presetName).Query;
\r
458 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
462 //Ok, Reset all the H264 widgets before changing the preset
\r
463 x264PanelFunctions.reset2Defaults(this);
\r
465 // Send the query from the file to the Query Parser class
\r
466 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
468 // Now load the preset
\r
469 presetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
471 // The x264 widgets will need updated, so do this now:
\r
472 x264PanelFunctions.X264_StandardizeOptString(this);
\r
473 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
478 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
480 if (e.KeyCode == Keys.Delete)
\r
482 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
483 if (result == DialogResult.Yes)
\r
485 if (treeView_presets.SelectedNode != null)
\r
486 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
488 // Remember each nodes expanded status so we can reload it
\r
489 List<Boolean> nodeStatus = new List<Boolean>();
\r
490 foreach (TreeNode node in treeView_presets.Nodes)
\r
491 nodeStatus.Add(node.IsExpanded);
\r
493 // Now reload the preset panel
\r
496 // And finally, re-expand any of the nodes if required
\r
498 foreach (TreeNode node in treeView_presets.Nodes)
\r
508 private List<Boolean> saveTreeViewState()
\r
510 // Remember each nodes expanded status so we can reload it
\r
511 List<Boolean> nodeStatus = new List<Boolean>();
\r
512 foreach (TreeNode node in treeView_presets.Nodes)
\r
514 nodeStatus.Add(node.IsExpanded);
\r
515 foreach (TreeNode subNode in node.Nodes)
\r
516 nodeStatus.Add(node.IsExpanded);
\r
520 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
522 // And finally, re-expand any of the nodes if required
\r
524 foreach (TreeNode node in treeView_presets.Nodes)
\r
529 foreach (TreeNode subNode in node.Nodes)
\r
538 private void loadNormalPreset()
\r
540 treeView_presets.Nodes.Find("Normal", true);
\r
542 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
544 foreach (TreeNode node in treenode.Nodes)
\r
546 if (node.Text.Equals("Normal"))
\r
547 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
554 private void btn_source_Click(object sender, EventArgs e)
\r
556 if (Properties.Settings.Default.drive_detection == "Checked")
\r
558 mnu_dvd_drive.Visible = true;
\r
559 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
560 driveInfoThread.Start();
\r
563 mnu_dvd_drive.Visible = false;
\r
565 private void btn_start_Click(object sender, EventArgs e)
\r
567 if (btn_start.Text == "Stop")
\r
569 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
571 if (result == DialogResult.Yes)
\r
574 encodeQueue.pauseEncode();
\r
576 // Kill the current process.
\r
577 Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");
\r
578 Process HandBrakeCLI;
\r
579 if (aProc.Length > 0)
\r
581 HandBrakeCLI = aProc[0];
\r
582 HandBrakeCLI.Kill();
\r
586 setEncodeFinished();
\r
591 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
593 // Set the last action to encode.
\r
594 // This is used for tracking which file to load in the activity window
\r
595 lastAction = "encode";
\r
597 String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateTheQuery(this);
\r
599 if (encodeQueue.count() == 0)
\r
601 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
602 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
604 queueWindow.setQueue();
\r
605 if (encodeQueue.count() > 1)
\r
606 queueWindow.Show();
\r
608 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
609 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
612 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
613 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
617 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
619 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
620 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
623 String query = queryGen.GenerateTheQuery(this);
\r
624 if (rtf_query.Text != "")
\r
625 query = rtf_query.Text;
\r
627 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
628 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
630 queueWindow.setQueue();
\r
631 queueWindow.Show();
\r
634 private void btn_showQueue_Click(object sender, EventArgs e)
\r
636 queueWindow.setQueue();
\r
637 queueWindow.Show();
\r
639 private void mnu_vlcpreview_Click(object sender, EventArgs e)
\r
641 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
642 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
645 if (vlcpreview == null)
\r
647 vlcpreview = new frmGenPreview(this);
\r
650 else if (vlcpreview.IsDisposed)
\r
652 vlcpreview = new frmGenPreview(this);
\r
656 MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
659 private void mnu_qtpreview_Click(object sender, EventArgs e)
\r
661 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
662 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
665 if (qtpreview == null)
\r
667 qtpreview = new frmPreview(this);
\r
670 else if (qtpreview.IsDisposed)
\r
672 qtpreview = new frmPreview(this);
\r
676 MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
679 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
681 String file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
683 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);
\r
684 ActivityWindow.Show();
\r
688 #region System Tray Icon
\r
689 private void frmMain_Resize(object sender, EventArgs e)
\r
691 if (FormWindowState.Minimized == this.WindowState)
\r
693 notifyIcon.Visible = true;
\r
694 notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";
\r
695 notifyIcon.ShowBalloonTip(500);
\r
698 else if (FormWindowState.Normal == this.WindowState)
\r
699 notifyIcon.Visible = false;
\r
701 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
703 this.Visible = true;
\r
705 this.WindowState = FormWindowState.Normal;
\r
706 notifyIcon.Visible = false;
\r
708 private void btn_restore_Click(object sender, EventArgs e)
\r
710 this.Visible = true;
\r
712 this.WindowState = FormWindowState.Normal;
\r
713 notifyIcon.Visible = false;
\r
717 #region Tab Control
\r
720 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
722 // Enable the creation of chapter markers.
\r
723 Check_ChapterMarkers.Enabled = true;
\r
725 // Set the last action to scan.
\r
726 // This is used for tracking which file to load in the activity window
\r
727 lastAction = "scan";
\r
730 text_source.Text = "";
\r
732 DVD_Open.ShowDialog();
\r
733 filename = DVD_Open.SelectedPath;
\r
735 if (filename.StartsWith("\\"))
\r
736 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
739 if (filename != "")
\r
741 setupGUIforScan(filename);
\r
742 startScan(filename);
\r
745 text_source.Text = "Click 'Source' to continue";
\r
748 private void btn_file_source_Click(object sender, EventArgs e)
\r
750 // Set the last action to scan.
\r
751 // This is used for tracking which file to load in the activity window
\r
752 lastAction = "scan";
\r
755 text_source.Text = "";
\r
757 ISO_Open.ShowDialog();
\r
758 filename = ISO_Open.FileName;
\r
760 if (filename.StartsWith("\\"))
\r
761 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
764 if (filename != "")
\r
766 setupGUIforScan(filename);
\r
767 startScan(filename);
\r
770 text_source.Text = "Click 'Source' to continue";
\r
773 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
775 // Enable the creation of chapter markers.
\r
776 Check_ChapterMarkers.Enabled = true;
\r
778 // Set the last action to scan.
\r
779 // This is used for tracking which file to load in the activity window
\r
780 lastAction = "scan";
\r
782 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
784 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
785 String filename = path[0];
\r
786 setupGUIforScan(filename);
\r
787 startScan(filename);
\r
790 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
791 if (drp_dvdtitle.Items.Count == 0)
\r
792 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
794 lbl_encode.Text = "";
\r
796 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
798 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
799 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
801 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
803 // Reset some values on the form
\r
804 lbl_Aspect.Text = "Select a Title";
\r
805 //lbl_RecomendedCrop.Text = "Select a Title";
\r
806 drop_chapterStart.Items.Clear();
\r
807 drop_chapterFinish.Items.Clear();
\r
809 // If the dropdown is set to automatic nothing else needs to be done.
\r
810 // Otheriwse if its not, title data has to be loased from parsing.
\r
811 if (drp_dvdtitle.Text != "Automatic")
\r
813 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
815 // Set the Aspect Ratio
\r
816 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();
\r
817 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;
\r
818 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
820 // Set the Recommended Cropping values
\r
821 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
822 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
823 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
824 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
826 // Populate the Start chapter Dropdown
\r
827 drop_chapterStart.Items.Clear();
\r
828 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
829 if (drop_chapterStart.Items.Count > 0)
\r
830 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
832 // Populate the Final Chapter Dropdown
\r
833 drop_chapterFinish.Items.Clear();
\r
834 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
835 if (drop_chapterFinish.Items.Count > 0)
\r
836 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
838 // Populate the Audio Channels Dropdown
\r
839 drp_track1Audio.Items.Clear();
\r
840 drp_track1Audio.Items.Add("Automatic");
\r
841 drp_track1Audio.Items.Add("None");
\r
842 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());
\r
843 drp_track1Audio.SelectedIndex = 0;
\r
845 // Populate the Subtitles dropdown
\r
846 drp_subtitle.Items.Clear();
\r
847 drp_subtitle.Items.Add("None");
\r
848 drp_subtitle.Items.Add("Autoselect");
\r
849 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
850 if (drp_subtitle.Items.Count > 0)
\r
851 drp_subtitle.Text = drp_subtitle.Items[0].ToString();
\r
855 // Run the autoName & chapterNaming functions
\r
856 if (Properties.Settings.Default.autoNaming == "Checked")
\r
857 text_destination.Text = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
859 data_chpt.Rows.Clear();
\r
860 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
861 if (chapterGridView != null)
\r
862 data_chpt = chapterGridView;
\r
864 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
865 data_chpt.Columns[0].Width = 166;
\r
866 data_chpt.Columns[0].Width = 165;
\r
868 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
870 int c_start, c_end;
\r
872 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
873 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
875 int.TryParse(drop_chapterStart.Text, out c_start);
\r
876 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
880 if (c_start > c_end)
\r
881 drop_chapterFinish.Text = c_start.ToString();
\r
884 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
886 // Run the Autonaming function
\r
887 if (Properties.Settings.Default.autoNaming == "Checked")
\r
888 text_destination.Text = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
891 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
893 int c_start, c_end;
\r
895 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
896 drop_chapterStart.SelectedIndex = 1;
\r
898 int.TryParse(drop_chapterStart.Text, out c_start);
\r
899 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
903 if (c_end < c_start)
\r
904 drop_chapterFinish.Text = c_start.ToString();
\r
907 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
909 // Run the Autonaming function
\r
910 if (Properties.Settings.Default.autoNaming == "Checked")
\r
911 text_destination.Text = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
913 // Add more rows to the Chapter menu if needed.
\r
914 if (Check_ChapterMarkers.Checked)
\r
916 int i = data_chpt.Rows.Count, finish = 0;
\r
918 if (drop_chapterFinish.Text != "Auto")
\r
919 int.TryParse(drop_chapterFinish.Text, out finish);
\r
923 int n = data_chpt.Rows.Add();
\r
924 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
925 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
926 data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
\r
927 data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
\r
934 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
936 // This removes the file extension from the filename box on the save file dialog.
\r
937 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
938 DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");
\r
940 // Show the dialog and set the main form file path
\r
941 if (drop_format.SelectedIndex.Equals(0))
\r
942 DVD_Save.FilterIndex = 1;
\r
943 else if (drop_format.SelectedIndex.Equals(1))
\r
944 DVD_Save.FilterIndex = 2;
\r
945 else if (drop_format.SelectedIndex.Equals(2))
\r
946 DVD_Save.FilterIndex = 3;
\r
947 else if (drop_format.SelectedIndex.Equals(3))
\r
948 DVD_Save.FilterIndex = 4;
\r
949 else if (drop_format.SelectedIndex.Equals(4))
\r
950 DVD_Save.FilterIndex = 5;
\r
952 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
954 if (DVD_Save.FileName.StartsWith("\\"))
\r
955 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
958 setAudioByContainer(DVD_Save.FileName);
\r
959 text_destination.Text = DVD_Save.FileName;
\r
961 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
962 if (Check_ChapterMarkers.Checked)
\r
963 text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");
\r
967 private void text_destination_TextChanged(object sender, EventArgs e)
\r
969 string path = text_destination.Text;
\r
970 if (path.EndsWith(".mp4"))
\r
971 drop_format.SelectedIndex = 0;
\r
972 else if (path.EndsWith(".m4v"))
\r
973 drop_format.SelectedIndex = 1;
\r
974 else if (path.EndsWith(".mkv"))
\r
975 drop_format.SelectedIndex = 2;
\r
976 else if (path.EndsWith(".avi"))
\r
977 drop_format.SelectedIndex = 3;
\r
978 else if (path.EndsWith(".ogm"))
\r
979 drop_format.SelectedIndex = 4;
\r
984 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
986 if (drop_format.SelectedIndex == 0)
\r
987 setExtension(".mp4");
\r
988 else if (drop_format.SelectedIndex == 1)
\r
989 setExtension(".m4v");
\r
990 else if (drop_format.SelectedIndex == 2)
\r
991 setExtension(".mkv");
\r
992 else if (drop_format.SelectedIndex == 3)
\r
993 setExtension(".avi");
\r
994 else if (drop_format.SelectedIndex == 4)
\r
995 setExtension(".ogm");
\r
997 setAudioByContainer(drop_format.Text);
\r
998 setVideoByContainer(drop_format.Text);
\r
1000 private void setExtension(string newExtension)
\r
1002 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
1003 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
1004 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
1005 text_destination.Text = text_destination.Text.Replace(".avi", newExtension);
\r
1006 text_destination.Text = text_destination.Text.Replace(".ogm", newExtension);
\r
1010 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1012 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1014 check_largeFile.Enabled = true;
\r
1015 check_optimiseMP4.Enabled = true;
\r
1016 check_iPodAtom.Enabled = true;
\r
1020 check_largeFile.Enabled = false;
\r
1021 check_optimiseMP4.Enabled = false;
\r
1022 check_iPodAtom.Enabled = false;
\r
1023 check_largeFile.Checked = false;
\r
1024 check_optimiseMP4.Checked = false;
\r
1025 check_iPodAtom.Checked = false;
\r
1028 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1029 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1031 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1032 check_turbo.Enabled = true;
\r
1034 h264Tab.Enabled = true;
\r
1035 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1036 check_iPodAtom.Enabled = true;
\r
1038 check_iPodAtom.Enabled = false;
\r
1042 check_turbo.CheckState = CheckState.Unchecked;
\r
1043 check_turbo.Enabled = false;
\r
1044 h264Tab.Enabled = false;
\r
1045 rtf_x264Query.Text = "";
\r
1046 check_iPodAtom.Enabled = false;
\r
1047 check_iPodAtom.Checked = false;
\r
1050 // Setup the CQ Slider
\r
1051 switch (drp_videoEncoder.Text)
\r
1053 case "MPEG-4 (FFmpeg)":
\r
1054 slider_videoQuality.Minimum = 1;
\r
1055 slider_videoQuality.Maximum = 31;
\r
1056 slider_videoQuality.Value = 1;
\r
1057 SliderValue.Text = "0% QP: 31.00";
\r
1059 case "MPEG-4 (XviD)":
\r
1060 slider_videoQuality.Minimum = 1;
\r
1061 slider_videoQuality.Maximum = 31;
\r
1062 slider_videoQuality.Value = 1;
\r
1063 SliderValue.Text = "0% QP: 31.00";
\r
1065 case "H.264 (x264)":
\r
1066 slider_videoQuality.Minimum = 0;
\r
1068 double.TryParse(Properties.Settings.Default.x264cqstep, out tickFreq);
\r
1069 tickFreq = 1/tickFreq;
\r
1071 int.TryParse(Math.Round(tickFreq).ToString(), out freq);
\r
1072 slider_videoQuality.Maximum = (51 * freq);
\r
1073 slider_videoQuality.TickFrequency = 1;
\r
1074 slider_videoQuality.Value = 0;
\r
1075 SliderValue.Text = "0% RF: 51.00";
\r
1077 case "VP3 (Theora)":
\r
1078 slider_videoQuality.Minimum = 0;
\r
1079 slider_videoQuality.Maximum = 63;
\r
1080 slider_videoQuality.Value = 0;
\r
1081 SliderValue.Text = "0% QP: 0.00";
\r
1086 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1088 switch (drp_videoEncoder.Text)
\r
1090 case "MPEG-4 (FFmpeg)":
\r
1091 float rfValue = 31 - (slider_videoQuality.Value -1);
\r
1092 float max = slider_videoQuality.Maximum;
\r
1093 float min = slider_videoQuality.Minimum;
\r
1094 float val = ((max - min) - (rfValue - min)) / (max - min);
\r
1095 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1097 case "MPEG-4 (XviD)":
\r
1098 rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1099 max = slider_videoQuality.Maximum;
\r
1100 min = slider_videoQuality.Minimum;
\r
1101 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1102 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1104 case "H.264 (x264)":
\r
1106 float.TryParse(Properties.Settings.Default.x264cqstep, out divided);
\r
1107 rfValue = 51 - slider_videoQuality.Value*divided;
\r
1108 max = slider_videoQuality.Maximum * divided;
\r
1109 min = slider_videoQuality.Minimum;
\r
1110 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1111 SliderValue.Text = Math.Round((val * 100), 2) + "% RF:" + (51 - slider_videoQuality.Value * divided);
\r
1113 case "VP3 (Theora)":
\r
1114 rfValue = slider_videoQuality.Value;
\r
1115 float value = rfValue/63;
\r
1116 SliderValue.Text = Math.Round((value * 100), 2) + "% QP:" + slider_videoQuality.Value;
\r
1120 private void radio_targetFilesize_CheckedChanged(object sender, EventArgs e)
\r
1122 text_bitrate.Enabled = false;
\r
1123 text_filesize.Enabled = true;
\r
1124 slider_videoQuality.Enabled = false;
\r
1126 check_2PassEncode.Enabled = true;
\r
1128 private void radio_avgBitrate_CheckedChanged(object sender, EventArgs e)
\r
1130 text_bitrate.Enabled = true;
\r
1131 text_filesize.Enabled = false;
\r
1132 slider_videoQuality.Enabled = false;
\r
1134 check_2PassEncode.Enabled = true;
\r
1136 private void radio_cq_CheckedChanged(object sender, EventArgs e)
\r
1138 text_bitrate.Enabled = false;
\r
1139 text_filesize.Enabled = false;
\r
1140 slider_videoQuality.Enabled = true;
\r
1142 check_2PassEncode.Enabled = false;
\r
1143 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1145 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1147 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1149 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1150 check_turbo.Enabled = true;
\r
1154 check_turbo.Enabled = false;
\r
1155 check_turbo.CheckState = CheckState.Unchecked;
\r
1160 private void text_width_TextChanged(object sender, EventArgs e)
\r
1162 if (text_width.Text == "")
\r
1163 text_width.BackColor = Color.White;
\r
1165 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
1168 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1171 text_width.BackColor = (width % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1173 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1175 if (drp_anamorphic.Text == "None")
\r
1177 int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1179 text_height.Text = height.ToString();
\r
1184 private void text_height_TextChanged(object sender, EventArgs e)
\r
1186 if (text_height.Text == "")
\r
1187 text_height.BackColor = Color.White;
\r
1189 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1192 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1194 text_height.BackColor = (height % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1196 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1198 text_left.Enabled = true;
\r
1199 text_right.Enabled = true;
\r
1200 text_top.Enabled = true;
\r
1201 text_bottom.Enabled = true;
\r
1202 if (selectedTitle != null)
\r
1204 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1205 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1206 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1207 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1211 text_left.Text = "0";
\r
1212 text_right.Text = "0";
\r
1213 text_top.Text = "0";
\r
1214 text_bottom.Text = "0";
\r
1217 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1219 text_left.Enabled = false;
\r
1220 text_right.Enabled = false;
\r
1221 text_top.Enabled = false;
\r
1222 text_bottom.Enabled = false;
\r
1224 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1226 if (drp_anamorphic.SelectedIndex == 1)
\r
1228 text_height.BackColor = Color.LightGray;
\r
1229 text_width.BackColor = Color.LightGray;
\r
1230 text_height.Text = "";
\r
1231 text_width.Text = "";
\r
1232 text_height.Enabled = false;
\r
1233 text_width.Enabled = false;
\r
1236 if (drp_anamorphic.SelectedIndex == 2)
\r
1238 text_height.Text = "";
\r
1239 text_height.Enabled = false;
\r
1240 text_height.BackColor = Color.LightGray;
\r
1242 text_width.Enabled = true;
\r
1243 text_width.BackColor = Color.White;
\r
1246 if (drp_anamorphic.SelectedIndex == 0)
\r
1248 text_height.BackColor = Color.White;
\r
1249 text_width.BackColor = Color.White;
\r
1250 text_height.Enabled = true;
\r
1251 text_width.Enabled = true;
\r
1256 private void ctl_decomb_changed(object sender, EventArgs e)
\r
1258 if (ctl_decomb.getDropValue != "Off")
\r
1259 if (ctl_deinterlace.getDropValue != "None")
\r
1260 ctl_deinterlace.setOption("None");
\r
1262 private void ctl_deinterlace_changed(object sender, EventArgs e)
\r
1264 if (ctl_detelecine.getDropValue != "None")
\r
1265 if (ctl_decomb.getDropValue != "Off")
\r
1266 ctl_decomb.setOption("Off");
\r
1268 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1270 lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
\r
1274 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1276 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1278 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1279 lv_audioList.Select();
\r
1282 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1284 if (drp_audenc_1.Text == "AC3")
\r
1286 drp_audmix_1.Enabled = false;
\r
1287 drp_audbit_1.Enabled = false;
\r
1288 drp_audsr_1.Enabled = false;
\r
1290 drp_audmix_1.SelectedIndex = 0;
\r
1291 drp_audbit_1.SelectedIndex = 0;
\r
1292 drp_audsr_1.SelectedIndex = 0;
\r
1296 drp_audmix_1.Enabled = true;
\r
1297 drp_audbit_1.Enabled = true;
\r
1298 drp_audsr_1.Enabled = true;
\r
1300 drp_audmix_1.Text = "Automatic";
\r
1301 drp_audbit_1.Text = "160";
\r
1302 drp_audsr_1.Text = "Auto";
\r
1305 if (drp_audenc_1.Text == "AAC")
\r
1307 setMixDownAllOptions(drp_audmix_1);
\r
1308 setBitrateSelections160(drp_audbit_1);
\r
1312 setMixDownNotAAC(drp_audmix_1);
\r
1313 setBitrateSelections320(drp_audbit_1);
\r
1316 // Update an item in the Audio list if required.
\r
1317 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1319 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1320 lv_audioList.Select();
\r
1323 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1325 if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1326 setBitrateSelections384(drp_audbit_1);
\r
1327 else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1328 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\r
1330 // Update an item in the Audio list if required.
\r
1331 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1333 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;
\r
1334 lv_audioList.Select();
\r
1337 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1339 // Update an item in the Audio list if required.
\r
1340 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1342 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1343 lv_audioList.Select();
\r
1346 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1348 // Update an item in the Audio list if required.
\r
1349 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1351 if (drp_audenc_1.Text == "AC3")
\r
1352 drp_audbit_1.Text = "Auto";
\r
1353 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1354 lv_audioList.Select();
\r
1357 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1360 if (tb_drc.Value == 0) value = 0;
\r
1362 value = ((tb_drc.Value-1) / 10.0) + 1;
\r
1364 lbl_drc.Text = value.ToString();
\r
1366 // Update an item in the Audio list if required.
\r
1367 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1369 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;
\r
1370 lv_audioList.Select();
\r
1374 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1376 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1377 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1378 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1379 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1380 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1381 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1382 newTrack.SubItems.Add(lbl_drc.Text);
\r
1384 // Select the newly added track and select the control
\r
1385 lv_audioList.Items.Add(newTrack);
\r
1386 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1387 lv_audioList.Select();
\r
1389 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1391 removeAudioTrack();
\r
1393 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1395 if (lv_audioList.SelectedIndices.Count != 0)
\r
1397 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1398 int index = item.Index;
\r
1401 if (lv_audioList.Items.Count > index && index >= 0)
\r
1403 lv_audioList.Items.Remove(item);
\r
1404 lv_audioList.Items.Insert(index, item);
\r
1405 item.Selected = true;
\r
1406 lv_audioList.Focus();
\r
1410 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1412 if (lv_audioList.SelectedIndices.Count != 0)
\r
1414 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1415 int index = item.Index;
\r
1418 if (index < lv_audioList.Items.Count)
\r
1420 lv_audioList.Items.Remove(item);
\r
1421 lv_audioList.Items.Insert(index, item);
\r
1422 item.Selected = true;
\r
1423 lv_audioList.Focus();
\r
1429 private void audioList_remove_Click(object sender, EventArgs e)
\r
1431 removeAudioTrack();
\r
1433 private void removeAudioTrack()
\r
1435 // Remove the Item and reselect the control if the following conditions are met.
\r
1436 if (lv_audioList.SelectedItems.Count != 0)
\r
1438 // Record the current selected index.
\r
1439 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1441 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1443 // Now reslect the correct item and give focus to the audio list.
\r
1444 if (lv_audioList.Items.Count != 0)
\r
1446 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1447 lv_audioList.Items[currentPosition].Selected = true;
\r
1448 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1449 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1451 lv_audioList.Select();
\r
1456 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1458 // Set the dropdown controls based on the selected item in the Audio List.
\r
1459 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1461 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1462 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1463 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1464 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1465 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1466 double drcValue; int drcCalculated;
\r
1467 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1468 if (drcValue == 0) drcCalculated = 0;
\r
1470 drcValue = ((drcValue * 10)+1) -10;
\r
1471 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1472 tb_drc.Value = drcCalculated;
\r
1476 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1478 if (drp_subtitle.Text.Contains("None"))
\r
1480 check_forced.Enabled = false;
\r
1481 check_forced.Checked = false;
\r
1484 check_forced.Enabled = true;
\r
1487 // Chapter Marker Tab
\r
1488 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1490 if (Check_ChapterMarkers.Checked)
\r
1492 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1493 data_chpt.Rows.Clear();
\r
1494 data_chpt.Enabled = true;
\r
1495 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1496 if (chapterGridView != null)
\r
1497 data_chpt = chapterGridView;
\r
1501 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1502 data_chpt.Rows.Clear();
\r
1503 data_chpt.Enabled = false;
\r
1508 private void drop_refFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
1510 x264PanelFunctions.on_x264_WidgetChange("ref", this);
\r
1512 private void check_mixedReferences_CheckedChanged(object sender, EventArgs e)
\r
1514 x264PanelFunctions.on_x264_WidgetChange("mixed-refs", this);
\r
1516 private void drop_bFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
1518 x264PanelFunctions.on_x264_WidgetChange("bframes", this);
\r
1520 private void drop_directPrediction_SelectedIndexChanged(object sender, EventArgs e)
\r
1522 x264PanelFunctions.on_x264_WidgetChange("direct", this);
\r
1524 private void check_weightedBFrames_CheckedChanged(object sender, EventArgs e)
\r
1526 x264PanelFunctions.on_x264_WidgetChange("weightb", this);
\r
1528 private void check_pyrmidalBFrames_CheckedChanged(object sender, EventArgs e)
\r
1530 x264PanelFunctions.on_x264_WidgetChange("b-pyramid", this);
\r
1532 private void drop_MotionEstimationMethod_SelectedIndexChanged(object sender, EventArgs e)
\r
1534 x264PanelFunctions.on_x264_WidgetChange("me", this);
\r
1536 private void drop_MotionEstimationRange_SelectedIndexChanged(object sender, EventArgs e)
\r
1538 x264PanelFunctions.on_x264_WidgetChange("merange", this);
\r
1540 private void drop_subpixelMotionEstimation_SelectedIndexChanged(object sender, EventArgs e)
\r
1542 x264PanelFunctions.on_x264_WidgetChange("subq", this);
\r
1544 private void drop_analysis_SelectedIndexChanged(object sender, EventArgs e)
\r
1546 x264PanelFunctions.on_x264_WidgetChange("analyse", this);
\r
1548 private void check_8x8DCT_CheckedChanged(object sender, EventArgs e)
\r
1550 x264PanelFunctions.on_x264_WidgetChange("8x8dct", this);
\r
1552 private void drop_deblockAlpha_SelectedIndexChanged(object sender, EventArgs e)
\r
1554 x264PanelFunctions.on_x264_WidgetChange("deblock", this);
\r
1557 private void drop_deblockBeta_SelectedIndexChanged(object sender, EventArgs e)
\r
1559 x264PanelFunctions.on_x264_WidgetChange("deblock", this);
\r
1562 private void drop_trellis_SelectedIndexChanged(object sender, EventArgs e)
\r
1564 x264PanelFunctions.on_x264_WidgetChange("trellis", this);
\r
1566 private void check_noFastPSkip_CheckedChanged(object sender, EventArgs e)
\r
1568 x264PanelFunctions.on_x264_WidgetChange("no-fast-pskip", this);
\r
1570 private void check_noDCTDecimate_CheckedChanged(object sender, EventArgs e)
\r
1572 x264PanelFunctions.on_x264_WidgetChange("no-dct-decimate", this);
\r
1575 private void check_Cabac_CheckedChanged(object sender, EventArgs e)
\r
1578 x264PanelFunctions.on_x264_WidgetChange("cabac", this);
\r
1581 private void rtf_x264Query_TextChanged(object sender, EventArgs e)
\r
1583 if (rtf_x264Query.Text.EndsWith("\n"))
\r
1585 rtf_x264Query.Text = rtf_x264Query.Text.Replace("\n", "");
\r
1586 x264PanelFunctions.X264_StandardizeOptString(this);
\r
1587 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
1589 if (rtf_x264Query.Text == string.Empty)
\r
1590 x264PanelFunctions.reset2Defaults(this);
\r
1593 private void btn_reset_Click(object sender, EventArgs e)
\r
1595 rtf_x264Query.Text = "";
\r
1596 x264PanelFunctions.reset2Defaults(this);
\r
1599 // Query Editor Tab
\r
1600 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1602 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1604 private void btn_clear_Click(object sender, EventArgs e)
\r
1606 rtf_query.Clear();
\r
1610 // MainWindow Components, Actions and Functions ***********************
\r
1612 #region Source Scan
\r
1613 private void setupGUIforScan(String filename)
\r
1615 text_source.Text = filename;
\r
1617 foreach (Control ctrl in Controls)
\r
1619 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1620 ctrl.Enabled = false;
\r
1622 lbl_encode.Visible = true;
\r
1623 lbl_encode.Text = "Scanning ...";
\r
1624 gb_source.Text = "Source: Scanning ...";
\r
1625 btn_source.Enabled = false;
\r
1626 btn_start.Enabled = false;
\r
1627 btn_showQueue.Enabled = false;
\r
1628 btn_add2Queue.Enabled = false;
\r
1629 tb_preview.Enabled = false;
\r
1630 mnu_killCLI.Visible = true;
\r
1632 private void startScan(String filename)
\r
1636 lbl_encode.Visible = true;
\r
1637 lbl_encode.Text = "Scanning...";
\r
1638 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1640 catch (Exception exc)
\r
1642 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1645 private void scanProcess(object state)
\r
1649 string inputFile = (string)state;
\r
1650 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1651 string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");
\r
1653 // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)
\r
1654 if (File.Exists(dvdInfoPath))
\r
1655 File.Delete(dvdInfoPath);
\r
1657 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);
\r
1659 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine);
\r
1660 hbParseDvd.WindowStyle = ProcessWindowStyle.Hidden;
\r
1662 using (hbproc = Process.Start(hbParseDvd))
\r
1664 hbproc.WaitForExit();
\r
1667 if (!File.Exists(dvdInfoPath))
\r
1669 throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);
\r
1672 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1674 thisDVD = Parsing.DVD.Parse(sr);
\r
1679 updateUIafterScan();
\r
1681 catch (Exception exc)
\r
1683 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1687 private void updateUIafterScan()
\r
1691 if (InvokeRequired)
\r
1693 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1697 // Setup some GUI components
\r
1698 drp_dvdtitle.Items.Clear();
\r
1699 if (thisDVD.Titles.Count != 0)
\r
1700 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1701 drp_dvdtitle.Text = "Automatic";
\r
1702 drop_chapterFinish.Text = "Auto";
\r
1703 drop_chapterStart.Text = "Auto";
\r
1705 // Now select the longest title
\r
1706 if (thisDVD.Titles.Count != 0)
\r
1707 drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);
\r
1709 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1710 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1711 Check_ChapterMarkers.Enabled = true;
\r
1714 Check_ChapterMarkers.Enabled = false;
\r
1715 Check_ChapterMarkers.Checked = false;
\r
1716 data_chpt.Rows.Clear();
\r
1719 // If no titles were found, Display an error message
\r
1720 if (drp_dvdtitle.Items.Count == 0)
\r
1721 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
1723 // Enable the GUI components and enable any disabled components
\r
1726 catch (Exception exc)
\r
1728 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1733 private void enableGUI()
\r
1737 if (InvokeRequired)
\r
1739 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1741 lbl_encode.Text = "Scan Completed";
\r
1742 gb_source.Text = "Source";
\r
1743 foreach (Control ctrl in Controls)
\r
1744 ctrl.Enabled = true;
\r
1745 btn_start.Enabled = true;
\r
1746 btn_showQueue.Enabled = true;
\r
1747 btn_add2Queue.Enabled = true;
\r
1748 tb_preview.Enabled = true;
\r
1749 btn_source.Enabled = true;
\r
1750 mnu_killCLI.Visible = false;
\r
1752 catch (Exception exc)
\r
1754 MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1757 private static void killCLI()
\r
1759 // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,
\r
1760 // hbproc.kill/close just won't do the trick.
\r
1763 string AppName = "HandBrakeCLI";
\r
1765 AppName = AppName.ToUpper();
\r
1767 System.Diagnostics.Process[] prs = Process.GetProcesses();
\r
1768 foreach (System.Diagnostics.Process proces in prs)
\r
1770 if (proces.ProcessName.ToUpper() == AppName)
\r
1773 if (!proces.HasExited)
\r
1778 catch (Exception ex)
\r
1780 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
1785 #region DVD Drive Detection
\r
1786 // Source Button Drive Detection
\r
1787 private delegate void ProgressUpdateHandler();
\r
1788 private void getDriveInfoThread()
\r
1792 if (InvokeRequired)
\r
1794 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1798 Boolean foundDrive = false;
\r
1799 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1800 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1802 if (curDrive.DriveType == DriveType.CDRom)
\r
1804 if (curDrive.IsReady)
\r
1806 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1807 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1809 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1811 foundDrive = true;
\r
1817 if (foundDrive == false)
\r
1818 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1822 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1827 #region Audio Panel Code Helpers
\r
1828 private void setAudioByContainer(String path)
\r
1832 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1834 oldval = drp_audenc_1.Text;
\r
1835 drp_audenc_1.Items.Clear();
\r
1836 drp_audenc_1.Items.Add("AAC");
\r
1837 drp_audenc_1.Items.Add("AC3");
\r
1838 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1839 drp_audenc_1.SelectedIndex = 0;
\r
1842 else if (path.Contains("AVI"))
\r
1844 oldval = drp_audenc_1.Text;
\r
1845 drp_audenc_1.Items.Clear();
\r
1846 drp_audenc_1.Items.Add("MP3");
\r
1847 drp_audenc_1.Items.Add("AC3");
\r
1848 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1849 drp_audenc_1.SelectedIndex = 0;
\r
1852 else if (path.Contains("OGM"))
\r
1854 drp_audenc_1.Items.Clear();
\r
1855 drp_audenc_1.Items.Add("Vorbis");
\r
1856 drp_audenc_1.SelectedIndex = 0;
\r
1859 else if (path.Contains("MKV"))
\r
1861 drp_audenc_1.Items.Clear();
\r
1862 drp_audenc_1.Items.Add("AAC");
\r
1863 drp_audenc_1.Items.Add("MP3");
\r
1864 drp_audenc_1.Items.Add("AC3");
\r
1865 drp_audenc_1.Items.Add("Vorbis");
\r
1866 if (drp_audenc_1.Text == string.Empty)
\r
1867 drp_audenc_1.SelectedIndex = 0;
\r
1870 // Make sure the table is updated with new audio codecs
\r
1871 foreach (ListViewItem row in lv_audioList.Items)
\r
1873 if (!drp_audenc_1.Items.Contains(row.SubItems[1].Text))
\r
1874 row.SubItems[1].Text = drp_audenc_1.Items[0].ToString();
\r
1877 private void setVideoByContainer(String path)
\r
1881 if ((path.Contains("MP3")) || (path.Contains("M4V")))
\r
1883 oldval = drp_videoEncoder.Text;
\r
1884 drp_videoEncoder.Items.Clear();
\r
1885 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1886 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1887 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1888 if (oldval == "VP3 (Theora)")
\r
1889 drp_videoEncoder.SelectedIndex = 2;
\r
1891 drp_videoEncoder.Text = oldval;
\r
1894 else if (path.Contains("AVI"))
\r
1896 oldval = drp_videoEncoder.Text;
\r
1897 drp_videoEncoder.Items.Clear();
\r
1898 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1899 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1900 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1901 if (oldval == "VP3 (Theora)")
\r
1902 drp_videoEncoder.SelectedIndex = 2;
\r
1904 drp_videoEncoder.Text = oldval;
\r
1906 else if (path.Contains("OGM"))
\r
1908 oldval = drp_videoEncoder.Text;
\r
1909 drp_videoEncoder.Items.Clear();
\r
1910 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1911 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1912 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1913 if (oldval == "H.264 (x264)")
\r
1914 drp_videoEncoder.SelectedIndex = 2;
\r
1916 drp_videoEncoder.Text = oldval;
\r
1918 else if (path.Contains("MKV"))
\r
1920 oldval = drp_videoEncoder.Text;
\r
1921 drp_videoEncoder.Items.Clear();
\r
1922 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1923 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1924 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1925 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1926 drp_videoEncoder.Text = oldval;
\r
1929 private void setBitrateSelections384(ComboBox dropDown)
\r
1931 dropDown.Items.Clear();
\r
1932 dropDown.Items.Add("32");
\r
1933 dropDown.Items.Add("40");
\r
1934 dropDown.Items.Add("48");
\r
1935 dropDown.Items.Add("56");
\r
1936 dropDown.Items.Add("64");
\r
1937 dropDown.Items.Add("80");
\r
1938 dropDown.Items.Add("86");
\r
1939 dropDown.Items.Add("112");
\r
1940 dropDown.Items.Add("128");
\r
1941 dropDown.Items.Add("160");
\r
1942 dropDown.Items.Add("192");
\r
1943 dropDown.Items.Add("224");
\r
1944 dropDown.Items.Add("256");
\r
1945 dropDown.Items.Add("320");
\r
1946 dropDown.Items.Add("384");
\r
1948 private void setBitrateSelections320(ComboBox dropDown)
\r
1950 dropDown.Items.Clear();
\r
1951 dropDown.Items.Add("32");
\r
1952 dropDown.Items.Add("40");
\r
1953 dropDown.Items.Add("48");
\r
1954 dropDown.Items.Add("56");
\r
1955 dropDown.Items.Add("64");
\r
1956 dropDown.Items.Add("80");
\r
1957 dropDown.Items.Add("86");
\r
1958 dropDown.Items.Add("112");
\r
1959 dropDown.Items.Add("128");
\r
1960 dropDown.Items.Add("160");
\r
1961 dropDown.Items.Add("192");
\r
1962 dropDown.Items.Add("224");
\r
1963 dropDown.Items.Add("256");
\r
1964 dropDown.Items.Add("320");
\r
1966 private void setBitrateSelections160(ComboBox dropDown)
\r
1968 dropDown.Items.Clear();
\r
1969 dropDown.Items.Add("32");
\r
1970 dropDown.Items.Add("40");
\r
1971 dropDown.Items.Add("48");
\r
1972 dropDown.Items.Add("56");
\r
1973 dropDown.Items.Add("64");
\r
1974 dropDown.Items.Add("80");
\r
1975 dropDown.Items.Add("86");
\r
1976 dropDown.Items.Add("112");
\r
1977 dropDown.Items.Add("128");
\r
1978 dropDown.Items.Add("160");
\r
1980 private void setMixDownAllOptions(ComboBox dropdown)
\r
1982 dropdown.Items.Clear();
\r
1983 dropdown.Items.Add("Automatic");
\r
1984 dropdown.Items.Add("Mono");
\r
1985 dropdown.Items.Add("Stereo");
\r
1986 dropdown.Items.Add("Dolby Surround");
\r
1987 dropdown.Items.Add("Dolby Pro Logic II");
\r
1988 dropdown.Items.Add("6 Channel Discrete");
\r
1990 private void setMixDownNotAAC(ComboBox dropdown)
\r
1992 dropdown.Items.Clear();
\r
1993 dropdown.Items.Add("Automatic");
\r
1994 dropdown.Items.Add("Stereo");
\r
1995 dropdown.Items.Add("Dolby Surround");
\r
1996 dropdown.Items.Add("Dolby Pro Logic II");
\r
2000 #region Public Methods
\r
2003 /// Setup the GUI for Encoding or finished Encoding.
\r
2004 /// 1 = Encode Running
\r
2005 /// 0 = Encode Finished.
\r
2007 public void setEncodeFinished()
\r
2011 if (InvokeRequired)
\r
2013 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
2017 lbl_encode.Text = "Encoding Finished";
\r
2018 btn_start.Text = "Start";
\r
2019 btn_start.ToolTipText = "Start the encoding process";
\r
2020 btn_start.Image = Properties.Resources.Play;
\r
2022 // If the window is minimized, display the notification in a popup.
\r
2023 if (FormWindowState.Minimized == this.WindowState)
\r
2025 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
2026 notifyIcon.ShowBalloonTip(500);
\r
2029 catch (Exception exc)
\r
2031 MessageBox.Show(exc.ToString());
\r
2034 public void setEncodeStarted()
\r
2038 if (InvokeRequired)
\r
2040 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
2044 lbl_encode.Visible = true;
\r
2045 lbl_encode.Text = "Encoding in Progress";
\r
2046 btn_start.Text = "Stop";
\r
2047 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
2048 btn_start.Image = Properties.Resources.stop;
\r
2050 catch (Exception exc)
\r
2052 MessageBox.Show(exc.ToString());
\r
2057 /// Action can be "encode" or "scan"
\r
2058 /// Set the last action varible in the main window.
\r
2059 /// This is used to control which log file is displayed when the Activity window is displayed.
\r
2061 /// <param name="last">String</param>
\r
2062 public void setLastAction(string last)
\r
2064 this.lastAction = last;
\r
2068 /// DVD parseing. Pass in a parsed DVD.
\r
2070 /// <param name="dvd"></param>
\r
2071 public void setStreamReader(Parsing.DVD dvd)
\r
2073 this.thisDVD = dvd;
\r
2077 /// Reload the preset panel display
\r
2079 public void loadPresetPanel()
\r
2081 presetHandler.loadPresetData();
\r
2083 treeView_presets.Nodes.Clear();
\r
2085 List<Presets.Preset> presetNameList;
\r
2086 List<string> presetNames;
\r
2087 TreeNode preset_treeview;
\r
2089 TreeNode rootNode = new TreeNode();
\r
2090 TreeNode rootNodeTwo = new TreeNode();
\r
2091 TreeNode childNode;
\r
2092 int workingLevel = 0;
\r
2093 string previousCategory = String.Empty;
\r
2094 string currentCategory = String.Empty;
\r
2096 presetNameList = presetHandler.getBuildInPresets();
\r
2097 if (presetNameList.Count != 0)
\r
2099 foreach (Presets.Preset preset in presetNameList)
\r
2101 // Handle Root Nodes
\r
2103 // First Case - No presets have been read yet so setup the root category
\r
2104 if (preset.Level == 1 && currentCategory == String.Empty)
\r
2106 rootNode = new TreeNode(preset.Category);
\r
2107 workingLevel = preset.Level;
\r
2108 currentCategory = preset.Category;
\r
2109 previousCategory = preset.Category;
\r
2112 // Second Case - This is the first sub child node.
\r
2113 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
2115 rootNodeTwo = new TreeNode(preset.Category);
\r
2116 workingLevel = preset.Level;
\r
2117 currentCategory = preset.Category;
\r
2118 rootNode.Nodes.Add(rootNodeTwo);
\r
2121 // Third Case - Any presets the sub presets detected in the above if statment.
\r
2122 if (preset.Level == 1 && workingLevel == 2)
\r
2124 workingLevel = preset.Level;
\r
2125 currentCategory = preset.Category;
\r
2128 // Fourth Case - We've finished this root node and are onto the next root node.
\r
2129 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
2131 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
2133 rootNode = new TreeNode(preset.Category);
\r
2134 workingLevel = preset.Level;
\r
2135 currentCategory = preset.Category;
\r
2136 previousCategory = preset.Category;
\r
2139 // Handle Child Nodes
\r
2140 // Add First level child nodes to the current root node
\r
2141 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
2143 childNode = new TreeNode(preset.Name);
\r
2144 rootNode.Nodes.Add(childNode);
\r
2147 // Add Second level child nodes to the current sub root node
\r
2148 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
2150 childNode = new TreeNode(preset.Name);
\r
2151 rootNodeTwo.Nodes.Add(childNode);
\r
2155 // Add the final root node which does not get added above.
\r
2156 treeView_presets.Nodes.Add(rootNode);
\r
2160 presetNames = presetHandler.getUserPresetNames();
\r
2161 foreach (string preset in presetNames)
\r
2163 preset_treeview = new TreeNode(preset);
\r
2164 preset_treeview.ForeColor = Color.Black;
\r
2166 // Now Fill Out List View with Items
\r
2167 treeView_presets.Nodes.Add(preset_treeview);
\r
2175 // This is the END of the road ------------------------------------------------------------------------------
\r