OSDN Git Service

import 0.9.4
[handbrake-jp/handbrake-jp.git] / win / C# / Controls / x264Panel.cs
diff --git a/win/C#/Controls/x264Panel.cs b/win/C#/Controls/x264Panel.cs
new file mode 100644 (file)
index 0000000..4229c82
--- /dev/null
@@ -0,0 +1,1002 @@
+/*  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