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 /// <param name="sender">
\r
359 private void OnX264WidgetChange(string sender)
\r
362 string optNameToChange = sender;
\r
363 string currentOptString = rtf_x264Query.Text;
\r
365 /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after
\r
366 the first character of the opt string (hence the ":") */
\r
367 string checkOptNameToChange = ":" + optNameToChange + "=";
\r
368 string checkOptNameToChangeBegin = optNameToChange + "=";
\r
370 // IF the current H264 Option String Contains Multiple Items or Just 1 Item
\r
371 if ((currentOptString.Contains(checkOptNameToChange)) ||
\r
372 (currentOptString.StartsWith(checkOptNameToChangeBegin)))
\r
373 HasOptions(currentOptString, optNameToChange);
\r
374 else // IF there is no options in the rich text box!
\r
375 HasNoOptions(optNameToChange);
\r
379 /// Called when the current x264 option string contains multiple (or a single) item(s) in it seperated by :
\r
380 /// it updates the current option that the widget corrosponds to, if it is already in thes string.
\r
382 /// <param name="currentOptString">The Current Option String</param>
\r
383 /// <param name="optNameToChange">Name of the option to change</param>
\r
384 private void HasOptions(string currentOptString, string optNameToChange)
\r
386 string thisOpt; // The separated option such as "bframes=3"
\r
387 string optName; // The option name such as "bframes"
\r
388 string[] currentOptsArray;
\r
390 /* Create new empty opt string*/
\r
391 string changedOptString = string.Empty;
\r
393 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
394 currentOptsArray = currentOptString.Split(':');
\r
396 /*iterate through the array and get <opts> and <values*/
\r
397 for (int loopcounter = 0; loopcounter < currentOptsArray.Length; loopcounter++)
\r
399 thisOpt = currentOptsArray[loopcounter];
\r
401 if (thisOpt.Contains("="))
\r
403 string[] splitOptRange = thisOpt.Split('=');
\r
405 optName = splitOptRange[0]; // e.g bframes
\r
408 * Run through the available widgets for x264 opts and set them, as you add widgets,
\r
409 * they need to be added here. This should be moved to its own method probably
\r
410 * If the optNameToChange is found, appropriately change the value or delete it if
\r
411 * "unspecified" is set.
\r
413 if (optName.Equals(optNameToChange))
\r
415 if (optNameToChange.Equals("deblock"))
\r
417 string da = drop_deblockAlpha.SelectedItem.ToString();
\r
418 string db = drop_deblockBeta.SelectedItem.ToString();
\r
420 if (((da.Contains("Default")) && (db.Contains("Default"))) ||
\r
421 ((da.Contains("0")) && (db.Contains("0"))))
\r
423 drop_deblockBeta.SelectedItem = "Default (0)";
\r
424 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
425 thisOpt = string.Empty;
\r
427 else if ((!da.Contains("Default")) && (db.Contains("Default")))
\r
429 drop_deblockBeta.SelectedItem = "0";
\r
430 thisOpt = "deblock=" + da + ",0";
\r
432 else if ((da.Contains("Default")) && (!db.Contains("Default")))
\r
434 drop_deblockAlpha.SelectedItem = "0";
\r
435 thisOpt = "deblock=0," + db;
\r
437 else if ((!da.Contains("Default")) && (!db.Contains("Default")))
\r
438 thisOpt = "deblock=" + da + "," + db;
\r
440 else if (optNameToChange.Equals("psy-rd"))
\r
442 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
\r
443 thisOpt = string.Empty;
\r
446 double psyrd = slider_psyrd.Value * 0.1;
\r
447 double psytre = slider_psytrellis.Value * 0.1;
\r
449 string rd = psyrd.ToString("f1");
\r
450 string rt = psytre.ToString("f1");
\r
452 thisOpt = "psy-rd=" + rd + "," + rt;
\r
455 else if (optNameToChange.Equals("mixed-refs"))
\r
456 thisOpt = check_mixedReferences.CheckState == CheckState.Checked
\r
459 else if (optNameToChange.Equals("weightb"))
\r
460 thisOpt = check_weightedBFrames.CheckState == CheckState.Checked ? string.Empty : "weightb=0";
\r
461 else if (optNameToChange.Equals("b-pyramid"))
\r
462 thisOpt = check_pyrmidalBFrames.CheckState == CheckState.Checked ? "b-pyramid=1" : string.Empty;
\r
463 else if (optNameToChange.Equals("no-fast-pskip"))
\r
464 thisOpt = check_noFastPSkip.CheckState == CheckState.Checked ? "no-fast-pskip=1" : string.Empty;
\r
465 else if (optNameToChange.Equals("no-dct-decimate"))
\r
466 thisOpt = check_noDCTDecimate.CheckState == CheckState.Checked ? "no-dct-decimate=1" : string.Empty;
\r
467 else if (optNameToChange.Equals("8x8dct"))
\r
468 thisOpt = check_8x8DCT.CheckState == CheckState.Checked ? "8x8dct=1" : "8x8dct=0";
\r
469 else if (optNameToChange.Equals("cabac"))
\r
470 thisOpt = check_Cabac.CheckState == CheckState.Checked ? string.Empty : "cabac=0";
\r
471 else if (optNameToChange.Equals("me"))
\r
473 switch (drop_MotionEstimationMethod.SelectedIndex)
\r
476 thisOpt = "me=dia";
\r
480 thisOpt = "me=hex";
\r
484 thisOpt = "me=umh";
\r
488 thisOpt = "me=esa";
\r
492 thisOpt = "me=tesa";
\r
496 thisOpt = string.Empty;
\r
500 else if (optNameToChange.Equals("direct"))
\r
502 switch (drop_directPrediction.SelectedIndex)
\r
505 thisOpt = "direct=none";
\r
509 thisOpt = "direct=spatial";
\r
513 thisOpt = "direct=temporal";
\r
517 thisOpt = "direct=auto";
\r
521 thisOpt = string.Empty;
\r
525 else if (optNameToChange.Equals("analyse"))
\r
527 switch (drop_analysis.SelectedIndex)
\r
530 thisOpt = "analyse=none";
\r
534 thisOpt = "analyse=all";
\r
538 thisOpt = string.Empty;
\r
542 else if (optNameToChange.Equals("merange"))
\r
544 thisOpt = !drop_MotionEstimationRange.SelectedItem.ToString().Contains("Default")
\r
545 ? "merange=" + drop_MotionEstimationRange.SelectedItem
\r
548 else if (optNameToChange.Equals("b-adapt"))
\r
550 thisOpt = !drop_adaptBFrames.SelectedItem.ToString().Contains("Default")
\r
551 ? "b-adapt=" + (drop_adaptBFrames.SelectedIndex - 1)
\r
554 else if (optNameToChange.Equals("ref"))
\r
556 thisOpt = !drop_refFrames.SelectedItem.ToString().Contains("Default")
\r
557 ? "ref=" + drop_refFrames.SelectedItem
\r
560 else if (optNameToChange.Equals("bframes"))
\r
562 string value = drop_bFrames.SelectedItem.ToString();
\r
563 thisOpt = !drop_bFrames.SelectedItem.ToString().Contains("Default")
\r
564 ? "bframes=" + value
\r
567 else if (optNameToChange.Equals("subq"))
\r
569 string value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
570 thisOpt = !drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default")
\r
574 else if (optNameToChange.Equals("trellis"))
\r
576 string value = drop_trellis.SelectedItem.ToString();
\r
577 thisOpt = !drop_trellis.SelectedItem.ToString().Contains("Default")
\r
578 ? "trellis=" + value
\r
584 /* Construct New String for opts here */
\r
585 if (!thisOpt.Equals(string.Empty))
\r
586 changedOptString = changedOptString.Equals(string.Empty) ? thisOpt : changedOptString + ":" + thisOpt;
\r
589 /* Change the option string to reflect the new mod settings */
\r
590 rtf_x264Query.Text = changedOptString;
\r
594 /// Add's an option to the x264 query string.
\r
595 /// Handles 2 cases. 1 Where rtf_x264Query.Text is empty, and one where there is an option with no value,
\r
596 /// e.g no-fast-pskip
\r
598 /// <param name="optNameToChange">The Option Name to Change</param>
\r
599 private void HasNoOptions(IEquatable<string> optNameToChange)
\r
601 string colon = string.Empty;
\r
602 if (rtf_x264Query.Text != string.Empty)
\r
605 string query = rtf_x264Query.Text;
\r
606 if (optNameToChange.Equals("me"))
\r
608 switch (drop_MotionEstimationMethod.SelectedIndex)
\r
611 query = query + colon + "me=dia";
\r
615 query = query + colon + "me=hex";
\r
619 query = query + colon + "me=umh";
\r
623 query = query + colon + "me=esa";
\r
627 query = query + colon + "me=tesa";
\r
634 else if (optNameToChange.Equals("direct"))
\r
636 switch (drop_directPrediction.SelectedIndex)
\r
639 query = query + colon + "direct=none";
\r
643 query = query + colon + "direct=spatial";
\r
647 query = query + colon + "direct=temporal";
\r
651 query = query + colon + "direct=auto";
\r
658 else if (optNameToChange.Equals("analyse"))
\r
660 switch (drop_analysis.SelectedIndex)
\r
663 query = query + colon + "analyse=none";
\r
667 query = query + colon + "analyse=all";
\r
674 else if (optNameToChange.Equals("merange"))
\r
676 int value = drop_MotionEstimationRange.SelectedIndex + 3;
\r
677 query = query + colon + "merange=" + value;
\r
679 else if (optNameToChange.Equals("b-adapt"))
\r
681 int value = drop_adaptBFrames.SelectedIndex - 1;
\r
682 query = query + colon + "b-adapt=" + value;
\r
684 else if (optNameToChange.Equals("deblock"))
\r
686 string da = drop_deblockAlpha.SelectedItem.ToString();
\r
687 string db = drop_deblockBeta.Text;
\r
689 if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))
\r
691 drop_deblockBeta.SelectedItem = "Default (0)";
\r
692 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
696 if (db.Contains("Default"))
\r
699 if (da.Contains("Default"))
\r
702 query = query + colon + "deblock=" + da + "," + db;
\r
705 else if (optNameToChange.Equals("psy-rd"))
\r
707 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
\r
708 query += string.Empty;
\r
711 double psyrd = slider_psyrd.Value * 0.1;
\r
712 double psytre = slider_psytrellis.Value * 0.1;
\r
714 string rd = psyrd.ToString("f1");
\r
715 string rt = psytre.ToString("f1");
\r
717 query += colon + "psy-rd=" + rd + "," + rt;
\r
720 else if (optNameToChange.Equals("mixed-refs"))
\r
722 if (check_mixedReferences.CheckState == CheckState.Checked)
\r
723 query = query + colon + "mixed-refs=1";
\r
725 query = query + colon + "mixed-refs=0";
\r
727 else if (optNameToChange.Equals("weightb"))
\r
729 if (check_weightedBFrames.CheckState != CheckState.Checked)
\r
730 query = query + colon + "weightb=0";
\r
732 else if (optNameToChange.Equals("b-pyramid"))
\r
734 if (check_pyrmidalBFrames.CheckState == CheckState.Checked)
\r
735 query = query + colon + "b-pyramid=1";
\r
737 else if (optNameToChange.Equals("no-fast-pskip"))
\r
739 if (check_noFastPSkip.CheckState == CheckState.Checked)
\r
740 query = query + colon + "no-fast-pskip=1";
\r
742 else if (optNameToChange.Equals("no-dct-decimate"))
\r
744 if (check_noDCTDecimate.CheckState == CheckState.Checked)
\r
745 query = query + colon + "no-dct-decimate=1";
\r
747 else if (optNameToChange.Equals("8x8dct"))
\r
749 if (check_8x8DCT.CheckState == CheckState.Checked)
\r
750 query = query + colon + "8x8dct=1";
\r
752 else if (optNameToChange.Equals("cabac"))
\r
754 if (check_Cabac.CheckState != CheckState.Checked)
\r
755 query = query + colon + "cabac=0";
\r
757 else if (optNameToChange.Equals("ref"))
\r
759 if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))
\r
760 query = query + colon + "ref=" + drop_refFrames.SelectedItem;
\r
762 else if (optNameToChange.Equals("bframes"))
\r
764 string value = drop_bFrames.SelectedItem.ToString();
\r
765 if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))
\r
766 query = query + colon + "bframes=" + value;
\r
768 else if (optNameToChange.Equals("subq"))
\r
770 string value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
771 if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))
\r
772 query = query + colon + "subq=" + value;
\r
774 else if (optNameToChange.Equals("trellis"))
\r
776 if (!drop_trellis.SelectedItem.ToString().Contains("Default"))
\r
777 query = query + colon + "trellis=" + drop_trellis.SelectedItem;
\r
780 rtf_x264Query.Text = query;
\r
784 /// Shows and hides controls based on the values of other controls.
\r
786 /// <param name="sender">The Sender</param>
\r
787 private void Animate(string sender)
\r
789 /* Lots of situations to cover.
\r
790 - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)
\r
791 - CABAC (when 0 turn off trellis)
\r
792 - analysis (if none, turn off 8x8dct)
\r
793 - refs (under 2, disable mixed-refs)
\r
794 - subme (if under 6, turn off psy-rd and psy-trel)
\r
795 - trellis (if 0, turn off psy-trel)
\r
801 if (drop_bFrames.SelectedIndex > 0 && drop_bFrames.SelectedIndex < 2)
\r
803 /* If the b-frame widget is at 0 or 1, the user has chosen
\r
804 not to use b-frames at all. So disable the options
\r
805 that can only be used when b-frames are enabled. */
\r
806 check_weightedBFrames.Visible = false;
\r
807 check_pyrmidalBFrames.Visible = false;
\r
808 drop_directPrediction.Visible = false;
\r
809 lbl_direct_prediction.Visible = false;
\r
811 check_weightedBFrames.CheckState = CheckState.Unchecked;
\r
812 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
813 drop_directPrediction.SelectedIndex = 0;
\r
815 drop_adaptBFrames.Visible = false;
\r
816 lbl_adaptBFrames.Visible = false;
\r
817 drop_adaptBFrames.SelectedIndex = 0;
\r
819 else if (drop_bFrames.SelectedIndex == 2)
\r
821 /* Only 1 b-frame? Disable b-pyramid. */
\r
822 check_pyrmidalBFrames.Visible = false;
\r
823 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
825 check_weightedBFrames.Visible = true;
\r
826 drop_directPrediction.Visible = true;
\r
827 lbl_direct_prediction.Visible = true;
\r
829 drop_adaptBFrames.Visible = true;
\r
830 lbl_adaptBFrames.Visible = true;
\r
834 check_weightedBFrames.Visible = true;
\r
835 check_pyrmidalBFrames.Visible = true;
\r
836 drop_directPrediction.Visible = true;
\r
837 lbl_direct_prediction.Visible = true;
\r
839 drop_adaptBFrames.Visible = true;
\r
840 lbl_adaptBFrames.Visible = true;
\r
844 if (check_Cabac.Checked == false)
\r
846 /* Without CABAC entropy coding, trellis doesn't run. */
\r
847 drop_trellis.Visible = false;
\r
848 drop_trellis.SelectedIndex = 0;
\r
849 lbl_trellis.Visible = false;
\r
853 drop_trellis.Visible = true;
\r
854 lbl_trellis.Visible = true;
\r
858 if (drop_analysis.SelectedIndex == 1)
\r
860 /* No analysis? Disable 8x8dct */
\r
861 check_8x8DCT.Visible = false;
\r
862 if (sender != "8x8dct")
\r
863 check_8x8DCT.CheckState = CheckState.Unchecked;
\r
866 check_8x8DCT.Visible = true;
\r
869 if (drop_refFrames.SelectedIndex > 0 && drop_refFrames.SelectedIndex < 3)
\r
871 check_mixedReferences.Visible = false;
\r
872 if (sender != "mixed-refs")
\r
873 check_mixedReferences.CheckState = CheckState.Unchecked;
\r
876 check_mixedReferences.Visible = true;
\r
878 case "me": // Motion Estimation
\r
879 if (drop_MotionEstimationMethod.SelectedIndex < 3)
\r
881 drop_MotionEstimationRange.Visible = false;
\r
882 lbl_merange.Visible = false;
\r
883 drop_MotionEstimationRange.SelectedIndex = 0;
\r
887 drop_MotionEstimationRange.Visible = true;
\r
888 lbl_merange.Visible = true;
\r
891 case "subq": // subme
\r
892 if (drop_subpixelMotionEstimation.SelectedIndex != 0 &&
\r
893 drop_subpixelMotionEstimation.SelectedIndex < 7)
\r
895 slider_psyrd.Visible = false;
\r
896 slider_psyrd.Value = 10;
\r
897 lbl_psyrd.Visible = false;
\r
899 slider_psytrellis.Visible = false;
\r
900 slider_psytrellis.Value = 0;
\r
901 lbl_psytrellis.Visible = false;
\r
905 slider_psyrd.Visible = true;
\r
906 lbl_psyrd.Visible = true;
\r
908 if (drop_trellis.SelectedIndex >= 2 && check_Cabac.Checked && slider_psytrellis.Visible == false)
\r
910 slider_psytrellis.Visible = true;
\r
911 lbl_psytrellis.Visible = true;
\r
915 case "trellis": // subme
\r
916 if (drop_trellis.SelectedIndex > 0 && drop_trellis.SelectedIndex < 2)
\r
918 slider_psytrellis.Visible = false;
\r
919 slider_psytrellis.Value = 0;
\r
920 lbl_psytrellis.Visible = false;
\r
924 if ((drop_subpixelMotionEstimation.SelectedIndex == 0 ||
\r
925 drop_subpixelMotionEstimation.SelectedIndex >= 7) && check_Cabac.Checked &&
\r
926 slider_psytrellis.Visible == false)
\r
928 slider_psytrellis.Visible = true;
\r
929 lbl_psytrellis.Visible = true;
\r
936 private void widgetControlChanged(object sender, EventArgs e)
\r
938 Control changedControlName = (Control) sender;
\r
939 string controlName = string.Empty;
\r
941 switch (changedControlName.Name.Trim())
\r
943 case "drop_refFrames":
\r
944 controlName = "ref";
\r
946 case "check_mixedReferences":
\r
947 controlName = "mixed-refs";
\r
949 case "drop_bFrames":
\r
950 controlName = "bframes";
\r
952 case "drop_directPrediction":
\r
953 controlName = "direct";
\r
955 case "check_weightedBFrames":
\r
956 controlName = "weightb";
\r
958 case "check_pyrmidalBFrames":
\r
959 controlName = "b-pyramid";
\r
961 case "drop_MotionEstimationMethod":
\r
962 controlName = "me";
\r
964 case "drop_MotionEstimationRange":
\r
965 controlName = "merange";
\r
967 case "drop_subpixelMotionEstimation":
\r
968 controlName = "subq";
\r
970 case "drop_analysis":
\r
971 controlName = "analyse";
\r
973 case "check_8x8DCT":
\r
974 controlName = "8x8dct";
\r
976 case "drop_deblockAlpha":
\r
977 controlName = "deblock";
\r
979 case "drop_deblockBeta":
\r
980 controlName = "deblock";
\r
982 case "drop_trellis":
\r
983 controlName = "trellis";
\r
985 case "check_noFastPSkip":
\r
986 controlName = "no-fast-pskip";
\r
988 case "check_noDCTDecimate":
\r
989 controlName = "no-dct-decimate";
\r
991 case "check_Cabac":
\r
992 controlName = "cabac";
\r
994 case "slider_psyrd":
\r
995 controlName = "psy-rd";
\r
997 case "slider_psytrellis":
\r
998 controlName = "psy-rd";
\r
1000 case "drop_adaptBFrames":
\r
1001 controlName = "b-adapt";
\r
1004 OnX264WidgetChange(controlName);
\r
1007 private void rtf_x264Query_TextChanged(object sender, EventArgs e)
\r
1009 if (rtf_x264Query.Text.EndsWith("\n"))
\r
1011 string query = rtf_x264Query.Text.Replace("\n", string.Empty);
\r
1013 rtf_x264Query.Text = query;
\r
1014 X264_StandardizeOptString();
\r
1015 X264_SetCurrentSettingsInPanel();
\r
1017 if (rtf_x264Query.Text == string.Empty)
\r
1022 private void btn_reset_Click(object sender, EventArgs e)
\r
1024 rtf_x264Query.Text = string.Empty;
\r