OSDN Git Service

99cb7ed080c4c6493142980a1d080844752bbb82
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmMain.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Collections.Specialized;\r
4 using System.ComponentModel;\r
5 using System.Data;\r
6 using System.Drawing;\r
7 using System.Text;\r
8 using System.Windows.Forms;\r
9 using System.Net;\r
10 using System.IO;\r
11 using System.Diagnostics;\r
12 using System.Threading;\r
13 using System.Runtime.InteropServices;\r
14 using System.Globalization;\r
15 using System.Text.RegularExpressions;\r
16 \r
17 \r
18 namespace Handbrake\r
19 {\r
20     public partial class frmMain : Form\r
21     {\r
22         // -------------------------------------------------------------- \r
23         // Applicaiton Startup Stuff\r
24         // --------------------------------------------------------------\r
25 \r
26         #region Application Startup\r
27 \r
28         // Some stuff that needs to be Initialized. \r
29         private Process hbProc;\r
30         private Parsing.DVD thisDVD;\r
31         private frmQueue queueWindow = new frmQueue();\r
32 \r
33         // The main window beings here...\r
34         public frmMain()\r
35         {\r
36             // Load the splash screen in this thread\r
37             Form splash = new frmSplashScreen();\r
38             splash.Show();\r
39 \r
40             //Create a label that can be updated from the parent thread.\r
41             Label lblStatus = new Label();\r
42 \r
43             //Size the label\r
44             lblStatus.Size = new Size(250, 20);\r
45 \r
46             //Position the label\r
47             lblStatus.Location = new Point(10, 280);\r
48 \r
49             //Put the label on the splash form\r
50             splash.Controls.Add(lblStatus);\r
51 \r
52             //Fire a thread to wait for 2 seconds.  The splash screen will exit when the time expires\r
53             Thread timer = new Thread(splashTimer);\r
54             timer.Start();\r
55 \r
56             InitializeComponent();\r
57 \r
58             // show the form, but leave disabled until preloading is complete\r
59             this.Enabled = false;\r
60 \r
61             // Show the main form\r
62             this.Show();\r
63 \r
64             // Forces frmMain to draw\r
65             Application.DoEvents();\r
66 \r
67             // Set the Version number lable to the corect version.\r
68             Version.Text = "Version " + Properties.Settings.Default.CliVersion;\r
69 \r
70             // update the status\r
71             if (Properties.Settings.Default.updateStatus == "Checked")\r
72             {\r
73                 lblStatus.Text = "Checking for updates ...";\r
74                 // redraw the splash screen\r
75                 Application.DoEvents();\r
76                 // Run the update checker.\r
77                 Thread updateCheckThread = new Thread(startupUpdateCheck);\r
78                 updateCheckThread.Start();\r
79                 Thread.Sleep(200);\r
80             }\r
81 \r
82             // Update the presets\r
83             if (Properties.Settings.Default.updatePresets == "Checked")\r
84             {\r
85                 lblStatus.Text = "Updaing Presets ...";\r
86                 Application.DoEvents();\r
87                 grabCLIPresets();\r
88                 Thread.Sleep(200);\r
89             }\r
90 \r
91             // Load the presets for the preset box\r
92             updatePresets();\r
93 \r
94             // Now load the users default if required. (Will overide the above setting)\r
95             if (Properties.Settings.Default.defaultSettings == "Checked")\r
96             {\r
97                 lblStatus.Text = "Loading User Default Settings...";\r
98                 Application.DoEvents();\r
99                 loadUserDefaults();\r
100                 Thread.Sleep(100);\r
101             }\r
102             else\r
103             {\r
104                 loadNormalPreset();\r
105             }\r
106 \r
107             // Enable or disable tooltips\r
108             if (Properties.Settings.Default.tooltipEnable == "Checked")\r
109             {\r
110                 lblStatus.Text = "Loading Tooltips ...";\r
111                 Application.DoEvents();\r
112                 ToolTip.Active = true;\r
113                 Thread.Sleep(100);\r
114             }\r
115 \r
116 \r
117             //Finished Loading\r
118             lblStatus.Text = "Loading Complete!";\r
119             Application.DoEvents();\r
120             Thread.Sleep(200);\r
121 \r
122             // Wait until splash screen is done\r
123             while (timer.IsAlive)\r
124             { Thread.Sleep(100); }\r
125 \r
126             //Close the splash screen\r
127             splash.Close();\r
128             splash.Dispose();\r
129 \r
130             // Turn the interface back to the user\r
131             this.Enabled = true;\r
132         }\r
133 \r
134         private delegate void updateStatusChanger();\r
135         private void startupUpdateCheck()\r
136         {\r
137             try\r
138             {\r
139                 if (this.InvokeRequired)\r
140                 {\r
141                     this.BeginInvoke(new updateStatusChanger(startupUpdateCheck));\r
142                     return;\r
143                 }\r
144 \r
145                 Boolean update = updateCheck();\r
146                 if (update == true)\r
147                 {\r
148                     lbl_update.Visible = true;\r
149 \r
150                     frmUpdater updateWindow = new frmUpdater();\r
151                     updateWindow.Show();\r
152                 }\r
153             }\r
154             catch (Exception exc)\r
155             {\r
156                 MessageBox.Show(exc.ToString());\r
157             }\r
158 \r
159             \r
160         }\r
161 \r
162         private void splashTimer(object sender)\r
163         {\r
164             Thread.Sleep(1000);  //sit for 1 seconds then exit\r
165         }\r
166 \r
167         private void showSplash(object sender)\r
168         {\r
169             // Display splash screen for 1.5 Seconds\r
170             Form splash = new frmSplashScreen();\r
171             splash.Show();\r
172             Thread.Sleep(1500);\r
173             splash.Close(); // Then close.\r
174         }\r
175 \r
176         private void loadUserDefaults()\r
177         {\r
178             string userDefaults = Properties.Settings.Default.defaultUserSettings;\r
179             try\r
180             {\r
181                 // Some things that need to be done to reset some gui components:\r
182                 CheckPixelRatio.CheckState = CheckState.Unchecked;\r
183 \r
184                 // Send the query from the file to the Query Parser class\r
185                 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(userDefaults);\r
186 \r
187                 // Now load the preset\r
188                 presetLoader(presetQuery, "User Defaults ");\r
189             }\r
190             catch (Exception exc)\r
191             {\r
192                 MessageBox.Show("Unable to load user Default Settings. \n\n" + exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
193             }\r
194         }\r
195 \r
196         #endregion\r
197 \r
198         // -------------------------------------------------------------- \r
199         // The main Menu bar.\r
200         // -------------------------------------------------------------- \r
201 \r
202         #region File Menu\r
203         private void mnu_open_Click(object sender, EventArgs e)\r
204         {\r
205             string filename;\r
206             File_Open.ShowDialog();\r
207             filename = File_Open.FileName;\r
208 \r
209             if (filename != "")\r
210             {\r
211                 try\r
212                 {\r
213                     // Some things that need to be done to reset some gui components:\r
214                     CheckPixelRatio.CheckState = CheckState.Unchecked;\r
215 \r
216                     //---------------------------\r
217                     // Get the Preset\r
218                     // ---------------------------\r
219 \r
220                     // Create StreamReader & open file\r
221                     StreamReader line = new StreamReader(filename);\r
222 \r
223                     // Send the query from the file to the Query Parser class\r
224                     Functions.QueryParser presetQuery = Functions.QueryParser.Parse(line.ReadLine());\r
225 \r
226                     // Now load the preset\r
227                     presetLoader(presetQuery, filename);\r
228 \r
229                     // Close the stream\r
230                     line.Close();\r
231                 }\r
232                 catch (Exception exc)\r
233                 {\r
234                     MessageBox.Show("Unable to load profile.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
235                     MessageBox.Show(exc.ToString());\r
236                 }\r
237             }\r
238         }\r
239 \r
240         private void mnu_save_Click(object sender, EventArgs e)\r
241         {\r
242             string filename;\r
243             File_Save.ShowDialog();\r
244             filename = File_Save.FileName;\r
245             if (filename != "")\r
246             {\r
247                 try\r
248                 {\r
249                     // Create a StreamWriter and open the file\r
250                     StreamWriter line = new StreamWriter(filename);\r
251 \r
252                     // Generate and write the query string to the file\r
253                     String query = GenerateTheQuery();\r
254                     line.WriteLine(query);\r
255 \r
256                     // close the stream\r
257                     line.Close();\r
258                     MessageBox.Show("Your profile has been sucessfully saved.", "Status", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
259                 }\r
260                 catch (Exception)\r
261                 {\r
262                     MessageBox.Show("Unable to write to the file. Please make sure the location has the correct permissions for file writing.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
263                 }\r
264 \r
265             }\r
266         }\r
267 \r
268         private void mnu_exit_Click(object sender, EventArgs e)\r
269         {\r
270             Application.Exit();\r
271         }\r
272 \r
273         #endregion\r
274 \r
275         #region Tools Menu\r
276 \r
277         private void mnu_encode_Click(object sender, EventArgs e)\r
278         {\r
279             showQueue();\r
280         }\r
281 \r
282         private void mnu_viewDVDdata_Click(object sender, EventArgs e)\r
283         {\r
284             frmDvdInfo dvdInfoWindow = new frmDvdInfo();\r
285             dvdInfoWindow.Show();\r
286         }\r
287 \r
288         private void mnu_options_Click(object sender, EventArgs e)\r
289         {\r
290             Form Options = new frmOptions();\r
291             Options.ShowDialog();\r
292         }\r
293 \r
294         #endregion\r
295 \r
296         #region Presets Menu\r
297         Boolean presetStatus;\r
298 \r
299         private void mnu_showPresets_Click(object sender, EventArgs e)\r
300         {\r
301             if (presetStatus == false)\r
302             {\r
303                 this.Width = 881;\r
304                 presetStatus = true;\r
305                 mnu_showPresets.Text = "Hide Presets";\r
306             }\r
307             else\r
308             {\r
309                 this.Width = 590;\r
310                 presetStatus = false;\r
311                 mnu_showPresets.Text = "Show Presets";\r
312             }\r
313         }\r
314 \r
315         private void mnu_presetReset_Click(object sender, EventArgs e)\r
316         {\r
317             treeView_presets.Nodes.Clear();\r
318             grabCLIPresets();\r
319             updatePresets();\r
320             MessageBox.Show("Presets have been updated", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
321         }\r
322 \r
323         private void mnu_SelectDefault_Click(object sender, EventArgs e)\r
324         {\r
325             loadNormalPreset();\r
326         }\r
327 \r
328         #endregion\r
329 \r
330         #region Help Menu\r
331 \r
332 \r
333         private void mnu_quickStart_Click(object sender, EventArgs e)\r
334         {\r
335             Form QuickStart = new frmQuickStart();\r
336             QuickStart.ShowDialog();\r
337         }\r
338 \r
339         private void mnu_wiki_Click(object sender, EventArgs e)\r
340         {\r
341             Process.Start("http://handbrake.m0k.org/trac");\r
342         }\r
343 \r
344         private void mnu_faq_Click(object sender, EventArgs e)\r
345         {\r
346             Process.Start("http://handbrake.m0k.org/trac/wiki/WindowsGuiFaq");\r
347         }\r
348 \r
349         private void mnu_onlineDocs_Click(object sender, EventArgs e)\r
350         {\r
351             Process.Start("http://handbrake.m0k.org/?page_id=11");\r
352         }\r
353 \r
354         private void mnu_homepage_Click(object sender, EventArgs e)\r
355         {\r
356             Process.Start("http://handbrake.m0k.org");\r
357         }\r
358 \r
359         private void mnu_forum_Click(object sender, EventArgs e)\r
360         {\r
361             Process.Start("http://handbrake.m0k.org/forum");\r
362         }\r
363 \r
364         private void mnu_UpdateCheck_Click(object sender, EventArgs e)\r
365         {\r
366             Boolean update = updateCheck();\r
367             if (update == true)\r
368             {\r
369                 lbl_update.Visible = true;\r
370                 frmUpdater updateWindow = new frmUpdater();\r
371                 updateWindow.Show();\r
372             }\r
373             else\r
374             {\r
375                 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
376             }\r
377         }\r
378 \r
379         private void mnu_about_Click(object sender, EventArgs e)\r
380         {\r
381             Form About = new frmAbout();\r
382             About.ShowDialog();\r
383         }\r
384 \r
385         #endregion\r
386 \r
387         // -------------------------------------------------------------- \r
388         // Buttons on the main Window and items that require actions\r
389         // --------------------------------------------------------------\r
390 \r
391         #region Buttons\r
392 \r
393         private void btn_Browse_Click(object sender, EventArgs e)\r
394         {\r
395             String filename = "";\r
396             text_source.Text = "";\r
397             frmDvdInfo dvdInfoWindow = new frmDvdInfo();\r
398 \r
399             if (RadioDVD.Checked)\r
400             {\r
401                 DVD_Open.ShowDialog();\r
402                 filename = DVD_Open.SelectedPath;\r
403             }\r
404             else\r
405             {\r
406                 ISO_Open.ShowDialog();\r
407                 filename = ISO_Open.FileName;\r
408             }\r
409 \r
410             if (filename != "")\r
411             {\r
412                 Form frmRD = new frmReadDVD(filename, this, dvdInfoWindow);\r
413                 text_source.Text = filename;\r
414                 frmRD.ShowDialog();\r
415             }\r
416             else\r
417                 text_source.Text = "Click 'Browse' to continue";\r
418 \r
419             // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.\r
420             if (drp_dvdtitle.Items.Count == 0)\r
421             {\r
422                 MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source. Please refer to the FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
423             }\r
424         }\r
425 \r
426         private void btn_destBrowse_Click(object sender, EventArgs e)\r
427         {\r
428             // This removes the file extension from the filename box on the save file dialog.\r
429             // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.\r
430             // Should be a nicer way to do this.\r
431             DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");\r
432 \r
433             // Show the dialog and set the main form file path\r
434             DVD_Save.ShowDialog();\r
435             text_destination.Text = DVD_Save.FileName;\r
436 \r
437             // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)\r
438             if (Check_ChapterMarkers.Checked)\r
439             {\r
440                 string destination = text_destination.Text;\r
441                 destination = destination.Replace(".mp4", ".m4v");\r
442                 text_destination.Text = destination;\r
443             }\r
444         }\r
445 \r
446         private void btn_h264Clear_Click(object sender, EventArgs e)\r
447         {\r
448             rtf_h264advanced.Text = "";\r
449         }\r
450 \r
451         private void GenerateQuery_Click(object sender, EventArgs e)\r
452         {\r
453             String query = GenerateTheQuery();\r
454             QueryEditorText.Text = query;\r
455         }\r
456 \r
457         private void btn_ClearQuery_Click(object sender, EventArgs e)\r
458         {\r
459             QueryEditorText.Text = "";\r
460         }\r
461 \r
462         private void btn_copy_Click(object sender, EventArgs e)\r
463         {\r
464             if (QueryEditorText.Text != "")\r
465                 Clipboard.SetText(QueryEditorText.Text, TextDataFormat.Text);\r
466         }\r
467 \r
468         #endregion\r
469 \r
470         #region frmMain Actions\r
471 \r
472         private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)\r
473         {\r
474             // Reset some values on the form\r
475             lbl_Aspect.Text = "Select a Title";\r
476             lbl_RecomendedCrop.Text = "Select a Title";\r
477             drop_chapterStart.Items.Clear();\r
478             drop_chapterFinish.Items.Clear();\r
479             QueryEditorText.Text = "";\r
480 \r
481             // If the dropdown is set to automatic nothing else needs to be done.\r
482             // Otheriwse if its not, title data has to be loased from parsing.\r
483             if (drp_dvdtitle.Text != "Automatic")\r
484             {\r
485                 Parsing.Title selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;\r
486 \r
487                 // Set the Aspect Ratio\r
488                 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();\r
489 \r
490                 // Set the Recommended Cropping values\r
491                 lbl_RecomendedCrop.Text = string.Format("{0}/{1}/{2}/{3}", selectedTitle.AutoCropDimensions[0], selectedTitle.AutoCropDimensions[1], selectedTitle.AutoCropDimensions[2], selectedTitle.AutoCropDimensions[3]);\r
492 \r
493                 // Populate the Start chapter Dropdown\r
494                 drop_chapterStart.Items.Clear();\r
495                 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());\r
496                 if (drop_chapterStart.Items.Count > 0)\r
497                 {\r
498                     drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();\r
499                 }\r
500 \r
501                 // Populate the Final Chapter Dropdown\r
502                 drop_chapterFinish.Items.Clear();\r
503                 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());\r
504                 if (drop_chapterFinish.Items.Count > 0)\r
505                 {\r
506                     drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();\r
507                 }\r
508 \r
509                 // Populate the Audio Channels Dropdown\r
510                 drp_track1Audio.Items.Clear();\r
511                 drp_track1Audio.Items.Add("Automatic");\r
512                 drp_track1Audio.Items.Add("None");\r
513                 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
514                 if (drp_track1Audio.Items.Count > 0)\r
515                 {\r
516                     drp_track1Audio.Text = drp_track1Audio.Items[0].ToString();\r
517                 }\r
518                 drp_track2Audio.Items.Clear();\r
519                 drp_track2Audio.Items.Add("None");\r
520                 drp_track2Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
521                 if (drp_track2Audio.Items.Count > 0)\r
522                 {\r
523                     drp_track2Audio.Text = drp_track2Audio.Items[0].ToString();\r
524                 }\r
525 \r
526 \r
527                 // Populate the Subtitles dropdown\r
528                 drp_subtitle.Items.Clear();\r
529                 drp_subtitle.Items.Add("None");\r
530                 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());\r
531                 if (drp_subtitle.Items.Count > 0)\r
532                 {\r
533                     drp_subtitle.Text = drp_subtitle.Items[0].ToString();\r
534                 }\r
535             }\r
536         }\r
537 \r
538         private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)\r
539         {\r
540             drop_chapterStart.BackColor = Color.White;\r
541             QueryEditorText.Text = "";\r
542             if ((drop_chapterFinish.Text != "Auto") && (drop_chapterStart.Text != "Auto"))\r
543             {\r
544                 try\r
545                 {\r
546                     int chapterFinish = int.Parse(drop_chapterFinish.Text);\r
547                     int chapterStart = int.Parse(drop_chapterStart.Text);\r
548 \r
549                     if (chapterFinish < chapterStart)\r
550                     {\r
551                         drop_chapterStart.BackColor = Color.LightCoral;\r
552                     }\r
553                 }\r
554                 catch (Exception)\r
555                 {\r
556                     drop_chapterStart.BackColor = Color.LightCoral;\r
557                 }\r
558             }\r
559 \r
560 \r
561         }\r
562 \r
563         private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)\r
564         {\r
565             drop_chapterFinish.BackColor = Color.White;\r
566             QueryEditorText.Text = "";\r
567             if ((drop_chapterFinish.Text != "Auto") && (drop_chapterStart.Text != "Auto"))\r
568             {\r
569                 try\r
570                 {\r
571                     int chapterFinish = int.Parse(drop_chapterFinish.Text);\r
572                     int chapterStart = int.Parse(drop_chapterStart.Text);\r
573 \r
574                     if (chapterFinish < chapterStart)\r
575                     {\r
576                         drop_chapterFinish.BackColor = Color.LightCoral;\r
577                     }\r
578                 }\r
579                 catch (Exception)\r
580                 {\r
581                     drop_chapterFinish.BackColor = Color.LightCoral;\r
582                 }\r
583             }\r
584         }\r
585 \r
586         private void text_bitrate_TextChanged(object sender, EventArgs e)\r
587         {\r
588             text_filesize.Text = "";\r
589             slider_videoQuality.Value = 0;\r
590             SliderValue.Text = "0%";\r
591             CheckCRF.CheckState = CheckState.Unchecked;\r
592             CheckCRF.Enabled = false;\r
593         }\r
594 \r
595         private void text_filesize_TextChanged(object sender, EventArgs e)\r
596         {\r
597             text_bitrate.Text = "";\r
598             slider_videoQuality.Value = 0;\r
599             SliderValue.Text = "0%";\r
600             CheckCRF.CheckState = CheckState.Unchecked;\r
601             CheckCRF.Enabled = false;\r
602         }\r
603 \r
604         private void slider_videoQuality_Scroll(object sender, EventArgs e)\r
605         {\r
606             SliderValue.Text = slider_videoQuality.Value.ToString() + "%";\r
607             text_bitrate.Text = "";\r
608             text_filesize.Text = "";\r
609             CheckCRF.Enabled = true;\r
610         }\r
611 \r
612         private void label_h264_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\r
613         {\r
614             Process.Start("http://handbrake.m0k.org/trac/wiki/x264Options");\r
615         }\r
616 \r
617         private void text_width_TextChanged(object sender, EventArgs e)\r
618         {\r
619             try\r
620             {\r
621                 if (CheckPixelRatio.Checked)\r
622                 {\r
623                     text_width.Text = "";\r
624                     text_width.BackColor = Color.LightCoral;\r
625                     CheckPixelRatio.BackColor = Color.LightCoral;\r
626                 }\r
627                 else\r
628                 {\r
629                     if ((int.Parse(text_width.Text) % 16) != 0)\r
630                     {\r
631                         text_width.BackColor = Color.LightCoral;\r
632                     }\r
633                     else\r
634                     {\r
635                         text_width.BackColor = Color.LightGreen;\r
636                     }\r
637                 }\r
638 \r
639                 if (lbl_Aspect.Text != "Select a Title")\r
640                 {\r
641                     double height = int.Parse(text_width.Text) / double.Parse(lbl_Aspect.Text);\r
642                     double mod16 = height % 16;\r
643                     height = height - mod16;\r
644 \r
645                     if (text_width.Text == "")\r
646                     {\r
647                         text_height.Text = "";\r
648                         text_width.BackColor = Color.White;\r
649                     }\r
650                     else\r
651                     {\r
652                         text_height.Text = height.ToString();\r
653                         text_width.BackColor = Color.LightGreen;\r
654                     }\r
655                 }\r
656             }\r
657             catch (Exception)\r
658             {\r
659                 // No need to throw an error here.\r
660                 // Note on non english systems, this will throw an error because of double.Parse(lbl_Aspect.Text); not working.\r
661             }\r
662 \r
663 \r
664         }\r
665 \r
666         private void text_height_TextChanged(object sender, EventArgs e)\r
667         {\r
668             try\r
669             {\r
670                 if (CheckPixelRatio.Checked)\r
671                 {\r
672                     text_height.Text = "";\r
673                     text_height.BackColor = Color.LightCoral;\r
674                     CheckPixelRatio.BackColor = Color.LightCoral;\r
675                 }\r
676                 else\r
677                 {\r
678                     if ((int.Parse(text_height.Text) % 16) != 0)\r
679                     {\r
680                         text_height.BackColor = Color.LightCoral;\r
681                     }\r
682                     else\r
683                     {\r
684                         text_height.BackColor = Color.LightGreen;\r
685                     }\r
686                 }\r
687 \r
688             }\r
689             catch (Exception)\r
690             {\r
691                 // No need to alert the user.\r
692             }\r
693         }\r
694 \r
695         private void drp_crop_SelectedIndexChanged(object sender, EventArgs e)\r
696         {\r
697             if ((string)drp_crop.SelectedItem == "Manual")\r
698             {\r
699                 text_left.Enabled = true;\r
700                 text_right.Enabled = true;\r
701                 text_top.Enabled = true;\r
702                 text_bottom.Enabled = true;\r
703             }\r
704 \r
705             if ((string)drp_crop.SelectedItem == "Auto Crop")\r
706             {\r
707                 text_left.Enabled = false;\r
708                 text_right.Enabled = false;\r
709                 text_top.Enabled = false;\r
710                 text_bottom.Enabled = false;\r
711 \r
712 \r
713                 if (lbl_RecomendedCrop.Text != "Select a Title")\r
714                 {\r
715                     string[] temp = new string[4];\r
716                     temp = lbl_RecomendedCrop.Text.Split('/');\r
717                     text_left.Text = temp[2];\r
718                     text_right.Text = temp[3];\r
719                     text_top.Text = temp[0];\r
720                     text_bottom.Text = temp[1];\r
721                 }\r
722                 else\r
723                 {\r
724                     text_left.Text = "";\r
725                     text_right.Text = "";\r
726                     text_top.Text = "";\r
727                     text_bottom.Text = "";\r
728                 }\r
729             }\r
730 \r
731             if ((string)drp_crop.SelectedItem == "No Crop")\r
732             {\r
733                 text_left.Enabled = false;\r
734                 text_right.Enabled = false;\r
735                 text_top.Enabled = false;\r
736                 text_bottom.Enabled = false;\r
737                 text_left.Text = "0";\r
738                 text_right.Text = "0";\r
739                 text_top.Text = "0";\r
740                 text_bottom.Text = "0";\r
741 \r
742             }\r
743         }\r
744 \r
745         private void check_vfr_CheckedChanged(object sender, EventArgs e)\r
746         {\r
747             if (check_vfr.CheckState == CheckState.Checked)\r
748             {\r
749                 check_detelecine.Enabled = false;\r
750                 check_detelecine.CheckState = CheckState.Checked;\r
751                 drp_videoFramerate.Enabled = false;\r
752                 drp_videoFramerate.SelectedItem = "29.97";\r
753                 lbl_vfr.Visible = true;\r
754             }\r
755             else\r
756             {\r
757                 check_detelecine.Enabled = true;\r
758                 drp_videoFramerate.Enabled = true;\r
759                 drp_videoFramerate.SelectedItem = "Automatic";\r
760                 lbl_vfr.Visible = false;\r
761             }\r
762         }\r
763 \r
764         private void CheckPixelRatio_CheckedChanged(object sender, EventArgs e)\r
765         {\r
766             text_width.Text = "";\r
767             text_height.Text = "";\r
768             text_width.BackColor = Color.White;\r
769             text_height.BackColor = Color.White;\r
770             CheckPixelRatio.BackColor = TabPage1.BackColor;\r
771 \r
772             if (CheckPixelRatio.Checked)\r
773             {\r
774                 check_lAnamorphic.Enabled = false;\r
775                 check_lAnamorphic.Checked = false;\r
776             }\r
777             else\r
778                 check_lAnamorphic.Enabled = true;\r
779         }\r
780 \r
781         private void check_lAnamorphic_CheckedChanged(object sender, EventArgs e)\r
782         {\r
783             if (check_lAnamorphic.Checked)\r
784             {\r
785                 CheckPixelRatio.Enabled = false;\r
786                 CheckPixelRatio.Checked = false;\r
787             }\r
788             else\r
789                 CheckPixelRatio.Enabled = true;\r
790         }\r
791 \r
792         private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)\r
793         {\r
794             if (check_2PassEncode.CheckState.ToString() == "Checked")\r
795             {\r
796                 if (drp_videoEncoder.Text.Contains("H.264"))\r
797                 {\r
798                     check_turbo.Enabled = true;\r
799                 }\r
800             }\r
801             else\r
802             {\r
803                 check_turbo.Enabled = false;\r
804                 check_turbo.CheckState = CheckState.Unchecked;\r
805             }\r
806         }\r
807 \r
808         private void check_largeFile_CheckedChanged(object sender, EventArgs e)\r
809         {\r
810             if (!text_destination.Text.Contains(".mp4"))\r
811             {\r
812                 lbl_largeMp4Warning.Text = "Warning: Only mp4 files are supported";\r
813                 lbl_largeMp4Warning.ForeColor = Color.Red;\r
814                 check_largeFile.CheckState = CheckState.Unchecked;\r
815             }\r
816             else\r
817             {\r
818                 lbl_largeMp4Warning.Text = "Warning: Breaks iPod, @TV, PS3 compatibility.";\r
819                 lbl_largeMp4Warning.ForeColor = Color.Black;\r
820             }\r
821         }\r
822 \r
823         private void check_iPodAtom_CheckedChanged(object sender, EventArgs e)\r
824         {\r
825             if (!text_destination.Text.Contains(".mp4"))\r
826             {\r
827                 lbl_ipodAtom.Visible = true;\r
828                 check_iPodAtom.CheckState = CheckState.Unchecked;\r
829             }\r
830             else\r
831             {\r
832                 lbl_ipodAtom.Visible = false;\r
833             }\r
834         }\r
835 \r
836         private void check_optimiseMP4_CheckedChanged(object sender, EventArgs e)\r
837         {\r
838             if (!text_destination.Text.Contains(".mp4"))\r
839             {\r
840                 lbl_optimize.Visible = true;\r
841                 check_optimiseMP4.CheckState = CheckState.Unchecked;\r
842             }\r
843             else\r
844             {\r
845                 lbl_optimize.Visible = false;\r
846             }\r
847         }\r
848 \r
849         private void drp_dvdtitle_Click(object sender, EventArgs e)\r
850         {\r
851             if (drp_dvdtitle.Items.Count == 0)\r
852             {\r
853                 MessageBox.Show("There are no titles to select. Please scan the DVD by clicking the 'browse' button above before trying to select a title.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
854             }\r
855         }\r
856 \r
857         private void drp_audioCodec_SelectedIndexChanged(object sender, EventArgs e)\r
858         {\r
859             if (drp_audioCodec.Text == "AAC")\r
860             {\r
861                 drp_audioMixDown.Items.Clear();\r
862                 drp_audioMixDown.Items.Add("Mono");\r
863                 drp_audioMixDown.Items.Add("Stereo");\r
864                 drp_audioMixDown.Items.Add("Dolby Surround");\r
865                 drp_audioMixDown.Items.Add("Dolby Pro Logic II");\r
866                 drp_audioMixDown.Items.Add("6 Channel Discrete");\r
867 \r
868                 drp_audioBitrate.Items.Clear();\r
869                 drp_audioBitrate.Items.Add("32");\r
870                 drp_audioBitrate.Items.Add("40");\r
871                 drp_audioBitrate.Items.Add("48");\r
872                 drp_audioBitrate.Items.Add("56");\r
873                 drp_audioBitrate.Items.Add("64");\r
874                 drp_audioBitrate.Items.Add("80");\r
875                 drp_audioBitrate.Items.Add("86");\r
876                 drp_audioBitrate.Items.Add("112");\r
877                 drp_audioBitrate.Items.Add("128");\r
878                 drp_audioBitrate.Items.Add("160");\r
879 \r
880             }\r
881             else\r
882             {\r
883                 drp_audioMixDown.Items.Clear();\r
884                 drp_audioMixDown.Items.Add("Stereo");\r
885                 drp_audioMixDown.Items.Add("Dolby Surround");\r
886                 drp_audioMixDown.Items.Add("Dolby Pro Logic II");\r
887 \r
888                 drp_audioBitrate.Items.Clear();\r
889                 drp_audioBitrate.Items.Add("32");\r
890                 drp_audioBitrate.Items.Add("40");\r
891                 drp_audioBitrate.Items.Add("48");\r
892                 drp_audioBitrate.Items.Add("56");\r
893                 drp_audioBitrate.Items.Add("64");\r
894                 drp_audioBitrate.Items.Add("80");\r
895                 drp_audioBitrate.Items.Add("86");\r
896                 drp_audioBitrate.Items.Add("112");\r
897                 drp_audioBitrate.Items.Add("128");\r
898                 drp_audioBitrate.Items.Add("160");\r
899                 drp_audioBitrate.Items.Add("192");\r
900                 drp_audioBitrate.Items.Add("224");\r
901                 drp_audioBitrate.Items.Add("256");\r
902                 drp_audioBitrate.Items.Add("320");\r
903             }\r
904         }\r
905 \r
906         private void drp_audioMixDown_SelectedIndexChanged(object sender, EventArgs e)\r
907         {\r
908             if ((drp_audioCodec.Text == "AAC") && (drp_audioMixDown.Text == "6 Channel Discrete"))\r
909             {\r
910                 drp_audioBitrate.Items.Clear();\r
911                 drp_audioBitrate.Items.Add("32");\r
912                 drp_audioBitrate.Items.Add("40");\r
913                 drp_audioBitrate.Items.Add("48");\r
914                 drp_audioBitrate.Items.Add("56");\r
915                 drp_audioBitrate.Items.Add("64");\r
916                 drp_audioBitrate.Items.Add("80");\r
917                 drp_audioBitrate.Items.Add("86");\r
918                 drp_audioBitrate.Items.Add("112");\r
919                 drp_audioBitrate.Items.Add("128");\r
920                 drp_audioBitrate.Items.Add("160");\r
921                 drp_audioBitrate.Items.Add("192");\r
922                 drp_audioBitrate.Items.Add("224");\r
923                 drp_audioBitrate.Items.Add("256");\r
924                 drp_audioBitrate.Items.Add("320");\r
925                 drp_audioBitrate.Items.Add("384");\r
926             }\r
927         }\r
928 \r
929         private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)\r
930         {\r
931             if (drp_subtitle.Text.Contains("None"))\r
932             {\r
933                 check_forced.Enabled = false;\r
934                 check_forced.Checked = false;\r
935             }\r
936             else\r
937                 check_forced.Enabled = true;\r
938         }\r
939 \r
940         private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)\r
941         {\r
942             if (Check_ChapterMarkers.Checked)\r
943             {\r
944                 string destination = text_destination.Text;\r
945                 destination = destination.Replace(".mp4", ".m4v");\r
946                 text_destination.Text = destination;\r
947             }\r
948             else\r
949             {\r
950                 string destination = text_destination.Text;\r
951                 destination = destination.Replace(".m4v", ".mp4");\r
952                 text_destination.Text = destination;\r
953             }\r
954         }\r
955 \r
956         private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)\r
957         {\r
958             //Turn off some options which are H.264 only when the user selects a non h.264 encoder\r
959             if (!drp_videoEncoder.Text.Contains("H.264"))\r
960             {\r
961                 check_turbo.CheckState = CheckState.Unchecked;\r
962                 CheckCRF.CheckState = CheckState.Unchecked;\r
963                 CheckCRF.Enabled = false;\r
964                 check_turbo.Enabled = false;\r
965                 h264Tab.Enabled = false;\r
966                 rtf_h264advanced.Text = "";\r
967                 check_iPodAtom.Enabled = false;\r
968                 check_iPodAtom.Checked = false;\r
969                 lbl_ipodAtom.Visible = false;\r
970             }\r
971             else\r
972             {\r
973                 CheckCRF.Enabled = true;\r
974                 if (check_2PassEncode.CheckState == CheckState.Checked)\r
975                 {\r
976                     check_turbo.Enabled = true;\r
977                 }\r
978                 h264Tab.Enabled = true;\r
979                 check_iPodAtom.Enabled = true;\r
980                 lbl_ipodAtom.Visible = false;\r
981             }\r
982 \r
983         }\r
984 \r
985         #endregion\r
986 \r
987         // -------------------------------------------------------------- \r
988         // Main Window Preset System\r
989         // --------------------------------------------------------------\r
990 \r
991         #region Preset System\r
992 \r
993         // Import Current Presets\r
994         private void updatePresets()\r
995         {\r
996             string[] presets = new string[17];\r
997             presets[0] = "Animation";\r
998             presets[1] = "AppleTV";\r
999             presets[2] = "Bedlam";\r
1000             presets[3] = "Blind";\r
1001             presets[4] = "Broke";\r
1002             presets[5] = "Classic";\r
1003             presets[6] = "Constant Quality Rate";\r
1004             presets[7] = "Deux Six Quatre";\r
1005             presets[8] = "Film";\r
1006             presets[9] = "iPhone / iPod Touch";\r
1007             presets[10] = "iPod High-Rez";\r
1008             presets[11] = "iPod Low-Rez";\r
1009             presets[12] = "Normal";\r
1010             presets[13] = "PS3";\r
1011             presets[14] = "PSP";\r
1012             presets[15] = "QuickTime";\r
1013             presets[16] = "Television";\r
1014 \r
1015             TreeNode preset_treeview = new TreeNode();\r
1016 \r
1017             foreach (string preset in presets)\r
1018             {\r
1019                 preset_treeview = new TreeNode(preset);\r
1020 \r
1021                 // Now Fill Out List View with Items\r
1022                 treeView_presets.Nodes.Add(preset_treeview);\r
1023             }\r
1024         }\r
1025 \r
1026         private void grabCLIPresets()\r
1027         {\r
1028             string appPath = Application.StartupPath.ToString() + "\\";\r
1029             string strCmdLine = "cmd /c " + '"' + '"' + appPath + "HandBrakeCLI.exe" + '"' + " --preset-list >" + '"' + appPath + "presets.dat" + '"' + " 2>&1" + '"';\r
1030             Process hbproc = Process.Start("CMD.exe", strCmdLine);\r
1031             hbproc.WaitForExit();\r
1032             hbproc.Dispose();\r
1033             hbproc.Close();\r
1034         }\r
1035 \r
1036         // Function to select the default preset.\r
1037         private void loadNormalPreset()\r
1038         {\r
1039 \r
1040             int normal = 0;\r
1041             foreach (TreeNode treenode in treeView_presets.Nodes)\r
1042             {\r
1043                 if (treenode.ToString().Equals("TreeNode: Normal"))\r
1044                     normal = treenode.Index;\r
1045             }\r
1046 \r
1047             TreeNode np = treeView_presets.Nodes[normal];\r
1048 \r
1049             treeView_presets.SelectedNode = np;\r
1050 \r
1051 \r
1052 \r
1053         }\r
1054 \r
1055         // Buttons\r
1056         private void btn_setDefault_Click(object sender, EventArgs e)\r
1057         {\r
1058             String query = GenerateTheQuery();\r
1059             Properties.Settings.Default.defaultUserSettings = query;\r
1060             // Save the new default Settings\r
1061             Properties.Settings.Default.Save();\r
1062             MessageBox.Show("New default settings saved.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
1063         }\r
1064 \r
1065         // Preset Selection\r
1066         private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)\r
1067         {\r
1068 \r
1069 \r
1070             string selectedPreset = null;\r
1071             selectedPreset = treeView_presets.SelectedNode.Text;\r
1072 \r
1073             try\r
1074             {\r
1075                 string appPath = Application.StartupPath.ToString() + "\\";\r
1076                 StreamReader presetInput = new StreamReader(appPath + "presets.dat");\r
1077 \r
1078                 while (!presetInput.EndOfStream)\r
1079                 {\r
1080                     if ((char)presetInput.Peek() == '+')\r
1081                     {\r
1082                         string preset = presetInput.ReadLine().Replace("+ ", "");\r
1083                         Regex r = new Regex("(:  )"); // Split on hyphens. \r
1084                         string[] presetName = r.Split(preset);\r
1085 \r
1086                         if (selectedPreset == presetName[0])\r
1087                         {\r
1088                             // Need to disable anamorphic now, otherwise it may overide the width / height values later.\r
1089                             CheckPixelRatio.CheckState = CheckState.Unchecked;\r
1090 \r
1091                             // Send the query from the file to the Query Parser class\r
1092                             Functions.QueryParser presetQuery = Functions.QueryParser.Parse(preset);\r
1093 \r
1094                             // Now load the preset\r
1095                             presetLoader(presetQuery, selectedPreset);\r
1096                         }\r
1097 \r
1098                     }\r
1099                     else\r
1100                     {\r
1101                         presetInput.ReadLine();\r
1102                     }\r
1103                 }\r
1104             }\r
1105             catch (Exception exc)\r
1106             {\r
1107                 MessageBox.Show(exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
1108             }\r
1109         }\r
1110         #endregion\r
1111 \r
1112         //---------------------------------------------------\r
1113         // Encode / Cancel Buttons\r
1114         // Encode Progress Text Handler\r
1115         //---------------------------------------------------\r
1116 \r
1117         #region Encodeing and Queue\r
1118 \r
1119         Functions.CLI process = new Functions.CLI();\r
1120         private delegate void UpdateUIHandler();\r
1121 \r
1122         [DllImport("user32.dll")]\r
1123         public static extern void LockWorkStation();\r
1124         [DllImport("user32.dll")]\r
1125         public static extern int ExitWindowsEx(int uFlags, int dwReason);\r
1126 \r
1127         private void btn_queue_Click(object sender, EventArgs e)\r
1128         {\r
1129 \r
1130             if (text_source.Text == "" || text_source.Text == "Click 'Browse' to continue" || text_destination.Text == "")\r
1131                 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1132             else\r
1133             {\r
1134                 string query;\r
1135                 if (QueryEditorText.Text == "")\r
1136                 {\r
1137                     query = GenerateTheQuery();\r
1138                 }\r
1139                 else\r
1140                 {\r
1141                     query = QueryEditorText.Text;\r
1142                 }\r
1143                 queueWindow.list_queue.Items.Add(query);\r
1144                 queueWindow.Show();\r
1145             }\r
1146         }\r
1147 \r
1148         private void showQueue()\r
1149         {\r
1150             queueWindow.Show();\r
1151         }\r
1152 \r
1153         private void btn_encode_Click(object sender, EventArgs e)\r
1154         {\r
1155             if (text_source.Text == "" || text_source.Text == "Click 'Browse' to continue" || text_destination.Text == "")\r
1156                 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1157             else\r
1158             {\r
1159                 btn_eCancel.Enabled = true;\r
1160                 String query = "";\r
1161                 if (QueryEditorText.Text == "")\r
1162                 {\r
1163                     query = GenerateTheQuery();\r
1164                 }\r
1165                 else\r
1166                 {\r
1167                     query = QueryEditorText.Text;\r
1168                 }\r
1169 \r
1170                 ThreadPool.QueueUserWorkItem(procMonitor, query);\r
1171                 lbl_encode.Visible = true;\r
1172                 lbl_encode.Text = "Encoding in Progress";\r
1173             }\r
1174         }\r
1175 \r
1176         private void btn_eCancel_Click(object sender, EventArgs e)\r
1177         {\r
1178             process.killCLI();\r
1179             process.setNull();\r
1180             lbl_encode.Text = "Encoding Canceled";\r
1181         }\r
1182 \r
1183         private void procMonitor(object state)\r
1184         {\r
1185             // Make sure we are not already encoding and if we are then display an error.\r
1186             if (hbProc != null)\r
1187             {\r
1188                 MessageBox.Show("Handbrake is already encoding a video!", "Status", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1189             }\r
1190             else\r
1191             {\r
1192                 hbProc = process.runCli(this, (string)state, false, false, false, false);\r
1193                 hbProc.WaitForExit();\r
1194 \r
1195                 try\r
1196                 {\r
1197                     /*\r
1198                     //*****************************************************************************************\r
1199                     // BUG!\r
1200                     // When the below code is used and standard error is set to true, hbcli is outputing a\r
1201                     // video stream which has mild corruption issues every few seconds.\r
1202                     // Maybe an issue with the Parser cauing the CLI to hickup/pause?\r
1203                     //*****************************************************************************************\r
1204 \r
1205                     \r
1206                     Parsing.Parser encode = new Parsing.Parser(hbProc.StandardOutput.BaseStream);\r
1207                     encode.OnEncodeProgress += encode_OnEncodeProgress;\r
1208                     while (!encode.EndOfStream)\r
1209                     {\r
1210                         encode.ReadLine();\r
1211                     }\r
1212 \r
1213                     hbProc.WaitForExit();\r
1214                     process.closeCLI();\r
1215                      */\r
1216 \r
1217                 }\r
1218                 catch (Exception exc)\r
1219                 {\r
1220                     // Do nothing\r
1221                     MessageBox.Show(exc.ToString());\r
1222                 }\r
1223 \r
1224 \r
1225                 setEncodeLabel();\r
1226                 hbProc = null;\r
1227 \r
1228                 // Do something whent he encode ends.\r
1229                 switch (Properties.Settings.Default.CompletionOption)\r
1230                 {\r
1231                     case "Shutdown":\r
1232                         System.Diagnostics.Process.Start("Shutdown", "-s -t 60");\r
1233                         break;\r
1234                     case "Log Off":\r
1235                         ExitWindowsEx(0, 0);\r
1236                         break;\r
1237                     case "Suspend":\r
1238                         Application.SetSuspendState(PowerState.Suspend, true, true);\r
1239                         break;\r
1240                     case "Hibernate":\r
1241                         Application.SetSuspendState(PowerState.Hibernate, true, true);\r
1242                         break;\r
1243                     case "Lock System":\r
1244                         LockWorkStation();\r
1245                         break;\r
1246                     case "Quit HandBrake":\r
1247                         Application.Exit();\r
1248                         break;\r
1249                     default:\r
1250                         break;\r
1251                 }\r
1252             }\r
1253         }\r
1254 \r
1255         private void setEncodeLabel()\r
1256         {\r
1257             if (this.InvokeRequired)\r
1258             {\r
1259                 this.BeginInvoke(new UpdateUIHandler(setEncodeLabel));\r
1260                 return;\r
1261             }\r
1262             lbl_encode.Text = "Encoding Finished";\r
1263         }\r
1264 \r
1265         private void encode_OnEncodeProgress(object Sender, int CurrentTask, int TaskCount, float PercentComplete, float CurrentFps, float AverageFps, TimeSpan TimeRemaining)\r
1266         {\r
1267 \r
1268             if (this.InvokeRequired)\r
1269             {\r
1270                 this.BeginInvoke(new Parsing.EncodeProgressEventHandler(encode_OnEncodeProgress),\r
1271                     new object[] { Sender, CurrentTask, TaskCount, PercentComplete, CurrentFps, AverageFps, TimeRemaining });\r
1272                 return;\r
1273             }\r
1274             lbl_encode.Text = string.Format("Encode Progress: {0}%,       FPS: {1},       Avg FPS: {2},       Time Remaining: {3} ", PercentComplete, CurrentFps, AverageFps, TimeRemaining);\r
1275         }\r
1276 \r
1277         #endregion\r
1278 \r
1279 \r
1280         //---------------------------------------------------\r
1281         //  Some Functions\r
1282         //  - Query Generation\r
1283         //---------------------------------------------------\r
1284 \r
1285         #region Program Functions\r
1286 \r
1287         public string GenerateTheQuery()\r
1288         {\r
1289             // Source tab\r
1290             #region source\r
1291             string source = text_source.Text;\r
1292             string dvdTitle = drp_dvdtitle.Text;\r
1293             string chapterStart = drop_chapterStart.Text;\r
1294             string chapterFinish = drop_chapterFinish.Text;\r
1295             int totalChapters = drop_chapterFinish.Items.Count - 1;\r
1296             string dvdChapter = "";\r
1297 \r
1298             source = " -i " + '"' + source + '"';\r
1299 \r
1300             if (dvdTitle == "Automatic")\r
1301                 dvdTitle = "";\r
1302             else\r
1303             {\r
1304                 string[] titleInfo = dvdTitle.Split(' ');\r
1305                 dvdTitle = " -t " + titleInfo[0];\r
1306             }\r
1307 \r
1308             if (chapterFinish.Equals("Auto") && chapterStart.Equals("Auto"))\r
1309                 dvdChapter = "";\r
1310             else if (chapterFinish == chapterStart)\r
1311                 dvdChapter = " -c " + chapterStart;\r
1312             else\r
1313                 dvdChapter = " -c " + chapterStart + "-" + chapterFinish;\r
1314 \r
1315             string querySource = source + dvdTitle + dvdChapter;\r
1316             #endregion\r
1317 \r
1318             // Destination tab\r
1319             #region Destination\r
1320 \r
1321             string destination = text_destination.Text;\r
1322             string videoEncoder = drp_videoEncoder.Text;\r
1323             string audioEncoder = drp_audioCodec.Text;\r
1324             string width = text_width.Text;\r
1325             string height = text_height.Text;\r
1326 \r
1327             if (destination == "")\r
1328                 MessageBox.Show("No destination has been selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1329             else\r
1330                 destination = " -o " + '"' + destination + '"'; //'"'+ \r
1331 \r
1332 \r
1333             switch (videoEncoder)\r
1334             {\r
1335                 case "Mpeg 4":\r
1336                     videoEncoder = " -e ffmpeg";\r
1337                     break;\r
1338                 case "Xvid":\r
1339                     videoEncoder = " -e xvid";\r
1340                     break;\r
1341                 case "H.264":\r
1342                     videoEncoder = " -e x264";\r
1343                     break;\r
1344                 case "H.264 (iPod)":\r
1345                     videoEncoder = " -e x264b30";\r
1346                     break;\r
1347                 default:\r
1348                     videoEncoder = " -e x264";\r
1349                     break;\r
1350             }\r
1351 \r
1352             switch (audioEncoder)\r
1353             {\r
1354                 case "AAC":\r
1355                     audioEncoder = " -E faac";\r
1356                     break;\r
1357                 case "MP3":\r
1358                     audioEncoder = " -E lame";\r
1359                     break;\r
1360                 case "Vorbis":\r
1361                     audioEncoder = " -E vorbis";\r
1362                     break;\r
1363                 case "AC3":\r
1364                     audioEncoder = " -E ac3";\r
1365                     break;\r
1366                 default:\r
1367                     audioEncoder = " -E faac";\r
1368                     break;\r
1369             }\r
1370 \r
1371             if (width != "")\r
1372                 width = " -w " + width;\r
1373 \r
1374 \r
1375             if (height == "Auto")\r
1376             {\r
1377                 height = "";\r
1378             }\r
1379             else if (height != "")\r
1380             {\r
1381                 height = " -l " + height;\r
1382             }\r
1383 \r
1384 \r
1385             string queryDestination = destination + videoEncoder + audioEncoder + width + height;\r
1386             #endregion\r
1387 \r
1388             // Picture Settings Tab\r
1389             #region Picture Settings Tab\r
1390 \r
1391             string cropSetting = drp_crop.Text;\r
1392             string cropTop = text_top.Text;\r
1393             string cropBottom = text_bottom.Text;\r
1394             string cropLeft = text_left.Text;\r
1395             string cropRight = text_right.Text;\r
1396             string subtitles = drp_subtitle.Text;\r
1397             string cropOut = "";\r
1398             string deInterlace_Option = drp_deInterlace_option.Text;\r
1399             string deinterlace = "";\r
1400             string grayscale = "";\r
1401             string pixelRatio = "";\r
1402             string ChapterMarkers = "";\r
1403             string vfr = "";\r
1404             string deblock = "";\r
1405             string detelecine = "";\r
1406             string lanamorphic = "";\r
1407 \r
1408 \r
1409 \r
1410             if (cropSetting == "Auto Crop")\r
1411                 cropOut = "";\r
1412             else if (cropSetting == "No Crop")\r
1413                 cropOut = " --crop 0:0:0:0 ";\r
1414             else\r
1415             {\r
1416                 if (text_top.Text == "")\r
1417                     cropTop = "0";\r
1418                 if (text_bottom.Text == "")\r
1419                     cropBottom = "0";\r
1420                 if (text_left.Text == "")\r
1421                     cropLeft = "0";\r
1422                 if (text_right.Text == "")\r
1423                     cropRight = "0";\r
1424 \r
1425                 cropOut = " --crop " + cropTop + ":" + cropBottom + ":" + cropLeft + ":" + cropRight;\r
1426             }\r
1427 \r
1428             if (subtitles == "None")\r
1429                 subtitles = "";\r
1430             else if (subtitles == "")\r
1431                 subtitles = "";\r
1432             else\r
1433             {\r
1434                 string[] tempSub;\r
1435                 tempSub = subtitles.Split(' ');\r
1436                 subtitles = " -s " + tempSub[0];\r
1437             }\r
1438 \r
1439             switch (deInterlace_Option)\r
1440             {\r
1441                 case "None":\r
1442                     deinterlace = "";\r
1443                     break;\r
1444                 case "Original (Fast)":\r
1445                     deinterlace = " --deinterlace=fast";\r
1446                     break;\r
1447                 case "yadif (Slow)":\r
1448                     deinterlace = " --deinterlace=slow";\r
1449                     break;\r
1450                 case "yadif + mcdeint (Slower)":\r
1451                     deinterlace = " --deinterlace=slower";\r
1452                     break;\r
1453                 case "yadif + mcdeint (Slowest)":\r
1454                     deinterlace = " --deinterlace=slowest";\r
1455                     break;\r
1456                 default:\r
1457                     deinterlace = "";\r
1458                     break;\r
1459             }\r
1460 \r
1461             if (check_grayscale.Checked)\r
1462                 grayscale = " -g ";\r
1463 \r
1464             if (CheckPixelRatio.Checked)\r
1465                 pixelRatio = " -p ";\r
1466 \r
1467             if (Check_ChapterMarkers.Checked)\r
1468                 ChapterMarkers = " -m ";\r
1469 \r
1470             if (check_deblock.Checked)\r
1471                 deblock = " --deblock";\r
1472 \r
1473             if (check_detelecine.Checked)\r
1474                 detelecine = " --detelecine";\r
1475 \r
1476             if (check_vfr.Checked)\r
1477                 vfr = " -V ";\r
1478 \r
1479             if (check_lAnamorphic.Checked)\r
1480                 lanamorphic = " -P ";\r
1481 \r
1482             string queryPictureSettings = cropOut + subtitles + deinterlace + deblock + detelecine + vfr + grayscale + pixelRatio + lanamorphic + ChapterMarkers;\r
1483             #endregion\r
1484 \r
1485             // Video Settings Tab\r
1486             #region Video Settings Tab\r
1487 \r
1488             string videoBitrate = text_bitrate.Text;\r
1489             string videoFilesize = text_filesize.Text;\r
1490             double videoQuality = slider_videoQuality.Value;\r
1491             string vidQSetting = "";\r
1492             string twoPassEncoding = "";\r
1493             string videoFramerate = drp_videoFramerate.Text;\r
1494             string turboH264 = "";\r
1495             string largeFile = "";\r
1496             string denoise = "";\r
1497             string CRF = "";\r
1498             string ipodAtom = "";\r
1499             string optimizeMP4 = "";\r
1500 \r
1501             if (CheckCRF.Checked)\r
1502                 CRF = " -Q ";\r
1503             else\r
1504                 CRF = "";\r
1505 \r
1506             if (videoBitrate != "")\r
1507                 videoBitrate = " -b " + videoBitrate;\r
1508 \r
1509             if (videoFilesize != "")\r
1510                 videoFilesize = " -S " + videoFilesize;\r
1511 \r
1512             // Video Quality Setting\r
1513 \r
1514             if ((videoQuality == 0))\r
1515                 vidQSetting = "";\r
1516             else\r
1517             {\r
1518                 videoQuality = videoQuality / 100;\r
1519                 if (videoQuality == 1)\r
1520                 {\r
1521                     vidQSetting = "1.0";\r
1522                 }\r
1523                 vidQSetting = " -q " + videoQuality.ToString(new CultureInfo("en-US"));\r
1524             }\r
1525 \r
1526             if (check_2PassEncode.Checked)\r
1527                 twoPassEncoding = " -2 ";\r
1528 \r
1529             if (videoFramerate == "Automatic")\r
1530                 videoFramerate = "";\r
1531             else\r
1532                 videoFramerate = " -r " + videoFramerate;\r
1533 \r
1534             if (check_turbo.Checked)\r
1535                 turboH264 = " -T ";\r
1536 \r
1537             if (check_largeFile.Checked)\r
1538                 largeFile = " -4 ";\r
1539 \r
1540 \r
1541             switch (drp_deNoise.Text)\r
1542             {\r
1543                 case "None":\r
1544                     denoise = "";\r
1545                     break;\r
1546                 case "Weak":\r
1547                     denoise = " --denoise=weak";\r
1548                     break;\r
1549                 case "Medium":\r
1550                     denoise = " --denoise=medium";\r
1551                     break;\r
1552                 case "Strong":\r
1553                     denoise = " --denoise=strong";\r
1554                     break;\r
1555                 default:\r
1556                     denoise = "";\r
1557                     break;\r
1558             }\r
1559 \r
1560             if (check_iPodAtom.Checked)\r
1561                 ipodAtom = " -I ";\r
1562 \r
1563             if (check_optimiseMP4.Checked)\r
1564                 optimizeMP4 = " -O ";\r
1565 \r
1566 \r
1567             string queryVideoSettings = videoBitrate + videoFilesize + vidQSetting + CRF + twoPassEncoding + videoFramerate + turboH264 + ipodAtom + optimizeMP4 + largeFile + denoise;\r
1568             #endregion\r
1569 \r
1570             // Audio Settings Tab\r
1571             #region Audio Settings Tab\r
1572 \r
1573             string audioBitrate = drp_audioBitrate.Text;\r
1574             string audioSampleRate = drp_audioSampleRate.Text;\r
1575             string track1 = drp_track1Audio.Text;\r
1576             string track2 = drp_track2Audio.Text;\r
1577             string audioChannels = "";\r
1578             string Mixdown = drp_audioMixDown.Text;\r
1579             string SixChannelAudio = "";\r
1580             string forced = "";\r
1581 \r
1582             if (audioBitrate != "")\r
1583                 audioBitrate = " -B " + audioBitrate;\r
1584 \r
1585             if (audioSampleRate != "")\r
1586                 audioSampleRate = " -R " + audioSampleRate;\r
1587 \r
1588             // Audio Track 1\r
1589             if (track1 == "Automatic")\r
1590                 audioChannels = "";\r
1591             else if (track1 == "")\r
1592                 audioChannels = "";\r
1593             else if (track1 == "None")\r
1594                 audioChannels = " -a none";\r
1595             else\r
1596             {\r
1597                 string[] tempSub;\r
1598                 tempSub = track1.Split(' ');\r
1599                 audioChannels = " -a " + tempSub[0];\r
1600             }\r
1601 \r
1602             // Audio Track 2\r
1603             if (audioChannels != "")\r
1604             {\r
1605                 if ((track2 != "") && (track2 != "None"))\r
1606                 {\r
1607                     string[] tempSub;\r
1608                     tempSub = track2.Split(' ');\r
1609                     audioChannels = audioChannels + "," + tempSub[0];\r
1610                 }\r
1611             }\r
1612             else\r
1613             {\r
1614                 if ((track2 != "") && (track2 != "None"))\r
1615                 {\r
1616                     string[] tempSub;\r
1617                     tempSub = track2.Split(' ');\r
1618                     audioChannels = " -a " + tempSub[0];\r
1619                 }\r
1620             }\r
1621 \r
1622 \r
1623 \r
1624             switch (Mixdown)\r
1625             {\r
1626                 case "Automatic":\r
1627                     Mixdown = "";\r
1628                     break;\r
1629                 case "Mono":\r
1630                     Mixdown = "mono";\r
1631                     break;\r
1632                 case "Stereo":\r
1633                     Mixdown = "stereo";\r
1634                     break;\r
1635                 case "Dolby Surround":\r
1636                     Mixdown = "dpl1";\r
1637                     break;\r
1638                 case "Dolby Pro Logic II":\r
1639                     Mixdown = "dpl2";\r
1640                     break;\r
1641                 case "6 Channel Discrete":\r
1642                     Mixdown = "6ch";\r
1643                     break;\r
1644                 default:\r
1645                     Mixdown = "";\r
1646                     break;\r
1647             }\r
1648 \r
1649             if (Mixdown != "")\r
1650                 SixChannelAudio = " -6 " + Mixdown;\r
1651             else\r
1652                 SixChannelAudio = "";\r
1653 \r
1654             if (check_forced.Checked)\r
1655                 forced = "-F";\r
1656 \r
1657             string queryAudioSettings = audioBitrate + audioSampleRate + audioChannels + SixChannelAudio + forced;\r
1658             #endregion\r
1659 \r
1660             // H264 Tab\r
1661             #region  H264 Tab\r
1662 \r
1663             string h264Advanced = rtf_h264advanced.Text;\r
1664 \r
1665             if ((h264Advanced == ""))\r
1666                 h264Advanced = "";\r
1667             else\r
1668                 h264Advanced = " -x " + h264Advanced;\r
1669 \r
1670 \r
1671             string h264Settings = h264Advanced;\r
1672             #endregion\r
1673 \r
1674             // Other\r
1675             #region Processors / Other\r
1676 \r
1677             string processors = Properties.Settings.Default.Processors;\r
1678             //  Number of Processors Handler\r
1679 \r
1680             if (processors == "Automatic")\r
1681                 processors = "";\r
1682             else\r
1683                 processors = " -C " + processors + " ";\r
1684 \r
1685 \r
1686             string queryAdvancedSettings = processors;\r
1687 \r
1688             string verbose = "";\r
1689             if (Properties.Settings.Default.verbose == "Checked")\r
1690                 verbose = " -v ";\r
1691             #endregion\r
1692 \r
1693             return querySource + queryDestination + queryPictureSettings + queryVideoSettings + h264Settings + queryAudioSettings + queryAdvancedSettings + verbose;\r
1694         }\r
1695 \r
1696         private void presetLoader(Functions.QueryParser presetQuery, string name)\r
1697         {\r
1698             // ---------------------------\r
1699             // Setup the GUI\r
1700             // ---------------------------\r
1701 \r
1702             // Source tab\r
1703             #region source\r
1704             if (presetQuery.Source != "")\r
1705                 text_source.Text = presetQuery.Source;\r
1706 \r
1707             if (presetQuery.DVDTitle != 0)\r
1708                 drp_dvdtitle.Text = presetQuery.DVDTitle.ToString();\r
1709 \r
1710             if (presetQuery.DVDChapterStart != 0)\r
1711                 drop_chapterStart.Text = presetQuery.DVDChapterStart.ToString();\r
1712 \r
1713             if (presetQuery.DVDChapterFinish != 0)\r
1714                 drop_chapterFinish.Text = presetQuery.DVDChapterFinish.ToString();\r
1715 \r
1716             if (presetQuery.Format != "")\r
1717             {\r
1718                 string destination = text_destination.Text;\r
1719                 destination = destination.Replace(".mp4", "." + presetQuery.Format);\r
1720                 destination = destination.Replace(".m4v", "." + presetQuery.Format);\r
1721                 destination = destination.Replace(".avi", "." + presetQuery.Format);\r
1722                 destination = destination.Replace(".mkv", "." + presetQuery.Format);\r
1723                 destination = destination.Replace(".ogm", "." + presetQuery.Format);\r
1724                 text_destination.Text = destination;\r
1725             }\r
1726 \r
1727             #endregion\r
1728 \r
1729             // Destination tab\r
1730             #region destination\r
1731 \r
1732             if (presetQuery.Destination != "")\r
1733                 text_destination.Text = presetQuery.Destination;\r
1734 \r
1735             drp_videoEncoder.Text = presetQuery.VideoEncoder;\r
1736             drp_audioCodec.Text = presetQuery.AudioEncoder;\r
1737             if (presetQuery.Width != 0)\r
1738                 text_width.Text = presetQuery.Width.ToString();\r
1739             else\r
1740             {\r
1741                 text_width.Text = "";\r
1742                 text_width.BackColor = Color.White;\r
1743             }\r
1744 \r
1745             if (presetQuery.Height != 0)\r
1746                 text_height.Text = presetQuery.Height.ToString();\r
1747             else\r
1748             {\r
1749                 text_height.Text = "";\r
1750                 text_height.BackColor = Color.White;\r
1751             }\r
1752             #endregion\r
1753 \r
1754             // Picture Settings Tab\r
1755             #region Picture\r
1756             drp_crop.Text = "Manual";\r
1757             text_top.Text = presetQuery.CropTop;\r
1758             text_bottom.Text = presetQuery.CropBottom;\r
1759             text_left.Text = presetQuery.CropLeft;\r
1760             text_right.Text = presetQuery.CropRight;\r
1761 \r
1762             drp_deInterlace_option.Text = presetQuery.DeInterlace;\r
1763             drp_deNoise.Text = presetQuery.DeNoise;\r
1764 \r
1765             if (presetQuery.DeTelecine == true)\r
1766                 check_detelecine.CheckState = CheckState.Checked;\r
1767             else\r
1768                 check_detelecine.CheckState = CheckState.Unchecked;\r
1769 \r
1770 \r
1771             if (presetQuery.DeBlock == true)\r
1772                 check_deblock.CheckState = CheckState.Checked;\r
1773             else\r
1774                 check_deblock.CheckState = CheckState.Unchecked;\r
1775 \r
1776             if (presetQuery.ChapterMarkers == true)\r
1777                 Check_ChapterMarkers.CheckState = CheckState.Checked;\r
1778             else\r
1779                 Check_ChapterMarkers.CheckState = CheckState.Unchecked;\r
1780 \r
1781             if (presetQuery.Anamorphic == true)\r
1782                 CheckPixelRatio.CheckState = CheckState.Checked;\r
1783             else\r
1784                 CheckPixelRatio.CheckState = CheckState.Unchecked;\r
1785 \r
1786             if (presetQuery.LooseAnamorphic == true)\r
1787                 check_lAnamorphic.CheckState = CheckState.Checked;\r
1788             else\r
1789                 check_lAnamorphic.CheckState = CheckState.Unchecked;\r
1790 \r
1791             if (presetQuery.VFR == true)\r
1792                 check_vfr.CheckState = CheckState.Checked;\r
1793             else\r
1794                 check_vfr.CheckState = CheckState.Unchecked;\r
1795             #endregion\r
1796 \r
1797             // Video Settings Tab\r
1798             #region video\r
1799             text_bitrate.Text = presetQuery.AverageVideoBitrate;\r
1800             text_filesize.Text = presetQuery.VideoTargetSize;\r
1801             slider_videoQuality.Value = presetQuery.VideoQuality;\r
1802             if (slider_videoQuality.Value != 0)\r
1803             {\r
1804                 CheckCRF.Enabled = true;\r
1805                 int ql = presetQuery.VideoQuality;\r
1806                 SliderValue.Text = ql.ToString() + "%";\r
1807             }\r
1808 \r
1809             if (presetQuery.TwoPass == true)\r
1810                 check_2PassEncode.CheckState = CheckState.Checked;\r
1811             else\r
1812                 check_2PassEncode.CheckState = CheckState.Unchecked;\r
1813 \r
1814             if (presetQuery.Grayscale == true)\r
1815                 check_grayscale.CheckState = CheckState.Checked;\r
1816             else\r
1817                 check_grayscale.CheckState = CheckState.Unchecked;\r
1818 \r
1819             drp_videoFramerate.Text = presetQuery.VideoFramerate;\r
1820 \r
1821             if (presetQuery.TurboFirstPass == true)\r
1822                 check_turbo.CheckState = CheckState.Checked;\r
1823             else\r
1824                 check_turbo.CheckState = CheckState.Unchecked;\r
1825 \r
1826             if (presetQuery.LargeMP4 == true)\r
1827                 check_largeFile.CheckState = CheckState.Checked;\r
1828             else\r
1829                 check_largeFile.CheckState = CheckState.Unchecked;\r
1830 \r
1831             if (presetQuery.CRF == true)\r
1832                 CheckCRF.CheckState = CheckState.Checked;\r
1833             else\r
1834                 CheckCRF.CheckState = CheckState.Unchecked;\r
1835 \r
1836             if (presetQuery.IpodAtom == true)\r
1837                 check_iPodAtom.CheckState = CheckState.Checked;\r
1838             else\r
1839                 check_iPodAtom.CheckState = CheckState.Unchecked;\r
1840 \r
1841             if (presetQuery.OptimizeMP4 == true)\r
1842                 check_optimiseMP4.CheckState = CheckState.Checked;\r
1843             else\r
1844                 check_optimiseMP4.CheckState = CheckState.Unchecked;\r
1845 \r
1846             #endregion\r
1847 \r
1848             // Audio Settings Tab\r
1849             #region audio\r
1850             drp_audioBitrate.Text = presetQuery.AudioBitrate;\r
1851             drp_audioSampleRate.Text = presetQuery.AudioSampleBitrate;\r
1852             drp_track1Audio.Text = presetQuery.AudioTrack1;\r
1853             drp_track2Audio.Text = presetQuery.AudioTrack2;\r
1854             drp_audioMixDown.Text = presetQuery.AudioTrackMix;\r
1855             drp_subtitle.Text = presetQuery.Subtitles;\r
1856 \r
1857             if (presetQuery.ForcedSubtitles == true)\r
1858             {\r
1859                 check_forced.CheckState = CheckState.Checked;\r
1860                 check_forced.Enabled = true;\r
1861             }\r
1862             else\r
1863                 check_forced.CheckState = CheckState.Unchecked;\r
1864             #endregion\r
1865 \r
1866             // H264 Tab & Preset Name\r
1867             #region other\r
1868             rtf_h264advanced.Text = presetQuery.H264Query;\r
1869 \r
1870             // Set the preset name\r
1871             groupBox_output.Text = "Output Settings (Preset: " + name + ")";\r
1872             #endregion\r
1873         }\r
1874 \r
1875         private Boolean updateCheck()\r
1876         {\r
1877             try\r
1878             {\r
1879                 Functions.RssReader rssRead = new Functions.RssReader();\r
1880                 string build = rssRead.build();\r
1881 \r
1882                 int latest = int.Parse(build);\r
1883                 int current = Properties.Settings.Default.build;\r
1884                 int skip = Properties.Settings.Default.skipversion;\r
1885 \r
1886                 if (latest == skip)\r
1887                 {\r
1888                     return false;\r
1889                 }\r
1890                 else\r
1891                 {\r
1892                     Boolean update = (latest > current);                    \r
1893                     return update;\r
1894                 }\r
1895             }\r
1896             catch (Exception exc)\r
1897             {\r
1898                 MessageBox.Show(exc.ToString());\r
1899                 return false;\r
1900             }\r
1901         }\r
1902 \r
1903         public void setStreamReader(Parsing.DVD dvd)\r
1904         {\r
1905             this.thisDVD = dvd;\r
1906         }\r
1907 \r
1908         #endregion\r
1909 \r
1910 \r
1911 \r
1912    \r
1913 \r
1914 \r
1915         // This is the END of the road ------------------------------------------------------------------------------\r
1916     }\r
1917 }