2 using System.Windows.Forms;
\r
4 namespace Handbrake.Controls
\r
6 public partial class x264Panel : UserControl
\r
10 InitializeComponent();
\r
13 public string x264Query
\r
15 get { return rtf_x264Query.Text; }
\r
16 set { rtf_x264Query.Text = value; }
\r
18 public void setToolTipActive(Boolean active)
\r
20 ToolTip.Active = active;
\r
23 #region Controls Changed
\r
24 private void drop_refFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
26 on_x264_WidgetChange("ref");
\r
28 private void check_mixedReferences_CheckedChanged(object sender, EventArgs e)
\r
30 on_x264_WidgetChange("mixed-refs");
\r
32 private void drop_bFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
34 on_x264_WidgetChange("bframes");
\r
36 private void drop_directPrediction_SelectedIndexChanged(object sender, EventArgs e)
\r
38 on_x264_WidgetChange("direct");
\r
40 private void check_weightedBFrames_CheckedChanged(object sender, EventArgs e)
\r
42 on_x264_WidgetChange("weightb");
\r
44 private void check_pyrmidalBFrames_CheckedChanged(object sender, EventArgs e)
\r
46 on_x264_WidgetChange("b-pyramid");
\r
48 private void drop_MotionEstimationMethod_SelectedIndexChanged(object sender, EventArgs e)
\r
50 on_x264_WidgetChange("me");
\r
52 private void drop_MotionEstimationRange_SelectedIndexChanged(object sender, EventArgs e)
\r
54 on_x264_WidgetChange("merange");
\r
56 private void drop_subpixelMotionEstimation_SelectedIndexChanged(object sender, EventArgs e)
\r
58 on_x264_WidgetChange("subq");
\r
60 private void drop_analysis_SelectedIndexChanged(object sender, EventArgs e)
\r
62 on_x264_WidgetChange("analyse");
\r
64 private void check_8x8DCT_CheckedChanged(object sender, EventArgs e)
\r
66 on_x264_WidgetChange("8x8dct");
\r
68 private void drop_deblockAlpha_SelectedIndexChanged(object sender, EventArgs e)
\r
70 on_x264_WidgetChange("deblock");
\r
72 private void drop_deblockBeta_SelectedIndexChanged(object sender, EventArgs e)
\r
74 on_x264_WidgetChange("deblock");
\r
76 private void drop_trellis_SelectedIndexChanged(object sender, EventArgs e)
\r
78 on_x264_WidgetChange("trellis");
\r
80 private void check_noFastPSkip_CheckedChanged(object sender, EventArgs e)
\r
82 on_x264_WidgetChange("no-fast-pskip");
\r
84 private void check_noDCTDecimate_CheckedChanged(object sender, EventArgs e)
\r
86 on_x264_WidgetChange("no-dct-decimate");
\r
88 private void check_Cabac_CheckedChanged(object sender, EventArgs e)
\r
90 on_x264_WidgetChange("cabac");
\r
92 private void slider_psyrd_Scroll(object sender, EventArgs e)
\r
94 on_x264_WidgetChange("psy-rd");
\r
96 private void slider_psytrellis_Scroll(object sender, EventArgs e)
\r
98 on_x264_WidgetChange("psy-rd");
\r
100 private void drop_adaptBFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
102 on_x264_WidgetChange("b-adapt");
\r
104 private void rtf_x264Query_TextChanged(object sender, EventArgs e)
\r
106 if (rtf_x264Query.Text.EndsWith("\n"))
\r
108 string query = rtf_x264Query.Text.Replace("\n", "");
\r
110 rtf_x264Query.Text = query;
\r
111 X264_StandardizeOptString();
\r
112 X264_SetCurrentSettingsInPanel();
\r
114 if (rtf_x264Query.Text == string.Empty)
\r
118 private void btn_reset_Click(object sender, EventArgs e)
\r
120 rtf_x264Query.Text = "";
\r
126 /// Reset all components to defaults and clears the x264 rtf box
\r
128 public void reset2Defaults()
\r
130 check_8x8DCT.CheckState = CheckState.Unchecked;
\r
131 check_Cabac.CheckState = CheckState.Checked;
\r
132 check_mixedReferences.CheckState = CheckState.Unchecked;
\r
133 check_noDCTDecimate.CheckState = CheckState.Unchecked;
\r
134 check_noFastPSkip.CheckState = CheckState.Unchecked;
\r
135 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
136 check_weightedBFrames.CheckState = CheckState.Unchecked;
\r
137 drop_analysis.SelectedIndex = 0;
\r
138 drop_bFrames.SelectedIndex = 0;
\r
139 drop_deblockAlpha.SelectedIndex = 0;
\r
140 drop_deblockBeta.SelectedIndex = 0;
\r
141 drop_directPrediction.SelectedIndex = 0;
\r
142 drop_MotionEstimationMethod.SelectedIndex = 0;
\r
143 drop_MotionEstimationRange.SelectedIndex = 0;
\r
144 drop_refFrames.SelectedIndex = 0;
\r
145 drop_subpixelMotionEstimation.SelectedIndex = 0;
\r
146 drop_trellis.SelectedIndex = 0;
\r
147 slider_psyrd.Value = 10;
\r
148 slider_psytrellis.Value = 0;
\r
149 drop_adaptBFrames.SelectedIndex = 0;
\r
151 rtf_x264Query.Text = "";
\r
155 /// Iterate over every x264 option, standardize it, write the full string to the x264 rtf box
\r
157 public void X264_StandardizeOptString()
\r
159 /* Set widgets depending on the opt string in field */
\r
160 String thisOpt; // The separated option such as "bframes=3"
\r
161 String optName; // The option name such as "bframes"
\r
162 String optValue;// The option value such as "3"
\r
163 String changedOptString = "";
\r
164 String[] currentOptsArray;
\r
166 /*First, we get an opt string to process */
\r
167 String currentOptString = rtf_x264Query.Text;
\r
169 /*verify there is an opt string to process */
\r
170 if (currentOptString.Contains("="))
\r
172 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
173 currentOptsArray = currentOptString.Split(':');
\r
175 /*iterate through the array and get <opts> and <values*/
\r
177 int currentOptsArrayCount = currentOptsArray.Length;
\r
178 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
\r
180 thisOpt = currentOptsArray[loopcounter];
\r
181 if (currentOptsArray[currentOptsArrayCount - 1] == string.Empty)
\r
184 String[] splitOptRange = thisOpt.Split('=');
\r
187 if (thisOpt.Contains("="))
\r
189 optName = splitOptRange[0];
\r
190 optValue = splitOptRange[1];
\r
192 /* Standardize the names here depending on whats in the string */
\r
193 optName = X264_StandardizeOptNames(optName);
\r
194 thisOpt = optName + "=" + optValue;
\r
196 else // No value given so we use a default of "1"
\r
199 /* Standardize the names here depending on whats in the string */
\r
200 optName = X264_StandardizeOptNames(optName);
\r
201 thisOpt = optName + "=1";
\r
205 /* Construct New String for opts here */
\r
206 if (thisOpt == string.Empty)
\r
207 changedOptString = changedOptString + thisOpt;
\r
210 if (changedOptString == string.Empty)
\r
211 changedOptString = thisOpt;
\r
213 changedOptString = changedOptString + ":" + thisOpt;
\r
218 /* Change the option string to reflect the new standardized option string */
\r
219 if (changedOptString != "")
\r
220 rtf_x264Query.Text = changedOptString;
\r
224 /// Take a single option and standardize it. Returns as a String
\r
225 /// Input: String. - Single X264 Option. Name only
\r
226 /// Output: String - Single X264 Option. Name only. Changed to standard format
\r
228 /// <param name="cleanOptNameString"></param>
\r
229 /// <returns></returns>
\r
230 private string X264_StandardizeOptNames(String cleanOptNameString)
\r
232 String input = cleanOptNameString;
\r
234 if (input.Equals("ref") || input.Equals("frameref"))
\r
235 cleanOptNameString = "ref";
\r
237 /*No Fast PSkip nofast_pskip*/
\r
238 if (input.Equals("no-fast-pskip") || input.Equals("no_fast_pskip") || input.Equals("nofast_pskip"))
\r
239 cleanOptNameString = "no-fast-pskip";
\r
241 /*No Dict Decimate*/
\r
242 if (input.Equals("no-dct-decimate") || input.Equals("no_dct_decimate") || input.Equals("nodct_decimate"))
\r
243 cleanOptNameString = "no-dct-decimate";
\r
246 if (input.Equals("subme"))
\r
247 cleanOptNameString = "subq";
\r
250 if (input.Equals("me-range") || input.Equals("me_range"))
\r
251 cleanOptNameString = "merange";
\r
254 if (input.Equals("weight-b") || input.Equals("weight_b"))
\r
255 cleanOptNameString = "weightb";
\r
258 if (input.Equals("b_pyramid"))
\r
259 cleanOptNameString = "b-pyramid";
\r
261 /*Direct Prediction*/
\r
262 if (input.Equals("direct-pred") || input.Equals("direct_pred"))
\r
263 cleanOptNameString = "direct";
\r
266 if (input.Equals("filter"))
\r
267 cleanOptNameString = "deblock";
\r
270 if (input.Equals("partitions"))
\r
271 cleanOptNameString = "analyse";
\r
273 return cleanOptNameString;
\r
277 /// Resets the GUI widgets to the contents of the option string.
\r
279 public void X264_SetCurrentSettingsInPanel()
\r
281 /* Set widgets depending on the opt string in field */
\r
282 String thisOpt; // The separated option such as "bframes=3"
\r
283 String optName; // The option name such as "bframes"
\r
284 String optValue;// The option value such as "3"
\r
285 String[] currentOptsArray;
\r
287 //Set currentOptString to the contents of the text box.
\r
288 String currentOptString = rtf_x264Query.Text.Replace("\n", "");
\r
290 /*verify there is an opt string to process */
\r
291 if (currentOptString.Contains("="))
\r
293 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
294 currentOptsArray = currentOptString.Split(':');
\r
296 /*iterate through the array and get <opts> and <values*/
\r
298 int currentOptsArrayCount = currentOptsArray.Length;
\r
300 /*iterate through the array and get <opts> and <values*/
\r
301 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
\r
303 thisOpt = currentOptsArray[loopcounter];
\r
304 String[] splitOptRange = thisOpt.Split('=');
\r
306 if (thisOpt.Contains("="))
\r
308 optName = splitOptRange[0];
\r
309 optValue = splitOptRange[1];
\r
311 /*Run through the available widgets for x264 opts and set them, as you add widgets,
\r
312 they need to be added here. This should be moved to its own method probably*/
\r
316 drop_bFrames.SelectedItem = optValue;
\r
319 drop_refFrames.SelectedItem = optValue;
\r
321 case "no-fast-pskip":
\r
322 check_noFastPSkip.CheckState = CheckState.Checked;
\r
324 case "no-dct-decimate":
\r
325 check_noDCTDecimate.CheckState = CheckState.Checked;
\r
328 drop_subpixelMotionEstimation.SelectedItem = optValue;
\r
331 drop_trellis.SelectedItem = optValue;
\r
334 check_mixedReferences.CheckState = CheckState.Checked;
\r
337 if (optValue.Equals("dia"))
\r
338 drop_MotionEstimationMethod.SelectedItem = "Diamond";
\r
339 else if (optValue.Equals("hex"))
\r
340 drop_MotionEstimationMethod.SelectedItem = "Hexagon";
\r
341 else if (optValue.Equals("umh"))
\r
342 drop_MotionEstimationMethod.SelectedItem = "Uneven Multi-Hexagon";
\r
343 else if (optValue.Equals("esa"))
\r
344 drop_MotionEstimationMethod.SelectedItem = "Exhaustive";
\r
345 else if (optValue.Equals("tesa"))
\r
346 drop_MotionEstimationMethod.SelectedItem = "Transformed Exhaustive";
\r
349 drop_MotionEstimationRange.SelectedItem = optValue;
\r
353 int.TryParse(optValue, out badapt);
\r
354 drop_adaptBFrames.SelectedIndex = (badapt + 1);
\r
357 check_weightedBFrames.CheckState = CheckState.Checked;
\r
360 check_pyrmidalBFrames.CheckState = CheckState.Checked;
\r
363 if (optValue == "auto")
\r
364 optValue = "Automatic";
\r
366 if (optValue != "")
\r
368 Char[] letters = optValue.ToCharArray();
\r
369 letters[0] = Char.ToUpper(letters[0]);
\r
370 optValue = new string(letters);
\r
373 drop_directPrediction.SelectedItem = optValue;
\r
376 string[] splitDeblock = optValue.Split(',');
\r
377 string alphaDeblock = splitDeblock[0];
\r
378 string betaDeblock = splitDeblock[1];
\r
380 if (alphaDeblock.Equals("0") && betaDeblock.Replace("\n", "").Equals("0"))
\r
382 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
383 drop_deblockBeta.SelectedItem = "Default (0)";
\r
387 drop_deblockAlpha.SelectedItem = !alphaDeblock.Equals("0") ? alphaDeblock : "0";
\r
389 drop_deblockBeta.SelectedItem = !betaDeblock.Replace("\n", "").Equals("0") ? betaDeblock.Replace("\n", "") : "0";
\r
393 if (optValue.Equals("p8x8,b8x8,i8x8,i4x4"))
\r
394 drop_analysis.SelectedItem = "Default (some)";
\r
395 if (optValue.Equals("none"))
\r
396 drop_analysis.SelectedItem = "None";
\r
397 if (optValue.Equals("all"))
\r
398 drop_analysis.SelectedItem = "All";
\r
401 check_8x8DCT.CheckState = CheckState.Checked;
\r
404 check_Cabac.CheckState = CheckState.Unchecked;
\r
407 string[] x = optValue.Split(',');
\r
409 double psyrd, psytrellis;
\r
412 // default psy-rd = 1 (10 for the slider)
\r
413 psyrd = double.TryParse(x[0], out psyrd) ? psyrd * 10 : 10.0;
\r
414 // default psy-trellis = 0
\r
415 psytrellis = double.TryParse(x[1], out psytrellis) ? psytrellis * 10 : 0.0;
\r
417 int.TryParse(psyrd.ToString(), out val);
\r
418 int.TryParse(psytrellis.ToString(), out val2);
\r
420 slider_psyrd.Value = val;
\r
421 slider_psytrellis.Value = val2;
\r
430 /// This function will update the X264 Query when one of the GUI widgets changes.
\r
432 private void on_x264_WidgetChange(string sender)
\r
435 String optNameToChange = sender;
\r
436 String currentOptString = rtf_x264Query.Text;
\r
438 /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after
\r
439 the first character of the opt string (hence the ":") */
\r
440 String checkOptNameToChange = ":" + optNameToChange + "=";
\r
441 String checkOptNameToChangeBegin = optNameToChange + "=";
\r
443 // IF the current H264 Option String Contains Multiple Items or Just 1 Item
\r
444 if ((currentOptString.Contains(checkOptNameToChange)) || (currentOptString.StartsWith(checkOptNameToChangeBegin)))
\r
445 hasOptions(currentOptString, optNameToChange);
\r
446 else // IF there is no options in the rich text box!
\r
447 hasNoOptions(optNameToChange);
\r
451 /// Called when the current x264 option string contains multiple (or a single) item(s) in it seperated by :
\r
452 /// it updates the current option that the widget corrosponds to, if it is already in thes string.
\r
454 /// <param name="currentOptString"></param>
\r
455 /// <param name="optNameToChange"></param>
\r
456 private void hasOptions(string currentOptString, string optNameToChange)
\r
458 String thisOpt; // The separated option such as "bframes=3"
\r
459 String optName; // The option name such as "bframes"
\r
460 String[] currentOptsArray;
\r
462 /* Create new empty opt string*/
\r
463 String changedOptString = "";
\r
465 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
466 currentOptsArray = currentOptString.Split(':');
\r
468 /*iterate through the array and get <opts> and <values*/
\r
469 for (int loopcounter = 0; loopcounter < currentOptsArray.Length; loopcounter++)
\r
471 thisOpt = currentOptsArray[loopcounter];
\r
473 if (thisOpt.Contains("="))
\r
475 string[] splitOptRange = thisOpt.Split('=');
\r
477 optName = splitOptRange[0]; // e.g bframes
\r
480 * Run through the available widgets for x264 opts and set them, as you add widgets,
\r
481 * they need to be added here. This should be moved to its own method probably
\r
482 * If the optNameToChange is found, appropriately change the value or delete it if
\r
483 * "unspecified" is set.
\r
485 if (optName.Equals(optNameToChange))
\r
487 if (optNameToChange.Equals("deblock"))
\r
489 String da = drop_deblockAlpha.SelectedItem.ToString();
\r
490 String db = drop_deblockBeta.SelectedItem.ToString();
\r
492 if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))
\r
494 drop_deblockBeta.SelectedItem = "Default (0)";
\r
495 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
498 else if ((!da.Contains("Default")) && (db.Contains("Default")))
\r
500 drop_deblockBeta.SelectedItem = "0";
\r
501 thisOpt = "deblock=" + da + ",0";
\r
503 else if ((da.Contains("Default")) && (!db.Contains("Default")))
\r
505 drop_deblockAlpha.SelectedItem = "0";
\r
506 thisOpt = "deblock=0," + db;
\r
508 else if ((!da.Contains("Default")) && (!db.Contains("Default")))
\r
509 thisOpt = "deblock=" + da + "," + db;
\r
511 else if (optNameToChange.Equals("psy-rd"))
\r
513 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
\r
517 double psyrd = slider_psyrd.Value * 0.1;
\r
518 double psytre = slider_psytrellis.Value * 0.1;
\r
520 string rd = psyrd.ToString("f1");
\r
521 string rt = psytre.ToString("f1");
\r
523 thisOpt = "psy-rd=" + rd + "," + rt;
\r
526 else if (optNameToChange.Equals("mixed-refs"))
\r
527 thisOpt = check_mixedReferences.CheckState == CheckState.Checked ? "mixed-refs=1" : "";
\r
528 else if (optNameToChange.Equals("weightb"))
\r
529 thisOpt = check_weightedBFrames.CheckState == CheckState.Checked ? "weightb=1" : "";
\r
530 else if (optNameToChange.Equals("b-pyramid"))
\r
531 thisOpt = check_pyrmidalBFrames.CheckState == CheckState.Checked ? "b-pyramid=1" : "";
\r
532 else if (optNameToChange.Equals("no-fast-pskip"))
\r
533 thisOpt = check_noFastPSkip.CheckState == CheckState.Checked ? "no-fast-pskip=1" : "";
\r
534 else if (optNameToChange.Equals("no-dct-decimate"))
\r
535 thisOpt = check_noDCTDecimate.CheckState == CheckState.Checked ? "no-dct-decimate=1" : "";
\r
536 else if (optNameToChange.Equals("8x8dct"))
\r
537 thisOpt = check_8x8DCT.CheckState == CheckState.Checked ? "8x8dct=1" : "";
\r
538 else if (optNameToChange.Equals("cabac"))
\r
539 thisOpt = check_Cabac.CheckState == CheckState.Checked ? "" : "cabac=0";
\r
540 else if (optNameToChange.Equals("me"))
\r
542 switch (drop_MotionEstimationMethod.SelectedIndex)
\r
545 thisOpt = "me=dia";
\r
549 thisOpt = "me=hex";
\r
553 thisOpt = "me=umh";
\r
557 thisOpt = "me=esa";
\r
561 thisOpt = "me=tesa";
\r
569 else if (optNameToChange.Equals("direct"))
\r
571 switch (drop_directPrediction.SelectedIndex)
\r
574 thisOpt = "direct=none";
\r
578 thisOpt = "direct=spatial";
\r
582 thisOpt = "direct=temporal";
\r
586 thisOpt = "direct=auto";
\r
594 else if (optNameToChange.Equals("analyse"))
\r
596 switch (drop_analysis.SelectedIndex)
\r
599 thisOpt = "analyse=none";
\r
603 thisOpt = "analyse=all";
\r
611 else if (optNameToChange.Equals("merange"))
\r
613 thisOpt = !drop_MotionEstimationRange.SelectedItem.ToString().Contains("Default")
\r
614 ? "merange=" + drop_MotionEstimationRange.SelectedItem
\r
617 else if (optNameToChange.Equals("b-adapt"))
\r
619 thisOpt = !drop_adaptBFrames.SelectedItem.ToString().Contains("Default")
\r
620 ? "b-adapt=" + (drop_adaptBFrames.SelectedIndex - 1)
\r
623 else if (optNameToChange.Equals("ref"))
\r
625 thisOpt = !drop_refFrames.SelectedItem.ToString().Contains("Default")
\r
626 ? "ref=" + drop_refFrames.SelectedItem
\r
629 else if (optNameToChange.Equals("bframes"))
\r
631 String value = drop_bFrames.SelectedItem.ToString();
\r
632 thisOpt = !drop_bFrames.SelectedItem.ToString().Contains("Default")
\r
633 ? "bframes=" + value
\r
636 else if (optNameToChange.Equals("subq"))
\r
638 String value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
639 thisOpt = !drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default")
\r
643 else if (optNameToChange.Equals("trellis"))
\r
645 String value = drop_trellis.SelectedItem.ToString();
\r
646 thisOpt = !drop_trellis.SelectedItem.ToString().Contains("Default")
\r
647 ? "trellis=" + value
\r
653 /* Construct New String for opts here */
\r
654 if (!thisOpt.Equals(""))
\r
655 changedOptString = changedOptString.Equals("") ? thisOpt : changedOptString + ":" + thisOpt;
\r
658 /* Change the option string to reflect the new mod settings */
\r
659 rtf_x264Query.Text = changedOptString;
\r
663 /// Add's an option to the x264 query string.
\r
664 /// Handles 2 cases. 1 Where rtf_x264Query.Text is empty, and one where there is an option with no value,
\r
665 /// e.g no-fast-pskip
\r
667 /// <param name="optNameToChange"></param>
\r
668 private void hasNoOptions(string optNameToChange)
\r
671 if (rtf_x264Query.Text != "")
\r
674 string query = rtf_x264Query.Text;
\r
675 if (optNameToChange.Equals("me"))
\r
677 switch (drop_MotionEstimationMethod.SelectedIndex)
\r
680 query = query + colon + "me=dia";
\r
684 query = query + colon + "me=hex";
\r
688 query = query + colon + "me=umh";
\r
692 query = query + colon + "me=esa";
\r
696 query = query + colon + "me=tesa";
\r
703 else if (optNameToChange.Equals("direct"))
\r
705 switch (drop_directPrediction.SelectedIndex)
\r
708 query = query + colon + "direct=none";
\r
712 query = query + colon + "direct=spatial";
\r
716 query = query + colon + "direct=temporal";
\r
720 query = query + colon + "direct=auto";
\r
727 else if (optNameToChange.Equals("analyse"))
\r
729 switch (drop_analysis.SelectedIndex)
\r
732 query = query + colon + "analyse=none";
\r
736 query = query + colon + "analyse=all";
\r
743 else if (optNameToChange.Equals("merange"))
\r
745 int value = drop_MotionEstimationRange.SelectedIndex + 3;
\r
746 query = query + colon + "merange=" + value;
\r
748 else if (optNameToChange.Equals("b-adapt"))
\r
750 int value = drop_adaptBFrames.SelectedIndex - 1;
\r
751 query = query + colon + "b-adapt=" + value;
\r
754 else if (optNameToChange.Equals("deblock"))
\r
756 String da = drop_deblockAlpha.SelectedItem.ToString();
\r
757 String db = drop_deblockBeta.Text;
\r
759 if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))
\r
761 drop_deblockBeta.SelectedItem = "Default (0)";
\r
762 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
766 if (db.Contains("Default"))
\r
769 if (da.Contains("Default"))
\r
772 query = query + colon + "deblock=" + da + "," + db;
\r
775 else if (optNameToChange.Equals("psy-rd"))
\r
777 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
\r
781 double psyrd = slider_psyrd.Value * 0.1;
\r
782 double psytre = slider_psytrellis.Value * 0.1;
\r
784 string rd = psyrd.ToString("f1");
\r
785 string rt = psytre.ToString("f1");
\r
787 query += colon + "psy-rd=" + rd + "," + rt;
\r
790 else if (optNameToChange.Equals("mixed-refs"))
\r
792 if (check_mixedReferences.CheckState == CheckState.Checked)
\r
793 query = query + colon + "mixed-refs=1";
\r
795 else if (optNameToChange.Equals("weightb"))
\r
797 if (check_weightedBFrames.CheckState == CheckState.Checked)
\r
798 query = query + colon + "weightb=1";
\r
800 else if (optNameToChange.Equals("b-pyramid"))
\r
802 if (check_pyrmidalBFrames.CheckState == CheckState.Checked)
\r
803 query = query + colon + "b-pyramid=1";
\r
805 else if (optNameToChange.Equals("no-fast-pskip"))
\r
807 if (check_noFastPSkip.CheckState == CheckState.Checked)
\r
808 query = query + colon + "no-fast-pskip=1";
\r
810 else if (optNameToChange.Equals("no-dct-decimate"))
\r
812 if (check_noDCTDecimate.CheckState == CheckState.Checked)
\r
813 query = query + colon + "no-dct-decimate=1";
\r
815 else if (optNameToChange.Equals("8x8dct"))
\r
817 if (check_8x8DCT.CheckState == CheckState.Checked)
\r
818 query = query + colon + "8x8dct=1";
\r
820 else if (optNameToChange.Equals("cabac"))
\r
822 if (check_Cabac.CheckState != CheckState.Checked)
\r
823 query = query + colon + "cabac=0";
\r
825 else if (optNameToChange.Equals("ref"))
\r
827 if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))
\r
828 query = query + colon + "ref=" + drop_refFrames.SelectedItem;
\r
830 else if (optNameToChange.Equals("bframes"))
\r
832 String value = drop_bFrames.SelectedItem.ToString();
\r
833 if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))
\r
834 query = query + colon + "bframes=" + value;
\r
836 else if (optNameToChange.Equals("subq"))
\r
838 String value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
839 if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))
\r
840 query = query + colon + "subq=" + value;
\r
842 else if (optNameToChange.Equals("trellis"))
\r
844 if (!drop_trellis.SelectedItem.ToString().Contains("Default"))
\r
845 query = query + colon + "trellis=" + drop_trellis.SelectedItem;
\r
848 rtf_x264Query.Text = query;
\r
852 /// Shows and hides controls based on the values of other controls.
\r
854 /// <param name="sender"></param>
\r
855 private void animate(string sender)
\r
857 /* Lots of situations to cover.
\r
858 - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)
\r
859 - CABAC (when 0 turn off trellis)
\r
860 - analysis (if none, turn off 8x8dct)
\r
861 - refs (under 2, disable mixed-refs)
\r
862 - subme (if under 6, turn off psy-rd and psy-trel)
\r
863 - trellis (if 0, turn off psy-trel)
\r
869 if (drop_bFrames.SelectedIndex < 2)
\r
871 /* If the b-frame widget is at 0 or 1, the user has chosen
\r
872 not to use b-frames at all. So disable the options
\r
873 that can only be used when b-frames are enabled. */
\r
874 check_weightedBFrames.Visible = false;
\r
875 check_pyrmidalBFrames.Visible = false;
\r
876 drop_directPrediction.Visible = false;
\r
877 lbl_direct_prediction.Visible = false;
\r
879 check_weightedBFrames.CheckState = CheckState.Unchecked;
\r
880 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
881 drop_directPrediction.SelectedIndex = 0;
\r
883 drop_adaptBFrames.Visible = false;
\r
884 lbl_adaptBFrames.Visible = false;
\r
885 drop_adaptBFrames.SelectedIndex = 0;
\r
887 else if (drop_bFrames.SelectedIndex == 2)
\r
889 /* Only 1 b-frame? Disable b-pyramid. */
\r
890 check_pyrmidalBFrames.Visible = false;
\r
891 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
893 check_weightedBFrames.Visible = true;
\r
894 drop_directPrediction.Visible = true;
\r
895 lbl_direct_prediction.Visible = true;
\r
897 drop_adaptBFrames.Visible = true;
\r
898 lbl_adaptBFrames.Visible = true;
\r
902 check_weightedBFrames.Visible = true;
\r
903 check_pyrmidalBFrames.Visible = true;
\r
904 drop_directPrediction.Visible = true;
\r
905 lbl_direct_prediction.Visible = true;
\r
907 drop_adaptBFrames.Visible = true;
\r
908 lbl_adaptBFrames.Visible = true;
\r
912 if (check_Cabac.Checked == false)
\r
914 /* Without CABAC entropy coding, trellis doesn't run. */
\r
915 drop_trellis.Visible = false;
\r
916 drop_trellis.SelectedIndex = 0;
\r
917 lbl_trellis.Visible = false;
\r
921 drop_trellis.Visible = true;
\r
922 lbl_trellis.Visible = true;
\r
926 if (drop_analysis.SelectedIndex == 1)
\r
928 /* No analysis? Disable 8x8dct */
\r
929 check_8x8DCT.Visible = false;
\r
930 if (sender != "8x8dct")
\r
931 check_8x8DCT.CheckState = CheckState.Unchecked;
\r
934 check_8x8DCT.Visible = true;
\r
937 if (drop_refFrames.SelectedIndex < 3)
\r
939 check_mixedReferences.Visible = false;
\r
940 if (sender != "mixed-refs")
\r
941 check_mixedReferences.CheckState = CheckState.Unchecked;
\r
944 check_mixedReferences.Visible = true;
\r
946 case "me": // Motion Estimation
\r
947 if (drop_MotionEstimationMethod.SelectedIndex < 3)
\r
949 drop_MotionEstimationRange.Visible = false;
\r
950 lbl_merange.Visible = false;
\r
951 drop_MotionEstimationRange.SelectedIndex = 0;
\r
955 drop_MotionEstimationRange.Visible = true;
\r
956 lbl_merange.Visible = true;
\r
959 case "subq": // subme
\r
960 if (drop_subpixelMotionEstimation.SelectedIndex != 0 && drop_subpixelMotionEstimation.SelectedIndex < 7)
\r
962 slider_psyrd.Visible = false;
\r
963 slider_psyrd.Value = 10;
\r
964 lbl_psyrd.Visible = false;
\r
967 slider_psytrellis.Visible = false;
\r
968 slider_psytrellis.Value = 0;
\r
969 lbl_psytrellis.Visible = false;
\r
973 slider_psyrd.Visible = true;
\r
974 lbl_psyrd.Visible = true;
\r
976 if (drop_trellis.SelectedIndex >= 2 && check_Cabac.Checked && slider_psytrellis.Visible == false)
\r
978 slider_psytrellis.Visible = true;
\r
979 lbl_psytrellis.Visible = true;
\r
983 case "trellis": // subme
\r
984 if (drop_trellis.SelectedIndex < 2)
\r
986 slider_psytrellis.Visible = false;
\r
987 slider_psytrellis.Value = 0;
\r
988 lbl_psytrellis.Visible = false;
\r
992 if ((drop_subpixelMotionEstimation.SelectedIndex == 0 || drop_subpixelMotionEstimation.SelectedIndex >= 7) && check_Cabac.Checked && slider_psytrellis.Visible == false)
\r
994 slider_psytrellis.Visible = true;
\r
995 lbl_psytrellis.Visible = true;
\r