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 public 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 = CheckState.Checked;
\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" : "";
\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" : "";
\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 else if (optNameToChange.Equals("weightb"))
\r
808 if (check_weightedBFrames.CheckState == CheckState.Checked)
\r
809 query = query + colon + "weightb=1";
\r
811 else if (optNameToChange.Equals("b-pyramid"))
\r
813 if (check_pyrmidalBFrames.CheckState == CheckState.Checked)
\r
814 query = query + colon + "b-pyramid=1";
\r
816 else if (optNameToChange.Equals("no-fast-pskip"))
\r
818 if (check_noFastPSkip.CheckState == CheckState.Checked)
\r
819 query = query + colon + "no-fast-pskip=1";
\r
821 else if (optNameToChange.Equals("no-dct-decimate"))
\r
823 if (check_noDCTDecimate.CheckState == CheckState.Checked)
\r
824 query = query + colon + "no-dct-decimate=1";
\r
826 else if (optNameToChange.Equals("8x8dct"))
\r
828 if (check_8x8DCT.CheckState == CheckState.Checked)
\r
829 query = query + colon + "8x8dct=1";
\r
831 else if (optNameToChange.Equals("cabac"))
\r
833 if (check_Cabac.CheckState != CheckState.Checked)
\r
834 query = query + colon + "cabac=0";
\r
836 else if (optNameToChange.Equals("ref"))
\r
838 if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))
\r
839 query = query + colon + "ref=" + drop_refFrames.SelectedItem;
\r
841 else if (optNameToChange.Equals("bframes"))
\r
843 String value = drop_bFrames.SelectedItem.ToString();
\r
844 if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))
\r
845 query = query + colon + "bframes=" + value;
\r
847 else if (optNameToChange.Equals("subq"))
\r
849 String value = drop_subpixelMotionEstimation.SelectedItem.ToString();
\r
850 if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))
\r
851 query = query + colon + "subq=" + value;
\r
853 else if (optNameToChange.Equals("trellis"))
\r
855 if (!drop_trellis.SelectedItem.ToString().Contains("Default"))
\r
856 query = query + colon + "trellis=" + drop_trellis.SelectedItem;
\r
859 rtf_x264Query.Text = query;
\r
863 /// Shows and hides controls based on the values of other controls.
\r
865 /// <param name="sender"></param>
\r
866 private void animate(string sender)
\r
868 /* Lots of situations to cover.
\r
869 - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)
\r
870 - CABAC (when 0 turn off trellis)
\r
871 - analysis (if none, turn off 8x8dct)
\r
872 - refs (under 2, disable mixed-refs)
\r
873 - subme (if under 6, turn off psy-rd and psy-trel)
\r
874 - trellis (if 0, turn off psy-trel)
\r
880 if (drop_bFrames.SelectedIndex >0 && drop_bFrames.SelectedIndex < 2 )
\r
882 /* If the b-frame widget is at 0 or 1, the user has chosen
\r
883 not to use b-frames at all. So disable the options
\r
884 that can only be used when b-frames are enabled. */
\r
885 check_weightedBFrames.Visible = false;
\r
886 check_pyrmidalBFrames.Visible = false;
\r
887 drop_directPrediction.Visible = false;
\r
888 lbl_direct_prediction.Visible = false;
\r
890 check_weightedBFrames.CheckState = CheckState.Unchecked;
\r
891 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
892 drop_directPrediction.SelectedIndex = 0;
\r
894 drop_adaptBFrames.Visible = false;
\r
895 lbl_adaptBFrames.Visible = false;
\r
896 drop_adaptBFrames.SelectedIndex = 0;
\r
898 else if (drop_bFrames.SelectedIndex == 2)
\r
900 /* Only 1 b-frame? Disable b-pyramid. */
\r
901 check_pyrmidalBFrames.Visible = false;
\r
902 check_pyrmidalBFrames.CheckState = CheckState.Unchecked;
\r
904 check_weightedBFrames.Visible = true;
\r
905 drop_directPrediction.Visible = true;
\r
906 lbl_direct_prediction.Visible = true;
\r
908 drop_adaptBFrames.Visible = true;
\r
909 lbl_adaptBFrames.Visible = true;
\r
913 check_weightedBFrames.Visible = true;
\r
914 check_pyrmidalBFrames.Visible = true;
\r
915 drop_directPrediction.Visible = true;
\r
916 lbl_direct_prediction.Visible = true;
\r
918 drop_adaptBFrames.Visible = true;
\r
919 lbl_adaptBFrames.Visible = true;
\r
923 if (check_Cabac.Checked == false)
\r
925 /* Without CABAC entropy coding, trellis doesn't run. */
\r
926 drop_trellis.Visible = false;
\r
927 drop_trellis.SelectedIndex = 0;
\r
928 lbl_trellis.Visible = false;
\r
932 drop_trellis.Visible = true;
\r
933 lbl_trellis.Visible = true;
\r
937 if (drop_analysis.SelectedIndex == 1)
\r
939 /* No analysis? Disable 8x8dct */
\r
940 check_8x8DCT.Visible = false;
\r
941 if (sender != "8x8dct")
\r
942 check_8x8DCT.CheckState = CheckState.Unchecked;
\r
945 check_8x8DCT.Visible = true;
\r
948 if (drop_refFrames.SelectedIndex > 0 && drop_refFrames.SelectedIndex < 3)
\r
950 check_mixedReferences.Visible = false;
\r
951 if (sender != "mixed-refs")
\r
952 check_mixedReferences.CheckState = CheckState.Unchecked;
\r
955 check_mixedReferences.Visible = true;
\r
957 case "me": // Motion Estimation
\r
958 if (drop_MotionEstimationMethod.SelectedIndex < 3)
\r
960 drop_MotionEstimationRange.Visible = false;
\r
961 lbl_merange.Visible = false;
\r
962 drop_MotionEstimationRange.SelectedIndex = 0;
\r
966 drop_MotionEstimationRange.Visible = true;
\r
967 lbl_merange.Visible = true;
\r
970 case "subq": // subme
\r
971 if (drop_subpixelMotionEstimation.SelectedIndex != 0 && drop_subpixelMotionEstimation.SelectedIndex < 7)
\r
973 slider_psyrd.Visible = false;
\r
974 slider_psyrd.Value = 10;
\r
975 lbl_psyrd.Visible = false;
\r
978 slider_psytrellis.Visible = false;
\r
979 slider_psytrellis.Value = 0;
\r
980 lbl_psytrellis.Visible = false;
\r
984 slider_psyrd.Visible = true;
\r
985 lbl_psyrd.Visible = true;
\r
987 if (drop_trellis.SelectedIndex >= 2 && check_Cabac.Checked && slider_psytrellis.Visible == false)
\r
989 slider_psytrellis.Visible = true;
\r
990 lbl_psytrellis.Visible = true;
\r
994 case "trellis": // subme
\r
995 if (drop_trellis.SelectedIndex > 0 && drop_trellis.SelectedIndex < 2 )
\r
997 slider_psytrellis.Visible = false;
\r
998 slider_psytrellis.Value = 0;
\r
999 lbl_psytrellis.Visible = false;
\r
1003 if ((drop_subpixelMotionEstimation.SelectedIndex == 0 || drop_subpixelMotionEstimation.SelectedIndex >= 7) && check_Cabac.Checked && slider_psytrellis.Visible == false)
\r
1005 slider_psytrellis.Visible = true;
\r
1006 lbl_psytrellis.Visible = true;
\r