--- /dev/null
+/* x264Panel.cs $\r
+ \r
+ This file is part of the HandBrake source code.\r
+ Homepage: <http://handbrake.fr>.\r
+ It may be used under the terms of the GNU General Public License. */\r
+\r
+using System;\r
+using System.Windows.Forms;\r
+\r
+namespace Handbrake.Controls\r
+{\r
+ public partial class x264Panel : UserControl\r
+ {\r
+ public x264Panel()\r
+ {\r
+ InitializeComponent();\r
+\r
+ if (Properties.Settings.Default.tooltipEnable)\r
+ ToolTip.Active = true;\r
+\r
+ reset2Defaults();\r
+ }\r
+\r
+ public string x264Query\r
+ {\r
+ get { return rtf_x264Query.Text; }\r
+ set { rtf_x264Query.Text = value; }\r
+ }\r
+\r
+ private void widgetControlChanged(object sender, EventArgs e)\r
+ {\r
+ Control changedControlName = (Control) sender;\r
+ string controlName = "";\r
+\r
+ switch (changedControlName.Name.Trim())\r
+ {\r
+ case "drop_refFrames":\r
+ controlName = "ref";\r
+ break;\r
+ case "check_mixedReferences":\r
+ controlName = "mixed-refs";\r
+ break;\r
+ case "drop_bFrames":\r
+ controlName = "bframes";\r
+ break;\r
+ case "drop_directPrediction":\r
+ controlName = "direct";\r
+ break;\r
+ case "check_weightedBFrames":\r
+ controlName = "weightb";\r
+ break;\r
+ case "check_pyrmidalBFrames":\r
+ controlName = "b-pyramid";\r
+ break;\r
+ case "drop_MotionEstimationMethod":\r
+ controlName = "me";\r
+ break;\r
+ case "drop_MotionEstimationRange":\r
+ controlName = "merange";\r
+ break;\r
+ case "drop_subpixelMotionEstimation":\r
+ controlName = "subq";\r
+ break;\r
+ case "drop_analysis":\r
+ controlName = "analyse";\r
+ break;\r
+ case "check_8x8DCT":\r
+ controlName = "8x8dct";\r
+ break;\r
+ case "drop_deblockAlpha":\r
+ controlName = "deblock";\r
+ break;\r
+ case "drop_deblockBeta":\r
+ controlName = "deblock";\r
+ break;\r
+ case "drop_trellis":\r
+ controlName = "trellis";\r
+ break;\r
+ case "check_noFastPSkip":\r
+ controlName = "no-fast-pskip";\r
+ break;\r
+ case "check_noDCTDecimate":\r
+ controlName = "no-dct-decimate";\r
+ break;\r
+ case "check_Cabac":\r
+ controlName = "cabac";\r
+ break;\r
+ case "slider_psyrd":\r
+ controlName = "psy-rd";\r
+ break;\r
+ case "slider_psytrellis":\r
+ controlName = "psy-rd";\r
+ break;\r
+ case "drop_adaptBFrames":\r
+ controlName = "b-adapt";\r
+ break;\r
+ }\r
+ on_x264_WidgetChange(controlName);\r
+ }\r
+ private void rtf_x264Query_TextChanged(object sender, EventArgs e)\r
+ {\r
+ if (rtf_x264Query.Text.EndsWith("\n"))\r
+ {\r
+ string query = rtf_x264Query.Text.Replace("\n", "");\r
+ reset2Defaults();\r
+ rtf_x264Query.Text = query;\r
+ X264_StandardizeOptString();\r
+ X264_SetCurrentSettingsInPanel();\r
+\r
+ if (rtf_x264Query.Text == string.Empty)\r
+ reset2Defaults();\r
+ }\r
+ }\r
+ private void btn_reset_Click(object sender, EventArgs e)\r
+ {\r
+ rtf_x264Query.Text = "";\r
+ reset2Defaults();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// Reset all components to defaults and clears the x264 rtf box\r
+ /// </summary>\r
+ public void reset2Defaults()\r
+ {\r
+ check_8x8DCT.CheckState = CheckState.Checked;\r
+ check_Cabac.CheckState = CheckState.Checked;\r
+ check_mixedReferences.CheckState = CheckState.Checked;\r
+ check_noDCTDecimate.CheckState = CheckState.Unchecked;\r
+ check_noFastPSkip.CheckState = CheckState.Unchecked;\r
+ check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
+ check_weightedBFrames.CheckState = CheckState.Checked;\r
+ drop_analysis.SelectedIndex = 0;\r
+ drop_bFrames.SelectedIndex = 0;\r
+ drop_deblockAlpha.SelectedIndex = 0;\r
+ drop_deblockBeta.SelectedIndex = 0;\r
+ drop_directPrediction.SelectedIndex = 0;\r
+ drop_MotionEstimationMethod.SelectedIndex = 0;\r
+ drop_MotionEstimationRange.SelectedIndex = 0;\r
+ drop_refFrames.SelectedIndex = 0;\r
+ drop_subpixelMotionEstimation.SelectedIndex = 0;\r
+ drop_trellis.SelectedIndex = 0;\r
+ slider_psyrd.Value = 10;\r
+ slider_psytrellis.Value = 0;\r
+ drop_adaptBFrames.SelectedIndex = 0;\r
+\r
+ rtf_x264Query.Text = "";\r
+ }\r
+\r
+ /// <summary>\r
+ /// Iterate over every x264 option, standardize it, write the full string to the x264 rtf box\r
+ /// </summary>\r
+ public void X264_StandardizeOptString()\r
+ {\r
+ /* Set widgets depending on the opt string in field */\r
+ String thisOpt; // The separated option such as "bframes=3"\r
+ String optName; // The option name such as "bframes"\r
+ String optValue;// The option value such as "3"\r
+ String changedOptString = "";\r
+ String[] currentOptsArray;\r
+\r
+ /*First, we get an opt string to process */\r
+ String currentOptString = rtf_x264Query.Text;\r
+\r
+ /*verify there is an opt string to process */\r
+ if (currentOptString.Contains("="))\r
+ {\r
+ /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/\r
+ currentOptsArray = currentOptString.Split(':');\r
+\r
+ /*iterate through the array and get <opts> and <values*/\r
+ int loopcounter;\r
+ int currentOptsArrayCount = currentOptsArray.Length;\r
+ for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)\r
+ {\r
+ thisOpt = currentOptsArray[loopcounter];\r
+ if (currentOptsArray[currentOptsArrayCount - 1] == string.Empty)\r
+ break;\r
+\r
+ String[] splitOptRange = thisOpt.Split('=');\r
+ if (thisOpt != "")\r
+ {\r
+ if (thisOpt.Contains("="))\r
+ {\r
+ optName = splitOptRange[0];\r
+ optValue = splitOptRange[1];\r
+\r
+ /* Standardize the names here depending on whats in the string */\r
+ optName = X264_StandardizeOptNames(optName);\r
+ thisOpt = optName + "=" + optValue;\r
+ }\r
+ else // No value given so we use a default of "1"\r
+ {\r
+ optName = thisOpt;\r
+ /* Standardize the names here depending on whats in the string */\r
+ optName = X264_StandardizeOptNames(optName);\r
+ thisOpt = optName + "=1";\r
+ }\r
+ }\r
+\r
+ /* Construct New String for opts here */\r
+ if (thisOpt == string.Empty)\r
+ changedOptString = changedOptString + thisOpt;\r
+ else\r
+ {\r
+ if (changedOptString == string.Empty)\r
+ changedOptString = thisOpt;\r
+ else\r
+ changedOptString = changedOptString + ":" + thisOpt;\r
+ }\r
+ }\r
+ }\r
+\r
+ /* Change the option string to reflect the new standardized option string */\r
+ if (changedOptString != "")\r
+ rtf_x264Query.Text = changedOptString;\r
+ }\r
+\r
+ /// <summary>\r
+ /// Take a single option and standardize it. Returns as a String\r
+ /// Input: String. - Single X264 Option. Name only\r
+ /// Output: String - Single X264 Option. Name only. Changed to standard format\r
+ /// </summary>\r
+ /// <param name="cleanOptNameString"></param>\r
+ /// <returns></returns>\r
+ private static string X264_StandardizeOptNames(String cleanOptNameString)\r
+ {\r
+ String input = cleanOptNameString;\r
+\r
+ if (input.Equals("ref") || input.Equals("frameref"))\r
+ cleanOptNameString = "ref";\r
+\r
+ /*No Fast PSkip nofast_pskip*/\r
+ if (input.Equals("no-fast-pskip") || input.Equals("no_fast_pskip") || input.Equals("nofast_pskip"))\r
+ cleanOptNameString = "no-fast-pskip";\r
+\r
+ /*No Dict Decimate*/\r
+ if (input.Equals("no-dct-decimate") || input.Equals("no_dct_decimate") || input.Equals("nodct_decimate"))\r
+ cleanOptNameString = "no-dct-decimate";\r
+\r
+ /*Subme*/\r
+ if (input.Equals("subme"))\r
+ cleanOptNameString = "subq";\r
+\r
+ /*ME Range*/\r
+ if (input.Equals("me-range") || input.Equals("me_range"))\r
+ cleanOptNameString = "merange";\r
+\r
+ /*WeightB*/\r
+ if (input.Equals("weight-b") || input.Equals("weight_b"))\r
+ cleanOptNameString = "weightb";\r
+\r
+ /*B Pyramid*/\r
+ if (input.Equals("b_pyramid"))\r
+ cleanOptNameString = "b-pyramid";\r
+\r
+ /*Direct Prediction*/\r
+ if (input.Equals("direct-pred") || input.Equals("direct_pred"))\r
+ cleanOptNameString = "direct";\r
+\r
+ /*Deblocking*/\r
+ if (input.Equals("filter"))\r
+ cleanOptNameString = "deblock";\r
+\r
+ /*Analysis*/\r
+ if (input.Equals("partitions"))\r
+ cleanOptNameString = "analyse";\r
+\r
+ return cleanOptNameString;\r
+ }\r
+\r
+ /// <summary>\r
+ /// Resets the GUI widgets to the contents of the option string.\r
+ /// </summary>\r
+ public void X264_SetCurrentSettingsInPanel()\r
+ {\r
+ /* Set widgets depending on the opt string in field */\r
+ String thisOpt; // The separated option such as "bframes=3"\r
+ String optName; // The option name such as "bframes"\r
+ String optValue;// The option value such as "3"\r
+ String[] currentOptsArray;\r
+\r
+ //Set currentOptString to the contents of the text box.\r
+ String currentOptString = rtf_x264Query.Text.Replace("\n", "");\r
+\r
+ /*verify there is an opt string to process */\r
+ if (currentOptString.Contains("="))\r
+ {\r
+ /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/\r
+ currentOptsArray = currentOptString.Split(':');\r
+\r
+ /*iterate through the array and get <opts> and <values*/\r
+ int loopcounter;\r
+ int currentOptsArrayCount = currentOptsArray.Length;\r
+\r
+ /*iterate through the array and get <opts> and <values*/\r
+ for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)\r
+ {\r
+ thisOpt = currentOptsArray[loopcounter];\r
+ String[] splitOptRange = thisOpt.Split('=');\r
+\r
+ if (thisOpt.Contains("="))\r
+ {\r
+ optName = splitOptRange[0];\r
+ optValue = splitOptRange[1];\r
+\r
+ /*Run through the available widgets for x264 opts and set them, as you add widgets, \r
+ they need to be added here. This should be moved to its own method probably*/\r
+ switch (optName)\r
+ {\r
+ case "bframes":\r
+ drop_bFrames.SelectedItem = optValue;\r
+ continue;\r
+ case "ref":\r
+ drop_refFrames.SelectedItem = optValue;\r
+ continue;\r
+ case "no-fast-pskip":\r
+ check_noFastPSkip.CheckState = CheckState.Checked;\r
+ continue;\r
+ case "no-dct-decimate":\r
+ check_noDCTDecimate.CheckState = CheckState.Checked;\r
+ continue;\r
+ case "subq":\r
+ drop_subpixelMotionEstimation.SelectedItem = optValue;\r
+ continue;\r
+ case "trellis":\r
+ drop_trellis.SelectedItem = optValue;\r
+ continue;\r
+ case "mixed-refs":\r
+ check_mixedReferences.CheckState = CheckState.Checked;\r
+ continue;\r
+ case "me":\r
+ if (optValue.Equals("dia"))\r
+ drop_MotionEstimationMethod.SelectedItem = "Diamond";\r
+ else if (optValue.Equals("hex"))\r
+ drop_MotionEstimationMethod.SelectedItem = "Hexagon";\r
+ else if (optValue.Equals("umh"))\r
+ drop_MotionEstimationMethod.SelectedItem = "Uneven Multi-Hexagon";\r
+ else if (optValue.Equals("esa"))\r
+ drop_MotionEstimationMethod.SelectedItem = "Exhaustive";\r
+ else if (optValue.Equals("tesa"))\r
+ drop_MotionEstimationMethod.SelectedItem = "Transformed Exhaustive";\r
+ continue;\r
+ case "merange":\r
+ drop_MotionEstimationRange.SelectedItem = optValue;\r
+ continue;\r
+ case "b-adapt":\r
+ int badapt;\r
+ int.TryParse(optValue, out badapt);\r
+ drop_adaptBFrames.SelectedIndex = (badapt + 1);\r
+ continue;\r
+ case "weightb":\r
+ if (optValue != "0")\r
+ check_weightedBFrames.CheckState = CheckState.Checked;\r
+ else\r
+ check_weightedBFrames.CheckState = CheckState.Unchecked;\r
+ continue;\r
+ case "b-pyramid":\r
+ check_pyrmidalBFrames.CheckState = CheckState.Checked;\r
+ continue;\r
+ case "direct":\r
+ if (optValue == "auto")\r
+ optValue = "Automatic";\r
+\r
+ if (optValue != "")\r
+ {\r
+ Char[] letters = optValue.ToCharArray();\r
+ letters[0] = Char.ToUpper(letters[0]);\r
+ optValue = new string(letters);\r
+ }\r
+\r
+ drop_directPrediction.SelectedItem = optValue;\r
+ continue;\r
+ case "deblock":\r
+ string[] splitDeblock = optValue.Split(',');\r
+ string alphaDeblock = splitDeblock[0];\r
+ string betaDeblock = splitDeblock[1];\r
+\r
+ if (alphaDeblock.Equals("0") && betaDeblock.Replace("\n", "").Equals("0"))\r
+ {\r
+ drop_deblockAlpha.SelectedItem = "Default (0)";\r
+ drop_deblockBeta.SelectedItem = "Default (0)";\r
+ }\r
+ else\r
+ {\r
+ drop_deblockAlpha.SelectedItem = !alphaDeblock.Equals("0") ? alphaDeblock : "0";\r
+\r
+ drop_deblockBeta.SelectedItem = !betaDeblock.Replace("\n", "").Equals("0") ? betaDeblock.Replace("\n", "") : "0";\r
+ }\r
+ continue;\r
+ case "analyse":\r
+ if (optValue.Equals("p8x8,b8x8,i8x8,i4x4"))\r
+ drop_analysis.SelectedItem = "Default (some)";\r
+ if (optValue.Equals("none"))\r
+ drop_analysis.SelectedItem = "None";\r
+ if (optValue.Equals("all"))\r
+ drop_analysis.SelectedItem = "All";\r
+ continue;\r
+ case "8x8dct":\r
+ check_8x8DCT.CheckState = optValue == "1" ? CheckState.Checked : CheckState.Unchecked;\r
+ continue;\r
+ case "cabac":\r
+ check_Cabac.CheckState = CheckState.Unchecked;\r
+ continue;\r
+ case "psy-rd":\r
+ string[] x = optValue.Split(',');\r
+\r
+ double psyrd, psytrellis;\r
+ int val, val2;\r
+\r
+ // default psy-rd = 1 (10 for the slider)\r
+ psyrd = double.TryParse(x[0], out psyrd) ? psyrd * 10 : 10.0;\r
+ // default psy-trellis = 0\r
+ psytrellis = double.TryParse(x[1], out psytrellis) ? psytrellis * 10 : 0.0; \r
+\r
+ int.TryParse(psyrd.ToString(), out val);\r
+ int.TryParse(psytrellis.ToString(), out val2);\r
+\r
+ slider_psyrd.Value = val;\r
+ slider_psytrellis.Value = val2;\r
+ continue;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// This function will update the X264 Query when one of the GUI widgets changes.\r
+ /// </summary>\r
+ private void on_x264_WidgetChange(string sender)\r
+ {\r
+ animate(sender);\r
+ String optNameToChange = sender;\r
+ String currentOptString = rtf_x264Query.Text;\r
+\r
+ /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after\r
+ the first character of the opt string (hence the ":") */\r
+ String checkOptNameToChange = ":" + optNameToChange + "=";\r
+ String checkOptNameToChangeBegin = optNameToChange + "=";\r
+\r
+ // IF the current H264 Option String Contains Multiple Items or Just 1 Item\r
+ if ((currentOptString.Contains(checkOptNameToChange)) || (currentOptString.StartsWith(checkOptNameToChangeBegin)))\r
+ hasOptions(currentOptString, optNameToChange);\r
+ else // IF there is no options in the rich text box!\r
+ hasNoOptions(optNameToChange);\r
+ }\r
+\r
+ /// <summary>\r
+ /// Called when the current x264 option string contains multiple (or a single) item(s) in it seperated by :\r
+ /// it updates the current option that the widget corrosponds to, if it is already in thes string.\r
+ /// </summary>\r
+ /// <param name="currentOptString"></param>\r
+ /// <param name="optNameToChange"></param>\r
+ private void hasOptions(string currentOptString, string optNameToChange)\r
+ {\r
+ String thisOpt; // The separated option such as "bframes=3"\r
+ String optName; // The option name such as "bframes"\r
+ String[] currentOptsArray;\r
+\r
+ /* Create new empty opt string*/\r
+ String changedOptString = "";\r
+\r
+ /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/\r
+ currentOptsArray = currentOptString.Split(':');\r
+\r
+ /*iterate through the array and get <opts> and <values*/\r
+ for (int loopcounter = 0; loopcounter < currentOptsArray.Length; loopcounter++)\r
+ {\r
+ thisOpt = currentOptsArray[loopcounter];\r
+\r
+ if (thisOpt.Contains("="))\r
+ {\r
+ string[] splitOptRange = thisOpt.Split('=');\r
+\r
+ optName = splitOptRange[0]; // e.g bframes\r
+\r
+ /* \r
+ * Run through the available widgets for x264 opts and set them, as you add widgets,\r
+ * they need to be added here. This should be moved to its own method probably\r
+ * If the optNameToChange is found, appropriately change the value or delete it if\r
+ * "unspecified" is set.\r
+ */\r
+ if (optName.Equals(optNameToChange))\r
+ {\r
+ if (optNameToChange.Equals("deblock"))\r
+ {\r
+ String da = drop_deblockAlpha.SelectedItem.ToString();\r
+ String db = drop_deblockBeta.SelectedItem.ToString();\r
+\r
+ if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))\r
+ {\r
+ drop_deblockBeta.SelectedItem = "Default (0)";\r
+ drop_deblockAlpha.SelectedItem = "Default (0)";\r
+ thisOpt = "";\r
+ }\r
+ else if ((!da.Contains("Default")) && (db.Contains("Default")))\r
+ {\r
+ drop_deblockBeta.SelectedItem = "0";\r
+ thisOpt = "deblock=" + da + ",0";\r
+ }\r
+ else if ((da.Contains("Default")) && (!db.Contains("Default")))\r
+ {\r
+ drop_deblockAlpha.SelectedItem = "0";\r
+ thisOpt = "deblock=0," + db;\r
+ }\r
+ else if ((!da.Contains("Default")) && (!db.Contains("Default")))\r
+ thisOpt = "deblock=" + da + "," + db;\r
+ }\r
+ else if (optNameToChange.Equals("psy-rd"))\r
+ {\r
+ if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)\r
+ thisOpt = "";\r
+ else\r
+ {\r
+ double psyrd = slider_psyrd.Value * 0.1;\r
+ double psytre = slider_psytrellis.Value * 0.1;\r
+\r
+ string rd = psyrd.ToString("f1");\r
+ string rt = psytre.ToString("f1");\r
+\r
+ thisOpt = "psy-rd=" + rd + "," + rt;\r
+ }\r
+ }\r
+ else if (optNameToChange.Equals("mixed-refs"))\r
+ thisOpt = check_mixedReferences.CheckState == CheckState.Checked ? "mixed-refs=1" : "mixed-refs=0";\r
+ else if (optNameToChange.Equals("weightb"))\r
+ thisOpt = check_weightedBFrames.CheckState == CheckState.Checked ? "" : "weightb=0";\r
+ else if (optNameToChange.Equals("b-pyramid"))\r
+ thisOpt = check_pyrmidalBFrames.CheckState == CheckState.Checked ? "b-pyramid=1" : "";\r
+ else if (optNameToChange.Equals("no-fast-pskip"))\r
+ thisOpt = check_noFastPSkip.CheckState == CheckState.Checked ? "no-fast-pskip=1" : "";\r
+ else if (optNameToChange.Equals("no-dct-decimate"))\r
+ thisOpt = check_noDCTDecimate.CheckState == CheckState.Checked ? "no-dct-decimate=1" : "";\r
+ else if (optNameToChange.Equals("8x8dct"))\r
+ thisOpt = check_8x8DCT.CheckState == CheckState.Checked ? "8x8dct=1" : "8x8dct=0";\r
+ else if (optNameToChange.Equals("cabac"))\r
+ thisOpt = check_Cabac.CheckState == CheckState.Checked ? "" : "cabac=0";\r
+ else if (optNameToChange.Equals("me"))\r
+ {\r
+ switch (drop_MotionEstimationMethod.SelectedIndex)\r
+ {\r
+ case 1:\r
+ thisOpt = "me=dia";\r
+ break;\r
+\r
+ case 2:\r
+ thisOpt = "me=hex";\r
+ break;\r
+\r
+ case 3:\r
+ thisOpt = "me=umh";\r
+ break;\r
+\r
+ case 4:\r
+ thisOpt = "me=esa";\r
+ break;\r
+\r
+ case 5:\r
+ thisOpt = "me=tesa";\r
+ break;\r
+\r
+ default:\r
+ thisOpt = "";\r
+ break;\r
+ }\r
+ }\r
+ else if (optNameToChange.Equals("direct"))\r
+ {\r
+ switch (drop_directPrediction.SelectedIndex)\r
+ {\r
+ case 1:\r
+ thisOpt = "direct=none";\r
+ break;\r
+\r
+ case 2:\r
+ thisOpt = "direct=spatial";\r
+ break;\r
+\r
+ case 3:\r
+ thisOpt = "direct=temporal";\r
+ break;\r
+\r
+ case 4:\r
+ thisOpt = "direct=auto";\r
+ break;\r
+\r
+ default:\r
+ thisOpt = "";\r
+ break;\r
+ }\r
+ }\r
+ else if (optNameToChange.Equals("analyse"))\r
+ {\r
+ switch (drop_analysis.SelectedIndex)\r
+ {\r
+ case 1:\r
+ thisOpt = "analyse=none";\r
+ break;\r
+\r
+ case 2:\r
+ thisOpt = "analyse=all";\r
+ break;\r
+\r
+ default:\r
+ thisOpt = "";\r
+ break;\r
+ }\r
+ }\r
+ else if (optNameToChange.Equals("merange"))\r
+ {\r
+ thisOpt = !drop_MotionEstimationRange.SelectedItem.ToString().Contains("Default")\r
+ ? "merange=" + drop_MotionEstimationRange.SelectedItem\r
+ : "";\r
+ }\r
+ else if (optNameToChange.Equals("b-adapt"))\r
+ {\r
+ thisOpt = !drop_adaptBFrames.SelectedItem.ToString().Contains("Default")\r
+ ? "b-adapt=" + (drop_adaptBFrames.SelectedIndex - 1)\r
+ : "";\r
+ }\r
+ else if (optNameToChange.Equals("ref"))\r
+ {\r
+ thisOpt = !drop_refFrames.SelectedItem.ToString().Contains("Default")\r
+ ? "ref=" + drop_refFrames.SelectedItem\r
+ : "";\r
+ }\r
+ else if (optNameToChange.Equals("bframes"))\r
+ {\r
+ String value = drop_bFrames.SelectedItem.ToString();\r
+ thisOpt = !drop_bFrames.SelectedItem.ToString().Contains("Default")\r
+ ? "bframes=" + value\r
+ : "";\r
+ }\r
+ else if (optNameToChange.Equals("subq"))\r
+ {\r
+ String value = drop_subpixelMotionEstimation.SelectedItem.ToString();\r
+ thisOpt = !drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default")\r
+ ? "subq=" + value\r
+ : "";\r
+ }\r
+ else if (optNameToChange.Equals("trellis"))\r
+ {\r
+ String value = drop_trellis.SelectedItem.ToString();\r
+ thisOpt = !drop_trellis.SelectedItem.ToString().Contains("Default")\r
+ ? "trellis=" + value\r
+ : "";\r
+ }\r
+ }\r
+ }\r
+\r
+ /* Construct New String for opts here */\r
+ if (!thisOpt.Equals(""))\r
+ changedOptString = changedOptString.Equals("") ? thisOpt : changedOptString + ":" + thisOpt;\r
+ }\r
+\r
+ /* Change the option string to reflect the new mod settings */\r
+ rtf_x264Query.Text = changedOptString;\r
+ }\r
+\r
+ /// <summary>\r
+ /// Add's an option to the x264 query string.\r
+ /// Handles 2 cases. 1 Where rtf_x264Query.Text is empty, and one where there is an option with no value,\r
+ /// e.g no-fast-pskip\r
+ /// </summary>\r
+ /// <param name="optNameToChange"></param>\r
+ private void hasNoOptions(string optNameToChange)\r
+ {\r
+ string colon = "";\r
+ if (rtf_x264Query.Text != "")\r
+ colon = ":";\r
+\r
+ string query = rtf_x264Query.Text;\r
+ if (optNameToChange.Equals("me"))\r
+ {\r
+ switch (drop_MotionEstimationMethod.SelectedIndex)\r
+ {\r
+ case 1:\r
+ query = query + colon + "me=dia";\r
+ break;\r
+\r
+ case 2:\r
+ query = query + colon + "me=hex";\r
+ break;\r
+\r
+ case 3:\r
+ query = query + colon + "me=umh";\r
+ break;\r
+\r
+ case 4:\r
+ query = query + colon + "me=esa";\r
+ break;\r
+\r
+ case 5:\r
+ query = query + colon + "me=tesa";\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ else if (optNameToChange.Equals("direct"))\r
+ {\r
+ switch (drop_directPrediction.SelectedIndex)\r
+ {\r
+ case 1:\r
+ query = query + colon + "direct=none";\r
+ break;\r
+\r
+ case 2:\r
+ query = query + colon + "direct=spatial";\r
+ break;\r
+\r
+ case 3:\r
+ query = query + colon + "direct=temporal";\r
+ break;\r
+\r
+ case 4:\r
+ query = query + colon + "direct=auto";\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ else if (optNameToChange.Equals("analyse"))\r
+ {\r
+ switch (drop_analysis.SelectedIndex)\r
+ {\r
+ case 1:\r
+ query = query + colon + "analyse=none";\r
+ break;\r
+\r
+ case 2:\r
+ query = query + colon + "analyse=all";\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ else if (optNameToChange.Equals("merange"))\r
+ {\r
+ int value = drop_MotionEstimationRange.SelectedIndex + 3;\r
+ query = query + colon + "merange=" + value;\r
+ }\r
+ else if (optNameToChange.Equals("b-adapt"))\r
+ {\r
+ int value = drop_adaptBFrames.SelectedIndex - 1;\r
+ query = query + colon + "b-adapt=" + value;\r
+ }\r
+\r
+ else if (optNameToChange.Equals("deblock"))\r
+ {\r
+ String da = drop_deblockAlpha.SelectedItem.ToString();\r
+ String db = drop_deblockBeta.Text;\r
+\r
+ if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))\r
+ {\r
+ drop_deblockBeta.SelectedItem = "Default (0)";\r
+ drop_deblockAlpha.SelectedItem = "Default (0)";\r
+ }\r
+ else\r
+ {\r
+ if (db.Contains("Default"))\r
+ db = "0";\r
+\r
+ if (da.Contains("Default"))\r
+ da = "0";\r
+\r
+ query = query + colon + "deblock=" + da + "," + db;\r
+ }\r
+ }\r
+ else if (optNameToChange.Equals("psy-rd"))\r
+ {\r
+ if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)\r
+ query += "";\r
+ else\r
+ {\r
+ double psyrd = slider_psyrd.Value * 0.1;\r
+ double psytre = slider_psytrellis.Value * 0.1;\r
+\r
+ string rd = psyrd.ToString("f1");\r
+ string rt = psytre.ToString("f1");\r
+\r
+ query += colon + "psy-rd=" + rd + "," + rt;\r
+ }\r
+ }\r
+ else if (optNameToChange.Equals("mixed-refs"))\r
+ {\r
+ if (check_mixedReferences.CheckState == CheckState.Checked)\r
+ query = query + colon + "mixed-refs=1";\r
+ else\r
+ query = query + colon + "mixed-refs=0";\r
+ }\r
+ else if (optNameToChange.Equals("weightb"))\r
+ {\r
+ if (check_weightedBFrames.CheckState != CheckState.Checked)\r
+ query = query + colon + "weightb=0";\r
+ }\r
+ else if (optNameToChange.Equals("b-pyramid"))\r
+ {\r
+ if (check_pyrmidalBFrames.CheckState == CheckState.Checked)\r
+ query = query + colon + "b-pyramid=1";\r
+ }\r
+ else if (optNameToChange.Equals("no-fast-pskip"))\r
+ {\r
+ if (check_noFastPSkip.CheckState == CheckState.Checked)\r
+ query = query + colon + "no-fast-pskip=1";\r
+ }\r
+ else if (optNameToChange.Equals("no-dct-decimate"))\r
+ {\r
+ if (check_noDCTDecimate.CheckState == CheckState.Checked)\r
+ query = query + colon + "no-dct-decimate=1";\r
+ }\r
+ else if (optNameToChange.Equals("8x8dct"))\r
+ {\r
+ if (check_8x8DCT.CheckState == CheckState.Checked)\r
+ query = query + colon + "8x8dct=1";\r
+ }\r
+ else if (optNameToChange.Equals("cabac"))\r
+ {\r
+ if (check_Cabac.CheckState != CheckState.Checked)\r
+ query = query + colon + "cabac=0";\r
+ }\r
+ else if (optNameToChange.Equals("ref"))\r
+ {\r
+ if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))\r
+ query = query + colon + "ref=" + drop_refFrames.SelectedItem;\r
+ }\r
+ else if (optNameToChange.Equals("bframes"))\r
+ {\r
+ String value = drop_bFrames.SelectedItem.ToString();\r
+ if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))\r
+ query = query + colon + "bframes=" + value;\r
+ }\r
+ else if (optNameToChange.Equals("subq"))\r
+ {\r
+ String value = drop_subpixelMotionEstimation.SelectedItem.ToString();\r
+ if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))\r
+ query = query + colon + "subq=" + value;\r
+ }\r
+ else if (optNameToChange.Equals("trellis"))\r
+ {\r
+ if (!drop_trellis.SelectedItem.ToString().Contains("Default"))\r
+ query = query + colon + "trellis=" + drop_trellis.SelectedItem;\r
+ }\r
+\r
+ rtf_x264Query.Text = query;\r
+ }\r
+\r
+ /// <summary>\r
+ /// Shows and hides controls based on the values of other controls.\r
+ /// </summary>\r
+ /// <param name="sender"></param>\r
+ private void animate(string sender)\r
+ {\r
+ /* Lots of situations to cover.\r
+ - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)\r
+ - CABAC (when 0 turn off trellis)\r
+ - analysis (if none, turn off 8x8dct)\r
+ - refs (under 2, disable mixed-refs)\r
+ - subme (if under 6, turn off psy-rd and psy-trel)\r
+ - trellis (if 0, turn off psy-trel)\r
+ */\r
+\r
+ switch(sender)\r
+ {\r
+ case "bframes":\r
+ if (drop_bFrames.SelectedIndex >0 && drop_bFrames.SelectedIndex < 2 )\r
+ {\r
+ /* If the b-frame widget is at 0 or 1, the user has chosen\r
+ not to use b-frames at all. So disable the options\r
+ that can only be used when b-frames are enabled. */\r
+ check_weightedBFrames.Visible = false;\r
+ check_pyrmidalBFrames.Visible = false;\r
+ drop_directPrediction.Visible = false;\r
+ lbl_direct_prediction.Visible = false;\r
+\r
+ check_weightedBFrames.CheckState = CheckState.Unchecked;\r
+ check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
+ drop_directPrediction.SelectedIndex = 0;\r
+\r
+ drop_adaptBFrames.Visible = false;\r
+ lbl_adaptBFrames.Visible = false;\r
+ drop_adaptBFrames.SelectedIndex = 0;\r
+ }\r
+ else if (drop_bFrames.SelectedIndex == 2)\r
+ {\r
+ /* Only 1 b-frame? Disable b-pyramid. */\r
+ check_pyrmidalBFrames.Visible = false;\r
+ check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
+\r
+ check_weightedBFrames.Visible = true;\r
+ drop_directPrediction.Visible = true;\r
+ lbl_direct_prediction.Visible = true;\r
+\r
+ drop_adaptBFrames.Visible = true;\r
+ lbl_adaptBFrames.Visible = true;\r
+ }\r
+ else\r
+ {\r
+ check_weightedBFrames.Visible = true;\r
+ check_pyrmidalBFrames.Visible = true;\r
+ drop_directPrediction.Visible = true;\r
+ lbl_direct_prediction.Visible = true;\r
+\r
+ drop_adaptBFrames.Visible = true;\r
+ lbl_adaptBFrames.Visible = true;\r
+ }\r
+ break;\r
+ case "cabac":\r
+ if (check_Cabac.Checked == false)\r
+ {\r
+ /* Without CABAC entropy coding, trellis doesn't run. */\r
+ drop_trellis.Visible = false;\r
+ drop_trellis.SelectedIndex = 0;\r
+ lbl_trellis.Visible = false;\r
+ }\r
+ else\r
+ {\r
+ drop_trellis.Visible = true;\r
+ lbl_trellis.Visible = true;\r
+ }\r
+ break;\r
+ case "analyse":\r
+ if (drop_analysis.SelectedIndex == 1)\r
+ {\r
+ /* No analysis? Disable 8x8dct */\r
+ check_8x8DCT.Visible = false;\r
+ if (sender != "8x8dct")\r
+ check_8x8DCT.CheckState = CheckState.Unchecked;\r
+ }\r
+ else\r
+ check_8x8DCT.Visible = true;\r
+ break;\r
+ case "ref":\r
+ if (drop_refFrames.SelectedIndex > 0 && drop_refFrames.SelectedIndex < 3)\r
+ {\r
+ check_mixedReferences.Visible = false;\r
+ if (sender != "mixed-refs")\r
+ check_mixedReferences.CheckState = CheckState.Unchecked;\r
+ }\r
+ else\r
+ check_mixedReferences.Visible = true;\r
+ break;\r
+ case "me": // Motion Estimation\r
+ if (drop_MotionEstimationMethod.SelectedIndex < 3)\r
+ {\r
+ drop_MotionEstimationRange.Visible = false;\r
+ lbl_merange.Visible = false;\r
+ drop_MotionEstimationRange.SelectedIndex = 0;\r
+ }\r
+ else\r
+ {\r
+ drop_MotionEstimationRange.Visible = true;\r
+ lbl_merange.Visible = true;\r
+ }\r
+ break;\r
+ case "subq": // subme\r
+ if (drop_subpixelMotionEstimation.SelectedIndex != 0 && drop_subpixelMotionEstimation.SelectedIndex < 7)\r
+ {\r
+ slider_psyrd.Visible = false;\r
+ slider_psyrd.Value = 10;\r
+ lbl_psyrd.Visible = false;\r
+\r
+\r
+ slider_psytrellis.Visible = false;\r
+ slider_psytrellis.Value = 0;\r
+ lbl_psytrellis.Visible = false;\r
+ }\r
+ else\r
+ {\r
+ slider_psyrd.Visible = true;\r
+ lbl_psyrd.Visible = true;\r
+\r
+ if (drop_trellis.SelectedIndex >= 2 && check_Cabac.Checked && slider_psytrellis.Visible == false)\r
+ {\r
+ slider_psytrellis.Visible = true;\r
+ lbl_psytrellis.Visible = true;\r
+ }\r
+ }\r
+ break;\r
+ case "trellis": // subme\r
+ if (drop_trellis.SelectedIndex > 0 && drop_trellis.SelectedIndex < 2 )\r
+ {\r
+ slider_psytrellis.Visible = false;\r
+ slider_psytrellis.Value = 0;\r
+ lbl_psytrellis.Visible = false;\r
+ }\r
+ else\r
+ {\r
+ if ((drop_subpixelMotionEstimation.SelectedIndex == 0 || drop_subpixelMotionEstimation.SelectedIndex >= 7) && check_Cabac.Checked && slider_psytrellis.Visible == false)\r
+ {\r
+ slider_psytrellis.Visible = true;\r
+ lbl_psytrellis.Visible = true;\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+}
\ No newline at end of file