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
6 namespace Handbrake.Controls
\r
9 using System.Windows.Forms;
\r
11 public partial class x264Panel : UserControl
\r
14 * TODO This code was ported from the obj-c MacGUI code. It's really messy and could really do with being cleaned up
\r
19 /// Initializes a new instance of the <see cref="x264Panel"/> class.
\r
20 /// Initializes a new instance of the x264 panel user control
\r
24 InitializeComponent();
\r
26 if (Properties.Settings.Default.tooltipEnable)
\r
27 ToolTip.Active = true;
\r
33 /// Gets or sets the X264 query string
\r
35 public string X264Query
\r
39 return rtf_x264Query.Text;
\r
41 set { rtf_x264Query.Text = value; }
\r
45 /// Reset all components to defaults and clears the x264 rtf box
\r
47 public void Reset2Defaults()
\r
49 check_8x8DCT.CheckState = CheckState.Checked;
\r
50 check_Cabac.CheckState = CheckState.Checked;
\r
51 check_mixedReferences.CheckState = CheckState.Checked;
\r
52 check_noDCTDecimate.CheckState = CheckState.Unchecked;
\r
53 check_noFastPSkip.CheckState = CheckState.Unchecked;
\r
54 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
55 check_weightedBFrames.CheckState = CheckState.Checked;
\r
56 drop_analysis.SelectedIndex = 0;
\r
57 drop_bFrames.SelectedIndex = 0;
\r
58 drop_deblockAlpha.SelectedIndex = 0;
\r
59 drop_deblockBeta.SelectedIndex = 0;
\r
60 drop_directPrediction.SelectedIndex = 0;
\r
61 drop_MotionEstimationMethod.SelectedIndex = 0;
\r
62 drop_MotionEstimationRange.SelectedIndex = 0;
\r
63 drop_refFrames.SelectedIndex = 0;
\r
64 drop_subpixelMotionEstimation.SelectedIndex = 0;
\r
65 drop_trellis.SelectedIndex = 0;
\r
66 slider_psyrd.Value = 10;
\r
67 slider_psytrellis.Value = 0;
\r
68 drop_adaptBFrames.SelectedIndex = 0;
\r
70 rtf_x264Query.Text = string.Empty;
\r
74 /// Iterate over every x264 option, standardize it, write the full string to the x264 rtf box
\r
76 public void X264_StandardizeOptString()
\r
78 /* Set widgets depending on the opt string in field */
\r
79 string thisOpt; // The separated option such as "bframes=3"
\r
80 string optName; // The option name such as "bframes"
\r
81 string optValue; // The option value such as "3"
\r
82 string changedOptString = string.Empty;
\r
83 string[] currentOptsArray;
\r
85 /*First, we get an opt string to process */
\r
86 string currentOptString = rtf_x264Query.Text;
\r
88 /*verify there is an opt string to process */
\r
89 if (currentOptString.Contains("="))
\r
91 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
92 currentOptsArray = currentOptString.Split(':');
\r
94 /*iterate through the array and get <opts> and <values*/
\r
96 int currentOptsArrayCount = currentOptsArray.Length;
\r
97 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
\r
99 thisOpt = currentOptsArray[loopcounter];
\r
100 if (currentOptsArray[currentOptsArrayCount - 1] == string.Empty)
\r
103 string[] splitOptRange = thisOpt.Split('=');
\r
104 if (thisOpt != string.Empty)
\r
106 if (thisOpt.Contains("="))
\r
108 optName = splitOptRange[0];
\r
109 optValue = splitOptRange[1];
\r
111 /* Standardize the names here depending on whats in the string */
\r
112 optName = X264_StandardizeOptNames(optName);
\r
113 thisOpt = optName + "=" + optValue;
\r
115 else // No value given so we use a default of "1"
\r
118 /* Standardize the names here depending on whats in the string */
\r
119 optName = X264_StandardizeOptNames(optName);
\r
120 thisOpt = optName + "=1";
\r
124 /* Construct New String for opts here */
\r
125 if (thisOpt == string.Empty)
\r
126 changedOptString = changedOptString + thisOpt;
\r
129 if (changedOptString == string.Empty)
\r
130 changedOptString = thisOpt;
\r
132 changedOptString = changedOptString + ":" + thisOpt;
\r
137 /* Change the option string to reflect the new standardized option string */
\r
138 if (changedOptString != string.Empty)
\r
139 rtf_x264Query.Text = changedOptString;
\r
143 /// Take a single option and standardize it. Returns as a String
\r
144 /// Input: String. - Single X264 Option. Name only
\r
145 /// Output: String - Single X264 Option. Name only. Changed to standard format
\r
147 /// <param name="cleanOptNameString">a string of x264 options to clean</param>
\r
148 /// <returns>A string containing standardized x264 option names</returns>
\r
149 private static string X264_StandardizeOptNames(string cleanOptNameString)
\r
151 string input = cleanOptNameString;
\r
153 if (input.Equals("ref") || input.Equals("frameref"))
\r
154 cleanOptNameString = "ref";
\r
156 /*No Fast PSkip nofast_pskip*/
\r
157 if (input.Equals("no-fast-pskip") || input.Equals("no_fast_pskip") || input.Equals("nofast_pskip"))
\r
158 cleanOptNameString = "no-fast-pskip";
\r
160 /*No Dict Decimate*/
\r
161 if (input.Equals("no-dct-decimate") || input.Equals("no_dct_decimate") || input.Equals("nodct_decimate"))
\r
162 cleanOptNameString = "no-dct-decimate";
\r
165 if (input.Equals("subme"))
\r
166 cleanOptNameString = "subq";
\r
169 if (input.Equals("me-range") || input.Equals("me_range"))
\r
170 cleanOptNameString = "merange";
\r
173 if (input.Equals("weight-b") || input.Equals("weight_b"))
\r
174 cleanOptNameString = "weightb";
\r
177 if (input.Equals("b_pyramid"))
\r
178 cleanOptNameString = "b-pyramid";
\r
180 /*Direct Prediction*/
\r
181 if (input.Equals("direct-pred") || input.Equals("direct_pred"))
\r
182 cleanOptNameString = "direct";
\r
185 if (input.Equals("filter"))
\r
186 cleanOptNameString = "deblock";
\r
189 if (input.Equals("partitions"))
\r
190 cleanOptNameString = "analyse";
\r
192 return cleanOptNameString;
\r
196 /// Resets the GUI widgets to the contents of the option string.
\r
198 public void X264_SetCurrentSettingsInPanel()
\r
200 /* Set widgets depending on the opt string in field */
\r
201 string thisOpt; // The separated option such as "bframes=3"
\r
202 string optName; // The option name such as "bframes"
\r
203 string optValue; // The option value such as "3"
\r
204 string[] currentOptsArray;
\r
206 // Set currentOptString to the contents of the text box.
\r
207 string currentOptString = rtf_x264Query.Text.Replace("\n", string.Empty);
\r
209 /*verify there is an opt string to process */
\r
210 if (currentOptString.Contains("="))
\r
212 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
213 currentOptsArray = currentOptString.Split(':');
\r
215 /*iterate through the array and get <opts> and <values*/
\r
217 int currentOptsArrayCount = currentOptsArray.Length;
\r
219 /*iterate through the array and get <opts> and <values*/
\r
220 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
\r
222 thisOpt = currentOptsArray[loopcounter];
\r
223 string[] splitOptRange = thisOpt.Split('=');
\r
225 if (thisOpt.Contains("="))
\r
227 optName = splitOptRange[0];
\r
228 optValue = splitOptRange[1];
\r
230 /*Run through the available widgets for x264 opts and set them, as you add widgets,
\r
231 they need to be added here. This should be moved to its own method probably*/
\r
235 drop_bFrames.SelectedItem = optValue;
\r
238 drop_refFrames.SelectedItem = optValue;
\r
240 case "no-fast-pskip":
\r
241 check_noFastPSkip.CheckState = CheckState.Checked;
\r
243 case "no-dct-decimate":
\r
244 check_noDCTDecimate.CheckState = CheckState.Checked;
\r
247 drop_subpixelMotionEstimation.SelectedItem = optValue;
\r
250 drop_trellis.SelectedItem = optValue;
\r
253 check_mixedReferences.CheckState = CheckState.Checked;
\r
256 if (optValue.Equals("dia"))
\r
257 drop_MotionEstimationMethod.SelectedItem = "Diamond";
\r
258 else if (optValue.Equals("hex"))
\r
259 drop_MotionEstimationMethod.SelectedItem = "Hexagon";
\r
260 else if (optValue.Equals("umh"))
\r
261 drop_MotionEstimationMethod.SelectedItem = "Uneven Multi-Hexagon";
\r
262 else if (optValue.Equals("esa"))
\r
263 drop_MotionEstimationMethod.SelectedItem = "Exhaustive";
\r
264 else if (optValue.Equals("tesa"))
\r
265 drop_MotionEstimationMethod.SelectedItem = "Transformed Exhaustive";
\r
268 drop_MotionEstimationRange.SelectedItem = optValue;
\r
272 int.TryParse(optValue, out badapt);
\r
273 drop_adaptBFrames.SelectedIndex = (badapt + 1);
\r
276 if (optValue != "0")
\r
277 check_weightedBFrames.CheckState = CheckState.Checked;
\r
279 check_weightedBFrames.CheckState = CheckState.Unchecked;
\r
282 check_pyrmidalBFrames.CheckState = CheckState.Checked;
\r
285 if (optValue == "auto")
\r
286 optValue = "Automatic";
\r
288 if (optValue != string.Empty)
\r
290 char[] letters = optValue.ToCharArray();
\r
291 letters[0] = Char.ToUpper(letters[0]);
\r
292 optValue = new string(letters);
\r
295 drop_directPrediction.SelectedItem = optValue;
\r
298 string[] splitDeblock = optValue.Split(',');
\r
299 string alphaDeblock = splitDeblock[0];
\r
300 string betaDeblock = splitDeblock[1];
\r
302 if (alphaDeblock.Equals("0") && betaDeblock.Replace("\n", string.Empty).Equals("0"))
\r
304 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
305 drop_deblockBeta.SelectedItem = "Default (0)";
\r
309 drop_deblockAlpha.SelectedItem = !alphaDeblock.Equals("0") ? alphaDeblock : "0";
\r
311 drop_deblockBeta.SelectedItem = !betaDeblock.Replace("\n", string.Empty).Equals("0")
\r
312 ? betaDeblock.Replace("\n", string.Empty)
\r
317 if (optValue.Equals("p8x8,b8x8,i8x8,i4x4"))
\r
318 drop_analysis.SelectedItem = "Default (some)";
\r
319 if (optValue.Equals("none"))
\r
320 drop_analysis.SelectedItem = "None";
\r
321 if (optValue.Equals("all"))
\r
322 drop_analysis.SelectedItem = "All";
\r
325 check_8x8DCT.CheckState = optValue == "1" ? CheckState.Checked : CheckState.Unchecked;
\r
328 check_Cabac.CheckState = CheckState.Unchecked;
\r
331 string[] x = optValue.Split(',');
\r
333 double psyrd, psytrellis;
\r
336 // default psy-rd = 1 (10 for the slider)
\r
337 psyrd = double.TryParse(x[0], out psyrd) ? psyrd * 10 : 10.0;
\r
338 // default psy-trellis = 0
\r
339 psytrellis = double.TryParse(x[1], out psytrellis) ? psytrellis * 10 : 0.0;
\r
341 int.TryParse(psyrd.ToString(), out val);
\r
342 int.TryParse(psytrellis.ToString(), out val2);
\r
344 slider_psyrd.Value = val;
\r
345 slider_psytrellis.Value = val2;
\r
354 /// This function will update the X264 Query when one of the GUI widgets changes.
\r
356 private void OnX264WidgetChange(string sender)
\r
359 string optNameToChange = sender;
\r
360 string currentOptString = rtf_x264Query.Text;
\r
362 /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after
\r
363 the first character of the opt string (hence the ":") */
\r
364 string checkOptNameToChange = ":" + optNameToChange + "=";
\r
365 string checkOptNameToChangeBegin = optNameToChange + "=";
\r
367 // IF the current H264 Option String Contains Multiple Items or Just 1 Item
\r
368 if ((currentOptString.Contains(checkOptNameToChange)) ||
\r
369 (currentOptString.StartsWith(checkOptNameToChangeBegin)))
\r
370 HasOptions(currentOptString, optNameToChange);
\r
371 else // IF there is no options in the rich text box!
\r
372 HasNoOptions(optNameToChange);
\r
376 /// Called when the current x264 option string contains multiple (or a single) item(s) in it seperated by :
\r
377 /// it updates the current option that the widget corrosponds to, if it is already in thes string.
\r
379 /// <param name="currentOptString"></param>
\r
380 /// <param name="optNameToChange"></param>
\r
381 private void HasOptions(string currentOptString, string optNameToChange)
\r
383 string thisOpt; // The separated option such as "bframes=3"
\r
384 string optName; // The option name such as "bframes"
\r
385 string[] currentOptsArray;
\r
387 /* Create new empty opt string*/
\r
388 string changedOptString = string.Empty;
\r
390 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
391 currentOptsArray = currentOptString.Split(':');
\r
393 /*iterate through the array and get <opts> and <values*/
\r
394 for (int loopcounter = 0; loopcounter < currentOptsArray.Length; loopcounter++)
\r
396 thisOpt = currentOptsArray[loopcounter];
\r
398 if (thisOpt.Contains("="))
\r
400 string[] splitOptRange = thisOpt.Split('=');
\r
402 optName = splitOptRange[0]; // e.g bframes
\r
405 * Run through the available widgets for x264 opts and set them, as you add widgets,
\r
406 * they need to be added here. This should be moved to its own method probably
\r
407 * If the optNameToChange is found, appropriately change the value or delete it if
\r
408 * "unspecified" is set.
\r
410 if (optName.Equals(optNameToChange))
\r
412 if (optNameToChange.Equals("deblock"))
\r
414 string da = drop_deblockAlpha.SelectedItem.ToString();
\r
415 string db = drop_deblockBeta.SelectedItem.ToString();
\r
417 if (((da.Contains("Default")) && (db.Contains("Default"))) ||
\r
418 ((da.Contains("0")) && (db.Contains("0"))))
\r
420 drop_deblockBeta.SelectedItem = "Default (0)";
\r
421 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
422 thisOpt = string.Empty;
\r
424 else if ((!da.Contains("Default")) && (db.Contains("Default")))
\r
426 drop_deblockBeta.SelectedItem = "0";
\r
427 thisOpt = "deblock=" + da + ",0";
\r
429 else if ((da.Contains("Default")) && (!db.Contains("Default")))
\r
431 drop_deblockAlpha.SelectedItem = "0";
\r
432 thisOpt = "deblock=0," + db;
\r
434 else if ((!da.Contains("Default")) && (!db.Contains("Default")))
\r
435 thisOpt = "deblock=" + da + "," + db;
\r
437 else if (optNameToChange.Equals("psy-rd"))
\r
439 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
\r
440 thisOpt = string.Empty;
\r
443 double psyrd = slider_psyrd.Value*0.1;
\r
444 double psytre = slider_psytrellis.Value*0.1;
\r
446 string rd = psyrd.ToString("f1");
\r
447 string rt = psytre.ToString("f1");
\r
449 thisOpt = "psy-rd=" + rd + "," + rt;
\r
452 else if (optNameToChange.Equals("mixed-refs"))
\r
453 thisOpt = check_mixedReferences.CheckState == CheckState.Checked
\r
456 else if (optNameToChange.Equals("weightb"))
\r
457 thisOpt = check_weightedBFrames.CheckState == CheckState.Checked ? string.Empty : "weightb=0";
\r
458 else if (optNameToChange.Equals("b-pyramid"))
\r
459 thisOpt = check_pyrmidalBFrames.CheckState == CheckState.Checked ? "b-pyramid=1" : string.Empty;
\r
460 else if (optNameToChange.Equals("no-fast-pskip"))
\r
461 thisOpt = check_noFastPSkip.CheckState == CheckState.Checked ? "no-fast-pskip=1" : string.Empty;
\r
462 else if (optNameToChange.Equals("no-dct-decimate"))
\r
463 thisOpt = check_noDCTDecimate.CheckState == CheckState.Checked ? "no-dct-decimate=1" : string.Empty;
\r
464 else if (optNameToChange.Equals("8x8dct"))
\r
465 thisOpt = check_8x8DCT.CheckState == CheckState.Checked ? "8x8dct=1" : "8x8dct=0";
\r
466 else if (optNameToChange.Equals("cabac"))
\r
467 thisOpt = check_Cabac.CheckState == CheckState.Checked ? string.Empty : "cabac=0";
\r
468 else if (optNameToChange.Equals("me"))
\r
470 switch (drop_MotionEstimationMethod.SelectedIndex)
\r
473 thisOpt = "me=dia";
\r
477 thisOpt = "me=hex";
\r
481 thisOpt = "me=umh";
\r
485 thisOpt = "me=esa";
\r
489 thisOpt = "me=tesa";
\r
493 thisOpt = string.Empty;
\r
497 else if (optNameToChange.Equals("direct"))
\r
499 switch (drop_directPrediction.SelectedIndex)
\r
502 thisOpt = "direct=none";
\r
506 thisOpt = "direct=spatial";
\r
510 thisOpt = "direct=temporal";
\r
514 thisOpt = "direct=auto";
\r
518 thisOpt = string.Empty;
\r
522 else if (optNameToChange.Equals("analyse"))
\r
524 switch (drop_analysis.SelectedIndex)
\r
527 thisOpt = "analyse=none";
\r
531 thisOpt = "analyse=all";
\r
535 thisOpt = string.Empty;
\r
539 else if (optNameToChange.Equals("merange"))
\r
541 thisOpt = !drop_MotionEstimationRange.SelectedItem.ToString().Contains("Default")
\r
542 ? "merange=" + drop_MotionEstimationRange.SelectedItem
\r
545 else if (optNameToChange.Equals("b-adapt"))
\r
547 thisOpt = !drop_adaptBFrames.SelectedItem.ToString().Contains("Default")
\r
548 ? "b-adapt=" + (drop_adaptBFrames.SelectedIndex - 1)
\r
551 else if (optNameToChange.Equals("ref"))
\r
553 thisOpt = !drop_refFrames.SelectedItem.ToString().Contains("Default")
\r
554 ? "ref=" + drop_refFrames.SelectedItem
\r
557 else if (optNameToChange.Equals("bframes"))
\r
559 string value = drop_bFrames.SelectedItem.ToString();
\r
560 thisOpt = !drop_bFrames.SelectedItem.ToString().Contains("Default")
\r
561 ? "bframes=" + value
\r
564 else if (optNameToChange.Equals("subq"))
\r
566 string value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
567 thisOpt = !drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default")
\r
571 else if (optNameToChange.Equals("trellis"))
\r
573 string value = drop_trellis.SelectedItem.ToString();
\r
574 thisOpt = !drop_trellis.SelectedItem.ToString().Contains("Default")
\r
575 ? "trellis=" + value
\r
581 /* Construct New String for opts here */
\r
582 if (!thisOpt.Equals(string.Empty))
\r
583 changedOptString = changedOptString.Equals(string.Empty) ? thisOpt : changedOptString + ":" + thisOpt;
\r
586 /* Change the option string to reflect the new mod settings */
\r
587 rtf_x264Query.Text = changedOptString;
\r
591 /// Add's an option to the x264 query string.
\r
592 /// Handles 2 cases. 1 Where rtf_x264Query.Text is empty, and one where there is an option with no value,
\r
593 /// e.g no-fast-pskip
\r
595 /// <param name="optNameToChange"></param>
\r
596 private void HasNoOptions(IEquatable<string> optNameToChange)
\r
598 string colon = string.Empty;
\r
599 if (rtf_x264Query.Text != string.Empty)
\r
602 string query = rtf_x264Query.Text;
\r
603 if (optNameToChange.Equals("me"))
\r
605 switch (drop_MotionEstimationMethod.SelectedIndex)
\r
608 query = query + colon + "me=dia";
\r
612 query = query + colon + "me=hex";
\r
616 query = query + colon + "me=umh";
\r
620 query = query + colon + "me=esa";
\r
624 query = query + colon + "me=tesa";
\r
631 else if (optNameToChange.Equals("direct"))
\r
633 switch (drop_directPrediction.SelectedIndex)
\r
636 query = query + colon + "direct=none";
\r
640 query = query + colon + "direct=spatial";
\r
644 query = query + colon + "direct=temporal";
\r
648 query = query + colon + "direct=auto";
\r
655 else if (optNameToChange.Equals("analyse"))
\r
657 switch (drop_analysis.SelectedIndex)
\r
660 query = query + colon + "analyse=none";
\r
664 query = query + colon + "analyse=all";
\r
671 else if (optNameToChange.Equals("merange"))
\r
673 int value = drop_MotionEstimationRange.SelectedIndex + 3;
\r
674 query = query + colon + "merange=" + value;
\r
676 else if (optNameToChange.Equals("b-adapt"))
\r
678 int value = drop_adaptBFrames.SelectedIndex - 1;
\r
679 query = query + colon + "b-adapt=" + value;
\r
681 else if (optNameToChange.Equals("deblock"))
\r
683 string da = drop_deblockAlpha.SelectedItem.ToString();
\r
684 string db = drop_deblockBeta.Text;
\r
686 if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))
\r
688 drop_deblockBeta.SelectedItem = "Default (0)";
\r
689 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
693 if (db.Contains("Default"))
\r
696 if (da.Contains("Default"))
\r
699 query = query + colon + "deblock=" + da + "," + db;
\r
702 else if (optNameToChange.Equals("psy-rd"))
\r
704 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
\r
705 query += string.Empty;
\r
708 double psyrd = slider_psyrd.Value*0.1;
\r
709 double psytre = slider_psytrellis.Value*0.1;
\r
711 string rd = psyrd.ToString("f1");
\r
712 string rt = psytre.ToString("f1");
\r
714 query += colon + "psy-rd=" + rd + "," + rt;
\r
717 else if (optNameToChange.Equals("mixed-refs"))
\r
719 if (check_mixedReferences.CheckState == CheckState.Checked)
\r
720 query = query + colon + "mixed-refs=1";
\r
722 query = query + colon + "mixed-refs=0";
\r
724 else if (optNameToChange.Equals("weightb"))
\r
726 if (check_weightedBFrames.CheckState != CheckState.Checked)
\r
727 query = query + colon + "weightb=0";
\r
729 else if (optNameToChange.Equals("b-pyramid"))
\r
731 if (check_pyrmidalBFrames.CheckState == CheckState.Checked)
\r
732 query = query + colon + "b-pyramid=1";
\r
734 else if (optNameToChange.Equals("no-fast-pskip"))
\r
736 if (check_noFastPSkip.CheckState == CheckState.Checked)
\r
737 query = query + colon + "no-fast-pskip=1";
\r
739 else if (optNameToChange.Equals("no-dct-decimate"))
\r
741 if (check_noDCTDecimate.CheckState == CheckState.Checked)
\r
742 query = query + colon + "no-dct-decimate=1";
\r
744 else if (optNameToChange.Equals("8x8dct"))
\r
746 if (check_8x8DCT.CheckState == CheckState.Checked)
\r
747 query = query + colon + "8x8dct=1";
\r
749 else if (optNameToChange.Equals("cabac"))
\r
751 if (check_Cabac.CheckState != CheckState.Checked)
\r
752 query = query + colon + "cabac=0";
\r
754 else if (optNameToChange.Equals("ref"))
\r
756 if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))
\r
757 query = query + colon + "ref=" + drop_refFrames.SelectedItem;
\r
759 else if (optNameToChange.Equals("bframes"))
\r
761 string value = drop_bFrames.SelectedItem.ToString();
\r
762 if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))
\r
763 query = query + colon + "bframes=" + value;
\r
765 else if (optNameToChange.Equals("subq"))
\r
767 string value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
768 if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))
\r
769 query = query + colon + "subq=" + value;
\r
771 else if (optNameToChange.Equals("trellis"))
\r
773 if (!drop_trellis.SelectedItem.ToString().Contains("Default"))
\r
774 query = query + colon + "trellis=" + drop_trellis.SelectedItem;
\r
777 rtf_x264Query.Text = query;
\r
781 /// Shows and hides controls based on the values of other controls.
\r
783 /// <param name="sender"></param>
\r
784 private void Animate(string sender)
\r
786 /* Lots of situations to cover.
\r
787 - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)
\r
788 - CABAC (when 0 turn off trellis)
\r
789 - analysis (if none, turn off 8x8dct)
\r
790 - refs (under 2, disable mixed-refs)
\r
791 - subme (if under 6, turn off psy-rd and psy-trel)
\r
792 - trellis (if 0, turn off psy-trel)
\r
798 if (drop_bFrames.SelectedIndex > 0 && drop_bFrames.SelectedIndex < 2)
\r
800 /* If the b-frame widget is at 0 or 1, the user has chosen
\r
801 not to use b-frames at all. So disable the options
\r
802 that can only be used when b-frames are enabled. */
\r
803 check_weightedBFrames.Visible = false;
\r
804 check_pyrmidalBFrames.Visible = false;
\r
805 drop_directPrediction.Visible = false;
\r
806 lbl_direct_prediction.Visible = false;
\r
808 check_weightedBFrames.CheckState = CheckState.Unchecked;
\r
809 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
810 drop_directPrediction.SelectedIndex = 0;
\r
812 drop_adaptBFrames.Visible = false;
\r
813 lbl_adaptBFrames.Visible = false;
\r
814 drop_adaptBFrames.SelectedIndex = 0;
\r
816 else if (drop_bFrames.SelectedIndex == 2)
\r
818 /* Only 1 b-frame? Disable b-pyramid. */
\r
819 check_pyrmidalBFrames.Visible = false;
\r
820 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
822 check_weightedBFrames.Visible = true;
\r
823 drop_directPrediction.Visible = true;
\r
824 lbl_direct_prediction.Visible = true;
\r
826 drop_adaptBFrames.Visible = true;
\r
827 lbl_adaptBFrames.Visible = true;
\r
831 check_weightedBFrames.Visible = true;
\r
832 check_pyrmidalBFrames.Visible = true;
\r
833 drop_directPrediction.Visible = true;
\r
834 lbl_direct_prediction.Visible = true;
\r
836 drop_adaptBFrames.Visible = true;
\r
837 lbl_adaptBFrames.Visible = true;
\r
841 if (check_Cabac.Checked == false)
\r
843 /* Without CABAC entropy coding, trellis doesn't run. */
\r
844 drop_trellis.Visible = false;
\r
845 drop_trellis.SelectedIndex = 0;
\r
846 lbl_trellis.Visible = false;
\r
850 drop_trellis.Visible = true;
\r
851 lbl_trellis.Visible = true;
\r
855 if (drop_analysis.SelectedIndex == 1)
\r
857 /* No analysis? Disable 8x8dct */
\r
858 check_8x8DCT.Visible = false;
\r
859 if (sender != "8x8dct")
\r
860 check_8x8DCT.CheckState = CheckState.Unchecked;
\r
863 check_8x8DCT.Visible = true;
\r
866 if (drop_refFrames.SelectedIndex > 0 && drop_refFrames.SelectedIndex < 3)
\r
868 check_mixedReferences.Visible = false;
\r
869 if (sender != "mixed-refs")
\r
870 check_mixedReferences.CheckState = CheckState.Unchecked;
\r
873 check_mixedReferences.Visible = true;
\r
875 case "me": // Motion Estimation
\r
876 if (drop_MotionEstimationMethod.SelectedIndex < 3)
\r
878 drop_MotionEstimationRange.Visible = false;
\r
879 lbl_merange.Visible = false;
\r
880 drop_MotionEstimationRange.SelectedIndex = 0;
\r
884 drop_MotionEstimationRange.Visible = true;
\r
885 lbl_merange.Visible = true;
\r
888 case "subq": // subme
\r
889 if (drop_subpixelMotionEstimation.SelectedIndex != 0 &&
\r
890 drop_subpixelMotionEstimation.SelectedIndex < 7)
\r
892 slider_psyrd.Visible = false;
\r
893 slider_psyrd.Value = 10;
\r
894 lbl_psyrd.Visible = false;
\r
897 slider_psytrellis.Visible = false;
\r
898 slider_psytrellis.Value = 0;
\r
899 lbl_psytrellis.Visible = false;
\r
903 slider_psyrd.Visible = true;
\r
904 lbl_psyrd.Visible = true;
\r
906 if (drop_trellis.SelectedIndex >= 2 && check_Cabac.Checked && slider_psytrellis.Visible == false)
\r
908 slider_psytrellis.Visible = true;
\r
909 lbl_psytrellis.Visible = true;
\r
913 case "trellis": // subme
\r
914 if (drop_trellis.SelectedIndex > 0 && drop_trellis.SelectedIndex < 2)
\r
916 slider_psytrellis.Visible = false;
\r
917 slider_psytrellis.Value = 0;
\r
918 lbl_psytrellis.Visible = false;
\r
922 if ((drop_subpixelMotionEstimation.SelectedIndex == 0 ||
\r
923 drop_subpixelMotionEstimation.SelectedIndex >= 7) && check_Cabac.Checked &&
\r
924 slider_psytrellis.Visible == false)
\r
926 slider_psytrellis.Visible = true;
\r
927 lbl_psytrellis.Visible = true;
\r
935 private void widgetControlChanged(object sender, EventArgs e)
\r
937 Control changedControlName = (Control) sender;
\r
938 string controlName = string.Empty;
\r
940 switch (changedControlName.Name.Trim())
\r
942 case "drop_refFrames":
\r
943 controlName = "ref";
\r
945 case "check_mixedReferences":
\r
946 controlName = "mixed-refs";
\r
948 case "drop_bFrames":
\r
949 controlName = "bframes";
\r
951 case "drop_directPrediction":
\r
952 controlName = "direct";
\r
954 case "check_weightedBFrames":
\r
955 controlName = "weightb";
\r
957 case "check_pyrmidalBFrames":
\r
958 controlName = "b-pyramid";
\r
960 case "drop_MotionEstimationMethod":
\r
961 controlName = "me";
\r
963 case "drop_MotionEstimationRange":
\r
964 controlName = "merange";
\r
966 case "drop_subpixelMotionEstimation":
\r
967 controlName = "subq";
\r
969 case "drop_analysis":
\r
970 controlName = "analyse";
\r
972 case "check_8x8DCT":
\r
973 controlName = "8x8dct";
\r
975 case "drop_deblockAlpha":
\r
976 controlName = "deblock";
\r
978 case "drop_deblockBeta":
\r
979 controlName = "deblock";
\r
981 case "drop_trellis":
\r
982 controlName = "trellis";
\r
984 case "check_noFastPSkip":
\r
985 controlName = "no-fast-pskip";
\r
987 case "check_noDCTDecimate":
\r
988 controlName = "no-dct-decimate";
\r
990 case "check_Cabac":
\r
991 controlName = "cabac";
\r
993 case "slider_psyrd":
\r
994 controlName = "psy-rd";
\r
996 case "slider_psytrellis":
\r
997 controlName = "psy-rd";
\r
999 case "drop_adaptBFrames":
\r
1000 controlName = "b-adapt";
\r
1003 OnX264WidgetChange(controlName);
\r
1006 private void rtf_x264Query_TextChanged(object sender, EventArgs e)
\r
1008 if (rtf_x264Query.Text.EndsWith("\n"))
\r
1010 string query = rtf_x264Query.Text.Replace("\n", string.Empty);
\r
1012 rtf_x264Query.Text = query;
\r
1013 X264_StandardizeOptString();
\r
1014 X264_SetCurrentSettingsInPanel();
\r
1016 if (rtf_x264Query.Text == string.Empty)
\r
1021 private void btn_reset_Click(object sender, EventArgs e)
\r
1023 rtf_x264Query.Text = string.Empty;
\r