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
8 using System.Windows.Forms;
\r
10 namespace Handbrake.Controls
\r
12 public partial class x264Panel : UserControl
\r
16 InitializeComponent();
\r
18 if (Properties.Settings.Default.tooltipEnable)
\r
19 setToolTipActive(true);
\r
24 public string x264Query
\r
26 get { return rtf_x264Query.Text; }
\r
27 set { rtf_x264Query.Text = value; }
\r
29 private void setToolTipActive(Boolean active)
\r
31 ToolTip.Active = active;
\r
34 #region Controls Changed
\r
35 private void drop_refFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
37 on_x264_WidgetChange("ref");
\r
39 private void check_mixedReferences_CheckedChanged(object sender, EventArgs e)
\r
41 on_x264_WidgetChange("mixed-refs");
\r
43 private void drop_bFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
45 on_x264_WidgetChange("bframes");
\r
47 private void drop_directPrediction_SelectedIndexChanged(object sender, EventArgs e)
\r
49 on_x264_WidgetChange("direct");
\r
51 private void check_weightedBFrames_CheckedChanged(object sender, EventArgs e)
\r
53 on_x264_WidgetChange("weightb");
\r
55 private void check_pyrmidalBFrames_CheckedChanged(object sender, EventArgs e)
\r
57 on_x264_WidgetChange("b-pyramid");
\r
59 private void drop_MotionEstimationMethod_SelectedIndexChanged(object sender, EventArgs e)
\r
61 on_x264_WidgetChange("me");
\r
63 private void drop_MotionEstimationRange_SelectedIndexChanged(object sender, EventArgs e)
\r
65 on_x264_WidgetChange("merange");
\r
67 private void drop_subpixelMotionEstimation_SelectedIndexChanged(object sender, EventArgs e)
\r
69 on_x264_WidgetChange("subq");
\r
71 private void drop_analysis_SelectedIndexChanged(object sender, EventArgs e)
\r
73 on_x264_WidgetChange("analyse");
\r
75 private void check_8x8DCT_CheckedChanged(object sender, EventArgs e)
\r
77 on_x264_WidgetChange("8x8dct");
\r
79 private void drop_deblockAlpha_SelectedIndexChanged(object sender, EventArgs e)
\r
81 on_x264_WidgetChange("deblock");
\r
83 private void drop_deblockBeta_SelectedIndexChanged(object sender, EventArgs e)
\r
85 on_x264_WidgetChange("deblock");
\r
87 private void drop_trellis_SelectedIndexChanged(object sender, EventArgs e)
\r
89 on_x264_WidgetChange("trellis");
\r
91 private void check_noFastPSkip_CheckedChanged(object sender, EventArgs e)
\r
93 on_x264_WidgetChange("no-fast-pskip");
\r
95 private void check_noDCTDecimate_CheckedChanged(object sender, EventArgs e)
\r
97 on_x264_WidgetChange("no-dct-decimate");
\r
99 private void check_Cabac_CheckedChanged(object sender, EventArgs e)
\r
101 on_x264_WidgetChange("cabac");
\r
103 private void slider_psyrd_Scroll(object sender, EventArgs e)
\r
105 on_x264_WidgetChange("psy-rd");
\r
107 private void slider_psytrellis_Scroll(object sender, EventArgs e)
\r
109 on_x264_WidgetChange("psy-rd");
\r
111 private void drop_adaptBFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
113 on_x264_WidgetChange("b-adapt");
\r
115 private void rtf_x264Query_TextChanged(object sender, EventArgs e)
\r
117 if (rtf_x264Query.Text.EndsWith("\n"))
\r
119 string query = rtf_x264Query.Text.Replace("\n", "");
\r
121 rtf_x264Query.Text = query;
\r
122 X264_StandardizeOptString();
\r
123 X264_SetCurrentSettingsInPanel();
\r
125 if (rtf_x264Query.Text == string.Empty)
\r
129 private void btn_reset_Click(object sender, EventArgs e)
\r
131 rtf_x264Query.Text = "";
\r
137 /// Reset all components to defaults and clears the x264 rtf box
\r
139 public void reset2Defaults()
\r
141 check_8x8DCT.CheckState = CheckState.Checked;
\r
142 check_Cabac.CheckState = CheckState.Checked;
\r
143 check_mixedReferences.CheckState = CheckState.Checked;
\r
144 check_noDCTDecimate.CheckState = CheckState.Unchecked;
\r
145 check_noFastPSkip.CheckState = CheckState.Unchecked;
\r
146 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
147 check_weightedBFrames.CheckState = CheckState.Checked;
\r
148 drop_analysis.SelectedIndex = 0;
\r
149 drop_bFrames.SelectedIndex = 0;
\r
150 drop_deblockAlpha.SelectedIndex = 0;
\r
151 drop_deblockBeta.SelectedIndex = 0;
\r
152 drop_directPrediction.SelectedIndex = 0;
\r
153 drop_MotionEstimationMethod.SelectedIndex = 0;
\r
154 drop_MotionEstimationRange.SelectedIndex = 0;
\r
155 drop_refFrames.SelectedIndex = 0;
\r
156 drop_subpixelMotionEstimation.SelectedIndex = 0;
\r
157 drop_trellis.SelectedIndex = 0;
\r
158 slider_psyrd.Value = 10;
\r
159 slider_psytrellis.Value = 0;
\r
160 drop_adaptBFrames.SelectedIndex = 0;
\r
162 rtf_x264Query.Text = "";
\r
166 /// Iterate over every x264 option, standardize it, write the full string to the x264 rtf box
\r
168 public void X264_StandardizeOptString()
\r
170 /* Set widgets depending on the opt string in field */
\r
171 String thisOpt; // The separated option such as "bframes=3"
\r
172 String optName; // The option name such as "bframes"
\r
173 String optValue;// The option value such as "3"
\r
174 String changedOptString = "";
\r
175 String[] currentOptsArray;
\r
177 /*First, we get an opt string to process */
\r
178 String currentOptString = rtf_x264Query.Text;
\r
180 /*verify there is an opt string to process */
\r
181 if (currentOptString.Contains("="))
\r
183 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
184 currentOptsArray = currentOptString.Split(':');
\r
186 /*iterate through the array and get <opts> and <values*/
\r
188 int currentOptsArrayCount = currentOptsArray.Length;
\r
189 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
\r
191 thisOpt = currentOptsArray[loopcounter];
\r
192 if (currentOptsArray[currentOptsArrayCount - 1] == string.Empty)
\r
195 String[] splitOptRange = thisOpt.Split('=');
\r
198 if (thisOpt.Contains("="))
\r
200 optName = splitOptRange[0];
\r
201 optValue = splitOptRange[1];
\r
203 /* Standardize the names here depending on whats in the string */
\r
204 optName = X264_StandardizeOptNames(optName);
\r
205 thisOpt = optName + "=" + optValue;
\r
207 else // No value given so we use a default of "1"
\r
210 /* Standardize the names here depending on whats in the string */
\r
211 optName = X264_StandardizeOptNames(optName);
\r
212 thisOpt = optName + "=1";
\r
216 /* Construct New String for opts here */
\r
217 if (thisOpt == string.Empty)
\r
218 changedOptString = changedOptString + thisOpt;
\r
221 if (changedOptString == string.Empty)
\r
222 changedOptString = thisOpt;
\r
224 changedOptString = changedOptString + ":" + thisOpt;
\r
229 /* Change the option string to reflect the new standardized option string */
\r
230 if (changedOptString != "")
\r
231 rtf_x264Query.Text = changedOptString;
\r
235 /// Take a single option and standardize it. Returns as a String
\r
236 /// Input: String. - Single X264 Option. Name only
\r
237 /// Output: String - Single X264 Option. Name only. Changed to standard format
\r
239 /// <param name="cleanOptNameString"></param>
\r
240 /// <returns></returns>
\r
241 private static string X264_StandardizeOptNames(String cleanOptNameString)
\r
243 String input = cleanOptNameString;
\r
245 if (input.Equals("ref") || input.Equals("frameref"))
\r
246 cleanOptNameString = "ref";
\r
248 /*No Fast PSkip nofast_pskip*/
\r
249 if (input.Equals("no-fast-pskip") || input.Equals("no_fast_pskip") || input.Equals("nofast_pskip"))
\r
250 cleanOptNameString = "no-fast-pskip";
\r
252 /*No Dict Decimate*/
\r
253 if (input.Equals("no-dct-decimate") || input.Equals("no_dct_decimate") || input.Equals("nodct_decimate"))
\r
254 cleanOptNameString = "no-dct-decimate";
\r
257 if (input.Equals("subme"))
\r
258 cleanOptNameString = "subq";
\r
261 if (input.Equals("me-range") || input.Equals("me_range"))
\r
262 cleanOptNameString = "merange";
\r
265 if (input.Equals("weight-b") || input.Equals("weight_b"))
\r
266 cleanOptNameString = "weightb";
\r
269 if (input.Equals("b_pyramid"))
\r
270 cleanOptNameString = "b-pyramid";
\r
272 /*Direct Prediction*/
\r
273 if (input.Equals("direct-pred") || input.Equals("direct_pred"))
\r
274 cleanOptNameString = "direct";
\r
277 if (input.Equals("filter"))
\r
278 cleanOptNameString = "deblock";
\r
281 if (input.Equals("partitions"))
\r
282 cleanOptNameString = "analyse";
\r
284 return cleanOptNameString;
\r
288 /// Resets the GUI widgets to the contents of the option string.
\r
290 public void X264_SetCurrentSettingsInPanel()
\r
292 /* Set widgets depending on the opt string in field */
\r
293 String thisOpt; // The separated option such as "bframes=3"
\r
294 String optName; // The option name such as "bframes"
\r
295 String optValue;// The option value such as "3"
\r
296 String[] currentOptsArray;
\r
298 //Set currentOptString to the contents of the text box.
\r
299 String currentOptString = rtf_x264Query.Text.Replace("\n", "");
\r
301 /*verify there is an opt string to process */
\r
302 if (currentOptString.Contains("="))
\r
304 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
305 currentOptsArray = currentOptString.Split(':');
\r
307 /*iterate through the array and get <opts> and <values*/
\r
309 int currentOptsArrayCount = currentOptsArray.Length;
\r
311 /*iterate through the array and get <opts> and <values*/
\r
312 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
\r
314 thisOpt = currentOptsArray[loopcounter];
\r
315 String[] splitOptRange = thisOpt.Split('=');
\r
317 if (thisOpt.Contains("="))
\r
319 optName = splitOptRange[0];
\r
320 optValue = splitOptRange[1];
\r
322 /*Run through the available widgets for x264 opts and set them, as you add widgets,
\r
323 they need to be added here. This should be moved to its own method probably*/
\r
327 drop_bFrames.SelectedItem = optValue;
\r
330 drop_refFrames.SelectedItem = optValue;
\r
332 case "no-fast-pskip":
\r
333 check_noFastPSkip.CheckState = CheckState.Checked;
\r
335 case "no-dct-decimate":
\r
336 check_noDCTDecimate.CheckState = CheckState.Checked;
\r
339 drop_subpixelMotionEstimation.SelectedItem = optValue;
\r
342 drop_trellis.SelectedItem = optValue;
\r
345 check_mixedReferences.CheckState = CheckState.Checked;
\r
348 if (optValue.Equals("dia"))
\r
349 drop_MotionEstimationMethod.SelectedItem = "Diamond";
\r
350 else if (optValue.Equals("hex"))
\r
351 drop_MotionEstimationMethod.SelectedItem = "Hexagon";
\r
352 else if (optValue.Equals("umh"))
\r
353 drop_MotionEstimationMethod.SelectedItem = "Uneven Multi-Hexagon";
\r
354 else if (optValue.Equals("esa"))
\r
355 drop_MotionEstimationMethod.SelectedItem = "Exhaustive";
\r
356 else if (optValue.Equals("tesa"))
\r
357 drop_MotionEstimationMethod.SelectedItem = "Transformed Exhaustive";
\r
360 drop_MotionEstimationRange.SelectedItem = optValue;
\r
364 int.TryParse(optValue, out badapt);
\r
365 drop_adaptBFrames.SelectedIndex = (badapt + 1);
\r
368 check_weightedBFrames.CheckState = CheckState.Checked;
\r
371 check_pyrmidalBFrames.CheckState = CheckState.Checked;
\r
374 if (optValue == "auto")
\r
375 optValue = "Automatic";
\r
377 if (optValue != "")
\r
379 Char[] letters = optValue.ToCharArray();
\r
380 letters[0] = Char.ToUpper(letters[0]);
\r
381 optValue = new string(letters);
\r
384 drop_directPrediction.SelectedItem = optValue;
\r
387 string[] splitDeblock = optValue.Split(',');
\r
388 string alphaDeblock = splitDeblock[0];
\r
389 string betaDeblock = splitDeblock[1];
\r
391 if (alphaDeblock.Equals("0") && betaDeblock.Replace("\n", "").Equals("0"))
\r
393 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
394 drop_deblockBeta.SelectedItem = "Default (0)";
\r
398 drop_deblockAlpha.SelectedItem = !alphaDeblock.Equals("0") ? alphaDeblock : "0";
\r
400 drop_deblockBeta.SelectedItem = !betaDeblock.Replace("\n", "").Equals("0") ? betaDeblock.Replace("\n", "") : "0";
\r
404 if (optValue.Equals("p8x8,b8x8,i8x8,i4x4"))
\r
405 drop_analysis.SelectedItem = "Default (some)";
\r
406 if (optValue.Equals("none"))
\r
407 drop_analysis.SelectedItem = "None";
\r
408 if (optValue.Equals("all"))
\r
409 drop_analysis.SelectedItem = "All";
\r
412 check_8x8DCT.CheckState = optValue == "1" ? CheckState.Checked : CheckState.Unchecked;
\r
415 check_Cabac.CheckState = CheckState.Unchecked;
\r
418 string[] x = optValue.Split(',');
\r
420 double psyrd, psytrellis;
\r
423 // default psy-rd = 1 (10 for the slider)
\r
424 psyrd = double.TryParse(x[0], out psyrd) ? psyrd * 10 : 10.0;
\r
425 // default psy-trellis = 0
\r
426 psytrellis = double.TryParse(x[1], out psytrellis) ? psytrellis * 10 : 0.0;
\r
428 int.TryParse(psyrd.ToString(), out val);
\r
429 int.TryParse(psytrellis.ToString(), out val2);
\r
431 slider_psyrd.Value = val;
\r
432 slider_psytrellis.Value = val2;
\r
441 /// This function will update the X264 Query when one of the GUI widgets changes.
\r
443 private void on_x264_WidgetChange(string sender)
\r
446 String optNameToChange = sender;
\r
447 String currentOptString = rtf_x264Query.Text;
\r
449 /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after
\r
450 the first character of the opt string (hence the ":") */
\r
451 String checkOptNameToChange = ":" + optNameToChange + "=";
\r
452 String checkOptNameToChangeBegin = optNameToChange + "=";
\r
454 // IF the current H264 Option String Contains Multiple Items or Just 1 Item
\r
455 if ((currentOptString.Contains(checkOptNameToChange)) || (currentOptString.StartsWith(checkOptNameToChangeBegin)))
\r
456 hasOptions(currentOptString, optNameToChange);
\r
457 else // IF there is no options in the rich text box!
\r
458 hasNoOptions(optNameToChange);
\r
462 /// Called when the current x264 option string contains multiple (or a single) item(s) in it seperated by :
\r
463 /// it updates the current option that the widget corrosponds to, if it is already in thes string.
\r
465 /// <param name="currentOptString"></param>
\r
466 /// <param name="optNameToChange"></param>
\r
467 private void hasOptions(string currentOptString, string optNameToChange)
\r
469 String thisOpt; // The separated option such as "bframes=3"
\r
470 String optName; // The option name such as "bframes"
\r
471 String[] currentOptsArray;
\r
473 /* Create new empty opt string*/
\r
474 String changedOptString = "";
\r
476 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
\r
477 currentOptsArray = currentOptString.Split(':');
\r
479 /*iterate through the array and get <opts> and <values*/
\r
480 for (int loopcounter = 0; loopcounter < currentOptsArray.Length; loopcounter++)
\r
482 thisOpt = currentOptsArray[loopcounter];
\r
484 if (thisOpt.Contains("="))
\r
486 string[] splitOptRange = thisOpt.Split('=');
\r
488 optName = splitOptRange[0]; // e.g bframes
\r
491 * Run through the available widgets for x264 opts and set them, as you add widgets,
\r
492 * they need to be added here. This should be moved to its own method probably
\r
493 * If the optNameToChange is found, appropriately change the value or delete it if
\r
494 * "unspecified" is set.
\r
496 if (optName.Equals(optNameToChange))
\r
498 if (optNameToChange.Equals("deblock"))
\r
500 String da = drop_deblockAlpha.SelectedItem.ToString();
\r
501 String db = drop_deblockBeta.SelectedItem.ToString();
\r
503 if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))
\r
505 drop_deblockBeta.SelectedItem = "Default (0)";
\r
506 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
509 else if ((!da.Contains("Default")) && (db.Contains("Default")))
\r
511 drop_deblockBeta.SelectedItem = "0";
\r
512 thisOpt = "deblock=" + da + ",0";
\r
514 else if ((da.Contains("Default")) && (!db.Contains("Default")))
\r
516 drop_deblockAlpha.SelectedItem = "0";
\r
517 thisOpt = "deblock=0," + db;
\r
519 else if ((!da.Contains("Default")) && (!db.Contains("Default")))
\r
520 thisOpt = "deblock=" + da + "," + db;
\r
522 else if (optNameToChange.Equals("psy-rd"))
\r
524 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
\r
528 double psyrd = slider_psyrd.Value * 0.1;
\r
529 double psytre = slider_psytrellis.Value * 0.1;
\r
531 string rd = psyrd.ToString("f1");
\r
532 string rt = psytre.ToString("f1");
\r
534 thisOpt = "psy-rd=" + rd + "," + rt;
\r
537 else if (optNameToChange.Equals("mixed-refs"))
\r
538 thisOpt = check_mixedReferences.CheckState == CheckState.Checked ? "mixed-refs=1" : "mixed-refs=0";
\r
539 else if (optNameToChange.Equals("weightb"))
\r
540 thisOpt = check_weightedBFrames.CheckState == CheckState.Checked ? "weightb=1" : "";
\r
541 else if (optNameToChange.Equals("b-pyramid"))
\r
542 thisOpt = check_pyrmidalBFrames.CheckState == CheckState.Checked ? "b-pyramid=1" : "";
\r
543 else if (optNameToChange.Equals("no-fast-pskip"))
\r
544 thisOpt = check_noFastPSkip.CheckState == CheckState.Checked ? "no-fast-pskip=1" : "";
\r
545 else if (optNameToChange.Equals("no-dct-decimate"))
\r
546 thisOpt = check_noDCTDecimate.CheckState == CheckState.Checked ? "no-dct-decimate=1" : "";
\r
547 else if (optNameToChange.Equals("8x8dct"))
\r
548 thisOpt = check_8x8DCT.CheckState == CheckState.Checked ? "8x8dct=1" : "8x8dct=0";
\r
549 else if (optNameToChange.Equals("cabac"))
\r
550 thisOpt = check_Cabac.CheckState == CheckState.Checked ? "" : "cabac=0";
\r
551 else if (optNameToChange.Equals("me"))
\r
553 switch (drop_MotionEstimationMethod.SelectedIndex)
\r
556 thisOpt = "me=dia";
\r
560 thisOpt = "me=hex";
\r
564 thisOpt = "me=umh";
\r
568 thisOpt = "me=esa";
\r
572 thisOpt = "me=tesa";
\r
580 else if (optNameToChange.Equals("direct"))
\r
582 switch (drop_directPrediction.SelectedIndex)
\r
585 thisOpt = "direct=none";
\r
589 thisOpt = "direct=spatial";
\r
593 thisOpt = "direct=temporal";
\r
597 thisOpt = "direct=auto";
\r
605 else if (optNameToChange.Equals("analyse"))
\r
607 switch (drop_analysis.SelectedIndex)
\r
610 thisOpt = "analyse=none";
\r
614 thisOpt = "analyse=all";
\r
622 else if (optNameToChange.Equals("merange"))
\r
624 thisOpt = !drop_MotionEstimationRange.SelectedItem.ToString().Contains("Default")
\r
625 ? "merange=" + drop_MotionEstimationRange.SelectedItem
\r
628 else if (optNameToChange.Equals("b-adapt"))
\r
630 thisOpt = !drop_adaptBFrames.SelectedItem.ToString().Contains("Default")
\r
631 ? "b-adapt=" + (drop_adaptBFrames.SelectedIndex - 1)
\r
634 else if (optNameToChange.Equals("ref"))
\r
636 thisOpt = !drop_refFrames.SelectedItem.ToString().Contains("Default")
\r
637 ? "ref=" + drop_refFrames.SelectedItem
\r
640 else if (optNameToChange.Equals("bframes"))
\r
642 String value = drop_bFrames.SelectedItem.ToString();
\r
643 thisOpt = !drop_bFrames.SelectedItem.ToString().Contains("Default")
\r
644 ? "bframes=" + value
\r
647 else if (optNameToChange.Equals("subq"))
\r
649 String value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
650 thisOpt = !drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default")
\r
654 else if (optNameToChange.Equals("trellis"))
\r
656 String value = drop_trellis.SelectedItem.ToString();
\r
657 thisOpt = !drop_trellis.SelectedItem.ToString().Contains("Default")
\r
658 ? "trellis=" + value
\r
664 /* Construct New String for opts here */
\r
665 if (!thisOpt.Equals(""))
\r
666 changedOptString = changedOptString.Equals("") ? thisOpt : changedOptString + ":" + thisOpt;
\r
669 /* Change the option string to reflect the new mod settings */
\r
670 rtf_x264Query.Text = changedOptString;
\r
674 /// Add's an option to the x264 query string.
\r
675 /// Handles 2 cases. 1 Where rtf_x264Query.Text is empty, and one where there is an option with no value,
\r
676 /// e.g no-fast-pskip
\r
678 /// <param name="optNameToChange"></param>
\r
679 private void hasNoOptions(string optNameToChange)
\r
682 if (rtf_x264Query.Text != "")
\r
685 string query = rtf_x264Query.Text;
\r
686 if (optNameToChange.Equals("me"))
\r
688 switch (drop_MotionEstimationMethod.SelectedIndex)
\r
691 query = query + colon + "me=dia";
\r
695 query = query + colon + "me=hex";
\r
699 query = query + colon + "me=umh";
\r
703 query = query + colon + "me=esa";
\r
707 query = query + colon + "me=tesa";
\r
714 else if (optNameToChange.Equals("direct"))
\r
716 switch (drop_directPrediction.SelectedIndex)
\r
719 query = query + colon + "direct=none";
\r
723 query = query + colon + "direct=spatial";
\r
727 query = query + colon + "direct=temporal";
\r
731 query = query + colon + "direct=auto";
\r
738 else if (optNameToChange.Equals("analyse"))
\r
740 switch (drop_analysis.SelectedIndex)
\r
743 query = query + colon + "analyse=none";
\r
747 query = query + colon + "analyse=all";
\r
754 else if (optNameToChange.Equals("merange"))
\r
756 int value = drop_MotionEstimationRange.SelectedIndex + 3;
\r
757 query = query + colon + "merange=" + value;
\r
759 else if (optNameToChange.Equals("b-adapt"))
\r
761 int value = drop_adaptBFrames.SelectedIndex - 1;
\r
762 query = query + colon + "b-adapt=" + value;
\r
765 else if (optNameToChange.Equals("deblock"))
\r
767 String da = drop_deblockAlpha.SelectedItem.ToString();
\r
768 String db = drop_deblockBeta.Text;
\r
770 if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))
\r
772 drop_deblockBeta.SelectedItem = "Default (0)";
\r
773 drop_deblockAlpha.SelectedItem = "Default (0)";
\r
777 if (db.Contains("Default"))
\r
780 if (da.Contains("Default"))
\r
783 query = query + colon + "deblock=" + da + "," + db;
\r
786 else if (optNameToChange.Equals("psy-rd"))
\r
788 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
\r
792 double psyrd = slider_psyrd.Value * 0.1;
\r
793 double psytre = slider_psytrellis.Value * 0.1;
\r
795 string rd = psyrd.ToString("f1");
\r
796 string rt = psytre.ToString("f1");
\r
798 query += colon + "psy-rd=" + rd + "," + rt;
\r
801 else if (optNameToChange.Equals("mixed-refs"))
\r
803 if (check_mixedReferences.CheckState == CheckState.Checked)
\r
804 query = query + colon + "mixed-refs=1";
\r
806 query = query + colon + "mixed-refs=0";
\r
808 else if (optNameToChange.Equals("weightb"))
\r
810 if (check_weightedBFrames.CheckState == CheckState.Checked)
\r
811 query = query + colon + "weightb=1";
\r
813 else if (optNameToChange.Equals("b-pyramid"))
\r
815 if (check_pyrmidalBFrames.CheckState == CheckState.Checked)
\r
816 query = query + colon + "b-pyramid=1";
\r
818 else if (optNameToChange.Equals("no-fast-pskip"))
\r
820 if (check_noFastPSkip.CheckState == CheckState.Checked)
\r
821 query = query + colon + "no-fast-pskip=1";
\r
823 else if (optNameToChange.Equals("no-dct-decimate"))
\r
825 if (check_noDCTDecimate.CheckState == CheckState.Checked)
\r
826 query = query + colon + "no-dct-decimate=1";
\r
828 else if (optNameToChange.Equals("8x8dct"))
\r
830 if (check_8x8DCT.CheckState == CheckState.Checked)
\r
831 query = query + colon + "8x8dct=1";
\r
833 else if (optNameToChange.Equals("cabac"))
\r
835 if (check_Cabac.CheckState != CheckState.Checked)
\r
836 query = query + colon + "cabac=0";
\r
838 else if (optNameToChange.Equals("ref"))
\r
840 if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))
\r
841 query = query + colon + "ref=" + drop_refFrames.SelectedItem;
\r
843 else if (optNameToChange.Equals("bframes"))
\r
845 String value = drop_bFrames.SelectedItem.ToString();
\r
846 if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))
\r
847 query = query + colon + "bframes=" + value;
\r
849 else if (optNameToChange.Equals("subq"))
\r
851 String value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
852 if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))
\r
853 query = query + colon + "subq=" + value;
\r
855 else if (optNameToChange.Equals("trellis"))
\r
857 if (!drop_trellis.SelectedItem.ToString().Contains("Default"))
\r
858 query = query + colon + "trellis=" + drop_trellis.SelectedItem;
\r
861 rtf_x264Query.Text = query;
\r
865 /// Shows and hides controls based on the values of other controls.
\r
867 /// <param name="sender"></param>
\r
868 private void animate(string sender)
\r
870 /* Lots of situations to cover.
\r
871 - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)
\r
872 - CABAC (when 0 turn off trellis)
\r
873 - analysis (if none, turn off 8x8dct)
\r
874 - refs (under 2, disable mixed-refs)
\r
875 - subme (if under 6, turn off psy-rd and psy-trel)
\r
876 - trellis (if 0, turn off psy-trel)
\r
882 if (drop_bFrames.SelectedIndex >0 && drop_bFrames.SelectedIndex < 2 )
\r
884 /* If the b-frame widget is at 0 or 1, the user has chosen
\r
885 not to use b-frames at all. So disable the options
\r
886 that can only be used when b-frames are enabled. */
\r
887 check_weightedBFrames.Visible = false;
\r
888 check_pyrmidalBFrames.Visible = false;
\r
889 drop_directPrediction.Visible = false;
\r
890 lbl_direct_prediction.Visible = false;
\r
892 check_weightedBFrames.CheckState = CheckState.Unchecked;
\r
893 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
894 drop_directPrediction.SelectedIndex = 0;
\r
896 drop_adaptBFrames.Visible = false;
\r
897 lbl_adaptBFrames.Visible = false;
\r
898 drop_adaptBFrames.SelectedIndex = 0;
\r
900 else if (drop_bFrames.SelectedIndex == 2)
\r
902 /* Only 1 b-frame? Disable b-pyramid. */
\r
903 check_pyrmidalBFrames.Visible = false;
\r
904 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
906 check_weightedBFrames.Visible = true;
\r
907 drop_directPrediction.Visible = true;
\r
908 lbl_direct_prediction.Visible = true;
\r
910 drop_adaptBFrames.Visible = true;
\r
911 lbl_adaptBFrames.Visible = true;
\r
915 check_weightedBFrames.Visible = true;
\r
916 check_pyrmidalBFrames.Visible = true;
\r
917 drop_directPrediction.Visible = true;
\r
918 lbl_direct_prediction.Visible = true;
\r
920 drop_adaptBFrames.Visible = true;
\r
921 lbl_adaptBFrames.Visible = true;
\r
925 if (check_Cabac.Checked == false)
\r
927 /* Without CABAC entropy coding, trellis doesn't run. */
\r
928 drop_trellis.Visible = false;
\r
929 drop_trellis.SelectedIndex = 0;
\r
930 lbl_trellis.Visible = false;
\r
934 drop_trellis.Visible = true;
\r
935 lbl_trellis.Visible = true;
\r
939 if (drop_analysis.SelectedIndex == 1)
\r
941 /* No analysis? Disable 8x8dct */
\r
942 check_8x8DCT.Visible = false;
\r
943 if (sender != "8x8dct")
\r
944 check_8x8DCT.CheckState = CheckState.Unchecked;
\r
947 check_8x8DCT.Visible = true;
\r
950 if (drop_refFrames.SelectedIndex > 0 && drop_refFrames.SelectedIndex < 3)
\r
952 check_mixedReferences.Visible = false;
\r
953 if (sender != "mixed-refs")
\r
954 check_mixedReferences.CheckState = CheckState.Unchecked;
\r
957 check_mixedReferences.Visible = true;
\r
959 case "me": // Motion Estimation
\r
960 if (drop_MotionEstimationMethod.SelectedIndex < 3)
\r
962 drop_MotionEstimationRange.Visible = false;
\r
963 lbl_merange.Visible = false;
\r
964 drop_MotionEstimationRange.SelectedIndex = 0;
\r
968 drop_MotionEstimationRange.Visible = true;
\r
969 lbl_merange.Visible = true;
\r
972 case "subq": // subme
\r
973 if (drop_subpixelMotionEstimation.SelectedIndex != 0 && drop_subpixelMotionEstimation.SelectedIndex < 7)
\r
975 slider_psyrd.Visible = false;
\r
976 slider_psyrd.Value = 10;
\r
977 lbl_psyrd.Visible = false;
\r
980 slider_psytrellis.Visible = false;
\r
981 slider_psytrellis.Value = 0;
\r
982 lbl_psytrellis.Visible = false;
\r
986 slider_psyrd.Visible = true;
\r
987 lbl_psyrd.Visible = true;
\r
989 if (drop_trellis.SelectedIndex >= 2 && check_Cabac.Checked && slider_psytrellis.Visible == false)
\r
991 slider_psytrellis.Visible = true;
\r
992 lbl_psytrellis.Visible = true;
\r
996 case "trellis": // subme
\r
997 if (drop_trellis.SelectedIndex > 0 && drop_trellis.SelectedIndex < 2 )
\r
999 slider_psytrellis.Visible = false;
\r
1000 slider_psytrellis.Value = 0;
\r
1001 lbl_psytrellis.Visible = false;
\r
1005 if ((drop_subpixelMotionEstimation.SelectedIndex == 0 || drop_subpixelMotionEstimation.SelectedIndex >= 7) && check_Cabac.Checked && slider_psytrellis.Visible == false)
\r
1007 slider_psytrellis.Visible = true;
\r
1008 lbl_psytrellis.Visible = true;
\r