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
38 get { return " -x " + rtf_x264Query.Text; }
\r
39 set { rtf_x264Query.Text = value; }
\r
43 /// Reset all components to defaults and clears the x264 rtf box
\r
45 public void Reset2Defaults()
\r
47 check_8x8DCT.CheckState = CheckState.Checked;
\r
48 check_Cabac.CheckState = CheckState.Checked;
\r
49 check_mixedReferences.CheckState = CheckState.Checked;
\r
50 check_noDCTDecimate.CheckState = CheckState.Unchecked;
\r
51 check_noFastPSkip.CheckState = CheckState.Unchecked;
\r
52 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
53 check_weightedBFrames.CheckState = CheckState.Checked;
\r
54 drop_analysis.SelectedIndex = 0;
\r
55 drop_bFrames.SelectedIndex = 0;
\r
56 drop_deblockAlpha.SelectedIndex = 0;
\r
57 drop_deblockBeta.SelectedIndex = 0;
\r
58 drop_directPrediction.SelectedIndex = 0;
\r
59 drop_MotionEstimationMethod.SelectedIndex = 0;
\r
60 drop_MotionEstimationRange.SelectedIndex = 0;
\r
61 drop_refFrames.SelectedIndex = 0;
\r
62 drop_subpixelMotionEstimation.SelectedIndex = 0;
\r
63 drop_trellis.SelectedIndex = 0;
\r
64 slider_psyrd.Value = 10;
\r
65 slider_psytrellis.Value = 0;
\r
66 drop_adaptBFrames.SelectedIndex = 0;
\r
68 rtf_x264Query.Text = string.Empty;
\r
72 /// Iterate over every x264 option, standardize it, write the full string to the x264 rtf box
\r
74 public void X264_StandardizeOptString()
\r
76 /* Set widgets depending on the opt string in field */
\r
77 string thisOpt; // The separated option such as "bframes=3"
\r
78 string optName; // The option name such as "bframes"
\r
79 string optValue; // The option value such as "3"
\r
80 string changedOptString = string.Empty;
\r
81 string[] currentOptsArray;
\r
83 /*First, we get an opt string to process */
\r
84 string currentOptString = rtf_x264Query.Text;
\r
86 /*verify there is an opt string to process */
\r
87 if (currentOptString.Contains("="))
\r
89 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
90 currentOptsArray = currentOptString.Split(':');
\r
92 /*iterate through the array and get <opts> and <values*/
\r
94 int currentOptsArrayCount = currentOptsArray.Length;
\r
95 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
\r
97 thisOpt = currentOptsArray[loopcounter];
\r
98 if (currentOptsArray[currentOptsArrayCount - 1] == string.Empty)
\r
101 string[] splitOptRange = thisOpt.Split('=');
\r
102 if (thisOpt != string.Empty)
\r
104 if (thisOpt.Contains("="))
\r
106 optName = splitOptRange[0];
\r
107 optValue = splitOptRange[1];
\r
109 /* Standardize the names here depending on whats in the string */
\r
110 optName = X264_StandardizeOptNames(optName);
\r
111 thisOpt = optName + "=" + optValue;
\r
113 else // No value given so we use a default of "1"
\r
116 /* Standardize the names here depending on whats in the string */
\r
117 optName = X264_StandardizeOptNames(optName);
\r
118 thisOpt = optName + "=1";
\r
122 /* Construct New String for opts here */
\r
123 if (thisOpt == string.Empty)
\r
124 changedOptString = changedOptString + thisOpt;
\r
127 if (changedOptString == string.Empty)
\r
128 changedOptString = thisOpt;
\r
130 changedOptString = changedOptString + ":" + thisOpt;
\r
135 /* Change the option string to reflect the new standardized option string */
\r
136 if (changedOptString != string.Empty)
\r
137 rtf_x264Query.Text = changedOptString;
\r
141 /// Take a single option and standardize it. Returns as a String
\r
142 /// Input: String. - Single X264 Option. Name only
\r
143 /// Output: String - Single X264 Option. Name only. Changed to standard format
\r
145 /// <param name="cleanOptNameString">a string of x264 options to clean</param>
\r
146 /// <returns>A string containing standardized x264 option names</returns>
\r
147 private static string X264_StandardizeOptNames(string cleanOptNameString)
\r
149 string input = cleanOptNameString;
\r
151 if (input.Equals("ref") || input.Equals("frameref"))
\r
152 cleanOptNameString = "ref";
\r
154 /*No Fast PSkip nofast_pskip*/
\r
155 if (input.Equals("no-fast-pskip") || input.Equals("no_fast_pskip") || input.Equals("nofast_pskip"))
\r
156 cleanOptNameString = "no-fast-pskip";
\r
158 /*No Dict Decimate*/
\r
159 if (input.Equals("no-dct-decimate") || input.Equals("no_dct_decimate") || input.Equals("nodct_decimate"))
\r
160 cleanOptNameString = "no-dct-decimate";
\r
163 if (input.Equals("subme"))
\r
164 cleanOptNameString = "subq";
\r
167 if (input.Equals("me-range") || input.Equals("me_range"))
\r
168 cleanOptNameString = "merange";
\r
171 if (input.Equals("weight-b") || input.Equals("weight_b"))
\r
172 cleanOptNameString = "weightb";
\r
175 if (input.Equals("b_pyramid"))
\r
176 cleanOptNameString = "b-pyramid";
\r
178 /*Direct Prediction*/
\r
179 if (input.Equals("direct-pred") || input.Equals("direct_pred"))
\r
180 cleanOptNameString = "direct";
\r
183 if (input.Equals("filter"))
\r
184 cleanOptNameString = "deblock";
\r
187 if (input.Equals("partitions"))
\r
188 cleanOptNameString = "analyse";
\r
190 return cleanOptNameString;
\r
194 /// Resets the GUI widgets to the contents of the option string.
\r
196 public void X264_SetCurrentSettingsInPanel()
\r
198 /* Set widgets depending on the opt string in field */
\r
199 string thisOpt; // The separated option such as "bframes=3"
\r
200 string optName; // The option name such as "bframes"
\r
201 string optValue; // The option value such as "3"
\r
202 string[] currentOptsArray;
\r
204 // Set currentOptString to the contents of the text box.
\r
205 string currentOptString = rtf_x264Query.Text.Replace("\n", string.Empty);
\r
207 /*verify there is an opt string to process */
\r
208 if (currentOptString.Contains("="))
\r
210 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
211 currentOptsArray = currentOptString.Split(':');
\r
213 /*iterate through the array and get <opts> and <values*/
\r
215 int currentOptsArrayCount = currentOptsArray.Length;
\r
217 /*iterate through the array and get <opts> and <values*/
\r
218 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
\r
220 thisOpt = currentOptsArray[loopcounter];
\r
221 string[] splitOptRange = thisOpt.Split('=');
\r
223 if (thisOpt.Contains("="))
\r
225 optName = splitOptRange[0];
\r
226 optValue = splitOptRange[1];
\r
228 /*Run through the available widgets for x264 opts and set them, as you add widgets,
\r
229 they need to be added here. This should be moved to its own method probably*/
\r
233 drop_bFrames.SelectedItem = optValue;
\r
236 drop_refFrames.SelectedItem = optValue;
\r
238 case "no-fast-pskip":
\r
239 check_noFastPSkip.CheckState = CheckState.Checked;
\r
241 case "no-dct-decimate":
\r
242 check_noDCTDecimate.CheckState = CheckState.Checked;
\r
245 drop_subpixelMotionEstimation.SelectedItem = optValue;
\r
248 drop_trellis.SelectedItem = optValue;
\r
251 check_mixedReferences.CheckState = CheckState.Checked;
\r
254 if (optValue.Equals("dia"))
\r
255 drop_MotionEstimationMethod.SelectedItem = "Diamond";
\r
256 else if (optValue.Equals("hex"))
\r
257 drop_MotionEstimationMethod.SelectedItem = "Hexagon";
\r
258 else if (optValue.Equals("umh"))
\r
259 drop_MotionEstimationMethod.SelectedItem = "Uneven Multi-Hexagon";
\r
260 else if (optValue.Equals("esa"))
\r
261 drop_MotionEstimationMethod.SelectedItem = "Exhaustive";
\r
262 else if (optValue.Equals("tesa"))
\r
263 drop_MotionEstimationMethod.SelectedItem = "Transformed Exhaustive";
\r
266 drop_MotionEstimationRange.SelectedItem = optValue;
\r
270 int.TryParse(optValue, out badapt);
\r
271 drop_adaptBFrames.SelectedIndex = (badapt + 1);
\r
274 if (optValue != "0")
\r
275 check_weightedBFrames.CheckState = CheckState.Checked;
\r
277 check_weightedBFrames.CheckState = CheckState.Unchecked;
\r
280 check_pyrmidalBFrames.CheckState = CheckState.Checked;
\r
283 if (optValue == "auto")
\r
284 optValue = "Automatic";
\r
286 if (optValue != string.Empty)
\r
288 char[] letters = optValue.ToCharArray();
\r
289 letters[0] = Char.ToUpper(letters[0]);
\r
290 optValue = new string(letters);
\r
293 drop_directPrediction.SelectedItem = optValue;
\r
296 string[] splitDeblock = optValue.Split(',');
\r
297 string alphaDeblock = splitDeblock[0];
\r
298 string betaDeblock = splitDeblock[1];
\r
300 if (alphaDeblock.Equals("0") && betaDeblock.Replace("\n", string.Empty).Equals("0"))
\r
302 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
303 drop_deblockBeta.SelectedItem = "Default (0)";
\r
307 drop_deblockAlpha.SelectedItem = !alphaDeblock.Equals("0") ? alphaDeblock : "0";
\r
309 drop_deblockBeta.SelectedItem = !betaDeblock.Replace("\n", string.Empty).Equals("0")
\r
310 ? betaDeblock.Replace("\n", string.Empty)
\r
315 if (optValue.Equals("p8x8,b8x8,i8x8,i4x4"))
\r
316 drop_analysis.SelectedItem = "Default (some)";
\r
317 if (optValue.Equals("none"))
\r
318 drop_analysis.SelectedItem = "None";
\r
319 if (optValue.Equals("all"))
\r
320 drop_analysis.SelectedItem = "All";
\r
323 check_8x8DCT.CheckState = optValue == "1" ? CheckState.Checked : CheckState.Unchecked;
\r
326 check_Cabac.CheckState = CheckState.Unchecked;
\r
329 string[] x = optValue.Split(',');
\r
331 double psyrd, psytrellis;
\r
334 // default psy-rd = 1 (10 for the slider)
\r
335 psyrd = double.TryParse(x[0], out psyrd) ? psyrd*10 : 10.0;
\r
336 // default psy-trellis = 0
\r
337 psytrellis = double.TryParse(x[1], out psytrellis) ? psytrellis*10 : 0.0;
\r
339 int.TryParse(psyrd.ToString(), out val);
\r
340 int.TryParse(psytrellis.ToString(), out val2);
\r
342 slider_psyrd.Value = val;
\r
343 slider_psytrellis.Value = val2;
\r
352 /// This function will update the X264 Query when one of the GUI widgets changes.
\r
354 private void OnX264WidgetChange(string sender)
\r
357 string optNameToChange = sender;
\r
358 string currentOptString = rtf_x264Query.Text;
\r
360 /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after
\r
361 the first character of the opt string (hence the ":") */
\r
362 string checkOptNameToChange = ":" + optNameToChange + "=";
\r
363 string checkOptNameToChangeBegin = optNameToChange + "=";
\r
365 // IF the current H264 Option String Contains Multiple Items or Just 1 Item
\r
366 if ((currentOptString.Contains(checkOptNameToChange)) ||
\r
367 (currentOptString.StartsWith(checkOptNameToChangeBegin)))
\r
368 HasOptions(currentOptString, optNameToChange);
\r
369 else // IF there is no options in the rich text box!
\r
370 HasNoOptions(optNameToChange);
\r
374 /// Called when the current x264 option string contains multiple (or a single) item(s) in it seperated by :
\r
375 /// it updates the current option that the widget corrosponds to, if it is already in thes string.
\r
377 /// <param name="currentOptString"></param>
\r
378 /// <param name="optNameToChange"></param>
\r
379 private void HasOptions(string currentOptString, string optNameToChange)
\r
381 string thisOpt; // The separated option such as "bframes=3"
\r
382 string optName; // The option name such as "bframes"
\r
383 string[] currentOptsArray;
\r
385 /* Create new empty opt string*/
\r
386 string changedOptString = string.Empty;
\r
388 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
389 currentOptsArray = currentOptString.Split(':');
\r
391 /*iterate through the array and get <opts> and <values*/
\r
392 for (int loopcounter = 0; loopcounter < currentOptsArray.Length; loopcounter++)
\r
394 thisOpt = currentOptsArray[loopcounter];
\r
396 if (thisOpt.Contains("="))
\r
398 string[] splitOptRange = thisOpt.Split('=');
\r
400 optName = splitOptRange[0]; // e.g bframes
\r
403 * Run through the available widgets for x264 opts and set them, as you add widgets,
\r
404 * they need to be added here. This should be moved to its own method probably
\r
405 * If the optNameToChange is found, appropriately change the value or delete it if
\r
406 * "unspecified" is set.
\r
408 if (optName.Equals(optNameToChange))
\r
410 if (optNameToChange.Equals("deblock"))
\r
412 string da = drop_deblockAlpha.SelectedItem.ToString();
\r
413 string db = drop_deblockBeta.SelectedItem.ToString();
\r
415 if (((da.Contains("Default")) && (db.Contains("Default"))) ||
\r
416 ((da.Contains("0")) && (db.Contains("0"))))
\r
418 drop_deblockBeta.SelectedItem = "Default (0)";
\r
419 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
420 thisOpt = string.Empty;
\r
422 else if ((!da.Contains("Default")) && (db.Contains("Default")))
\r
424 drop_deblockBeta.SelectedItem = "0";
\r
425 thisOpt = "deblock=" + da + ",0";
\r
427 else if ((da.Contains("Default")) && (!db.Contains("Default")))
\r
429 drop_deblockAlpha.SelectedItem = "0";
\r
430 thisOpt = "deblock=0," + db;
\r
432 else if ((!da.Contains("Default")) && (!db.Contains("Default")))
\r
433 thisOpt = "deblock=" + da + "," + db;
\r
435 else if (optNameToChange.Equals("psy-rd"))
\r
437 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
\r
438 thisOpt = string.Empty;
\r
441 double psyrd = slider_psyrd.Value*0.1;
\r
442 double psytre = slider_psytrellis.Value*0.1;
\r
444 string rd = psyrd.ToString("f1");
\r
445 string rt = psytre.ToString("f1");
\r
447 thisOpt = "psy-rd=" + rd + "," + rt;
\r
450 else if (optNameToChange.Equals("mixed-refs"))
\r
451 thisOpt = check_mixedReferences.CheckState == CheckState.Checked
\r
454 else if (optNameToChange.Equals("weightb"))
\r
455 thisOpt = check_weightedBFrames.CheckState == CheckState.Checked ? string.Empty : "weightb=0";
\r
456 else if (optNameToChange.Equals("b-pyramid"))
\r
457 thisOpt = check_pyrmidalBFrames.CheckState == CheckState.Checked ? "b-pyramid=1" : string.Empty;
\r
458 else if (optNameToChange.Equals("no-fast-pskip"))
\r
459 thisOpt = check_noFastPSkip.CheckState == CheckState.Checked ? "no-fast-pskip=1" : string.Empty;
\r
460 else if (optNameToChange.Equals("no-dct-decimate"))
\r
461 thisOpt = check_noDCTDecimate.CheckState == CheckState.Checked ? "no-dct-decimate=1" : string.Empty;
\r
462 else if (optNameToChange.Equals("8x8dct"))
\r
463 thisOpt = check_8x8DCT.CheckState == CheckState.Checked ? "8x8dct=1" : "8x8dct=0";
\r
464 else if (optNameToChange.Equals("cabac"))
\r
465 thisOpt = check_Cabac.CheckState == CheckState.Checked ? string.Empty : "cabac=0";
\r
466 else if (optNameToChange.Equals("me"))
\r
468 switch (drop_MotionEstimationMethod.SelectedIndex)
\r
471 thisOpt = "me=dia";
\r
475 thisOpt = "me=hex";
\r
479 thisOpt = "me=umh";
\r
483 thisOpt = "me=esa";
\r
487 thisOpt = "me=tesa";
\r
491 thisOpt = string.Empty;
\r
495 else if (optNameToChange.Equals("direct"))
\r
497 switch (drop_directPrediction.SelectedIndex)
\r
500 thisOpt = "direct=none";
\r
504 thisOpt = "direct=spatial";
\r
508 thisOpt = "direct=temporal";
\r
512 thisOpt = "direct=auto";
\r
516 thisOpt = string.Empty;
\r
520 else if (optNameToChange.Equals("analyse"))
\r
522 switch (drop_analysis.SelectedIndex)
\r
525 thisOpt = "analyse=none";
\r
529 thisOpt = "analyse=all";
\r
533 thisOpt = string.Empty;
\r
537 else if (optNameToChange.Equals("merange"))
\r
539 thisOpt = !drop_MotionEstimationRange.SelectedItem.ToString().Contains("Default")
\r
540 ? "merange=" + drop_MotionEstimationRange.SelectedItem
\r
543 else if (optNameToChange.Equals("b-adapt"))
\r
545 thisOpt = !drop_adaptBFrames.SelectedItem.ToString().Contains("Default")
\r
546 ? "b-adapt=" + (drop_adaptBFrames.SelectedIndex - 1)
\r
549 else if (optNameToChange.Equals("ref"))
\r
551 thisOpt = !drop_refFrames.SelectedItem.ToString().Contains("Default")
\r
552 ? "ref=" + drop_refFrames.SelectedItem
\r
555 else if (optNameToChange.Equals("bframes"))
\r
557 string value = drop_bFrames.SelectedItem.ToString();
\r
558 thisOpt = !drop_bFrames.SelectedItem.ToString().Contains("Default")
\r
559 ? "bframes=" + value
\r
562 else if (optNameToChange.Equals("subq"))
\r
564 string value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
565 thisOpt = !drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default")
\r
569 else if (optNameToChange.Equals("trellis"))
\r
571 string value = drop_trellis.SelectedItem.ToString();
\r
572 thisOpt = !drop_trellis.SelectedItem.ToString().Contains("Default")
\r
573 ? "trellis=" + value
\r
579 /* Construct New String for opts here */
\r
580 if (!thisOpt.Equals(string.Empty))
\r
581 changedOptString = changedOptString.Equals(string.Empty) ? thisOpt : changedOptString + ":" + thisOpt;
\r
584 /* Change the option string to reflect the new mod settings */
\r
585 rtf_x264Query.Text = changedOptString;
\r
589 /// Add's an option to the x264 query string.
\r
590 /// Handles 2 cases. 1 Where rtf_x264Query.Text is empty, and one where there is an option with no value,
\r
591 /// e.g no-fast-pskip
\r
593 /// <param name="optNameToChange"></param>
\r
594 private void HasNoOptions(IEquatable<string> optNameToChange)
\r
596 string colon = string.Empty;
\r
597 if (rtf_x264Query.Text != string.Empty)
\r
600 string query = rtf_x264Query.Text;
\r
601 if (optNameToChange.Equals("me"))
\r
603 switch (drop_MotionEstimationMethod.SelectedIndex)
\r
606 query = query + colon + "me=dia";
\r
610 query = query + colon + "me=hex";
\r
614 query = query + colon + "me=umh";
\r
618 query = query + colon + "me=esa";
\r
622 query = query + colon + "me=tesa";
\r
629 else if (optNameToChange.Equals("direct"))
\r
631 switch (drop_directPrediction.SelectedIndex)
\r
634 query = query + colon + "direct=none";
\r
638 query = query + colon + "direct=spatial";
\r
642 query = query + colon + "direct=temporal";
\r
646 query = query + colon + "direct=auto";
\r
653 else if (optNameToChange.Equals("analyse"))
\r
655 switch (drop_analysis.SelectedIndex)
\r
658 query = query + colon + "analyse=none";
\r
662 query = query + colon + "analyse=all";
\r
669 else if (optNameToChange.Equals("merange"))
\r
671 int value = drop_MotionEstimationRange.SelectedIndex + 3;
\r
672 query = query + colon + "merange=" + value;
\r
674 else if (optNameToChange.Equals("b-adapt"))
\r
676 int value = drop_adaptBFrames.SelectedIndex - 1;
\r
677 query = query + colon + "b-adapt=" + value;
\r
679 else if (optNameToChange.Equals("deblock"))
\r
681 string da = drop_deblockAlpha.SelectedItem.ToString();
\r
682 string db = drop_deblockBeta.Text;
\r
684 if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))
\r
686 drop_deblockBeta.SelectedItem = "Default (0)";
\r
687 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
691 if (db.Contains("Default"))
\r
694 if (da.Contains("Default"))
\r
697 query = query + colon + "deblock=" + da + "," + db;
\r
700 else if (optNameToChange.Equals("psy-rd"))
\r
702 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
\r
703 query += string.Empty;
\r
706 double psyrd = slider_psyrd.Value*0.1;
\r
707 double psytre = slider_psytrellis.Value*0.1;
\r
709 string rd = psyrd.ToString("f1");
\r
710 string rt = psytre.ToString("f1");
\r
712 query += colon + "psy-rd=" + rd + "," + rt;
\r
715 else if (optNameToChange.Equals("mixed-refs"))
\r
717 if (check_mixedReferences.CheckState == CheckState.Checked)
\r
718 query = query + colon + "mixed-refs=1";
\r
720 query = query + colon + "mixed-refs=0";
\r
722 else if (optNameToChange.Equals("weightb"))
\r
724 if (check_weightedBFrames.CheckState != CheckState.Checked)
\r
725 query = query + colon + "weightb=0";
\r
727 else if (optNameToChange.Equals("b-pyramid"))
\r
729 if (check_pyrmidalBFrames.CheckState == CheckState.Checked)
\r
730 query = query + colon + "b-pyramid=1";
\r
732 else if (optNameToChange.Equals("no-fast-pskip"))
\r
734 if (check_noFastPSkip.CheckState == CheckState.Checked)
\r
735 query = query + colon + "no-fast-pskip=1";
\r
737 else if (optNameToChange.Equals("no-dct-decimate"))
\r
739 if (check_noDCTDecimate.CheckState == CheckState.Checked)
\r
740 query = query + colon + "no-dct-decimate=1";
\r
742 else if (optNameToChange.Equals("8x8dct"))
\r
744 if (check_8x8DCT.CheckState == CheckState.Checked)
\r
745 query = query + colon + "8x8dct=1";
\r
747 else if (optNameToChange.Equals("cabac"))
\r
749 if (check_Cabac.CheckState != CheckState.Checked)
\r
750 query = query + colon + "cabac=0";
\r
752 else if (optNameToChange.Equals("ref"))
\r
754 if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))
\r
755 query = query + colon + "ref=" + drop_refFrames.SelectedItem;
\r
757 else if (optNameToChange.Equals("bframes"))
\r
759 string value = drop_bFrames.SelectedItem.ToString();
\r
760 if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))
\r
761 query = query + colon + "bframes=" + value;
\r
763 else if (optNameToChange.Equals("subq"))
\r
765 string value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
766 if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))
\r
767 query = query + colon + "subq=" + value;
\r
769 else if (optNameToChange.Equals("trellis"))
\r
771 if (!drop_trellis.SelectedItem.ToString().Contains("Default"))
\r
772 query = query + colon + "trellis=" + drop_trellis.SelectedItem;
\r
775 rtf_x264Query.Text = query;
\r
779 /// Shows and hides controls based on the values of other controls.
\r
781 /// <param name="sender"></param>
\r
782 private void Animate(string sender)
\r
784 /* Lots of situations to cover.
\r
785 - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)
\r
786 - CABAC (when 0 turn off trellis)
\r
787 - analysis (if none, turn off 8x8dct)
\r
788 - refs (under 2, disable mixed-refs)
\r
789 - subme (if under 6, turn off psy-rd and psy-trel)
\r
790 - trellis (if 0, turn off psy-trel)
\r
796 if (drop_bFrames.SelectedIndex > 0 && drop_bFrames.SelectedIndex < 2)
\r
798 /* If the b-frame widget is at 0 or 1, the user has chosen
\r
799 not to use b-frames at all. So disable the options
\r
800 that can only be used when b-frames are enabled. */
\r
801 check_weightedBFrames.Visible = false;
\r
802 check_pyrmidalBFrames.Visible = false;
\r
803 drop_directPrediction.Visible = false;
\r
804 lbl_direct_prediction.Visible = false;
\r
806 check_weightedBFrames.CheckState = CheckState.Unchecked;
\r
807 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
808 drop_directPrediction.SelectedIndex = 0;
\r
810 drop_adaptBFrames.Visible = false;
\r
811 lbl_adaptBFrames.Visible = false;
\r
812 drop_adaptBFrames.SelectedIndex = 0;
\r
814 else if (drop_bFrames.SelectedIndex == 2)
\r
816 /* Only 1 b-frame? Disable b-pyramid. */
\r
817 check_pyrmidalBFrames.Visible = false;
\r
818 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
820 check_weightedBFrames.Visible = true;
\r
821 drop_directPrediction.Visible = true;
\r
822 lbl_direct_prediction.Visible = true;
\r
824 drop_adaptBFrames.Visible = true;
\r
825 lbl_adaptBFrames.Visible = true;
\r
829 check_weightedBFrames.Visible = true;
\r
830 check_pyrmidalBFrames.Visible = true;
\r
831 drop_directPrediction.Visible = true;
\r
832 lbl_direct_prediction.Visible = true;
\r
834 drop_adaptBFrames.Visible = true;
\r
835 lbl_adaptBFrames.Visible = true;
\r
839 if (check_Cabac.Checked == false)
\r
841 /* Without CABAC entropy coding, trellis doesn't run. */
\r
842 drop_trellis.Visible = false;
\r
843 drop_trellis.SelectedIndex = 0;
\r
844 lbl_trellis.Visible = false;
\r
848 drop_trellis.Visible = true;
\r
849 lbl_trellis.Visible = true;
\r
853 if (drop_analysis.SelectedIndex == 1)
\r
855 /* No analysis? Disable 8x8dct */
\r
856 check_8x8DCT.Visible = false;
\r
857 if (sender != "8x8dct")
\r
858 check_8x8DCT.CheckState = CheckState.Unchecked;
\r
861 check_8x8DCT.Visible = true;
\r
864 if (drop_refFrames.SelectedIndex > 0 && drop_refFrames.SelectedIndex < 3)
\r
866 check_mixedReferences.Visible = false;
\r
867 if (sender != "mixed-refs")
\r
868 check_mixedReferences.CheckState = CheckState.Unchecked;
\r
871 check_mixedReferences.Visible = true;
\r
873 case "me": // Motion Estimation
\r
874 if (drop_MotionEstimationMethod.SelectedIndex < 3)
\r
876 drop_MotionEstimationRange.Visible = false;
\r
877 lbl_merange.Visible = false;
\r
878 drop_MotionEstimationRange.SelectedIndex = 0;
\r
882 drop_MotionEstimationRange.Visible = true;
\r
883 lbl_merange.Visible = true;
\r
886 case "subq": // subme
\r
887 if (drop_subpixelMotionEstimation.SelectedIndex != 0 &&
\r
888 drop_subpixelMotionEstimation.SelectedIndex < 7)
\r
890 slider_psyrd.Visible = false;
\r
891 slider_psyrd.Value = 10;
\r
892 lbl_psyrd.Visible = false;
\r
895 slider_psytrellis.Visible = false;
\r
896 slider_psytrellis.Value = 0;
\r
897 lbl_psytrellis.Visible = false;
\r
901 slider_psyrd.Visible = true;
\r
902 lbl_psyrd.Visible = true;
\r
904 if (drop_trellis.SelectedIndex >= 2 && check_Cabac.Checked && slider_psytrellis.Visible == false)
\r
906 slider_psytrellis.Visible = true;
\r
907 lbl_psytrellis.Visible = true;
\r
911 case "trellis": // subme
\r
912 if (drop_trellis.SelectedIndex > 0 && drop_trellis.SelectedIndex < 2)
\r
914 slider_psytrellis.Visible = false;
\r
915 slider_psytrellis.Value = 0;
\r
916 lbl_psytrellis.Visible = false;
\r
920 if ((drop_subpixelMotionEstimation.SelectedIndex == 0 ||
\r
921 drop_subpixelMotionEstimation.SelectedIndex >= 7) && check_Cabac.Checked &&
\r
922 slider_psytrellis.Visible == false)
\r
924 slider_psytrellis.Visible = true;
\r
925 lbl_psytrellis.Visible = true;
\r
933 private void widgetControlChanged(object sender, EventArgs e)
\r
935 Control changedControlName = (Control) sender;
\r
936 string controlName = string.Empty;
\r
938 switch (changedControlName.Name.Trim())
\r
940 case "drop_refFrames":
\r
941 controlName = "ref";
\r
943 case "check_mixedReferences":
\r
944 controlName = "mixed-refs";
\r
946 case "drop_bFrames":
\r
947 controlName = "bframes";
\r
949 case "drop_directPrediction":
\r
950 controlName = "direct";
\r
952 case "check_weightedBFrames":
\r
953 controlName = "weightb";
\r
955 case "check_pyrmidalBFrames":
\r
956 controlName = "b-pyramid";
\r
958 case "drop_MotionEstimationMethod":
\r
959 controlName = "me";
\r
961 case "drop_MotionEstimationRange":
\r
962 controlName = "merange";
\r
964 case "drop_subpixelMotionEstimation":
\r
965 controlName = "subq";
\r
967 case "drop_analysis":
\r
968 controlName = "analyse";
\r
970 case "check_8x8DCT":
\r
971 controlName = "8x8dct";
\r
973 case "drop_deblockAlpha":
\r
974 controlName = "deblock";
\r
976 case "drop_deblockBeta":
\r
977 controlName = "deblock";
\r
979 case "drop_trellis":
\r
980 controlName = "trellis";
\r
982 case "check_noFastPSkip":
\r
983 controlName = "no-fast-pskip";
\r
985 case "check_noDCTDecimate":
\r
986 controlName = "no-dct-decimate";
\r
988 case "check_Cabac":
\r
989 controlName = "cabac";
\r
991 case "slider_psyrd":
\r
992 controlName = "psy-rd";
\r
994 case "slider_psytrellis":
\r
995 controlName = "psy-rd";
\r
997 case "drop_adaptBFrames":
\r
998 controlName = "b-adapt";
\r
1001 OnX264WidgetChange(controlName);
\r
1004 private void rtf_x264Query_TextChanged(object sender, EventArgs e)
\r
1006 if (rtf_x264Query.Text.EndsWith("\n"))
\r
1008 string query = rtf_x264Query.Text.Replace("\n", string.Empty);
\r
1010 rtf_x264Query.Text = query;
\r
1011 X264_StandardizeOptString();
\r
1012 X264_SetCurrentSettingsInPanel();
\r
1014 if (rtf_x264Query.Text == string.Empty)
\r
1019 private void btn_reset_Click(object sender, EventArgs e)
\r
1021 rtf_x264Query.Text = string.Empty;
\r