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_deBlock;
\r
224 /// Returns a boolean to indicate wither DeBlock is on or off.
\r
226 public Boolean DeBlock
\r
230 return this.q_deBlock;
\r
234 private string q_deinterlace;
\r
236 /// Returns a string with the De-Interlace option used.
\r
238 public string DeInterlace
\r
242 return this.q_deinterlace;
\r
246 private string q_denoise;
\r
248 /// Returns a string with the DeNoise option used.
\r
250 public string DeNoise
\r
254 return this.q_denoise;
\r
258 private Boolean q_anamorphic;
\r
260 /// Returns a boolean to indicate wither Anamorphic is on or off.
\r
262 public Boolean Anamorphic
\r
266 return this.q_anamorphic;
\r
270 private Boolean q_chapterMarkers;
\r
272 /// Returns a boolean to indicate wither Chapter Markers is on or off.
\r
274 public Boolean ChapterMarkers
\r
278 return this.q_chapterMarkers;
\r
282 private Boolean q_grayscale;
\r
284 /// Returns a boolean to indicate wither Grayscale is on or off.
\r
286 public Boolean Grayscale
\r
290 return this.q_grayscale;
\r
294 private Boolean q_twoPass;
\r
296 /// Returns a boolean to indicate wither Two Pass Encoding is on or off.
\r
298 public Boolean TwoPass
\r
302 return this.q_twoPass;
\r
306 private Boolean q_turboFirst;
\r
308 /// Returns a boolean to indicate wither Chapter Markers is on or off.
\r
310 public Boolean TurboFirstPass
\r
314 return this.q_turboFirst;
\r
318 private Boolean q_largeMp4;
\r
320 /// Returns a boolean to indicate wither Larger MP4 files is on or off.
\r
322 public Boolean LargeMP4
\r
326 return this.q_largeMp4;
\r
330 private string q_videoFramerate;
\r
332 /// Returns a string with the video Framerate
\r
334 public string VideoFramerate
\r
338 return this.q_videoFramerate;
\r
342 private string q_avgBitrate;
\r
344 /// Returns a string with the average video bitrate
\r
346 public string AverageVideoBitrate
\r
350 return this.q_avgBitrate;
\r
354 private string q_videoTargetSize;
\r
356 /// Returns a string with the video target size
\r
358 public string VideoTargetSize
\r
362 return this.q_videoTargetSize;
\r
366 private int q_videoQuality;
\r
368 /// Returns a int with the video quality value
\r
370 public int VideoQuality
\r
374 return this.q_videoQuality;
\r
378 private Boolean q_crf;
\r
380 /// Returns a boolean to indicate if CRF is on or off.
\r
390 private string q_audioBitrate;
\r
392 /// Returns a string with the audio bitrate
\r
394 public string AudioBitrate
\r
398 return this.q_audioBitrate;
\r
402 private string q_audioSamplerate;
\r
404 /// Returns a string with the audio sample rate
\r
406 public string AudioSampleBitrate
\r
410 return this.q_audioSamplerate;
\r
414 private string q_audioTrack1;
\r
416 /// Returns a string with the First selected Audio track
\r
418 public string AudioTrack1
\r
422 return this.q_audioTrack1;
\r
426 private string q_audioTrackMix;
\r
428 /// Returns a string with the First selected Audio track Mix
\r
430 public string AudioTrackMix
\r
434 return this.q_audioTrackMix;
\r
438 private string q_subtitles;
\r
440 /// Returns a string with the selected subtitle track
\r
442 public string Subtitles
\r
446 return this.q_subtitles;
\r
450 private string q_h264;
\r
452 /// Returns a string with the Advanced H264 query string
\r
454 public string H264Query
\r
458 return this.q_h264;
\r
461 private Boolean q_verbose;
\r
463 /// Returns a string with the Advanced H264 query string
\r
465 public Boolean Verbose
\r
469 return this.q_verbose;
\r
474 // 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
475 public static QueryParser Parse(String input)
\r
477 QueryParser thisQuery = new QueryParser();
\r
481 Regex r1 = new Regex(@"(-i)(?:\s\"")([a-zA-Z0-9:\\\s\.]+)(?:\"")");
\r
482 Match source = r1.Match(input.Replace('"', '\"'));
\r
483 Match title = Regex.Match(input, @"-t ([0-9]*)");
\r
484 Match chapters = Regex.Match(input, @"-c ([0-9-]*)");
\r
485 Match format = Regex.Match(input, @"-f ([a-z0-9a-z0-9a-z0-9]*)");
\r
488 Regex r2 = new Regex(@"(-o)(?:\s\"")([a-zA-Z0-9:\\\s\.]+)(?:\"")");
\r
489 Match destination = r2.Match(input.Replace('"', '\"'));
\r
490 Match width = Regex.Match(input, @"-w ([0-9]*)");
\r
491 Match height = Regex.Match(input, @"-l ([0-9]*)");
\r
492 Match videoEncoder = Regex.Match(input, @"-e ([a-zA-Z0-9]*)");
\r
493 Match audioEncoder = Regex.Match(input, @"-E ([a-zA-Z0-9]*)");
\r
495 //Picture Settings Tab
\r
496 Match deinterlace = Regex.Match(input, @"--deinterlace=([a-z]*)");
\r
497 Match denoise = Regex.Match(input, @"--denoise=([a-z]*)");
\r
498 Match deblock = Regex.Match(input, @"--deblock");
\r
499 Match detelecine = Regex.Match(input, @"--detelecine");
\r
500 Match anamorphic = Regex.Match(input, @"-p ");
\r
501 Match chapterMarkers = Regex.Match(input, @"-m");
\r
502 Match crop = Regex.Match(input, @"--crop ([0-9]):([0-9]):([0-9]):([0-9])");
\r
504 //Video Settings Tab
\r
505 Match videoFramerate = Regex.Match(input, @"-r ([0-9]*)");
\r
506 Match videoBitrate = Regex.Match(input, @"-b ([0-9]*)");
\r
507 Match videoQuality = Regex.Match(input, @"-q ([0-9.]*)");
\r
508 Match videoFilesize = Regex.Match(input, @"-S ([0-9.]*)");
\r
509 Match CRF = Regex.Match(input, @"-Q");
\r
510 Match twoPass = Regex.Match(input, @"-2");
\r
511 Match turboFirstPass = Regex.Match(input, @"-T");
\r
512 Match grayscale = Regex.Match(input, @"-g");
\r
513 Match largerMp4 = Regex.Match(input, @"-4");
\r
515 //Audio Settings Tab
\r
516 Match subtitles = Regex.Match(input, @"-s ([0-9]*)");
\r
517 Match audioBitrate = Regex.Match(input, @"-B ([0-9]*)");
\r
518 Match audioSampleRate = Regex.Match(input, @"-R ([0-9.]*)");
\r
519 Match audioChannelsMix = Regex.Match(input, @"-6 ([0-9a-z0-9]*)"); // 1 -6 dpl2 // Broken
\r
520 Match audioChannel = Regex.Match(input, @"-a ([0-9]*)");
\r
523 Match x264 = Regex.Match(input, @"-x ([,a-zA-Z0-9=:-]*)");
\r
526 Match verbose = Regex.Match(input, @"-v");
\r
536 thisQuery.q_source = source.ToString().Replace("-i ", "").Replace("\"", "");
\r
537 if (title.Success != false)
\r
539 thisQuery.q_dvdTitle = int.Parse(title.ToString().Replace("-t ", ""));
\r
542 if (chapters.Success != false)
\r
544 string[] actTitles = new string[2];
\r
545 actTitles = chapters.ToString().Replace("-c ", "").Split('-');
\r
546 thisQuery.q_chaptersStart = int.Parse(actTitles[0]);
\r
547 thisQuery.q_chaptersFinish = int.Parse(actTitles[1]);
\r
550 if (format.Success != false)
\r
553 thisQuery.q_format = format.ToString().Replace("-f ", "");
\r
560 #region Destination
\r
561 thisQuery.q_destination = destination.ToString().Replace("-o ","").Replace("\"", "");
\r
563 string videoEncoderConvertion;
\r
564 string audioEncoderConvertion;
\r
566 videoEncoderConvertion = videoEncoder.ToString().Replace("-e ", "");
\r
567 switch (videoEncoderConvertion)
\r
570 videoEncoderConvertion = "Mpeg 4";
\r
573 videoEncoderConvertion = "Xvid";
\r
576 videoEncoderConvertion = "H.264";
\r
579 videoEncoderConvertion = "H.264 Baseline 1.3";
\r
582 videoEncoderConvertion = "H.264 (iPod)";
\r
585 videoEncoderConvertion = "Mpeg 4";
\r
588 thisQuery.q_videoEncoder = videoEncoderConvertion;
\r
590 audioEncoderConvertion = audioEncoder.ToString().Replace("-E ", "");
\r
591 switch (audioEncoderConvertion)
\r
594 audioEncoderConvertion = "AAC";
\r
597 audioEncoderConvertion = "MP3";
\r
600 audioEncoderConvertion = "Vorbis";
\r
603 audioEncoderConvertion = "AC3";
\r
606 audioEncoderConvertion = "AAC";
\r
609 thisQuery.q_audioEncoder =audioEncoderConvertion;
\r
612 if (width.Success != false)
\r
614 thisQuery.q_videoWidth = int.Parse(width.ToString().Replace("-w ", ""));
\r
616 if (height.Success != false)
\r
618 thisQuery.q_videoHeight = int.Parse(height.ToString().Replace("-l ", ""));
\r
623 //Picture Settings Tab
\r
625 #region Picture Tab
\r
626 if (crop.Success != false)
\r
628 thisQuery.q_cropValues = crop.ToString().Replace("--crop ", "");
\r
629 string[] actCropValues = new string[3];
\r
630 actCropValues = thisQuery.q_cropValues.Split(':');
\r
631 thisQuery.q_croptop = actCropValues[0];
\r
632 thisQuery.q_cropbottom = actCropValues[1];
\r
633 thisQuery.q_cropLeft = actCropValues[2];
\r
634 thisQuery.q_cropRight = actCropValues[3];
\r
637 thisQuery.q_detelecine = detelecine.Success;
\r
638 thisQuery.q_deBlock = deblock.Success;
\r
640 thisQuery.q_deinterlace = "None";
\r
641 if (deinterlace.Success != false)
\r
643 switch (deinterlace.ToString().Replace("--deinterlace=", ""))
\r
646 thisQuery.q_deinterlace = "Original (Fast)";
\r
649 thisQuery.q_deinterlace = "yadif (Slow)";
\r
652 thisQuery.q_deinterlace = "yadif + mcdeint (Slower)";
\r
655 thisQuery.q_deinterlace = "yadif + mcdeint (Slowest)";
\r
658 thisQuery.q_deinterlace = "None";
\r
663 thisQuery.q_denoise = "None";
\r
664 if (denoise.Success != false)
\r
666 switch (denoise.ToString().Replace("--denoise=", ""))
\r
669 thisQuery.q_denoise = "Weak";
\r
672 thisQuery.q_denoise = "Medium";
\r
675 thisQuery.q_denoise = "Strong";
\r
678 thisQuery.q_denoise = "None";
\r
683 thisQuery.q_anamorphic = anamorphic.Success;
\r
684 thisQuery.q_chapterMarkers = chapterMarkers.Success;
\r
688 //Video Settings Tab
\r
691 thisQuery.q_grayscale = grayscale.Success;
\r
692 thisQuery.q_twoPass = twoPass.Success;
\r
693 thisQuery.q_turboFirst = turboFirstPass.Success;
\r
694 thisQuery.q_largeMp4 = largerMp4.Success;
\r
695 if (videoFramerate.Success != false)
\r
697 thisQuery.q_videoFramerate = videoFramerate.ToString().Replace("-r ", "");
\r
701 thisQuery.q_videoFramerate = "Automatic";
\r
703 if (videoBitrate.Success != false)
\r
705 thisQuery.q_avgBitrate = videoBitrate.ToString().Replace("-b ", "");
\r
707 if (videoFilesize.Success != false)
\r
709 thisQuery.q_videoTargetSize = videoFilesize.ToString().Replace("-S ", "");
\r
712 double qConvert = 0;
\r
713 if (videoQuality.Success != false)
\r
715 qConvert = double.Parse(videoQuality.ToString().Replace("-q ", "")) * 100;
\r
716 qConvert = System.Math.Ceiling(qConvert);
\r
717 thisQuery.q_videoQuality = int.Parse(qConvert.ToString());
\r
719 thisQuery.q_crf = CRF.Success;
\r
723 //Audio Settings Tab
\r
726 if (audioBitrate.Success != false)
\r
728 thisQuery.q_audioBitrate = audioBitrate.ToString().Replace("-B ", "");
\r
730 if (audioSampleRate.Success != false)
\r
732 thisQuery.q_audioSamplerate = audioSampleRate.ToString().Replace("-R ", "");
\r
734 if (audioChannel.Success != false)
\r
736 thisQuery.q_audioTrack1 = audioChannel.ToString().Replace("-a ", "");
\r
740 thisQuery.q_audioTrack1 = "Automatic";
\r
743 thisQuery.q_audioTrackMix = "Automatic";
\r
744 if (audioChannelsMix.Success != false)
\r
746 switch (audioChannelsMix.ToString().Replace("-6 ", "").Replace(" ",""))
\r
749 thisQuery.q_audioTrackMix = "Mono";
\r
752 thisQuery.q_audioTrackMix = "Stereo";
\r
755 thisQuery.q_audioTrackMix = "Dolby Surround";
\r
758 thisQuery.q_audioTrackMix = "Dolby Pro Logic II";
\r
761 thisQuery.q_audioTrackMix = "6 Channel Discrete";
\r
764 thisQuery.q_audioTrackMix = "Automatic";
\r
769 if (subtitles.Success != false)
\r
771 thisQuery.q_subtitles = subtitles.ToString().Replace("-s ", "");
\r
775 thisQuery.q_subtitles = "None";
\r
780 //H264 tab and other
\r
782 #region h264 and other
\r
786 if (x264.Success != false)
\r
788 thisQuery.q_h264 = x264.ToString().Replace("-x ", "");
\r
794 thisQuery.q_verbose = verbose.Success;
\r
797 catch (Exception exc)
\r
799 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