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_audioTrackMix;
\r
476 /// Returns a string with the First selected Audio track Mix
\r
478 public string AudioTrackMix
\r
482 return this.q_audioTrackMix;
\r
486 private string q_subtitles;
\r
488 /// Returns a string with the selected subtitle track
\r
490 public string Subtitles
\r
494 return this.q_subtitles;
\r
498 private string q_h264;
\r
500 /// Returns a string with the Advanced H264 query string
\r
502 public string H264Query
\r
506 return this.q_h264;
\r
509 private Boolean q_verbose;
\r
511 /// Returns a string with the Advanced H264 query string
\r
513 public Boolean Verbose
\r
517 return this.q_verbose;
\r
522 // 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
523 public static QueryParser Parse(String input)
\r
525 QueryParser thisQuery = new QueryParser();
\r
529 Regex r1 = new Regex(@"(-i)(?:\s\"")([a-zA-Z0-9:\\\s\.]+)(?:\"")");
\r
530 Match source = r1.Match(input.Replace('"', '\"'));
\r
531 Match title = Regex.Match(input, @"-t ([0-9]*)");
\r
532 Match chapters = Regex.Match(input, @"-c ([0-9-]*)");
\r
533 Match format = Regex.Match(input, @"-f ([a-z0-9a-z0-9a-z0-9]*)");
\r
536 Regex r2 = new Regex(@"(-o)(?:\s\"")([a-zA-Z0-9:\\\s\.]+)(?:\"")");
\r
537 Match destination = r2.Match(input.Replace('"', '\"'));
\r
538 Match width = Regex.Match(input, @"-w ([0-9]*)");
\r
539 Match height = Regex.Match(input, @"-l ([0-9]*)");
\r
540 Match videoEncoder = Regex.Match(input, @"-e ([a-zA-Z0-9]*)");
\r
541 Match audioEncoder = Regex.Match(input, @"-E ([a-zA-Z0-9]*)");
\r
543 //Picture Settings Tab
\r
544 Match deinterlace = Regex.Match(input, @"--deinterlace=([a-z]*)");
\r
545 Match denoise = Regex.Match(input, @"--denoise=([a-z]*)");
\r
546 Match deblock = Regex.Match(input, @"--deblock");
\r
547 Match detelecine = Regex.Match(input, @"--detelecine");
\r
548 Match anamorphic = Regex.Match(input, @"-p ");
\r
549 Match chapterMarkers = Regex.Match(input, @"-m");
\r
550 Match crop = Regex.Match(input, @"--crop ([0-9]):([0-9]):([0-9]):([0-9])");
\r
551 Match vfr = Regex.Match(input, @"-V");
\r
552 Match lanamorphic = Regex.Match(input, @"-P");
\r
554 //Video Settings Tab
\r
555 Match videoFramerate = Regex.Match(input, @"-r ([0-9]*)");
\r
556 Match videoBitrate = Regex.Match(input, @"-b ([0-9]*)");
\r
557 Match videoQuality = Regex.Match(input, @"-q ([0-9.]*)");
\r
558 Match videoFilesize = Regex.Match(input, @"-S ([0-9.]*)");
\r
559 Match CRF = Regex.Match(input, @"-Q");
\r
560 Match twoPass = Regex.Match(input, @"-2");
\r
561 Match turboFirstPass = Regex.Match(input, @"-T");
\r
562 Match grayscale = Regex.Match(input, @"-g");
\r
563 Match largerMp4 = Regex.Match(input, @"-4");
\r
564 Match ipodAtom = Regex.Match(input, @"-I");
\r
565 Match optimizeMP4 = Regex.Match(input, @"-O");
\r
567 //Audio Settings Tab
\r
568 Match subtitles = Regex.Match(input, @"-s ([0-9]*)");
\r
569 Match audioBitrate = Regex.Match(input, @"-B ([0-9]*)");
\r
570 Match audioSampleRate = Regex.Match(input, @"-R ([0-9.]*)");
\r
571 Match audioChannelsMix = Regex.Match(input, @"-6 ([0-9a-z0-9]*)"); // 1 -6 dpl2 // Broken
\r
572 Match audioChannel = Regex.Match(input, @"-a ([0-9]*)");
\r
575 Match x264 = Regex.Match(input, @"-x ([,a-zA-Z0-9=:-]*)");
\r
578 Match verbose = Regex.Match(input, @"-v");
\r
588 thisQuery.q_source = source.ToString().Replace("-i ", "").Replace("\"", "");
\r
589 if (title.Success != false)
\r
590 thisQuery.q_dvdTitle = int.Parse(title.ToString().Replace("-t ", ""));
\r
592 if (chapters.Success != false)
\r
594 string[] actTitles = new string[2];
\r
595 actTitles = chapters.ToString().Replace("-c ", "").Split('-');
\r
596 thisQuery.q_chaptersStart = int.Parse(actTitles[0]);
\r
597 if (actTitles.Length > 1)
\r
598 thisQuery.q_chaptersFinish = int.Parse(actTitles[1]);
\r
601 if (format.Success != false)
\r
602 thisQuery.q_format = format.ToString().Replace("-f ", "");
\r
609 #region Destination
\r
610 thisQuery.q_destination = destination.ToString().Replace("-o ", "").Replace("\"", "");
\r
612 string videoEncoderConvertion;
\r
613 string audioEncoderConvertion;
\r
615 videoEncoderConvertion = videoEncoder.ToString().Replace("-e ", "");
\r
616 switch (videoEncoderConvertion)
\r
619 videoEncoderConvertion = "Mpeg 4";
\r
622 videoEncoderConvertion = "Xvid";
\r
625 videoEncoderConvertion = "H.264";
\r
628 videoEncoderConvertion = "H.264 Baseline 1.3";
\r
631 videoEncoderConvertion = "H.264 (iPod)";
\r
634 videoEncoderConvertion = "Mpeg 4";
\r
637 thisQuery.q_videoEncoder = videoEncoderConvertion;
\r
639 audioEncoderConvertion = audioEncoder.ToString().Replace("-E ", "");
\r
640 switch (audioEncoderConvertion)
\r
643 audioEncoderConvertion = "AAC";
\r
646 audioEncoderConvertion = "MP3";
\r
649 audioEncoderConvertion = "Vorbis";
\r
652 audioEncoderConvertion = "AC3";
\r
655 audioEncoderConvertion = "AAC";
\r
658 thisQuery.q_audioEncoder = audioEncoderConvertion;
\r
661 if (width.Success != false)
\r
662 thisQuery.q_videoWidth = int.Parse(width.ToString().Replace("-w ", ""));
\r
664 if (height.Success != false)
\r
665 thisQuery.q_videoHeight = int.Parse(height.ToString().Replace("-l ", ""));
\r
670 //Picture Settings Tab
\r
672 #region Picture Tab
\r
673 if (crop.Success != false)
\r
675 thisQuery.q_cropValues = crop.ToString().Replace("--crop ", "");
\r
676 string[] actCropValues = new string[3];
\r
677 actCropValues = thisQuery.q_cropValues.Split(':');
\r
678 thisQuery.q_croptop = actCropValues[0];
\r
679 thisQuery.q_cropbottom = actCropValues[1];
\r
680 thisQuery.q_cropLeft = actCropValues[2];
\r
681 thisQuery.q_cropRight = actCropValues[3];
\r
684 thisQuery.q_detelecine = detelecine.Success;
\r
685 thisQuery.q_deBlock = deblock.Success;
\r
687 thisQuery.q_deinterlace = "None";
\r
688 if (deinterlace.Success != false)
\r
690 switch (deinterlace.ToString().Replace("--deinterlace=", ""))
\r
693 thisQuery.q_deinterlace = "Original (Fast)";
\r
696 thisQuery.q_deinterlace = "yadif (Slow)";
\r
699 thisQuery.q_deinterlace = "yadif + mcdeint (Slower)";
\r
702 thisQuery.q_deinterlace = "yadif + mcdeint (Slowest)";
\r
705 thisQuery.q_deinterlace = "None";
\r
710 thisQuery.q_denoise = "None";
\r
711 if (denoise.Success != false)
\r
713 switch (denoise.ToString().Replace("--denoise=", ""))
\r
716 thisQuery.q_denoise = "Weak";
\r
719 thisQuery.q_denoise = "Medium";
\r
722 thisQuery.q_denoise = "Strong";
\r
725 thisQuery.q_denoise = "None";
\r
730 thisQuery.q_anamorphic = anamorphic.Success;
\r
731 thisQuery.q_chapterMarkers = chapterMarkers.Success;
\r
732 thisQuery.q_vfr = vfr.Success;
\r
733 thisQuery.q_looseAnamorphic = lanamorphic.Success;
\r
738 //Video Settings Tab
\r
741 thisQuery.q_grayscale = grayscale.Success;
\r
742 thisQuery.q_twoPass = twoPass.Success;
\r
743 thisQuery.q_turboFirst = turboFirstPass.Success;
\r
744 thisQuery.q_largeMp4 = largerMp4.Success;
\r
745 if (videoFramerate.Success != false)
\r
746 thisQuery.q_videoFramerate = videoFramerate.ToString().Replace("-r ", "");
\r
748 thisQuery.q_videoFramerate = "Automatic";
\r
750 if (videoBitrate.Success != false)
\r
751 thisQuery.q_avgBitrate = videoBitrate.ToString().Replace("-b ", "");
\r
752 if (videoFilesize.Success != false)
\r
753 thisQuery.q_videoTargetSize = videoFilesize.ToString().Replace("-S ", "");
\r
755 double qConvert = 0;
\r
756 if (videoQuality.Success != false)
\r
758 qConvert = double.Parse(videoQuality.ToString().Replace("-q ", "")) * 100;
\r
759 qConvert = System.Math.Ceiling(qConvert);
\r
760 thisQuery.q_videoQuality = int.Parse(qConvert.ToString());
\r
762 thisQuery.q_crf = CRF.Success;
\r
763 thisQuery.q_ipodAtom = ipodAtom.Success;
\r
764 thisQuery.q_optimizeMp4 = optimizeMP4.Success;
\r
769 //Audio Settings Tab
\r
772 if (audioBitrate.Success != false)
\r
773 thisQuery.q_audioBitrate = audioBitrate.ToString().Replace("-B ", "");
\r
775 if (audioSampleRate.Success != false)
\r
776 thisQuery.q_audioSamplerate = audioSampleRate.ToString().Replace("-R ", "");
\r
778 if (audioChannel.Success != false)
\r
779 thisQuery.q_audioTrack1 = audioChannel.ToString().Replace("-a ", "");
\r
781 thisQuery.q_audioTrack1 = "Automatic";
\r
783 thisQuery.q_audioTrackMix = "Automatic";
\r
784 if (audioChannelsMix.Success != false)
\r
786 switch (audioChannelsMix.ToString().Replace("-6 ", "").Replace(" ", ""))
\r
789 thisQuery.q_audioTrackMix = "Mono";
\r
792 thisQuery.q_audioTrackMix = "Stereo";
\r
795 thisQuery.q_audioTrackMix = "Dolby Surround";
\r
798 thisQuery.q_audioTrackMix = "Dolby Pro Logic II";
\r
801 thisQuery.q_audioTrackMix = "6 Channel Discrete";
\r
804 thisQuery.q_audioTrackMix = "Automatic";
\r
809 if (subtitles.Success != false)
\r
810 thisQuery.q_subtitles = subtitles.ToString().Replace("-s ", "");
\r
812 thisQuery.q_subtitles = "None";
\r
817 //H264 tab and other
\r
819 #region h264 and other
\r
823 if (x264.Success != false)
\r
825 thisQuery.q_h264 = x264.ToString().Replace("-x ", "");
\r
831 thisQuery.q_verbose = verbose.Success;
\r
834 catch (Exception exc)
\r
836 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