3 This file is part of the HandBrake source code.
\r
4 Homepage: <http://handbrake.fr>.
\r
5 It may be used under the terms of the GNU General Public License. */
\r
7 namespace Handbrake.Controls
\r
10 using System.Windows.Forms;
\r
12 public partial class x264Panel : UserControl
\r
15 * TODO This code was ported from the obj-c MacGUI code. It's really messy and could really do with being cleaned up
\r
20 /// Initializes a new instance of the <see cref="x264Panel"/> class.
\r
21 /// Initializes a new instance of the x264 panel user control
\r
25 InitializeComponent();
\r
27 if (Properties.Settings.Default.tooltipEnable)
\r
28 ToolTip.Active = true;
\r
34 /// Gets or sets the X264 query string
\r
36 public string X264Query
\r
40 return rtf_x264Query.Text;
\r
42 set { rtf_x264Query.Text = value; }
\r
46 /// Reset all components to defaults and clears the x264 rtf box
\r
48 public void Reset2Defaults()
\r
50 check_8x8DCT.CheckState = CheckState.Checked;
\r
51 check_Cabac.CheckState = CheckState.Checked;
\r
52 check_mixedReferences.CheckState = CheckState.Checked;
\r
53 check_noDCTDecimate.CheckState = CheckState.Unchecked;
\r
54 check_noFastPSkip.CheckState = CheckState.Unchecked;
\r
55 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
56 check_weightedBFrames.CheckState = CheckState.Checked;
\r
57 drop_analysis.SelectedIndex = 0;
\r
58 drop_bFrames.SelectedIndex = 0;
\r
59 drop_deblockAlpha.SelectedIndex = 0;
\r
60 drop_deblockBeta.SelectedIndex = 0;
\r
61 drop_directPrediction.SelectedIndex = 0;
\r
62 drop_MotionEstimationMethod.SelectedIndex = 0;
\r
63 drop_MotionEstimationRange.SelectedIndex = 0;
\r
64 drop_refFrames.SelectedIndex = 0;
\r
65 drop_subpixelMotionEstimation.SelectedIndex = 0;
\r
66 drop_trellis.SelectedIndex = 0;
\r
67 slider_psyrd.Value = 10;
\r
68 slider_psytrellis.Value = 0;
\r
69 drop_adaptBFrames.SelectedIndex = 0;
\r
71 rtf_x264Query.Text = string.Empty;
\r
75 /// Iterate over every x264 option, standardize it, write the full string to the x264 rtf box
\r
77 public void X264_StandardizeOptString()
\r
79 /* Set widgets depending on the opt string in field */
\r
80 string thisOpt; // The separated option such as "bframes=3"
\r
81 string optName; // The option name such as "bframes"
\r
82 string optValue; // The option value such as "3"
\r
83 string changedOptString = string.Empty;
\r
84 string[] currentOptsArray;
\r
86 /*First, we get an opt string to process */
\r
87 string currentOptString = rtf_x264Query.Text;
\r
89 /*verify there is an opt string to process */
\r
90 if (currentOptString.Contains("="))
\r
92 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
93 currentOptsArray = currentOptString.Split(':');
\r
95 /*iterate through the array and get <opts> and <values*/
\r
97 int currentOptsArrayCount = currentOptsArray.Length;
\r
98 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
\r
100 thisOpt = currentOptsArray[loopcounter];
\r
101 if (currentOptsArray[currentOptsArrayCount - 1] == string.Empty)
\r
104 string[] splitOptRange = thisOpt.Split('=');
\r
105 if (thisOpt != string.Empty)
\r
107 if (thisOpt.Contains("="))
\r
109 optName = splitOptRange[0];
\r
110 optValue = splitOptRange[1];
\r
112 /* Standardize the names here depending on whats in the string */
\r
113 optName = X264_StandardizeOptNames(optName);
\r
114 thisOpt = optName + "=" + optValue;
\r
116 else // No value given so we use a default of "1"
\r
119 /* Standardize the names here depending on whats in the string */
\r
120 optName = X264_StandardizeOptNames(optName);
\r
121 thisOpt = optName + "=1";
\r
125 /* Construct New String for opts here */
\r
126 if (thisOpt == string.Empty)
\r
127 changedOptString = changedOptString + thisOpt;
\r
130 if (changedOptString == string.Empty)
\r
131 changedOptString = thisOpt;
\r
133 changedOptString = changedOptString + ":" + thisOpt;
\r
138 /* Change the option string to reflect the new standardized option string */
\r
139 if (changedOptString != string.Empty)
\r
140 rtf_x264Query.Text = changedOptString;
\r
144 /// Take a single option and standardize it. Returns as a String
\r
145 /// Input: String. - Single X264 Option. Name only
\r
146 /// Output: String - Single X264 Option. Name only. Changed to standard format
\r
148 /// <param name="cleanOptNameString">a string of x264 options to clean</param>
\r
149 /// <returns>A string containing standardized x264 option names</returns>
\r
150 private static string X264_StandardizeOptNames(string cleanOptNameString)
\r
152 string input = cleanOptNameString;
\r
154 if (input.Equals("ref") || input.Equals("frameref"))
\r
155 cleanOptNameString = "ref";
\r
157 /*No Fast PSkip nofast_pskip*/
\r
158 if (input.Equals("no-fast-pskip") || input.Equals("no_fast_pskip") || input.Equals("nofast_pskip"))
\r
159 cleanOptNameString = "no-fast-pskip";
\r
161 /*No Dict Decimate*/
\r
162 if (input.Equals("no-dct-decimate") || input.Equals("no_dct_decimate") || input.Equals("nodct_decimate"))
\r
163 cleanOptNameString = "no-dct-decimate";
\r
166 if (input.Equals("subme"))
\r
167 cleanOptNameString = "subq";
\r
170 if (input.Equals("me-range") || input.Equals("me_range"))
\r
171 cleanOptNameString = "merange";
\r
174 if (input.Equals("weight-b") || input.Equals("weight_b"))
\r
175 cleanOptNameString = "weightb";
\r
178 if (input.Equals("b_pyramid"))
\r
179 cleanOptNameString = "b-pyramid";
\r
181 /*Direct Prediction*/
\r
182 if (input.Equals("direct-pred") || input.Equals("direct_pred"))
\r
183 cleanOptNameString = "direct";
\r
186 if (input.Equals("filter"))
\r
187 cleanOptNameString = "deblock";
\r
190 if (input.Equals("partitions"))
\r
191 cleanOptNameString = "analyse";
\r
193 return cleanOptNameString;
\r
197 /// Resets the GUI widgets to the contents of the option string.
\r
199 public void X264_SetCurrentSettingsInPanel()
\r
201 /* Set widgets depending on the opt string in field */
\r
202 string thisOpt; // The separated option such as "bframes=3"
\r
203 string optName; // The option name such as "bframes"
\r
204 string optValue; // The option value such as "3"
\r
205 string[] currentOptsArray;
\r
207 // Set currentOptString to the contents of the text box.
\r
208 string currentOptString = rtf_x264Query.Text.Replace("\n", string.Empty);
\r
210 /*verify there is an opt string to process */
\r
211 if (currentOptString.Contains("="))
\r
213 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
214 currentOptsArray = currentOptString.Split(':');
\r
216 /*iterate through the array and get <opts> and <values*/
\r
218 int currentOptsArrayCount = currentOptsArray.Length;
\r
220 /*iterate through the array and get <opts> and <values*/
\r
221 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
\r
223 thisOpt = currentOptsArray[loopcounter];
\r
224 string[] splitOptRange = thisOpt.Split('=');
\r
226 if (thisOpt.Contains("="))
\r
228 optName = splitOptRange[0];
\r
229 optValue = splitOptRange[1];
\r
231 /*Run through the available widgets for x264 opts and set them, as you add widgets,
\r
232 they need to be added here. This should be moved to its own method probably*/
\r
236 drop_bFrames.SelectedItem = optValue;
\r
239 drop_refFrames.SelectedItem = optValue;
\r
241 case "no-fast-pskip":
\r
242 check_noFastPSkip.CheckState = CheckState.Checked;
\r
244 case "no-dct-decimate":
\r
245 check_noDCTDecimate.CheckState = CheckState.Checked;
\r
248 drop_subpixelMotionEstimation.SelectedItem = optValue;
\r
251 drop_trellis.SelectedItem = optValue;
\r
254 check_mixedReferences.CheckState = CheckState.Checked;
\r
257 if (optValue.Equals("dia"))
\r
258 drop_MotionEstimationMethod.SelectedItem = "Diamond";
\r
259 else if (optValue.Equals("hex"))
\r
260 drop_MotionEstimationMethod.SelectedItem = "Hexagon";
\r
261 else if (optValue.Equals("umh"))
\r
262 drop_MotionEstimationMethod.SelectedItem = "Uneven Multi-Hexagon";
\r
263 else if (optValue.Equals("esa"))
\r
264 drop_MotionEstimationMethod.SelectedItem = "Exhaustive";
\r
265 else if (optValue.Equals("tesa"))
\r
266 drop_MotionEstimationMethod.SelectedItem = "Transformed Exhaustive";
\r
269 drop_MotionEstimationRange.SelectedItem = optValue;
\r
273 int.TryParse(optValue, out badapt);
\r
274 drop_adaptBFrames.SelectedIndex = (badapt + 1);
\r
277 if (optValue != "0")
\r
278 check_weightedBFrames.CheckState = CheckState.Checked;
\r
280 check_weightedBFrames.CheckState = CheckState.Unchecked;
\r
283 check_pyrmidalBFrames.CheckState = CheckState.Checked;
\r
286 if (optValue == "auto")
\r
287 optValue = "Automatic";
\r
289 if (optValue != string.Empty)
\r
291 char[] letters = optValue.ToCharArray();
\r
292 letters[0] = Char.ToUpper(letters[0]);
\r
293 optValue = new string(letters);
\r
296 drop_directPrediction.SelectedItem = optValue;
\r
299 string[] splitDeblock = optValue.Split(',');
\r
300 string alphaDeblock = splitDeblock[0];
\r
301 string betaDeblock = splitDeblock[1];
\r
303 if (alphaDeblock.Equals("0") && betaDeblock.Replace("\n", string.Empty).Equals("0"))
\r
305 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
306 drop_deblockBeta.SelectedItem = "Default (0)";
\r
310 drop_deblockAlpha.SelectedItem = !alphaDeblock.Equals("0") ? alphaDeblock : "0";
\r
312 drop_deblockBeta.SelectedItem = !betaDeblock.Replace("\n", string.Empty).Equals("0")
\r
313 ? betaDeblock.Replace("\n", string.Empty)
\r
318 if (optValue.Equals("p8x8,b8x8,i8x8,i4x4"))
\r
319 drop_analysis.SelectedItem = "Default (some)";
\r
320 if (optValue.Equals("none"))
\r
321 drop_analysis.SelectedItem = "None";
\r
322 if (optValue.Equals("all"))
\r
323 drop_analysis.SelectedItem = "All";
\r
326 check_8x8DCT.CheckState = optValue == "1" ? CheckState.Checked : CheckState.Unchecked;
\r
329 check_Cabac.CheckState = CheckState.Unchecked;
\r
332 string[] x = optValue.Split(',');
\r
334 double psyrd, psytrellis;
\r
337 // default psy-rd = 1 (10 for the slider)
\r
338 psyrd = double.TryParse(x[0], out psyrd) ? psyrd*10 : 10.0;
\r
339 // default psy-trellis = 0
\r
340 psytrellis = double.TryParse(x[1], out psytrellis) ? psytrellis*10 : 0.0;
\r
342 int.TryParse(psyrd.ToString(), out val);
\r
343 int.TryParse(psytrellis.ToString(), out val2);
\r
345 slider_psyrd.Value = val;
\r
346 slider_psytrellis.Value = val2;
\r
355 /// This function will update the X264 Query when one of the GUI widgets changes.
\r
357 private void OnX264WidgetChange(string sender)
\r
360 string optNameToChange = sender;
\r
361 string currentOptString = rtf_x264Query.Text;
\r
363 /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after
\r
364 the first character of the opt string (hence the ":") */
\r
365 string checkOptNameToChange = ":" + optNameToChange + "=";
\r
366 string checkOptNameToChangeBegin = optNameToChange + "=";
\r
368 // IF the current H264 Option String Contains Multiple Items or Just 1 Item
\r
369 if ((currentOptString.Contains(checkOptNameToChange)) ||
\r
370 (currentOptString.StartsWith(checkOptNameToChangeBegin)))
\r
371 HasOptions(currentOptString, optNameToChange);
\r
372 else // IF there is no options in the rich text box!
\r
373 HasNoOptions(optNameToChange);
\r
377 /// Called when the current x264 option string contains multiple (or a single) item(s) in it seperated by :
\r
378 /// it updates the current option that the widget corrosponds to, if it is already in thes string.
\r
380 /// <param name="currentOptString"></param>
\r
381 /// <param name="optNameToChange"></param>
\r
382 private void HasOptions(string currentOptString, string optNameToChange)
\r
384 string thisOpt; // The separated option such as "bframes=3"
\r
385 string optName; // The option name such as "bframes"
\r
386 string[] currentOptsArray;
\r
388 /* Create new empty opt string*/
\r
389 string changedOptString = string.Empty;
\r
391 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
392 currentOptsArray = currentOptString.Split(':');
\r
394 /*iterate through the array and get <opts> and <values*/
\r
395 for (int loopcounter = 0; loopcounter < currentOptsArray.Length; loopcounter++)
\r
397 thisOpt = currentOptsArray[loopcounter];
\r
399 if (thisOpt.Contains("="))
\r
401 string[] splitOptRange = thisOpt.Split('=');
\r
403 optName = splitOptRange[0]; // e.g bframes
\r
406 * Run through the available widgets for x264 opts and set them, as you add widgets,
\r
407 * they need to be added here. This should be moved to its own method probably
\r
408 * If the optNameToChange is found, appropriately change the value or delete it if
\r
409 * "unspecified" is set.
\r
411 if (optName.Equals(optNameToChange))
\r
413 if (optNameToChange.Equals("deblock"))
\r
415 string da = drop_deblockAlpha.SelectedItem.ToString();
\r
416 string db = drop_deblockBeta.SelectedItem.ToString();
\r
418 if (((da.Contains("Default")) && (db.Contains("Default"))) ||
\r
419 ((da.Contains("0")) && (db.Contains("0"))))
\r
421 drop_deblockBeta.SelectedItem = "Default (0)";
\r
422 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
423 thisOpt = string.Empty;
\r
425 else if ((!da.Contains("Default")) && (db.Contains("Default")))
\r
427 drop_deblockBeta.SelectedItem = "0";
\r
428 thisOpt = "deblock=" + da + ",0";
\r
430 else if ((da.Contains("Default")) && (!db.Contains("Default")))
\r
432 drop_deblockAlpha.SelectedItem = "0";
\r
433 thisOpt = "deblock=0," + db;
\r
435 else if ((!da.Contains("Default")) && (!db.Contains("Default")))
\r
436 thisOpt = "deblock=" + da + "," + db;
\r
438 else if (optNameToChange.Equals("psy-rd"))
\r
440 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
\r
441 thisOpt = string.Empty;
\r
444 double psyrd = slider_psyrd.Value*0.1;
\r
445 double psytre = slider_psytrellis.Value*0.1;
\r
447 string rd = psyrd.ToString("f1");
\r
448 string rt = psytre.ToString("f1");
\r
450 thisOpt = "psy-rd=" + rd + "," + rt;
\r
453 else if (optNameToChange.Equals("mixed-refs"))
\r
454 thisOpt = check_mixedReferences.CheckState == CheckState.Checked
\r
457 else if (optNameToChange.Equals("weightb"))
\r
458 thisOpt = check_weightedBFrames.CheckState == CheckState.Checked ? string.Empty : "weightb=0";
\r
459 else if (optNameToChange.Equals("b-pyramid"))
\r
460 thisOpt = check_pyrmidalBFrames.CheckState == CheckState.Checked ? "b-pyramid=1" : string.Empty;
\r
461 else if (optNameToChange.Equals("no-fast-pskip"))
\r
462 thisOpt = check_noFastPSkip.CheckState == CheckState.Checked ? "no-fast-pskip=1" : string.Empty;
\r
463 else if (optNameToChange.Equals("no-dct-decimate"))
\r
464 thisOpt = check_noDCTDecimate.CheckState == CheckState.Checked ? "no-dct-decimate=1" : string.Empty;
\r
465 else if (optNameToChange.Equals("8x8dct"))
\r
466 thisOpt = check_8x8DCT.CheckState == CheckState.Checked ? "8x8dct=1" : "8x8dct=0";
\r
467 else if (optNameToChange.Equals("cabac"))
\r
468 thisOpt = check_Cabac.CheckState == CheckState.Checked ? string.Empty : "cabac=0";
\r
469 else if (optNameToChange.Equals("me"))
\r
471 switch (drop_MotionEstimationMethod.SelectedIndex)
\r
474 thisOpt = "me=dia";
\r
478 thisOpt = "me=hex";
\r
482 thisOpt = "me=umh";
\r
486 thisOpt = "me=esa";
\r
490 thisOpt = "me=tesa";
\r
494 thisOpt = string.Empty;
\r
498 else if (optNameToChange.Equals("direct"))
\r
500 switch (drop_directPrediction.SelectedIndex)
\r
503 thisOpt = "direct=none";
\r
507 thisOpt = "direct=spatial";
\r
511 thisOpt = "direct=temporal";
\r
515 thisOpt = "direct=auto";
\r
519 thisOpt = string.Empty;
\r
523 else if (optNameToChange.Equals("analyse"))
\r
525 switch (drop_analysis.SelectedIndex)
\r
528 thisOpt = "analyse=none";
\r
532 thisOpt = "analyse=all";
\r
536 thisOpt = string.Empty;
\r
540 else if (optNameToChange.Equals("merange"))
\r
542 thisOpt = !drop_MotionEstimationRange.SelectedItem.ToString().Contains("Default")
\r
543 ? "merange=" + drop_MotionEstimationRange.SelectedItem
\r
546 else if (optNameToChange.Equals("b-adapt"))
\r
548 thisOpt = !drop_adaptBFrames.SelectedItem.ToString().Contains("Default")
\r
549 ? "b-adapt=" + (drop_adaptBFrames.SelectedIndex - 1)
\r
552 else if (optNameToChange.Equals("ref"))
\r
554 thisOpt = !drop_refFrames.SelectedItem.ToString().Contains("Default")
\r
555 ? "ref=" + drop_refFrames.SelectedItem
\r
558 else if (optNameToChange.Equals("bframes"))
\r
560 string value = drop_bFrames.SelectedItem.ToString();
\r
561 thisOpt = !drop_bFrames.SelectedItem.ToString().Contains("Default")
\r
562 ? "bframes=" + value
\r
565 else if (optNameToChange.Equals("subq"))
\r
567 string value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
568 thisOpt = !drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default")
\r
572 else if (optNameToChange.Equals("trellis"))
\r
574 string value = drop_trellis.SelectedItem.ToString();
\r
575 thisOpt = !drop_trellis.SelectedItem.ToString().Contains("Default")
\r
576 ? "trellis=" + value
\r
582 /* Construct New String for opts here */
\r
583 if (!thisOpt.Equals(string.Empty))
\r
584 changedOptString = changedOptString.Equals(string.Empty) ? thisOpt : changedOptString + ":" + thisOpt;
\r
587 /* Change the option string to reflect the new mod settings */
\r
588 rtf_x264Query.Text = changedOptString;
\r
592 /// Add's an option to the x264 query string.
\r
593 /// Handles 2 cases. 1 Where rtf_x264Query.Text is empty, and one where there is an option with no value,
\r
594 /// e.g no-fast-pskip
\r
596 /// <param name="optNameToChange"></param>
\r
597 private void HasNoOptions(IEquatable<string> optNameToChange)
\r
599 string colon = string.Empty;
\r
600 if (rtf_x264Query.Text != string.Empty)
\r
603 string query = rtf_x264Query.Text;
\r
604 if (optNameToChange.Equals("me"))
\r
606 switch (drop_MotionEstimationMethod.SelectedIndex)
\r
609 query = query + colon + "me=dia";
\r
613 query = query + colon + "me=hex";
\r
617 query = query + colon + "me=umh";
\r
621 query = query + colon + "me=esa";
\r
625 query = query + colon + "me=tesa";
\r
632 else if (optNameToChange.Equals("direct"))
\r
634 switch (drop_directPrediction.SelectedIndex)
\r
637 query = query + colon + "direct=none";
\r
641 query = query + colon + "direct=spatial";
\r
645 query = query + colon + "direct=temporal";
\r
649 query = query + colon + "direct=auto";
\r
656 else if (optNameToChange.Equals("analyse"))
\r
658 switch (drop_analysis.SelectedIndex)
\r
661 query = query + colon + "analyse=none";
\r
665 query = query + colon + "analyse=all";
\r
672 else if (optNameToChange.Equals("merange"))
\r
674 int value = drop_MotionEstimationRange.SelectedIndex + 3;
\r
675 query = query + colon + "merange=" + value;
\r
677 else if (optNameToChange.Equals("b-adapt"))
\r
679 int value = drop_adaptBFrames.SelectedIndex - 1;
\r
680 query = query + colon + "b-adapt=" + value;
\r
682 else if (optNameToChange.Equals("deblock"))
\r
684 string da = drop_deblockAlpha.SelectedItem.ToString();
\r
685 string db = drop_deblockBeta.Text;
\r
687 if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))
\r
689 drop_deblockBeta.SelectedItem = "Default (0)";
\r
690 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
694 if (db.Contains("Default"))
\r
697 if (da.Contains("Default"))
\r
700 query = query + colon + "deblock=" + da + "," + db;
\r
703 else if (optNameToChange.Equals("psy-rd"))
\r
705 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
\r
706 query += string.Empty;
\r
709 double psyrd = slider_psyrd.Value*0.1;
\r
710 double psytre = slider_psytrellis.Value*0.1;
\r
712 string rd = psyrd.ToString("f1");
\r
713 string rt = psytre.ToString("f1");
\r
715 query += colon + "psy-rd=" + rd + "," + rt;
\r
718 else if (optNameToChange.Equals("mixed-refs"))
\r
720 if (check_mixedReferences.CheckState == CheckState.Checked)
\r
721 query = query + colon + "mixed-refs=1";
\r
723 query = query + colon + "mixed-refs=0";
\r
725 else if (optNameToChange.Equals("weightb"))
\r
727 if (check_weightedBFrames.CheckState != CheckState.Checked)
\r
728 query = query + colon + "weightb=0";
\r
730 else if (optNameToChange.Equals("b-pyramid"))
\r
732 if (check_pyrmidalBFrames.CheckState == CheckState.Checked)
\r
733 query = query + colon + "b-pyramid=1";
\r
735 else if (optNameToChange.Equals("no-fast-pskip"))
\r
737 if (check_noFastPSkip.CheckState == CheckState.Checked)
\r
738 query = query + colon + "no-fast-pskip=1";
\r
740 else if (optNameToChange.Equals("no-dct-decimate"))
\r
742 if (check_noDCTDecimate.CheckState == CheckState.Checked)
\r
743 query = query + colon + "no-dct-decimate=1";
\r
745 else if (optNameToChange.Equals("8x8dct"))
\r
747 if (check_8x8DCT.CheckState == CheckState.Checked)
\r
748 query = query + colon + "8x8dct=1";
\r
750 else if (optNameToChange.Equals("cabac"))
\r
752 if (check_Cabac.CheckState != CheckState.Checked)
\r
753 query = query + colon + "cabac=0";
\r
755 else if (optNameToChange.Equals("ref"))
\r
757 if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))
\r
758 query = query + colon + "ref=" + drop_refFrames.SelectedItem;
\r
760 else if (optNameToChange.Equals("bframes"))
\r
762 string value = drop_bFrames.SelectedItem.ToString();
\r
763 if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))
\r
764 query = query + colon + "bframes=" + value;
\r
766 else if (optNameToChange.Equals("subq"))
\r
768 string value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
769 if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))
\r
770 query = query + colon + "subq=" + value;
\r
772 else if (optNameToChange.Equals("trellis"))
\r
774 if (!drop_trellis.SelectedItem.ToString().Contains("Default"))
\r
775 query = query + colon + "trellis=" + drop_trellis.SelectedItem;
\r
778 rtf_x264Query.Text = query;
\r
782 /// Shows and hides controls based on the values of other controls.
\r
784 /// <param name="sender"></param>
\r
785 private void Animate(string sender)
\r
787 /* Lots of situations to cover.
\r
788 - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)
\r
789 - CABAC (when 0 turn off trellis)
\r
790 - analysis (if none, turn off 8x8dct)
\r
791 - refs (under 2, disable mixed-refs)
\r
792 - subme (if under 6, turn off psy-rd and psy-trel)
\r
793 - trellis (if 0, turn off psy-trel)
\r
799 if (drop_bFrames.SelectedIndex > 0 && drop_bFrames.SelectedIndex < 2)
\r
801 /* If the b-frame widget is at 0 or 1, the user has chosen
\r
802 not to use b-frames at all. So disable the options
\r
803 that can only be used when b-frames are enabled. */
\r
804 check_weightedBFrames.Visible = false;
\r
805 check_pyrmidalBFrames.Visible = false;
\r
806 drop_directPrediction.Visible = false;
\r
807 lbl_direct_prediction.Visible = false;
\r
809 check_weightedBFrames.CheckState = CheckState.Unchecked;
\r
810 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
811 drop_directPrediction.SelectedIndex = 0;
\r
813 drop_adaptBFrames.Visible = false;
\r
814 lbl_adaptBFrames.Visible = false;
\r
815 drop_adaptBFrames.SelectedIndex = 0;
\r
817 else if (drop_bFrames.SelectedIndex == 2)
\r
819 /* Only 1 b-frame? Disable b-pyramid. */
\r
820 check_pyrmidalBFrames.Visible = false;
\r
821 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
823 check_weightedBFrames.Visible = true;
\r
824 drop_directPrediction.Visible = true;
\r
825 lbl_direct_prediction.Visible = true;
\r
827 drop_adaptBFrames.Visible = true;
\r
828 lbl_adaptBFrames.Visible = true;
\r
832 check_weightedBFrames.Visible = true;
\r
833 check_pyrmidalBFrames.Visible = true;
\r
834 drop_directPrediction.Visible = true;
\r
835 lbl_direct_prediction.Visible = true;
\r
837 drop_adaptBFrames.Visible = true;
\r
838 lbl_adaptBFrames.Visible = true;
\r
842 if (check_Cabac.Checked == false)
\r
844 /* Without CABAC entropy coding, trellis doesn't run. */
\r
845 drop_trellis.Visible = false;
\r
846 drop_trellis.SelectedIndex = 0;
\r
847 lbl_trellis.Visible = false;
\r
851 drop_trellis.Visible = true;
\r
852 lbl_trellis.Visible = true;
\r
856 if (drop_analysis.SelectedIndex == 1)
\r
858 /* No analysis? Disable 8x8dct */
\r
859 check_8x8DCT.Visible = false;
\r
860 if (sender != "8x8dct")
\r
861 check_8x8DCT.CheckState = CheckState.Unchecked;
\r
864 check_8x8DCT.Visible = true;
\r
867 if (drop_refFrames.SelectedIndex > 0 && drop_refFrames.SelectedIndex < 3)
\r
869 check_mixedReferences.Visible = false;
\r
870 if (sender != "mixed-refs")
\r
871 check_mixedReferences.CheckState = CheckState.Unchecked;
\r
874 check_mixedReferences.Visible = true;
\r
876 case "me": // Motion Estimation
\r
877 if (drop_MotionEstimationMethod.SelectedIndex < 3)
\r
879 drop_MotionEstimationRange.Visible = false;
\r
880 lbl_merange.Visible = false;
\r
881 drop_MotionEstimationRange.SelectedIndex = 0;
\r
885 drop_MotionEstimationRange.Visible = true;
\r
886 lbl_merange.Visible = true;
\r
889 case "subq": // subme
\r
890 if (drop_subpixelMotionEstimation.SelectedIndex != 0 &&
\r
891 drop_subpixelMotionEstimation.SelectedIndex < 7)
\r
893 slider_psyrd.Visible = false;
\r
894 slider_psyrd.Value = 10;
\r
895 lbl_psyrd.Visible = false;
\r
898 slider_psytrellis.Visible = false;
\r
899 slider_psytrellis.Value = 0;
\r
900 lbl_psytrellis.Visible = false;
\r
904 slider_psyrd.Visible = true;
\r
905 lbl_psyrd.Visible = true;
\r
907 if (drop_trellis.SelectedIndex >= 2 && check_Cabac.Checked && slider_psytrellis.Visible == false)
\r
909 slider_psytrellis.Visible = true;
\r
910 lbl_psytrellis.Visible = true;
\r
914 case "trellis": // subme
\r
915 if (drop_trellis.SelectedIndex > 0 && drop_trellis.SelectedIndex < 2)
\r
917 slider_psytrellis.Visible = false;
\r
918 slider_psytrellis.Value = 0;
\r
919 lbl_psytrellis.Visible = false;
\r
923 if ((drop_subpixelMotionEstimation.SelectedIndex == 0 ||
\r
924 drop_subpixelMotionEstimation.SelectedIndex >= 7) && check_Cabac.Checked &&
\r
925 slider_psytrellis.Visible == false)
\r
927 slider_psytrellis.Visible = true;
\r
928 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