OSDN Git Service

MacGui: Remove Target Size as a rate control option as it doesn't really work correct...
[handbrake-jp/handbrake-jp-git.git] / win / C# / Functions / QueryGenerator.cs
1 /*  QueryGenerator.cs $\r
2     This file is part of the HandBrake source code.\r
3     Homepage: <http://handbrake.fr/>.\r
4     It may be used under the terms of the GNU General Public License. */\r
5 \r
6 namespace Handbrake.Functions\r
7 {\r
8     using System;\r
9     using System.Collections.Generic;\r
10     using System.Globalization;\r
11     using System.IO;\r
12     using System.Windows.Forms;\r
13 \r
14     using Handbrake.Model;\r
15 \r
16     /// <summary>\r
17     /// Generate a CLI Query for HandBrakeCLI\r
18     /// </summary>\r
19     public class QueryGenerator\r
20     {\r
21         public static string GenerateQueryForPreset(frmMain mainWindow, QueryPictureSettingsMode mode, bool filters, int width, int height)\r
22         {\r
23             string query = string.Empty;\r
24 \r
25             query += GenerateTabbedComponentsQuery(mainWindow, filters, mode, width, height);\r
26 \r
27             return query;\r
28         }\r
29 \r
30         public static string GeneratePreviewQuery(frmMain mainWindow, int duration, string preview)\r
31         {\r
32             string query = string.Empty;\r
33 \r
34             query += SourceQuery(mainWindow, 3, duration, preview);\r
35 \r
36             query += DestinationQuery(mainWindow, QueryEncodeMode.Preview);\r
37 \r
38             query += GenerateTabbedComponentsQuery(mainWindow, true, QueryPictureSettingsMode.UserInterfaceSettings, 0, 0);\r
39 \r
40             return query;\r
41         }\r
42 \r
43         public static string GenerateFullQuery(frmMain mainWindow)\r
44         {\r
45             string query = string.Empty;\r
46 \r
47             query += SourceQuery(mainWindow, mainWindow.drop_mode.SelectedIndex, 0, null);\r
48 \r
49             query += DestinationQuery(mainWindow, QueryEncodeMode.Standard);\r
50 \r
51             query += GenerateTabbedComponentsQuery(mainWindow, true, QueryPictureSettingsMode.UserInterfaceSettings, 0, 0);\r
52 \r
53             return query;\r
54         }\r
55 \r
56         #region Individual Query Sections\r
57 \r
58         private static string GenerateTabbedComponentsQuery(frmMain mainWindow, bool filters, QueryPictureSettingsMode mode, int width, int height)\r
59         {\r
60             string query = string.Empty;\r
61 \r
62             // Output Settings\r
63             query += OutputSettingsQuery(mainWindow);\r
64 \r
65             // Filters Panel\r
66             if (filters)\r
67                 query += FiltersQuery(mainWindow);\r
68 \r
69             // Picture Settings\r
70             query += PictureSettingsQuery(mainWindow, mode, width, height);\r
71 \r
72             // Video Settings\r
73             query += VideoSettingsQuery(mainWindow);\r
74 \r
75             // Audio Settings\r
76             query += AudioSettingsQuery(mainWindow);\r
77 \r
78             // Subtitles Panel\r
79             query += mainWindow.Subtitles.GetCliQuery;\r
80 \r
81             // Chapter Markers\r
82             query += ChapterMarkersQuery(mainWindow);\r
83 \r
84             // X264 Panel\r
85             query += X264Query(mainWindow);\r
86 \r
87             // Extra Settings\r
88             query += ExtraSettings();\r
89 \r
90             return query;\r
91         }\r
92 \r
93         private static string SourceQuery(frmMain mainWindow, int mode, int duration, string preview)\r
94         {\r
95             string query = string.Empty;\r
96 \r
97             if (!string.IsNullOrEmpty(mainWindow.sourcePath) && mainWindow.sourcePath.Trim() != "Select \"Source\" to continue")\r
98             {\r
99                 if (mainWindow.sourcePath.EndsWith("\\"))\r
100                 {\r
101                     query = " -i " + mainWindow.sourcePath;\r
102                 }\r
103                 else\r
104                 {\r
105                     query = " -i " + '"' + mainWindow.sourcePath + '"';\r
106                 }\r
107             }\r
108 \r
109             if (mainWindow.drp_dvdtitle.Text != string.Empty)\r
110             {\r
111                 string[] titleInfo = mainWindow.drp_dvdtitle.Text.Split(' ');\r
112                 query += " -t " + titleInfo[0];\r
113             }\r
114 \r
115             if (!Properties.Settings.Default.noDvdNav && mainWindow.drop_angle.Items.Count != 0)\r
116                 query += " --angle " + mainWindow.drop_angle.SelectedItem;\r
117 \r
118             // Decide what part of the video we want to encode.\r
119             switch (mode)\r
120             {\r
121                 case 0: // Chapters\r
122                     if (mainWindow.drop_chapterFinish.Text == mainWindow.drop_chapterStart.Text &&\r
123                         mainWindow.drop_chapterStart.Text != string.Empty)\r
124                         query += string.Format(" -c {0}", mainWindow.drop_chapterStart.Text);\r
125                     else if (mainWindow.drop_chapterStart.Text != string.Empty &&\r
126                              mainWindow.drop_chapterFinish.Text != string.Empty)\r
127                         query += string.Format(" -c {0}-{1}", mainWindow.drop_chapterStart.Text,\r
128                                                mainWindow.drop_chapterFinish.Text);\r
129                     break;\r
130                 case 1: // Seconds\r
131                     int start, end;\r
132                     int.TryParse(mainWindow.drop_chapterStart.Text, out start);\r
133                     int.TryParse(mainWindow.drop_chapterFinish.Text, out end);\r
134                     int calculatedDuration = end - start;\r
135 \r
136                     query += string.Format(" --start-at duration:{0} --stop-at duration:{1}", mainWindow.drop_chapterStart.Text, calculatedDuration);\r
137                     break;\r
138                 case 2: // Frames\r
139                     int.TryParse(mainWindow.drop_chapterStart.Text, out start);\r
140                     int.TryParse(mainWindow.drop_chapterFinish.Text, out end);\r
141                     calculatedDuration = end - start;\r
142 \r
143                     query += string.Format(" --start-at frame:{0} --stop-at frame:{1}", mainWindow.drop_chapterStart.Text, calculatedDuration);\r
144                     break;\r
145                 case 3: // Preview\r
146                     query += " --previews " + Properties.Settings.Default.previewScanCount + " ";\r
147                     query += " --start-at-preview " + preview;\r
148                     query += " --stop-at duration:" + duration + " ";\r
149                     break;\r
150                 default:\r
151                     break;\r
152             }\r
153 \r
154             return query;\r
155         }\r
156 \r
157         private static string DestinationQuery(frmMain mainWindow, QueryEncodeMode mode)\r
158         {\r
159             string query = string.Empty;\r
160 \r
161             if (mode != QueryEncodeMode.Preview)\r
162                 query += string.Format(" -o \"{0}\" ", mainWindow.text_destination.Text);\r
163             else\r
164             {\r
165                 if (mainWindow.text_destination.Text != string.Empty)\r
166                     query += string.Format(" -o \"{0}\" ", mainWindow.text_destination.Text.Replace(".m", "_sample.m"));\r
167             }\r
168 \r
169             return query;\r
170         }\r
171 \r
172         private static string OutputSettingsQuery(frmMain mainWindow)\r
173         {\r
174             string query = string.Empty;\r
175 \r
176             query += " -f " + mainWindow.drop_format.Text.ToLower().Replace(" file", string.Empty);\r
177 \r
178             // These are output settings features\r
179             if (mainWindow.check_largeFile.Checked)\r
180                 query += " -4 ";\r
181 \r
182             if (mainWindow.check_iPodAtom.Checked)\r
183                 query += " -I ";\r
184 \r
185             if (mainWindow.check_optimiseMP4.Checked)\r
186                 query += " -O ";\r
187 \r
188             return query;\r
189         }\r
190 \r
191         private static string PictureSettingsQuery(frmMain mainWindow, QueryPictureSettingsMode mode, int width, int height)\r
192         {\r
193             string query = string.Empty;\r
194 \r
195             if (mode == QueryPictureSettingsMode.UserInterfaceSettings)\r
196             {\r
197                 if (mainWindow.PictureSettings.text_width.Value != 0)\r
198                     if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex != 1) // Prevent usage for strict anamorphic\r
199                         query += " -w " + mainWindow.PictureSettings.text_width.Text;\r
200 \r
201                 if (mainWindow.PictureSettings.text_height.Value != 0 &&\r
202                     mainWindow.PictureSettings.text_height.Text != string.Empty)\r
203                     if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 0 ||\r
204                         mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 3) // Prevent usage for strict anamorphic\r
205                         query += " -l " + mainWindow.PictureSettings.text_height.Text;\r
206             }\r
207             else if (mode == QueryPictureSettingsMode.Custom) // For Add Preset Only.\r
208             {\r
209                 query += " -X " + width;\r
210                 query += " -Y " + height;\r
211             }\r
212             else if (mode == QueryPictureSettingsMode.SourceMaximum) // For Add Preset Only.\r
213             {\r
214                 if (mainWindow.PictureSettings.text_width.Value != 0)\r
215                     if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex != 1) // Prevent usage for strict anamorphic\r
216                         query += " -X " + mainWindow.PictureSettings.text_width.Text;\r
217 \r
218                 if (mainWindow.PictureSettings.text_height.Value != 0 &&\r
219                     mainWindow.PictureSettings.text_height.Text != string.Empty)\r
220                     if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 0 ||\r
221                         mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 3) // Prevent usage for strict anamorphic\r
222                         query += " -Y " + mainWindow.PictureSettings.text_height.Text;\r
223             }\r
224 \r
225             string cropTop = mainWindow.PictureSettings.crop_top.Text;\r
226             string cropBottom = mainWindow.PictureSettings.crop_bottom.Text;\r
227             string cropLeft = mainWindow.PictureSettings.crop_left.Text;\r
228             string cropRight = mainWindow.PictureSettings.crop_right.Text;\r
229 \r
230             if (mainWindow.PictureSettings.check_customCrop.Checked && mode != QueryPictureSettingsMode.None)\r
231             {\r
232                 if (mainWindow.PictureSettings.crop_top.Text == string.Empty)\r
233                     cropTop = "0";\r
234                 if (mainWindow.PictureSettings.crop_bottom.Text == string.Empty)\r
235                     cropBottom = "0";\r
236                 if (mainWindow.PictureSettings.crop_left.Text == string.Empty)\r
237                     cropLeft = "0";\r
238                 if (mainWindow.PictureSettings.crop_right.Text == string.Empty)\r
239                     cropRight = "0";\r
240 \r
241                 query += " --crop " + cropTop + ":" + cropBottom + ":" + cropLeft + ":" + cropRight;\r
242             }\r
243 \r
244             switch (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex)\r
245             {\r
246                 case 0:\r
247                     if (mainWindow.PictureSettings.drp_modulus.SelectedIndex != 0)\r
248                         query += " --modulus " + mainWindow.PictureSettings.drp_modulus.SelectedItem;\r
249                     break;\r
250                 case 1:\r
251                     query += " --strict-anamorphic ";\r
252                     break;\r
253                 case 2:\r
254                     query += " --loose-anamorphic ";\r
255                     if (mainWindow.PictureSettings.drp_modulus.SelectedIndex != 0)\r
256                         query += " --modulus " + mainWindow.PictureSettings.drp_modulus.SelectedItem;\r
257                     break;\r
258                 case 3:\r
259                     query += " --custom-anamorphic ";\r
260 \r
261                     if (mainWindow.PictureSettings.drp_modulus.SelectedIndex != 0)\r
262                         query += " --modulus " + mainWindow.PictureSettings.drp_modulus.SelectedItem;\r
263 \r
264                     if (mainWindow.PictureSettings.check_KeepAR.Checked)\r
265                         query += " --display-width " + mainWindow.PictureSettings.updownDisplayWidth.Text + " ";\r
266 \r
267                     if (mainWindow.PictureSettings.check_KeepAR.Checked)\r
268                         query += " --keep-display-aspect ";\r
269 \r
270                     if (!mainWindow.PictureSettings.check_KeepAR.Checked)\r
271                         if (mainWindow.PictureSettings.updownParWidth.Text != string.Empty &&\r
272                             mainWindow.PictureSettings.updownParHeight.Text != string.Empty)\r
273                             query += " --pixel-aspect " + mainWindow.PictureSettings.updownParWidth.Text + ":" +\r
274                                      mainWindow.PictureSettings.updownParHeight.Text + " ";\r
275                     break;\r
276             }\r
277 \r
278             return query;\r
279         }\r
280 \r
281         private static string FiltersQuery(frmMain mainWindow)\r
282         {\r
283             return mainWindow.Filters.GetCliQuery;\r
284         }\r
285 \r
286         private static string VideoSettingsQuery(frmMain mainWindow)\r
287         {\r
288             string query = string.Empty;\r
289 \r
290             switch (mainWindow.drp_videoEncoder.Text)\r
291             {\r
292                 case "MPEG-4 (FFmpeg)":\r
293                     query += " -e ffmpeg";\r
294                     break;\r
295                 case "H.264 (x264)":\r
296                     query += " -e x264";\r
297                     break;\r
298                 case "VP3 (Theora)":\r
299                     query += " -e theora";\r
300                     break;\r
301                 default:\r
302                     query += " -e x264";\r
303                     break;\r
304             }\r
305 \r
306             // Video Settings\r
307             if (mainWindow.radio_avgBitrate.Checked)\r
308                 query += " -b " + mainWindow.text_bitrate.Text;\r
309 \r
310             // Video Quality Setting\r
311             if (mainWindow.radio_cq.Checked)\r
312             {\r
313                 double cqStep = Properties.Settings.Default.x264cqstep;\r
314                 double value;\r
315                 switch (mainWindow.drp_videoEncoder.Text)\r
316                 {\r
317                     case "MPEG-4 (FFmpeg)":\r
318                         value = 31 - (mainWindow.slider_videoQuality.Value - 1);\r
319                         query += " -q " + value.ToString(new CultureInfo("en-US"));\r
320                         break;\r
321                     case "H.264 (x264)":\r
322                         CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");\r
323                         value = 51 - (mainWindow.slider_videoQuality.Value * cqStep);\r
324                         value = Math.Round(value, 2);\r
325                         query += " -q " + value.ToString(culture);\r
326                         break;\r
327                     case "VP3 (Theora)":\r
328                         value = mainWindow.slider_videoQuality.Value;\r
329                         query += " -q " + value.ToString(new CultureInfo("en-US"));\r
330                         break;\r
331                 }\r
332             }\r
333 \r
334             if (mainWindow.check_2PassEncode.Checked)\r
335                 query += " -2 ";\r
336 \r
337             if (mainWindow.check_turbo.Checked)\r
338                 query += " -T ";\r
339 \r
340             if (mainWindow.drp_videoFramerate.Text != "Same as source")\r
341                 query += " -r " + mainWindow.drp_videoFramerate.Text;\r
342 \r
343             if (mainWindow.checkMaximumFramerate.Checked)\r
344                 query += " --pfr ";\r
345 \r
346             return query;\r
347         }\r
348 \r
349         private static string AudioSettingsQuery(frmMain mainWindow)\r
350         {\r
351             string query = string.Empty;\r
352 \r
353             DataGridView audioTracks = mainWindow.AudioSettings.GetAudioPanel();\r
354             List<string> tracks = new List<string>();\r
355             List<string> codecs = new List<string>();\r
356             List<string> mixdowns = new List<string>();\r
357             List<string> samplerates = new List<string>();\r
358             List<string> bitrates = new List<string>();\r
359             List<string> drcs = new List<string>();\r
360 \r
361             // No Audio\r
362             if (audioTracks.Rows.Count == 0)\r
363                 query += " -a none ";\r
364 \r
365             // Gather information about each audio track and store them in the declared lists.\r
366             foreach (DataGridViewRow row in audioTracks.Rows)\r
367             {\r
368                 // Audio Track (-a)\r
369                 if (row.Cells[1].Value.ToString() == "Automatic")\r
370                     tracks.Add("1");\r
371                 else if (row.Cells[1].Value.ToString() != "None")\r
372                 {\r
373                     string[] tempSub = row.Cells[1].Value.ToString().Split(' ');\r
374                     tracks.Add(tempSub[0]);\r
375                 }\r
376 \r
377                 // Audio Codec (-E)\r
378                 if (row.Cells[2].Value.ToString() != String.Empty)\r
379                     codecs.Add(GetAudioEncoder(row.Cells[2].Value.ToString()));\r
380 \r
381                 // Audio Mixdown (-6)\r
382                 if (row.Cells[3].Value.ToString() != String.Empty)\r
383                     mixdowns.Add(GetMixDown(row.Cells[3].Value.ToString()));\r
384 \r
385                 // Sample Rate (-R)\r
386                 if (row.Cells[4].Value.ToString() != String.Empty)\r
387                     samplerates.Add(row.Cells[4].Value.ToString());\r
388 \r
389                 // Audio Bitrate (-B)\r
390                 if (row.Cells[5].Value.ToString() != String.Empty)\r
391                     bitrates.Add(row.Cells[5].Value.ToString().Replace("Auto", "auto"));\r
392 \r
393                 // DRC (-D)\r
394                 if (row.Cells[6].Value.ToString() != String.Empty)\r
395                     drcs.Add(row.Cells[6].Value.ToString());\r
396             }\r
397 \r
398             // Audio Track (-a)\r
399             string audioItems = string.Empty;\r
400             bool firstLoop = true;\r
401 \r
402             foreach (string item in tracks)\r
403             {\r
404                 if (firstLoop)\r
405                 {\r
406                     audioItems = item;\r
407                     firstLoop = false;\r
408                 }\r
409                 else\r
410                     audioItems += "," + item;\r
411             }\r
412             if (audioItems.Trim() != String.Empty)\r
413                 query += " -a " + audioItems;\r
414             firstLoop = true;\r
415             audioItems = string.Empty; // Reset for another pass.\r
416 \r
417             // Audio Codec (-E)\r
418             foreach (string item in codecs)\r
419             {\r
420                 if (firstLoop)\r
421                 {\r
422                     audioItems = item;\r
423                     firstLoop = false;\r
424                 }\r
425                 else\r
426                     audioItems += "," + item;\r
427             }\r
428             if (audioItems.Trim() != String.Empty)\r
429                 query += " -E " + audioItems;\r
430             firstLoop = true;\r
431             audioItems = string.Empty; // Reset for another pass.\r
432 \r
433             // Audio Mixdown (-6)\r
434             foreach (string item in mixdowns)\r
435             {\r
436                 if (firstLoop)\r
437                 {\r
438                     audioItems = item;\r
439                     firstLoop = false;\r
440                 }\r
441                 else\r
442                     audioItems += "," + item;\r
443             }\r
444             if (audioItems.Trim() != String.Empty)\r
445                 query += " -6 " + audioItems;\r
446             firstLoop = true;\r
447             audioItems = string.Empty; // Reset for another pass.\r
448 \r
449             // Sample Rate (-R)\r
450             foreach (string item in samplerates)\r
451             {\r
452                 if (firstLoop)\r
453                 {\r
454                     audioItems = item;\r
455                     firstLoop = false;\r
456                 }\r
457                 else\r
458                     audioItems += "," + item;\r
459             }\r
460             if (audioItems.Trim() != String.Empty)\r
461                 query += " -R " + audioItems;\r
462             firstLoop = true;\r
463             audioItems = string.Empty; // Reset for another pass.\r
464 \r
465             // Audio Bitrate (-B)\r
466             foreach (string item in bitrates)\r
467             {\r
468                 if (firstLoop)\r
469                 {\r
470                     audioItems = item;\r
471                     firstLoop = false;\r
472                 }\r
473                 else\r
474                     audioItems += "," + item;\r
475             }\r
476             if (audioItems.Trim() != String.Empty)\r
477                 query += " -B " + audioItems;\r
478             firstLoop = true;\r
479             audioItems = string.Empty; // Reset for another pass.\r
480 \r
481             // DRC (-D)\r
482             foreach (var itm in drcs)\r
483             {\r
484                 string item = itm.ToString(new CultureInfo("en-US"));\r
485                 if (firstLoop)\r
486                 {\r
487                     audioItems = item;\r
488                     firstLoop = false;\r
489                 }\r
490                 else\r
491                     audioItems += "," + item;\r
492             }\r
493             if (audioItems.Trim() != String.Empty)\r
494                 query += " -D " + audioItems;\r
495 \r
496             return query;\r
497         }\r
498 \r
499         private static string ChapterMarkersQuery(frmMain mainWindow)\r
500         {\r
501             string query = string.Empty;\r
502 \r
503             // Attach Source name and dvd title to the start of the chapters.csv filename.\r
504             // This is for the queue. It allows different chapter name files for each title.\r
505             string[] destNameSplit = mainWindow.text_destination.Text.Split('\\');\r
506             string destName = destNameSplit[destNameSplit.Length - 1];\r
507             destName = destName.Replace("\"", string.Empty);\r
508             destName = destName.Replace(".mp4", string.Empty).Replace(".m4v", string.Empty).Replace(".mkv", string.Empty);\r
509 \r
510             string sourceTitle = mainWindow.drp_dvdtitle.Text;\r
511             string[] titlesplit = sourceTitle.Split(' ');\r
512             sourceTitle = titlesplit[0];\r
513 \r
514             if (mainWindow.Check_ChapterMarkers.Checked && mainWindow.Check_ChapterMarkers.Enabled)\r
515             {\r
516                 if (destName.Trim() != String.Empty)\r
517                 {\r
518                     string path = sourceTitle != "Automatic"\r
519                                       ? Path.Combine(Path.GetTempPath(), destName + "-" + sourceTitle + "-chapters.csv")\r
520                                       : Path.Combine(Path.GetTempPath(), destName + "-chapters.csv");\r
521 \r
522                     if (ChapterCsvSave(mainWindow, path) == false)\r
523                         query += " -m ";\r
524                     else\r
525                         query += " --markers=" + "\"" + path + "\"";\r
526                 }\r
527                 else\r
528                     query += " -m";\r
529             }\r
530 \r
531             return query;\r
532         }\r
533 \r
534         private static string X264Query(frmMain mainWindow)\r
535         {\r
536             if (string.IsNullOrEmpty(mainWindow.x264Panel.X264Query)) return string.Empty;\r
537 \r
538             return " -x " + mainWindow.x264Panel.X264Query;\r
539         }\r
540 \r
541         private static string ExtraSettings()\r
542         {\r
543             string query = string.Empty;\r
544 \r
545             // Verbosity Level\r
546             query += " --verbose=" + Properties.Settings.Default.verboseLevel;\r
547 \r
548             // LibDVDNav\r
549             if (Properties.Settings.Default.noDvdNav)\r
550                 query += " --no-dvdnav";\r
551 \r
552             return query;\r
553         }\r
554 \r
555         #endregion\r
556 \r
557         #region Helpers\r
558 \r
559         /// <summary>\r
560         /// Return the CLI Mixdown name\r
561         /// </summary>\r
562         /// <param name="selectedAudio">GUI mixdown name</param>\r
563         /// <returns>CLI mixdown name</returns>\r
564         private static string GetMixDown(string selectedAudio)\r
565         {\r
566             switch (selectedAudio)\r
567             {\r
568                 case "Automatic":\r
569                     return "auto";\r
570                 case "Mono":\r
571                     return "mono";\r
572                 case "Stereo":\r
573                     return "stereo";\r
574                 case "Dolby Surround":\r
575                     return "dpl1";\r
576                 case "Dolby Pro Logic II":\r
577                     return "dpl2";\r
578                 case "6 Channel Discrete":\r
579                     return "6ch";\r
580                 default:\r
581                     return "auto";\r
582             }\r
583         }\r
584 \r
585         /// <summary>\r
586         /// Get the CLI Audio Encoder name\r
587         /// </summary>\r
588         /// <param name="selectedEncoder">\r
589         /// String The GUI Encode name\r
590         /// </param>\r
591         /// <returns>\r
592         /// String CLI encoder name\r
593         /// </returns>\r
594         private static string GetAudioEncoder(string selectedEncoder)\r
595         {\r
596             switch (selectedEncoder)\r
597             {\r
598                 case "AAC (faac)":\r
599                     return "faac";\r
600                 case "MP3 (lame)":\r
601                     return "lame";\r
602                 case "Vorbis (vorbis)":\r
603                     return "vorbis";\r
604                 case "AC3 Passthru":\r
605                     return "copy:ac3";\r
606                 case "DTS Passthru":\r
607                     return "copy:dts";\r
608                 case "AC3 (ffmpeg)":\r
609                     return "ac3";\r
610                 default:\r
611                     return string.Empty;\r
612             }\r
613         }\r
614 \r
615         /// <summary>\r
616         /// Create a CSV file with the data from the Main Window Chapters tab\r
617         /// </summary>\r
618         /// <param name="mainWindow">Main Window</param>\r
619         /// <param name="filePathName">Path to save the csv file</param>\r
620         /// <returns>True if successful </returns>\r
621         private static bool ChapterCsvSave(frmMain mainWindow, string filePathName)\r
622         {\r
623             try\r
624             {\r
625                 string csv = string.Empty;\r
626 \r
627                 foreach (DataGridViewRow row in mainWindow.data_chpt.Rows)\r
628                 {\r
629                     csv += row.Cells[0].Value.ToString();\r
630                     csv += ",";\r
631                     csv += row.Cells[1].Value.ToString().Replace(",", "\\,");\r
632                     csv += Environment.NewLine;\r
633                 }\r
634                 StreamWriter file = new StreamWriter(filePathName);\r
635                 file.Write(csv);\r
636                 file.Close();\r
637                 file.Dispose();\r
638                 return true;\r
639             }\r
640             catch (Exception exc)\r
641             {\r
642                 MessageBox.Show("Unable to save Chapter Makrers file! \nChapter marker names will NOT be saved in your encode \n\n" + exc, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
643                 return false;\r
644             }\r
645         }\r
646         #endregion\r
647     }\r
648 }