3 This file is part of the HandBrake source code.
\r
4 Homepage: <http://handbrake.m0k.org/>.
\r
5 It may be used under the terms of the GNU General Public License. */
\r
8 using System.Collections.Generic;
\r
10 using System.Windows.Forms;
\r
11 using System.Globalization;
\r
13 using System.Drawing;
\r
15 namespace Handbrake.Functions
\r
20 * Checks for updates and returns "true" boolean if one exists.
\r
22 public Boolean updateCheck()
\r
26 Functions.RssReader rssRead = new Functions.RssReader();
\r
27 string build = rssRead.build();
\r
29 int latest = int.Parse(build);
\r
30 int current = Properties.Settings.Default.hb_build;
\r
31 int skip = Properties.Settings.Default.skipversion;
\r
39 Boolean update = (latest > current);
\r
43 catch (Exception exc)
\r
45 MessageBox.Show(exc.ToString());
\r
51 * Function which generates the filename and path automatically based on the Source Name, DVD title and DVD Chapters
\r
53 public void autoName(frmMain mainWindow)
\r
55 if (Properties.Settings.Default.autoNaming == "Checked")
\r
57 if (mainWindow.drp_dvdtitle.Text != "Automatic")
\r
59 string source = mainWindow.text_source.Text;
\r
60 string[] sourceName = source.Split('\\');
\r
61 source = sourceName[sourceName.Length - 1].Replace(".iso", "").Replace(".mpg", "").Replace(".ts", "").Replace(".ps", "");
\r
63 string title = mainWindow.drp_dvdtitle.Text;
\r
64 string[] titlesplit = title.Split(' ');
\r
65 title = titlesplit[0];
\r
67 string cs = mainWindow.drop_chapterStart.Text;
\r
68 string cf = mainWindow.drop_chapterFinish.Text;
\r
70 if (title == "Automatic")
\r
81 if (!mainWindow.text_destination.Text.Contains("\\"))
\r
83 string filePath = "";
\r
84 if (Properties.Settings.Default.autoNamePath.Trim() != "")
\r
86 if (Properties.Settings.Default.autoNamePath.Trim() != "Click 'Browse' to set the default location")
\r
87 filePath = Properties.Settings.Default.autoNamePath + "\\";
\r
89 mainWindow.text_destination.Text = filePath + source + "_T" + title + "_C" + cs + dash + cf + ".mp4";
\r
93 string dest = mainWindow.text_destination.Text;
\r
95 string[] destName = dest.Split('\\');
\r
98 string[] extension = dest.Split('.');
\r
99 string ext = extension[extension.Length - 1];
\r
101 destName[destName.Length - 1] = source + "_T" + title + "_C" + cs + dash + cf + "." + ext;
\r
103 string fullDest = "";
\r
104 foreach (string part in destName)
\r
106 if (fullDest != "")
\r
107 fullDest = fullDest + "\\" + part;
\r
109 fullDest = fullDest + part;
\r
112 mainWindow.text_destination.Text = fullDest;
\r
119 * This function takes in a Query which has been parsed by QueryParser and sets up the GUI.
\r
121 public void presetLoader(frmMain mainWindow, Functions.QueryParser presetQuery, string name)
\r
123 // ---------------------------
\r
125 // ---------------------------
\r
129 if (presetQuery.Source != "")
\r
130 mainWindow.text_source.Text = presetQuery.Source;
\r
132 if (presetQuery.DVDTitle != 0)
\r
133 mainWindow.drp_dvdtitle.Text = presetQuery.DVDTitle.ToString();
\r
135 if (presetQuery.DVDChapterStart != 0)
\r
136 mainWindow.drop_chapterStart.Text = presetQuery.DVDChapterStart.ToString();
\r
138 if (presetQuery.DVDChapterFinish != 0)
\r
139 mainWindow.drop_chapterFinish.Text = presetQuery.DVDChapterFinish.ToString();
\r
141 if (presetQuery.Format != "")
\r
143 string destination = mainWindow.text_destination.Text;
\r
144 destination = destination.Replace(".mp4", "." + presetQuery.Format);
\r
145 destination = destination.Replace(".m4v", "." + presetQuery.Format);
\r
146 destination = destination.Replace(".avi", "." + presetQuery.Format);
\r
147 destination = destination.Replace(".mkv", "." + presetQuery.Format);
\r
148 destination = destination.Replace(".ogm", "." + presetQuery.Format);
\r
149 mainWindow.text_destination.Text = destination;
\r
155 #region destination
\r
157 if (presetQuery.Destination != "")
\r
158 mainWindow.text_destination.Text = presetQuery.Destination;
\r
160 mainWindow.drp_videoEncoder.Text = presetQuery.VideoEncoder;
\r
161 mainWindow.drp_audioCodec.Text = presetQuery.AudioEncoder;
\r
165 // Picture Settings Tab
\r
167 mainWindow.drp_crop.Text = "Manual";
\r
168 mainWindow.text_top.Text = presetQuery.CropTop;
\r
169 mainWindow.text_bottom.Text = presetQuery.CropBottom;
\r
170 mainWindow.text_left.Text = presetQuery.CropLeft;
\r
171 mainWindow.text_right.Text = presetQuery.CropRight;
\r
173 mainWindow.drp_deInterlace_option.Text = presetQuery.DeInterlace;
\r
174 mainWindow.drp_deNoise.Text = presetQuery.DeNoise;
\r
176 if (presetQuery.DeTelecine == true)
\r
177 mainWindow.check_detelecine.CheckState = CheckState.Checked;
\r
179 mainWindow.check_detelecine.CheckState = CheckState.Unchecked;
\r
182 if (presetQuery.DeBlock == true)
\r
183 mainWindow.check_deblock.CheckState = CheckState.Checked;
\r
185 mainWindow.check_deblock.CheckState = CheckState.Unchecked;
\r
187 if (presetQuery.ChapterMarkers == true)
\r
188 mainWindow.Check_ChapterMarkers.CheckState = CheckState.Checked;
\r
190 mainWindow.Check_ChapterMarkers.CheckState = CheckState.Unchecked;
\r
192 if (presetQuery.Anamorphic == true)
\r
193 mainWindow.CheckPixelRatio.CheckState = CheckState.Checked;
\r
195 mainWindow.CheckPixelRatio.CheckState = CheckState.Unchecked;
\r
197 if (presetQuery.LooseAnamorphic == true)
\r
198 mainWindow.check_lAnamorphic.CheckState = CheckState.Checked;
\r
200 mainWindow.check_lAnamorphic.CheckState = CheckState.Unchecked;
\r
202 if (presetQuery.Width != 0)
\r
203 mainWindow.text_width.Text = presetQuery.Width.ToString();
\r
206 mainWindow.text_width.Text = "";
\r
207 mainWindow.text_width.BackColor = Color.White;
\r
210 if (presetQuery.Height != 0)
\r
211 mainWindow.text_height.Text = presetQuery.Height.ToString();
\r
214 mainWindow.text_height.Text = "";
\r
215 mainWindow.text_height.BackColor = Color.White;
\r
218 if (presetQuery.VFR == true)
\r
219 mainWindow.check_vfr.CheckState = CheckState.Checked;
\r
221 mainWindow.check_vfr.CheckState = CheckState.Unchecked;
\r
224 // Video Settings Tab
\r
226 mainWindow.text_bitrate.Text = presetQuery.AverageVideoBitrate;
\r
227 mainWindow.text_filesize.Text = presetQuery.VideoTargetSize;
\r
228 mainWindow.slider_videoQuality.Value = presetQuery.VideoQuality;
\r
229 if (mainWindow.slider_videoQuality.Value != 0)
\r
231 int ql = presetQuery.VideoQuality;
\r
232 mainWindow.SliderValue.Text = ql.ToString() + "%";
\r
235 if (presetQuery.TwoPass == true)
\r
236 mainWindow.check_2PassEncode.CheckState = CheckState.Checked;
\r
238 mainWindow.check_2PassEncode.CheckState = CheckState.Unchecked;
\r
240 if (presetQuery.Grayscale == true)
\r
241 mainWindow.check_grayscale.CheckState = CheckState.Checked;
\r
243 mainWindow.check_grayscale.CheckState = CheckState.Unchecked;
\r
245 mainWindow.drp_videoFramerate.Text = presetQuery.VideoFramerate;
\r
247 if (presetQuery.TurboFirstPass == true)
\r
248 mainWindow.check_turbo.CheckState = CheckState.Checked;
\r
250 mainWindow.check_turbo.CheckState = CheckState.Unchecked;
\r
252 if (presetQuery.LargeMP4 == true)
\r
253 mainWindow.check_largeFile.CheckState = CheckState.Checked;
\r
255 mainWindow.check_largeFile.CheckState = CheckState.Unchecked;
\r
257 if (presetQuery.IpodAtom == true)
\r
258 mainWindow.check_iPodAtom.CheckState = CheckState.Checked;
\r
260 mainWindow.check_iPodAtom.CheckState = CheckState.Unchecked;
\r
262 if (presetQuery.OptimizeMP4 == true)
\r
263 mainWindow.check_optimiseMP4.CheckState = CheckState.Checked;
\r
265 mainWindow.check_optimiseMP4.CheckState = CheckState.Unchecked;
\r
269 // Audio Settings Tab
\r
271 mainWindow.drp_audioBitrate.Text = presetQuery.AudioBitrate;
\r
272 mainWindow.drp_audioSampleRate.Text = presetQuery.AudioSampleBitrate;
\r
273 mainWindow.drp_track1Audio.Text = presetQuery.AudioTrack1;
\r
274 mainWindow.drp_track2Audio.Text = presetQuery.AudioTrack2;
\r
275 mainWindow.drp_audioMixDown.Text = presetQuery.AudioTrackMix;
\r
276 mainWindow.drp_subtitle.Text = presetQuery.Subtitles;
\r
278 if (presetQuery.ForcedSubtitles == true)
\r
280 mainWindow.check_forced.CheckState = CheckState.Checked;
\r
281 mainWindow.check_forced.Enabled = true;
\r
284 mainWindow.check_forced.CheckState = CheckState.Unchecked;
\r
286 // Dynamic Range Compression (Should be a float but we use double for ease)
\r
287 double value = presetQuery.DRC;
\r
289 value = value - 10;
\r
290 mainWindow.slider_drc.Value = int.Parse(value.ToString());
\r
292 double actualValue = presetQuery.DRC / 10;
\r
293 mainWindow.lbl_drc.Text = actualValue.ToString();
\r
298 // H264 Tab & Preset Name
\r
300 mainWindow.rtf_h264advanced.Text = presetQuery.H264Query;
\r
302 // Set the preset name
\r
303 mainWindow.groupBox_output.Text = "Output Settings (Preset: " + name + ")";
\r
308 * This takes all the widgets on frmMain
\r
310 public string GenerateTheQuery(frmMain mainWindow)
\r
315 string source = mainWindow.text_source.Text;
\r
316 string dvdTitle = mainWindow.drp_dvdtitle.Text;
\r
317 string chapterStart = mainWindow.drop_chapterStart.Text;
\r
318 string chapterFinish = mainWindow.drop_chapterFinish.Text;
\r
319 int totalChapters = mainWindow.drop_chapterFinish.Items.Count - 1;
\r
320 string dvdChapter = "";
\r
322 if ((source != "") || (source != "Click 'Browse' to continue"))
\r
323 source = " -i " + '"' + source + '"';
\r
325 if (dvdTitle == "Automatic")
\r
329 string[] titleInfo = dvdTitle.Split(' ');
\r
330 dvdTitle = " -t " + titleInfo[0];
\r
333 if (chapterFinish.Equals("Auto") && chapterStart.Equals("Auto"))
\r
335 else if (chapterFinish == chapterStart)
\r
336 dvdChapter = " -c " + chapterStart;
\r
338 dvdChapter = " -c " + chapterStart + "-" + chapterFinish;
\r
340 string querySource = source + dvdTitle + dvdChapter;
\r
344 #region Destination
\r
346 string destination = mainWindow.text_destination.Text;
\r
347 string videoEncoder = mainWindow.drp_videoEncoder.Text;
\r
348 string audioEncoder = mainWindow.drp_audioCodec.Text;
\r
349 string width = mainWindow.text_width.Text;
\r
350 string height = mainWindow.text_height.Text;
\r
352 if (destination != "")
\r
353 destination = " -o " + '"' + destination + '"'; //'"'+
\r
356 switch (videoEncoder)
\r
359 videoEncoder = " -e ffmpeg";
\r
362 videoEncoder = " -e xvid";
\r
365 videoEncoder = " -e x264";
\r
367 case "H.264 (iPod)":
\r
368 videoEncoder = " -e x264b30";
\r
371 videoEncoder = " -e x264";
\r
375 switch (audioEncoder)
\r
378 audioEncoder = " -E faac";
\r
381 audioEncoder = " -E lame";
\r
384 audioEncoder = " -E vorbis";
\r
387 audioEncoder = " -E ac3";
\r
390 audioEncoder = " -E faac";
\r
395 width = " -w " + width;
\r
398 if (height == "Auto")
\r
402 else if (height != "")
\r
404 height = " -l " + height;
\r
408 string queryDestination = destination + videoEncoder + audioEncoder + width + height;
\r
411 // Picture Settings Tab
\r
412 #region Picture Settings Tab
\r
414 string cropSetting = mainWindow.drp_crop.Text;
\r
415 string cropTop = mainWindow.text_top.Text;
\r
416 string cropBottom = mainWindow.text_bottom.Text;
\r
417 string cropLeft = mainWindow.text_left.Text;
\r
418 string cropRight = mainWindow.text_right.Text;
\r
419 string cropOut = "";
\r
420 string deInterlace_Option = mainWindow.drp_deInterlace_option.Text;
\r
421 string deinterlace = "";
\r
422 string grayscale = "";
\r
423 string pixelRatio = "";
\r
425 string deblock = "";
\r
426 string detelecine = "";
\r
427 string lanamorphic = "";
\r
431 if (cropSetting == "Automatic")
\r
433 else if (cropSetting == "No Crop")
\r
434 cropOut = " --crop 0:0:0:0 ";
\r
437 if (mainWindow.text_top.Text == "")
\r
439 if (mainWindow.text_bottom.Text == "")
\r
441 if (mainWindow.text_left.Text == "")
\r
443 if (mainWindow.text_right.Text == "")
\r
446 cropOut = " --crop " + cropTop + ":" + cropBottom + ":" + cropLeft + ":" + cropRight;
\r
449 switch (deInterlace_Option)
\r
455 deinterlace = " --deinterlace=fast";
\r
458 deinterlace = " --deinterlace=slow";
\r
461 deinterlace = " --deinterlace=slower";
\r
464 deinterlace = " --deinterlace=slowest";
\r
471 if (mainWindow.check_grayscale.Checked)
\r
472 grayscale = " -g ";
\r
474 if (mainWindow.CheckPixelRatio.Checked)
\r
475 pixelRatio = " -p ";
\r
477 if (mainWindow.check_deblock.Checked)
\r
478 deblock = " --deblock";
\r
480 if (mainWindow.check_detelecine.Checked)
\r
481 detelecine = " --detelecine";
\r
483 if (mainWindow.check_vfr.Checked)
\r
486 if (mainWindow.check_lAnamorphic.Checked)
\r
487 lanamorphic = " -P ";
\r
489 string queryPictureSettings = cropOut + deinterlace + deblock + detelecine + vfr + grayscale + pixelRatio + lanamorphic;
\r
492 // Video Settings Tab
\r
493 #region Video Settings Tab
\r
495 string videoBitrate = mainWindow.text_bitrate.Text;
\r
496 string videoFilesize = mainWindow.text_filesize.Text;
\r
497 double videoQuality = mainWindow.slider_videoQuality.Value;
\r
498 string vidQSetting = "";
\r
499 string twoPassEncoding = "";
\r
500 string videoFramerate = mainWindow.drp_videoFramerate.Text;
\r
501 string vid_frame_rate = "";
\r
502 string turboH264 = "";
\r
503 string largeFile = "";
\r
504 string denoise = "";
\r
505 string ipodAtom = "";
\r
506 string optimizeMP4 = "";
\r
508 if (videoBitrate != "")
\r
509 videoBitrate = " -b " + videoBitrate;
\r
511 if (videoFilesize != "")
\r
512 videoFilesize = " -S " + videoFilesize;
\r
514 // Video Quality Setting
\r
516 if ((videoQuality == 0))
\r
520 videoQuality = videoQuality / 100;
\r
521 if (videoQuality == 1)
\r
523 vidQSetting = "1.0";
\r
525 vidQSetting = " -q " + videoQuality.ToString(new CultureInfo("en-US"));
\r
528 if (mainWindow.check_2PassEncode.Checked)
\r
529 twoPassEncoding = " -2 ";
\r
531 if (videoFramerate == "Automatic")
\r
532 vid_frame_rate = "";
\r
535 if (!mainWindow.check_vfr.Checked)
\r
536 vid_frame_rate = " -r " + videoFramerate;
\r
539 if (mainWindow.check_turbo.Checked)
\r
540 turboH264 = " -T ";
\r
542 if (mainWindow.check_largeFile.Checked)
\r
543 largeFile = " -4 ";
\r
546 switch (mainWindow.drp_deNoise.Text)
\r
552 denoise = " --denoise=weak";
\r
555 denoise = " --denoise=medium";
\r
558 denoise = " --denoise=strong";
\r
565 if (mainWindow.check_iPodAtom.Checked)
\r
568 if (mainWindow.check_optimiseMP4.Checked)
\r
569 optimizeMP4 = " -O ";
\r
572 string queryVideoSettings = videoBitrate + videoFilesize + vidQSetting + twoPassEncoding + vid_frame_rate + turboH264 + ipodAtom + optimizeMP4 + largeFile + denoise;
\r
575 // Audio Settings Tab
\r
576 #region Audio Settings Tab
\r
578 string audioBitrate = mainWindow.drp_audioBitrate.Text;
\r
579 string audioSampleRate = mainWindow.drp_audioSampleRate.Text;
\r
580 string track1 = mainWindow.drp_track1Audio.Text;
\r
581 string track2 = mainWindow.drp_track2Audio.Text;
\r
582 string audioChannels = "";
\r
583 string Mixdown = mainWindow.drp_audioMixDown.Text;
\r
584 string SixChannelAudio = "";
\r
585 string subtitles = mainWindow.drp_subtitle.Text;
\r
586 string subScan = "";
\r
587 string forced = "";
\r
590 if (audioBitrate != "")
\r
591 audioBitrate = " -B " + audioBitrate;
\r
593 if (audioSampleRate != "")
\r
594 audioSampleRate = " -R " + audioSampleRate;
\r
597 if (track1 == "Automatic")
\r
598 audioChannels = "";
\r
599 else if (track1 == "")
\r
600 audioChannels = "";
\r
601 else if (track1 == "None")
\r
602 audioChannels = " -a none";
\r
606 tempSub = track1.Split(' ');
\r
607 audioChannels = " -a " + tempSub[0];
\r
611 if (audioChannels != "")
\r
613 if ((track2 != "") && (track2 != "None"))
\r
616 tempSub = track2.Split(' ');
\r
617 audioChannels = audioChannels + "," + tempSub[0];
\r
622 if ((track2 != "") && (track2 != "None"))
\r
625 tempSub = track2.Split(' ');
\r
626 audioChannels = " -a " + tempSub[0];
\r
641 Mixdown = "stereo";
\r
643 case "Dolby Surround":
\r
646 case "Dolby Pro Logic II":
\r
649 case "6 Channel Discrete":
\r
658 SixChannelAudio = " -6 " + Mixdown;
\r
660 SixChannelAudio = "";
\r
662 if (subtitles == "None")
\r
664 else if (subtitles == "")
\r
666 else if (subtitles == "Autoselect")
\r
674 tempSub = subtitles.Split(' ');
\r
675 subtitles = " -s " + tempSub[0];
\r
678 if (mainWindow.check_forced.Checked)
\r
681 //Dynamic Range Compression (expects a float but a double is used for ease)
\r
682 double value = mainWindow.slider_drc.Value / 10.0;
\r
684 drc = " -D " + value;
\r
686 string queryAudioSettings = audioBitrate + audioSampleRate + drc + audioChannels + SixChannelAudio + subScan + subtitles + forced;
\r
689 // Chapter Markers Tab
\r
690 #region Chapter Markers
\r
692 string ChapterMarkers = "";
\r
694 if (mainWindow.Check_ChapterMarkers.Checked)
\r
696 Boolean saveCSV = chapterCSVSave(mainWindow);
\r
697 if (saveCSV == false)
\r
699 MessageBox.Show("Unable to save Chapter Makrers file! \n Chapter marker names will NOT be saved in your encode \n\n", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
700 ChapterMarkers = " -m ";
\r
704 string path = Path.Combine(Path.GetTempPath(), "chapters.csv");
\r
706 ChapterMarkers = " --markers=" + "\"" + path + "\"";
\r
710 string chapter_markers = ChapterMarkers;
\r
716 string h264Advanced = mainWindow.rtf_h264advanced.Text;
\r
718 if ((h264Advanced == ""))
\r
721 h264Advanced = " -x " + h264Advanced;
\r
724 string h264Settings = h264Advanced;
\r
728 #region Processors / Other
\r
730 string processors = Properties.Settings.Default.Processors;
\r
731 // Number of Processors Handler
\r
733 if (processors == "Automatic")
\r
736 processors = " -C " + processors + " ";
\r
739 string queryAdvancedSettings = processors;
\r
741 string verbose = "";
\r
742 if (Properties.Settings.Default.verbose == "Checked")
\r
746 return querySource + queryDestination + queryPictureSettings + queryVideoSettings + h264Settings + queryAudioSettings + ChapterMarkers + queryAdvancedSettings + verbose;
\r
750 * Set's up the DataGridView on the Chapters tab (frmMain)
\r
752 public void chapterNaming(frmMain mainWindow)
\r
756 mainWindow.data_chpt.Rows.Clear();
\r
761 if (mainWindow.drop_chapterFinish.Text != "Auto")
\r
762 finish = int.Parse(mainWindow.drop_chapterFinish.Text);
\r
764 if (mainWindow.drop_chapterStart.Text != "Auto")
\r
765 start = int.Parse(mainWindow.drop_chapterStart.Text);
\r
767 rowCount = finish - (start - 1);
\r
769 while (i < rowCount)
\r
771 DataGridViewRow row = new DataGridViewRow();
\r
773 mainWindow.data_chpt.Rows.Insert(i, row);
\r
774 mainWindow.data_chpt.Rows[i].Cells[0].Value = (i + 1);
\r
775 mainWindow.data_chpt.Rows[i].Cells[1].Value = "Chapter " + (i + 1);
\r
779 catch (Exception exc)
\r
781 MessageBox.Show("chapterNaming() Error has occured: \n" + exc.ToString());
\r
786 * This function saves the data in the chapters tab, dataGridView into a CSV file called chapters.csv in this applications
\r
787 * running directory.
\r
789 private Boolean chapterCSVSave(frmMain mainWindow)
\r
793 string path = Path.Combine(Path.GetTempPath(), "chapters.csv");
\r
795 StringBuilder csv = new StringBuilder();
\r
797 foreach (DataGridViewRow row in mainWindow.data_chpt.Rows)
\r
799 csv.Append(row.Cells[0].Value.ToString());
\r
801 csv.Append(row.Cells[1].Value.ToString());
\r
802 csv.Append(Environment.NewLine);
\r
804 StreamWriter file = new StreamWriter(path);
\r
805 file.Write(csv.ToString());
\r
811 catch (Exception exc)
\r
813 MessageBox.Show(exc.ToString(), "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
818 // End of Functions
\r