2 using System.Collections.Generic;
\r
4 using System.Text.RegularExpressions;
\r
5 using System.Windows.Forms;
\r
7 namespace Handbrake.Functions
\r
12 // All the Main Window GUI options
\r
15 private string q_source;
\r
17 /// Returns a String
\r
18 /// Full path of the source.
\r
20 public string Source
\r
24 return this.q_source;
\r
28 private string q_destination;
\r
30 /// Returns a String
\r
31 /// Full path of the destination.
\r
33 public string Destination
\r
37 return this.q_destination;
\r
41 private string q_format;
\r
43 /// Returns a String
\r
44 /// Full path of the destination.
\r
46 public string Format
\r
50 return this.q_format;
\r
54 private int q_dvdTitle;
\r
56 /// Returns an Integer
\r
57 /// DVD Title number.
\r
63 return this.q_dvdTitle;
\r
67 private int q_chaptersStart;
\r
70 /// DVD Chapter number or chapter range.
\r
72 public int DVDChapterStart
\r
76 return this.q_chaptersStart;
\r
80 private int q_chaptersFinish;
\r
83 /// DVD Chapter number or chapter range.
\r
85 public int DVDChapterFinish
\r
89 return this.q_chaptersFinish;
\r
93 private string q_videoEncoder;
\r
95 /// Returns an String
\r
96 /// The Video Encoder used.
\r
98 public string VideoEncoder
\r
102 return this.q_videoEncoder;
\r
106 private string q_audioEncoder;
\r
108 /// Returns an String
\r
109 /// The Audio Encoder used.
\r
111 public string AudioEncoder
\r
115 return this.q_audioEncoder;
\r
119 private int q_videoWidth;
\r
122 /// The selected Width for the encoding.
\r
128 return this.q_videoWidth;
\r
132 private int q_videoHeight;
\r
135 /// The selected Height for the encoding.
\r
141 return this.q_videoHeight;
\r
145 private string q_cropValues;
\r
147 /// Returns an String
\r
148 /// Cropping values.
\r
150 public string CropValues
\r
154 return this.q_cropValues;
\r
158 private string q_croptop;
\r
160 /// Returns an String
\r
161 /// Cropping values.
\r
163 public string CropTop
\r
167 return this.q_croptop;
\r
171 private string q_cropbottom;
\r
173 /// Returns an String
\r
174 /// Cropping values.
\r
176 public string CropBottom
\r
180 return this.q_cropbottom;
\r
184 private string q_cropLeft;
\r
186 /// Returns an String
\r
187 /// Cropping values.
\r
189 public string CropLeft
\r
193 return this.q_cropLeft;
\r
197 private string q_cropRight;
\r
199 /// Returns an String
\r
200 /// Cropping values.
\r
202 public string CropRight
\r
206 return this.q_cropRight;
\r
210 private Boolean q_detelecine;
\r
212 /// Returns a boolean to indicate wither DeTelecine is on or off
\r
214 public Boolean DeTelecine
\r
218 return this.q_detelecine;
\r
222 private Boolean q_vfr;
\r
224 /// Returns a boolean to indicate wither DeTelecine is on or off
\r
234 private Boolean q_deBlock;
\r
236 /// Returns a boolean to indicate wither DeBlock is on or off.
\r
238 public Boolean DeBlock
\r
242 return this.q_deBlock;
\r
246 private string q_deinterlace;
\r
248 /// Returns a string with the De-Interlace option used.
\r
250 public string DeInterlace
\r
254 return this.q_deinterlace;
\r
258 private string q_denoise;
\r
260 /// Returns a string with the DeNoise option used.
\r
262 public string DeNoise
\r
266 return this.q_denoise;
\r
270 private Boolean q_anamorphic;
\r
272 /// Returns a boolean to indicate wither Anamorphic is on or off.
\r
274 public Boolean Anamorphic
\r
278 return this.q_anamorphic;
\r
282 private Boolean q_looseAnamorphic;
\r
284 /// Returns a boolean to indicate wither Anamorphic is on or off.
\r
286 public Boolean LooseAnamorphic
\r
290 return this.q_looseAnamorphic;
\r
294 private Boolean q_chapterMarkers;
\r
296 /// Returns a boolean to indicate wither Chapter Markers is on or off.
\r
298 public Boolean ChapterMarkers
\r
302 return this.q_chapterMarkers;
\r
306 private Boolean q_grayscale;
\r
308 /// Returns a boolean to indicate wither Grayscale is on or off.
\r
310 public Boolean Grayscale
\r
314 return this.q_grayscale;
\r
318 private Boolean q_twoPass;
\r
320 /// Returns a boolean to indicate wither Two Pass Encoding is on or off.
\r
322 public Boolean TwoPass
\r
326 return this.q_twoPass;
\r
330 private Boolean q_turboFirst;
\r
332 /// Returns a boolean to indicate wither Chapter Markers is on or off.
\r
334 public Boolean TurboFirstPass
\r
338 return this.q_turboFirst;
\r
342 private Boolean q_largeMp4;
\r
344 /// Returns a boolean to indicate wither Larger MP4 files is on or off.
\r
346 public Boolean LargeMP4
\r
350 return this.q_largeMp4;
\r
354 private Boolean q_ipodAtom;
\r
356 /// Returns a boolean to indicate wither Larger MP4 files is on or off.
\r
358 public Boolean IpodAtom
\r
362 return this.q_ipodAtom;
\r
366 private Boolean q_optimizeMp4;
\r
368 /// Returns a boolean to indicate wither Larger MP4 files is on or off.
\r
370 public Boolean OptimizeMP4
\r
374 return this.q_optimizeMp4;
\r
378 private string q_videoFramerate;
\r
380 /// Returns a string with the video Framerate
\r
382 public string VideoFramerate
\r
386 return this.q_videoFramerate;
\r
390 private string q_avgBitrate;
\r
392 /// Returns a string with the average video bitrate
\r
394 public string AverageVideoBitrate
\r
398 return this.q_avgBitrate;
\r
402 private string q_videoTargetSize;
\r
404 /// Returns a string with the video target size
\r
406 public string VideoTargetSize
\r
410 return this.q_videoTargetSize;
\r
414 private int q_videoQuality;
\r
416 /// Returns a int with the video quality value
\r
418 public int VideoQuality
\r
422 return this.q_videoQuality;
\r
426 private Boolean q_crf;
\r
428 /// Returns a boolean to indicate if CRF is on or off.
\r
438 private string q_audioBitrate;
\r
440 /// Returns a string with the audio bitrate
\r
442 public string AudioBitrate
\r
446 return this.q_audioBitrate;
\r
450 private string q_audioSamplerate;
\r
452 /// Returns a string with the audio sample rate
\r
454 public string AudioSampleBitrate
\r
458 return this.q_audioSamplerate;
\r
462 private string q_audioTrack1;
\r
464 /// Returns a string with the First selected Audio track
\r
466 public string AudioTrack1
\r
470 return this.q_audioTrack1;
\r
474 private string q_audioTrack2;
\r
476 /// Returns a string with the First selected Audio track
\r
478 public string AudioTrack2
\r
482 return this.q_audioTrack2;
\r
486 private string q_audioTrackMix;
\r
488 /// Returns a string with the First selected Audio track Mix
\r
490 public string AudioTrackMix
\r
494 return this.q_audioTrackMix;
\r
498 private string q_subtitles;
\r
500 /// Returns a string with the selected subtitle track
\r
502 public string Subtitles
\r
506 return this.q_subtitles;
\r
510 private Boolean q_forcedSubs;
\r
512 /// Returns a string with the selected subtitle track
\r
514 public Boolean ForcedSubtitles
\r
518 return this.q_forcedSubs;
\r
522 private string q_h264;
\r
524 /// Returns a string with the Advanced H264 query string
\r
526 public string H264Query
\r
530 return this.q_h264;
\r
533 private Boolean q_verbose;
\r
535 /// Returns a string with the Advanced H264 query string
\r
537 public Boolean Verbose
\r
541 return this.q_verbose;
\r
546 // Takes in a query which can be in any order and parses it. All varibles are then set so they can be used elsewhere.
\r
547 public static QueryParser Parse(String input)
\r
549 QueryParser thisQuery = new QueryParser();
\r
553 Regex r1 = new Regex(@"(-i)(?:\s\"")([a-zA-Z0-9:\\\s\.]+)(?:\"")");
\r
554 Match source = r1.Match(input.Replace('"', '\"'));
\r
555 Match title = Regex.Match(input, @"-t ([0-9]*)");
\r
556 Match chapters = Regex.Match(input, @"-c ([0-9-]*)");
\r
557 Match format = Regex.Match(input, @"-f ([a-z0-9a-z0-9a-z0-9]*)");
\r
560 Regex r2 = new Regex(@"(-o)(?:\s\"")([a-zA-Z0-9:\\\s\.]+)(?:\"")");
\r
561 Match destination = r2.Match(input.Replace('"', '\"'));
\r
562 Match width = Regex.Match(input, @"-w ([0-9]*)");
\r
563 Match height = Regex.Match(input, @"-l ([0-9]*)");
\r
564 Match videoEncoder = Regex.Match(input, @"-e ([a-zA-Z0-9]*)");
\r
565 Match audioEncoder = Regex.Match(input, @"-E ([a-zA-Z0-9]*)");
\r
567 //Picture Settings Tab
\r
568 Match deinterlace = Regex.Match(input, @"--deinterlace=([a-z]*)");
\r
569 Match denoise = Regex.Match(input, @"--denoise=([a-z]*)");
\r
570 Match deblock = Regex.Match(input, @"--deblock");
\r
571 Match detelecine = Regex.Match(input, @"--detelecine");
\r
572 Match anamorphic = Regex.Match(input, @"-p ");
\r
573 Match chapterMarkers = Regex.Match(input, @"-m");
\r
574 Match crop = Regex.Match(input, @"--crop ([0-9]):([0-9]):([0-9]):([0-9])");
\r
575 Match vfr = Regex.Match(input, @"-V");
\r
576 Match lanamorphic = Regex.Match(input, @"-P");
\r
578 //Video Settings Tab
\r
579 Match videoFramerate = Regex.Match(input, @"-r ([0-9]*)");
\r
580 Match videoBitrate = Regex.Match(input, @"-b ([0-9]*)");
\r
581 Match videoQuality = Regex.Match(input, @"-q ([0-9.]*)");
\r
582 Match videoFilesize = Regex.Match(input, @"-S ([0-9.]*)");
\r
583 Match CRF = Regex.Match(input, @"-Q");
\r
584 Match twoPass = Regex.Match(input, @"-2");
\r
585 Match turboFirstPass = Regex.Match(input, @"-T");
\r
586 Match grayscale = Regex.Match(input, @"-g");
\r
587 Match largerMp4 = Regex.Match(input, @"-4");
\r
588 Match ipodAtom = Regex.Match(input, @"-I");
\r
589 Match optimizeMP4 = Regex.Match(input, @"-O");
\r
591 //Audio Settings Tab
\r
592 Match subtitles = Regex.Match(input, @"-s ([0-9a-zA-Z]*)");
\r
593 Match subScan = Regex.Match(input, @"-U");
\r
594 Match audioBitrate = Regex.Match(input, @"-B ([0-9]*)");
\r
595 Match audioSampleRate = Regex.Match(input, @"-R ([0-9.]*)");
\r
596 Match audioChannelsMix = Regex.Match(input, @"-6 ([0-9a-z0-9]*)"); // 1 -6 dpl2 // Broken
\r
597 Match audioTrack1 = Regex.Match(input, @"-a ([0-9]*)");
\r
598 Match audioTrack2 = Regex.Match(input, @"-a ([0-9]*),([0-9]*)");
\r
599 Match forcedSubtitles = Regex.Match(input, @"-F");
\r
602 Match x264 = Regex.Match(input, @"-x ([,a-zA-Z0-9=:-]*)");
\r
605 Match verbose = Regex.Match(input, @"-v");
\r
615 thisQuery.q_source = source.ToString().Replace("-i ", "").Replace("\"", "");
\r
616 if (title.Success != false)
\r
617 thisQuery.q_dvdTitle = int.Parse(title.ToString().Replace("-t ", ""));
\r
619 if (chapters.Success != false)
\r
621 string[] actTitles = new string[2];
\r
622 actTitles = chapters.ToString().Replace("-c ", "").Split('-');
\r
623 thisQuery.q_chaptersStart = int.Parse(actTitles[0]);
\r
624 if (actTitles.Length > 1)
\r
626 MessageBox.Show(actTitles[1]);
\r
627 thisQuery.q_chaptersFinish = int.Parse(actTitles[1]);
\r
630 if ((thisQuery.q_chaptersStart == 1) && (thisQuery.q_chaptersFinish == 0))
\r
631 thisQuery.q_chaptersFinish = thisQuery.q_chaptersStart;
\r
634 if (format.Success != false)
\r
635 thisQuery.q_format = format.ToString().Replace("-f ", "");
\r
642 #region Destination
\r
643 thisQuery.q_destination = destination.ToString().Replace("-o ", "").Replace("\"", "");
\r
645 string videoEncoderConvertion;
\r
646 string audioEncoderConvertion;
\r
648 videoEncoderConvertion = videoEncoder.ToString().Replace("-e ", "");
\r
649 switch (videoEncoderConvertion)
\r
652 videoEncoderConvertion = "Mpeg 4";
\r
655 videoEncoderConvertion = "Xvid";
\r
658 videoEncoderConvertion = "H.264";
\r
661 videoEncoderConvertion = "H.264 Baseline 1.3";
\r
664 videoEncoderConvertion = "H.264 (iPod)";
\r
667 videoEncoderConvertion = "Mpeg 4";
\r
670 thisQuery.q_videoEncoder = videoEncoderConvertion;
\r
672 audioEncoderConvertion = audioEncoder.ToString().Replace("-E ", "");
\r
673 switch (audioEncoderConvertion)
\r
676 audioEncoderConvertion = "AAC";
\r
679 audioEncoderConvertion = "MP3";
\r
682 audioEncoderConvertion = "Vorbis";
\r
685 audioEncoderConvertion = "AC3";
\r
688 audioEncoderConvertion = "AAC";
\r
691 thisQuery.q_audioEncoder = audioEncoderConvertion;
\r
694 if (width.Success != false)
\r
695 thisQuery.q_videoWidth = int.Parse(width.ToString().Replace("-w ", ""));
\r
697 if (height.Success != false)
\r
698 thisQuery.q_videoHeight = int.Parse(height.ToString().Replace("-l ", ""));
\r
703 //Picture Settings Tab
\r
705 #region Picture Tab
\r
706 if (crop.Success != false)
\r
708 thisQuery.q_cropValues = crop.ToString().Replace("--crop ", "");
\r
709 string[] actCropValues = new string[3];
\r
710 actCropValues = thisQuery.q_cropValues.Split(':');
\r
711 thisQuery.q_croptop = actCropValues[0];
\r
712 thisQuery.q_cropbottom = actCropValues[1];
\r
713 thisQuery.q_cropLeft = actCropValues[2];
\r
714 thisQuery.q_cropRight = actCropValues[3];
\r
717 thisQuery.q_detelecine = detelecine.Success;
\r
718 thisQuery.q_deBlock = deblock.Success;
\r
720 thisQuery.q_deinterlace = "None";
\r
721 if (deinterlace.Success != false)
\r
723 switch (deinterlace.ToString().Replace("--deinterlace=", ""))
\r
726 thisQuery.q_deinterlace = "Original (Fast)";
\r
729 thisQuery.q_deinterlace = "yadif (Slow)";
\r
732 thisQuery.q_deinterlace = "yadif + mcdeint (Slower)";
\r
735 thisQuery.q_deinterlace = "yadif + mcdeint (Slowest)";
\r
738 thisQuery.q_deinterlace = "None";
\r
743 thisQuery.q_denoise = "None";
\r
744 if (denoise.Success != false)
\r
746 switch (denoise.ToString().Replace("--denoise=", ""))
\r
749 thisQuery.q_denoise = "Weak";
\r
752 thisQuery.q_denoise = "Medium";
\r
755 thisQuery.q_denoise = "Strong";
\r
758 thisQuery.q_denoise = "None";
\r
763 thisQuery.q_anamorphic = anamorphic.Success;
\r
764 thisQuery.q_chapterMarkers = chapterMarkers.Success;
\r
765 thisQuery.q_vfr = vfr.Success;
\r
766 thisQuery.q_looseAnamorphic = lanamorphic.Success;
\r
771 //Video Settings Tab
\r
774 thisQuery.q_grayscale = grayscale.Success;
\r
775 thisQuery.q_twoPass = twoPass.Success;
\r
776 thisQuery.q_turboFirst = turboFirstPass.Success;
\r
777 thisQuery.q_largeMp4 = largerMp4.Success;
\r
778 if (videoFramerate.Success != false)
\r
779 thisQuery.q_videoFramerate = videoFramerate.ToString().Replace("-r ", "");
\r
781 thisQuery.q_videoFramerate = "Automatic";
\r
783 if (videoBitrate.Success != false)
\r
784 thisQuery.q_avgBitrate = videoBitrate.ToString().Replace("-b ", "");
\r
785 if (videoFilesize.Success != false)
\r
786 thisQuery.q_videoTargetSize = videoFilesize.ToString().Replace("-S ", "");
\r
788 double qConvert = 0;
\r
789 if (videoQuality.Success != false)
\r
791 qConvert = double.Parse(videoQuality.ToString().Replace("-q ", "")) * 100;
\r
792 qConvert = System.Math.Ceiling(qConvert);
\r
793 thisQuery.q_videoQuality = int.Parse(qConvert.ToString());
\r
795 thisQuery.q_crf = CRF.Success;
\r
796 thisQuery.q_ipodAtom = ipodAtom.Success;
\r
797 thisQuery.q_optimizeMp4 = optimizeMP4.Success;
\r
802 //Audio Settings Tab
\r
805 if (audioBitrate.Success != false)
\r
806 thisQuery.q_audioBitrate = audioBitrate.ToString().Replace("-B ", "");
\r
808 if (audioSampleRate.Success != false)
\r
809 thisQuery.q_audioSamplerate = audioSampleRate.ToString().Replace("-R ", "");
\r
811 if (audioTrack1.Success != false)
\r
812 thisQuery.q_audioTrack1 = audioTrack1.ToString().Replace("-a ", "");
\r
814 thisQuery.q_audioTrack1 = "Automatic";
\r
816 if (audioTrack2.Success != false)
\r
818 string[] audioChan = audioTrack2.ToString().Split(',');
\r
819 thisQuery.q_audioTrack2 = audioChan[1];
\r
822 thisQuery.q_audioTrack2 = "None";
\r
824 thisQuery.q_audioTrackMix = "Automatic";
\r
825 if (audioChannelsMix.Success != false)
\r
827 switch (audioChannelsMix.ToString().Replace("-6 ", "").Replace(" ", ""))
\r
830 thisQuery.q_audioTrackMix = "Mono";
\r
833 thisQuery.q_audioTrackMix = "Stereo";
\r
836 thisQuery.q_audioTrackMix = "Dolby Surround";
\r
839 thisQuery.q_audioTrackMix = "Dolby Pro Logic II";
\r
842 thisQuery.q_audioTrackMix = "6 Channel Discrete";
\r
845 thisQuery.q_audioTrackMix = "Automatic";
\r
850 if (subtitles.Success != false)
\r
851 thisQuery.q_subtitles = subtitles.ToString().Replace("-s ", "");
\r
854 if (subScan.Success)
\r
855 thisQuery.q_subtitles = "Autoselect";
\r
857 thisQuery.q_subtitles = "None";
\r
860 thisQuery.q_forcedSubs = forcedSubtitles.Success;
\r
865 //H264 tab and other
\r
867 #region h264 and other
\r
871 if (x264.Success != false)
\r
873 thisQuery.q_h264 = x264.ToString().Replace("-x ", "");
\r
879 thisQuery.q_verbose = verbose.Success;
\r
882 catch (Exception exc)
\r
884 MessageBox.Show("An error has occured in the Query Parser. Please report this error on the forum in the 'Windows' support section. \n\n" + exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r