OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / Controls / x264Panel.cs
1 /*  x264Panel.cs $\r
2         \r
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
6 \r
7 using System;\r
8 using System.Windows.Forms;\r
9 \r
10 namespace Handbrake.Controls\r
11 {\r
12     public partial class x264Panel : UserControl\r
13     {\r
14         public x264Panel()\r
15         {\r
16             InitializeComponent();\r
17 \r
18             if (Properties.Settings.Default.tooltipEnable)\r
19                 setToolTipActive(true);\r
20 \r
21             reset2Defaults();\r
22         }\r
23 \r
24         public string x264Query\r
25         {\r
26             get { return rtf_x264Query.Text; }\r
27             set { rtf_x264Query.Text = value; }\r
28         }\r
29         public void setToolTipActive(Boolean active)\r
30         {\r
31             ToolTip.Active = active;\r
32         }\r
33 \r
34         #region Controls Changed\r
35         private void drop_refFrames_SelectedIndexChanged(object sender, EventArgs e)\r
36         {\r
37             on_x264_WidgetChange("ref");\r
38         }\r
39         private void check_mixedReferences_CheckedChanged(object sender, EventArgs e)\r
40         {\r
41             on_x264_WidgetChange("mixed-refs");\r
42         }\r
43         private void drop_bFrames_SelectedIndexChanged(object sender, EventArgs e)\r
44         {\r
45             on_x264_WidgetChange("bframes");\r
46         }\r
47         private void drop_directPrediction_SelectedIndexChanged(object sender, EventArgs e)\r
48         {\r
49             on_x264_WidgetChange("direct");\r
50         }\r
51         private void check_weightedBFrames_CheckedChanged(object sender, EventArgs e)\r
52         {\r
53             on_x264_WidgetChange("weightb");\r
54         }\r
55         private void check_pyrmidalBFrames_CheckedChanged(object sender, EventArgs e)\r
56         {\r
57             on_x264_WidgetChange("b-pyramid");\r
58         }\r
59         private void drop_MotionEstimationMethod_SelectedIndexChanged(object sender, EventArgs e)\r
60         {\r
61             on_x264_WidgetChange("me");\r
62         }\r
63         private void drop_MotionEstimationRange_SelectedIndexChanged(object sender, EventArgs e)\r
64         {\r
65             on_x264_WidgetChange("merange");\r
66         }\r
67         private void drop_subpixelMotionEstimation_SelectedIndexChanged(object sender, EventArgs e)\r
68         {\r
69             on_x264_WidgetChange("subq");\r
70         }\r
71         private void drop_analysis_SelectedIndexChanged(object sender, EventArgs e)\r
72         {\r
73             on_x264_WidgetChange("analyse");\r
74         }\r
75         private void check_8x8DCT_CheckedChanged(object sender, EventArgs e)\r
76         {\r
77             on_x264_WidgetChange("8x8dct");\r
78         }\r
79         private void drop_deblockAlpha_SelectedIndexChanged(object sender, EventArgs e)\r
80         {\r
81             on_x264_WidgetChange("deblock");\r
82         }\r
83         private void drop_deblockBeta_SelectedIndexChanged(object sender, EventArgs e)\r
84         {\r
85             on_x264_WidgetChange("deblock");\r
86         }\r
87         private void drop_trellis_SelectedIndexChanged(object sender, EventArgs e)\r
88         {\r
89             on_x264_WidgetChange("trellis");\r
90         }\r
91         private void check_noFastPSkip_CheckedChanged(object sender, EventArgs e)\r
92         {\r
93             on_x264_WidgetChange("no-fast-pskip");\r
94         }\r
95         private void check_noDCTDecimate_CheckedChanged(object sender, EventArgs e)\r
96         {\r
97             on_x264_WidgetChange("no-dct-decimate");\r
98         }\r
99         private void check_Cabac_CheckedChanged(object sender, EventArgs e)\r
100         {\r
101             on_x264_WidgetChange("cabac");\r
102         }\r
103         private void slider_psyrd_Scroll(object sender, EventArgs e)\r
104         {\r
105             on_x264_WidgetChange("psy-rd");\r
106         }\r
107         private void slider_psytrellis_Scroll(object sender, EventArgs e)\r
108         {\r
109             on_x264_WidgetChange("psy-rd");\r
110         }\r
111         private void drop_adaptBFrames_SelectedIndexChanged(object sender, EventArgs e)\r
112         {\r
113             on_x264_WidgetChange("b-adapt");\r
114         }\r
115         private void rtf_x264Query_TextChanged(object sender, EventArgs e)\r
116         {\r
117             if (rtf_x264Query.Text.EndsWith("\n"))\r
118             {\r
119                 string query = rtf_x264Query.Text.Replace("\n", "");\r
120                 reset2Defaults();\r
121                 rtf_x264Query.Text = query;\r
122                 X264_StandardizeOptString();\r
123                 X264_SetCurrentSettingsInPanel();\r
124 \r
125                 if (rtf_x264Query.Text == string.Empty)\r
126                     reset2Defaults();\r
127             }\r
128         }\r
129         private void btn_reset_Click(object sender, EventArgs e)\r
130         {\r
131             rtf_x264Query.Text = "";\r
132             reset2Defaults();\r
133         }\r
134         #endregion\r
135 \r
136         /// <summary>\r
137         /// Reset all components to defaults and clears the x264 rtf box\r
138         /// </summary>\r
139         public void reset2Defaults()\r
140         {\r
141             check_8x8DCT.CheckState = CheckState.Unchecked;\r
142             check_Cabac.CheckState = CheckState.Checked;\r
143             check_mixedReferences.CheckState = CheckState.Unchecked;\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.Unchecked;\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
161 \r
162             rtf_x264Query.Text = "";\r
163         }\r
164 \r
165         /// <summary>\r
166         /// Iterate over every x264 option, standardize it, write the full string to the x264 rtf box\r
167         /// </summary>\r
168         public void X264_StandardizeOptString()\r
169         {\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
176 \r
177             /*First, we get an opt string to process */\r
178             String currentOptString = rtf_x264Query.Text;\r
179 \r
180             /*verify there is an opt string to process */\r
181             if (currentOptString.Contains("="))\r
182             {\r
183                 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/\r
184                 currentOptsArray = currentOptString.Split(':');\r
185 \r
186                 /*iterate through the array and get <opts> and <values*/\r
187                 int loopcounter;\r
188                 int currentOptsArrayCount = currentOptsArray.Length;\r
189                 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)\r
190                 {\r
191                     thisOpt = currentOptsArray[loopcounter];\r
192                     if (currentOptsArray[currentOptsArrayCount - 1] == string.Empty)\r
193                         break;\r
194 \r
195                     String[] splitOptRange = thisOpt.Split('=');\r
196                     if (thisOpt != "")\r
197                     {\r
198                         if (thisOpt.Contains("="))\r
199                         {\r
200                             optName = splitOptRange[0];\r
201                             optValue = splitOptRange[1];\r
202 \r
203                             /* Standardize the names here depending on whats in the string */\r
204                             optName = X264_StandardizeOptNames(optName);\r
205                             thisOpt = optName + "=" + optValue;\r
206                         }\r
207                         else // No value given so we use a default of "1"\r
208                         {\r
209                             optName = thisOpt;\r
210                             /* Standardize the names here depending on whats in the string */\r
211                             optName = X264_StandardizeOptNames(optName);\r
212                             thisOpt = optName + "=1";\r
213                         }\r
214                     }\r
215 \r
216                     /* Construct New String for opts here */\r
217                     if (thisOpt == string.Empty)\r
218                         changedOptString = changedOptString + thisOpt;\r
219                     else\r
220                     {\r
221                         if (changedOptString == string.Empty)\r
222                             changedOptString = thisOpt;\r
223                         else\r
224                             changedOptString = changedOptString + ":" + thisOpt;\r
225                     }\r
226                 }\r
227             }\r
228 \r
229             /* Change the option string to reflect the new standardized option string */\r
230             if (changedOptString != "")\r
231                 rtf_x264Query.Text = changedOptString;\r
232         }\r
233 \r
234         /// <summary>\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
238         /// </summary>\r
239         /// <param name="cleanOptNameString"></param>\r
240         /// <returns></returns>\r
241         private static string X264_StandardizeOptNames(String cleanOptNameString)\r
242         {\r
243             String input = cleanOptNameString;\r
244 \r
245             if (input.Equals("ref") || input.Equals("frameref"))\r
246                 cleanOptNameString = "ref";\r
247 \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
251 \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
255 \r
256             /*Subme*/\r
257             if (input.Equals("subme"))\r
258                 cleanOptNameString = "subq";\r
259 \r
260             /*ME Range*/\r
261             if (input.Equals("me-range") || input.Equals("me_range"))\r
262                 cleanOptNameString = "merange";\r
263 \r
264             /*WeightB*/\r
265             if (input.Equals("weight-b") || input.Equals("weight_b"))\r
266                 cleanOptNameString = "weightb";\r
267 \r
268             /*B Pyramid*/\r
269             if (input.Equals("b_pyramid"))\r
270                 cleanOptNameString = "b-pyramid";\r
271 \r
272             /*Direct Prediction*/\r
273             if (input.Equals("direct-pred") || input.Equals("direct_pred"))\r
274                 cleanOptNameString = "direct";\r
275 \r
276             /*Deblocking*/\r
277             if (input.Equals("filter"))\r
278                 cleanOptNameString = "deblock";\r
279 \r
280             /*Analysis*/\r
281             if (input.Equals("partitions"))\r
282                 cleanOptNameString = "analyse";\r
283 \r
284             return cleanOptNameString;\r
285         }\r
286 \r
287         /// <summary>\r
288         /// Resets the GUI widgets to the contents of the option string.\r
289         /// </summary>\r
290         public void X264_SetCurrentSettingsInPanel()\r
291         {\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
297 \r
298             //Set currentOptString to the contents of the text box.\r
299             String currentOptString = rtf_x264Query.Text.Replace("\n", "");\r
300 \r
301             /*verify there is an opt string to process */\r
302             if (currentOptString.Contains("="))\r
303             {\r
304                 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/\r
305                 currentOptsArray = currentOptString.Split(':');\r
306 \r
307                 /*iterate through the array and get <opts> and <values*/\r
308                 int loopcounter;\r
309                 int currentOptsArrayCount = currentOptsArray.Length;\r
310 \r
311                 /*iterate through the array and get <opts> and <values*/\r
312                 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)\r
313                 {\r
314                     thisOpt = currentOptsArray[loopcounter];\r
315                     String[] splitOptRange = thisOpt.Split('=');\r
316 \r
317                     if (thisOpt.Contains("="))\r
318                     {\r
319                         optName = splitOptRange[0];\r
320                         optValue = splitOptRange[1];\r
321 \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
324                         switch (optName)\r
325                         {\r
326                             case "bframes":\r
327                                 drop_bFrames.SelectedItem = optValue;\r
328                                 continue;\r
329                             case "ref":\r
330                                 drop_refFrames.SelectedItem = optValue;\r
331                                 continue;\r
332                             case "no-fast-pskip":\r
333                                 check_noFastPSkip.CheckState = CheckState.Checked;\r
334                                 continue;\r
335                             case "no-dct-decimate":\r
336                                 check_noDCTDecimate.CheckState = CheckState.Checked;\r
337                                 continue;\r
338                             case "subq":\r
339                                 drop_subpixelMotionEstimation.SelectedItem = optValue;\r
340                                 continue;\r
341                             case "trellis":\r
342                                 drop_trellis.SelectedItem = optValue;\r
343                                 continue;\r
344                             case "mixed-refs":\r
345                                 check_mixedReferences.CheckState = CheckState.Checked;\r
346                                 continue;\r
347                             case "me":\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
358                                 continue;\r
359                             case "merange":\r
360                                 drop_MotionEstimationRange.SelectedItem = optValue;\r
361                                 continue;\r
362                             case "b-adapt":\r
363                                 int badapt;\r
364                                 int.TryParse(optValue, out badapt);\r
365                                 drop_adaptBFrames.SelectedIndex = (badapt + 1);\r
366                                 continue;\r
367                             case "weightb":\r
368                                 check_weightedBFrames.CheckState = CheckState.Checked;\r
369                                 continue;\r
370                             case "b-pyramid":\r
371                                 check_pyrmidalBFrames.CheckState = CheckState.Checked;\r
372                                 continue;\r
373                             case "direct":\r
374                                 if (optValue == "auto")\r
375                                     optValue = "Automatic";\r
376 \r
377                                 if (optValue != "")\r
378                                 {\r
379                                     Char[] letters = optValue.ToCharArray();\r
380                                     letters[0] = Char.ToUpper(letters[0]);\r
381                                     optValue = new string(letters);\r
382                                 }\r
383 \r
384                                 drop_directPrediction.SelectedItem = optValue;\r
385                                 continue;\r
386                             case "deblock":\r
387                                 string[] splitDeblock = optValue.Split(',');\r
388                                 string alphaDeblock = splitDeblock[0];\r
389                                 string betaDeblock = splitDeblock[1];\r
390 \r
391                                 if (alphaDeblock.Equals("0") && betaDeblock.Replace("\n", "").Equals("0"))\r
392                                 {\r
393                                     drop_deblockAlpha.SelectedItem = "Default (0)";\r
394                                     drop_deblockBeta.SelectedItem = "Default (0)";\r
395                                 }\r
396                                 else\r
397                                 {\r
398                                     drop_deblockAlpha.SelectedItem = !alphaDeblock.Equals("0") ? alphaDeblock : "0";\r
399 \r
400                                     drop_deblockBeta.SelectedItem = !betaDeblock.Replace("\n", "").Equals("0") ? betaDeblock.Replace("\n", "") : "0";\r
401                                 }\r
402                                 continue;\r
403                             case "analyse":\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
410                                 continue;\r
411                             case "8x8dct":\r
412                                 check_8x8DCT.CheckState = CheckState.Checked;\r
413                                 continue;\r
414                             case "cabac":\r
415                                 check_Cabac.CheckState = CheckState.Unchecked;\r
416                                 continue;\r
417                             case "psy-rd":\r
418                                 string[] x = optValue.Split(',');\r
419 \r
420                                 double psyrd, psytrellis;\r
421                                 int val, val2;\r
422 \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
427 \r
428                                 int.TryParse(psyrd.ToString(), out val);\r
429                                 int.TryParse(psytrellis.ToString(), out val2);\r
430 \r
431                                 slider_psyrd.Value = val;\r
432                                 slider_psytrellis.Value = val2;\r
433                                 continue;\r
434                         }\r
435                     }\r
436                 }\r
437             }\r
438         }\r
439 \r
440         /// <summary>\r
441         /// This function will update the X264 Query when one of the GUI widgets changes.\r
442         /// </summary>\r
443         private void on_x264_WidgetChange(string sender)\r
444         {\r
445             animate(sender);\r
446             String optNameToChange = sender;\r
447             String currentOptString = rtf_x264Query.Text;\r
448 \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
453 \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
459         }\r
460 \r
461         /// <summary>\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
464         /// </summary>\r
465         /// <param name="currentOptString"></param>\r
466         /// <param name="optNameToChange"></param>\r
467         private void hasOptions(string currentOptString, string optNameToChange)\r
468         {\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
472 \r
473             /* Create new empty opt string*/\r
474             String changedOptString = "";\r
475 \r
476             /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/\r
477             currentOptsArray = currentOptString.Split(':');\r
478 \r
479             /*iterate through the array and get <opts> and <values*/\r
480             for (int loopcounter = 0; loopcounter < currentOptsArray.Length; loopcounter++)\r
481             {\r
482                 thisOpt = currentOptsArray[loopcounter];\r
483 \r
484                 if (thisOpt.Contains("="))\r
485                 {\r
486                     string[] splitOptRange = thisOpt.Split('=');\r
487 \r
488                     optName = splitOptRange[0];     // e.g bframes\r
489 \r
490                     /* \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
495                      */\r
496                     if (optName.Equals(optNameToChange))\r
497                     {\r
498                         if (optNameToChange.Equals("deblock"))\r
499                         {\r
500                             String da = drop_deblockAlpha.SelectedItem.ToString();\r
501                             String db = drop_deblockBeta.SelectedItem.ToString();\r
502 \r
503                             if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))\r
504                             {\r
505                                 drop_deblockBeta.SelectedItem = "Default (0)";\r
506                                 drop_deblockAlpha.SelectedItem = "Default (0)";\r
507                                 thisOpt = "";\r
508                             }\r
509                             else if ((!da.Contains("Default")) && (db.Contains("Default")))\r
510                             {\r
511                                 drop_deblockBeta.SelectedItem = "0";\r
512                                 thisOpt = "deblock=" + da + ",0";\r
513                             }\r
514                             else if ((da.Contains("Default")) && (!db.Contains("Default")))\r
515                             {\r
516                                 drop_deblockAlpha.SelectedItem = "0";\r
517                                 thisOpt = "deblock=0," + db;\r
518                             }\r
519                             else if ((!da.Contains("Default")) && (!db.Contains("Default")))\r
520                                 thisOpt = "deblock=" + da + "," + db;\r
521                         }\r
522                         else if (optNameToChange.Equals("psy-rd"))\r
523                         {\r
524                             if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)\r
525                                 thisOpt = "";\r
526                             else\r
527                             {\r
528                                 double psyrd = slider_psyrd.Value * 0.1;\r
529                                 double psytre = slider_psytrellis.Value * 0.1;\r
530 \r
531                                 string rd = psyrd.ToString("f1");\r
532                                 string rt = psytre.ToString("f1");\r
533 \r
534                                 thisOpt = "psy-rd=" + rd + "," + rt;\r
535                             }\r
536                         }\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
552                         {\r
553                             switch (drop_MotionEstimationMethod.SelectedIndex)\r
554                             {\r
555                                 case 1:\r
556                                     thisOpt = "me=dia";\r
557                                     break;\r
558 \r
559                                 case 2:\r
560                                     thisOpt = "me=hex";\r
561                                     break;\r
562 \r
563                                 case 3:\r
564                                     thisOpt = "me=umh";\r
565                                     break;\r
566 \r
567                                 case 4:\r
568                                     thisOpt = "me=esa";\r
569                                     break;\r
570 \r
571                                 case 5:\r
572                                     thisOpt = "me=tesa";\r
573                                     break;\r
574 \r
575                                 default:\r
576                                     thisOpt = "";\r
577                                     break;\r
578                             }\r
579                         }\r
580                         else if (optNameToChange.Equals("direct"))\r
581                         {\r
582                             switch (drop_directPrediction.SelectedIndex)\r
583                             {\r
584                                 case 1:\r
585                                     thisOpt = "direct=none";\r
586                                     break;\r
587 \r
588                                 case 2:\r
589                                     thisOpt = "direct=spatial";\r
590                                     break;\r
591 \r
592                                 case 3:\r
593                                     thisOpt = "direct=temporal";\r
594                                     break;\r
595 \r
596                                 case 4:\r
597                                     thisOpt = "direct=auto";\r
598                                     break;\r
599 \r
600                                 default:\r
601                                     thisOpt = "";\r
602                                     break;\r
603                             }\r
604                         }\r
605                         else if (optNameToChange.Equals("analyse"))\r
606                         {\r
607                             switch (drop_analysis.SelectedIndex)\r
608                             {\r
609                                 case 1:\r
610                                     thisOpt = "analyse=none";\r
611                                     break;\r
612 \r
613                                 case 2:\r
614                                     thisOpt = "analyse=all";\r
615                                     break;\r
616 \r
617                                 default:\r
618                                     thisOpt = "";\r
619                                     break;\r
620                             }\r
621                         }\r
622                         else if (optNameToChange.Equals("merange"))\r
623                         {\r
624                             thisOpt = !drop_MotionEstimationRange.SelectedItem.ToString().Contains("Default")\r
625                                           ? "merange=" + drop_MotionEstimationRange.SelectedItem\r
626                                           : "";\r
627                         }\r
628                         else if (optNameToChange.Equals("b-adapt"))\r
629                         {\r
630                             thisOpt = !drop_adaptBFrames.SelectedItem.ToString().Contains("Default")\r
631                                           ? "b-adapt=" + (drop_adaptBFrames.SelectedIndex - 1)\r
632                                           : "";\r
633                         }\r
634                         else if (optNameToChange.Equals("ref"))\r
635                         {\r
636                             thisOpt = !drop_refFrames.SelectedItem.ToString().Contains("Default")\r
637                                           ? "ref=" + drop_refFrames.SelectedItem\r
638                                           : "";\r
639                         }\r
640                         else if (optNameToChange.Equals("bframes"))\r
641                         {\r
642                             String value = drop_bFrames.SelectedItem.ToString();\r
643                             thisOpt = !drop_bFrames.SelectedItem.ToString().Contains("Default")\r
644                                           ? "bframes=" + value\r
645                                           : "";\r
646                         }\r
647                         else if (optNameToChange.Equals("subq"))\r
648                         {\r
649                             String value = drop_subpixelMotionEstimation.SelectedItem.ToString();\r
650                             thisOpt = !drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default")\r
651                                           ? "subq=" + value\r
652                                           : "";\r
653                         }\r
654                         else if (optNameToChange.Equals("trellis"))\r
655                         {\r
656                             String value = drop_trellis.SelectedItem.ToString();\r
657                             thisOpt = !drop_trellis.SelectedItem.ToString().Contains("Default")\r
658                                           ? "trellis=" + value\r
659                                           : "";\r
660                         }\r
661                     }\r
662                 }\r
663 \r
664                 /* Construct New String for opts here */\r
665                 if (!thisOpt.Equals(""))\r
666                     changedOptString = changedOptString.Equals("") ? thisOpt : changedOptString + ":" + thisOpt;\r
667             }\r
668 \r
669             /* Change the option string to reflect the new mod settings */\r
670             rtf_x264Query.Text = changedOptString;\r
671         }\r
672 \r
673         /// <summary>\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
677         /// </summary>\r
678         /// <param name="optNameToChange"></param>\r
679         private void hasNoOptions(string optNameToChange)\r
680         {\r
681             string colon = "";\r
682             if (rtf_x264Query.Text != "")\r
683                 colon = ":";\r
684 \r
685             string query = rtf_x264Query.Text;\r
686             if (optNameToChange.Equals("me"))\r
687             {\r
688                 switch (drop_MotionEstimationMethod.SelectedIndex)\r
689                 {\r
690                     case 1:\r
691                         query = query + colon + "me=dia";\r
692                         break;\r
693 \r
694                     case 2:\r
695                         query = query + colon + "me=hex";\r
696                         break;\r
697 \r
698                     case 3:\r
699                         query = query + colon + "me=umh";\r
700                         break;\r
701 \r
702                     case 4:\r
703                         query = query + colon + "me=esa";\r
704                         break;\r
705 \r
706                     case 5:\r
707                         query = query + colon + "me=tesa";\r
708                         break;\r
709 \r
710                     default:\r
711                         break;\r
712                 }\r
713             }\r
714             else if (optNameToChange.Equals("direct"))\r
715             {\r
716                 switch (drop_directPrediction.SelectedIndex)\r
717                 {\r
718                     case 1:\r
719                         query = query + colon + "direct=none";\r
720                         break;\r
721 \r
722                     case 2:\r
723                         query = query + colon + "direct=spatial";\r
724                         break;\r
725 \r
726                     case 3:\r
727                         query = query + colon + "direct=temporal";\r
728                         break;\r
729 \r
730                     case 4:\r
731                         query = query + colon + "direct=auto";\r
732                         break;\r
733 \r
734                     default:\r
735                         break;\r
736                 }\r
737             }\r
738             else if (optNameToChange.Equals("analyse"))\r
739             {\r
740                 switch (drop_analysis.SelectedIndex)\r
741                 {\r
742                     case 1:\r
743                         query = query + colon + "analyse=none";\r
744                         break;\r
745 \r
746                     case 2:\r
747                         query = query + colon + "analyse=all";\r
748                         break;\r
749 \r
750                     default:\r
751                         break;\r
752                 }\r
753             }\r
754             else if (optNameToChange.Equals("merange"))\r
755             {\r
756                 int value = drop_MotionEstimationRange.SelectedIndex + 3;\r
757                 query = query + colon + "merange=" + value;\r
758             }\r
759             else if (optNameToChange.Equals("b-adapt"))\r
760             {\r
761                 int value = drop_adaptBFrames.SelectedIndex - 1;\r
762                 query = query + colon + "b-adapt=" + value;\r
763             }\r
764 \r
765             else if (optNameToChange.Equals("deblock"))\r
766             {\r
767                 String da = drop_deblockAlpha.SelectedItem.ToString();\r
768                 String db = drop_deblockBeta.Text;\r
769 \r
770                 if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))\r
771                 {\r
772                     drop_deblockBeta.SelectedItem = "Default (0)";\r
773                     drop_deblockAlpha.SelectedItem = "Default (0)";\r
774                 }\r
775                 else\r
776                 {\r
777                     if (db.Contains("Default"))\r
778                         db = "0";\r
779 \r
780                     if (da.Contains("Default"))\r
781                         da = "0";\r
782 \r
783                     query = query + colon + "deblock=" + da + "," + db;\r
784                 }\r
785             }\r
786             else if (optNameToChange.Equals("psy-rd"))\r
787             {\r
788                 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)\r
789                     query += "";\r
790                 else\r
791                 {\r
792                     double psyrd = slider_psyrd.Value * 0.1;\r
793                     double psytre = slider_psytrellis.Value * 0.1;\r
794 \r
795                     string rd = psyrd.ToString("f1");\r
796                     string rt = psytre.ToString("f1");\r
797 \r
798                     query += colon + "psy-rd=" + rd + "," + rt;\r
799                 }\r
800             }\r
801             else if (optNameToChange.Equals("mixed-refs"))\r
802             {\r
803                 if (check_mixedReferences.CheckState == CheckState.Checked)\r
804                     query = query + colon + "mixed-refs=1";\r
805             }\r
806             else if (optNameToChange.Equals("weightb"))\r
807             {\r
808                 if (check_weightedBFrames.CheckState == CheckState.Checked)\r
809                     query = query + colon + "weightb=1";\r
810             }\r
811             else if (optNameToChange.Equals("b-pyramid"))\r
812             {\r
813                 if (check_pyrmidalBFrames.CheckState == CheckState.Checked)\r
814                     query = query + colon + "b-pyramid=1";\r
815             }\r
816             else if (optNameToChange.Equals("no-fast-pskip"))\r
817             {\r
818                 if (check_noFastPSkip.CheckState == CheckState.Checked)\r
819                     query = query + colon + "no-fast-pskip=1";\r
820             }\r
821             else if (optNameToChange.Equals("no-dct-decimate"))\r
822             {\r
823                 if (check_noDCTDecimate.CheckState == CheckState.Checked)\r
824                     query = query + colon + "no-dct-decimate=1";\r
825             }\r
826             else if (optNameToChange.Equals("8x8dct"))\r
827             {\r
828                 if (check_8x8DCT.CheckState == CheckState.Checked)\r
829                     query = query + colon + "8x8dct=1";\r
830             }\r
831             else if (optNameToChange.Equals("cabac"))\r
832             {\r
833                 if (check_Cabac.CheckState != CheckState.Checked)\r
834                     query = query + colon + "cabac=0";\r
835             }\r
836             else if (optNameToChange.Equals("ref"))\r
837             {\r
838                 if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))\r
839                     query = query + colon + "ref=" + drop_refFrames.SelectedItem;\r
840             }\r
841             else if (optNameToChange.Equals("bframes"))\r
842             {\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
846             }\r
847             else if (optNameToChange.Equals("subq"))\r
848             {\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
852             }\r
853             else if (optNameToChange.Equals("trellis"))\r
854             {\r
855                 if (!drop_trellis.SelectedItem.ToString().Contains("Default"))\r
856                     query = query + colon + "trellis=" + drop_trellis.SelectedItem;\r
857             }\r
858 \r
859             rtf_x264Query.Text = query;\r
860         }\r
861 \r
862         /// <summary>\r
863         /// Shows and hides controls based on the values of other controls.\r
864         /// </summary>\r
865         /// <param name="sender"></param>\r
866         private void animate(string sender)\r
867         {\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
875                 */\r
876 \r
877             switch(sender)\r
878             {\r
879                 case "bframes":\r
880                     if (drop_bFrames.SelectedIndex < 2)\r
881                     {\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
889 \r
890                         check_weightedBFrames.CheckState = CheckState.Unchecked;\r
891                         check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
892                         drop_directPrediction.SelectedIndex = 0;\r
893 \r
894                         drop_adaptBFrames.Visible = false;\r
895                         lbl_adaptBFrames.Visible = false;\r
896                         drop_adaptBFrames.SelectedIndex = 0;\r
897                     }\r
898                     else if (drop_bFrames.SelectedIndex == 2)\r
899                     {\r
900                         /* Only 1 b-frame? Disable b-pyramid. */\r
901                         check_pyrmidalBFrames.Visible = false;\r
902                         check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
903 \r
904                         check_weightedBFrames.Visible = true;\r
905                         drop_directPrediction.Visible = true;\r
906                         lbl_direct_prediction.Visible = true;\r
907 \r
908                         drop_adaptBFrames.Visible = true;\r
909                         lbl_adaptBFrames.Visible = true;\r
910                     }\r
911                     else\r
912                     {\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
917 \r
918                         drop_adaptBFrames.Visible = true;\r
919                         lbl_adaptBFrames.Visible = true;\r
920                     }\r
921                 break;\r
922                 case "cabac":\r
923                     if (check_Cabac.Checked == false)\r
924                     {\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
929                     }\r
930                     else\r
931                     {\r
932                         drop_trellis.Visible = true;\r
933                         lbl_trellis.Visible = true;\r
934                     }\r
935                 break;\r
936                 case "analyse":\r
937                     if (drop_analysis.SelectedIndex == 1)\r
938                     {\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
943                     }\r
944                     else\r
945                         check_8x8DCT.Visible = true;\r
946                 break;\r
947                 case "ref":\r
948                     if (drop_refFrames.SelectedIndex < 3)\r
949                     {\r
950                         check_mixedReferences.Visible = false;\r
951                         if (sender != "mixed-refs")\r
952                             check_mixedReferences.CheckState = CheckState.Unchecked;\r
953                     }\r
954                     else\r
955                         check_mixedReferences.Visible = true;\r
956                 break;\r
957                 case "me":        // Motion Estimation\r
958                     if (drop_MotionEstimationMethod.SelectedIndex < 3)\r
959                     {\r
960                         drop_MotionEstimationRange.Visible = false;\r
961                         lbl_merange.Visible = false;\r
962                         drop_MotionEstimationRange.SelectedIndex = 0;\r
963                     }\r
964                     else\r
965                     {\r
966                         drop_MotionEstimationRange.Visible = true;\r
967                         lbl_merange.Visible = true;\r
968                     }\r
969                 break;\r
970                 case "subq":        // subme\r
971                     if (drop_subpixelMotionEstimation.SelectedIndex != 0 && drop_subpixelMotionEstimation.SelectedIndex < 7)\r
972                     {\r
973                         slider_psyrd.Visible = false;\r
974                         slider_psyrd.Value = 10;\r
975                         lbl_psyrd.Visible = false;\r
976 \r
977 \r
978                         slider_psytrellis.Visible = false;\r
979                         slider_psytrellis.Value = 0;\r
980                         lbl_psytrellis.Visible = false;\r
981                     }\r
982                     else\r
983                     {\r
984                         slider_psyrd.Visible = true;\r
985                         lbl_psyrd.Visible = true;\r
986 \r
987                         if (drop_trellis.SelectedIndex >= 2 && check_Cabac.Checked && slider_psytrellis.Visible == false)\r
988                         {\r
989                             slider_psytrellis.Visible = true;\r
990                             lbl_psytrellis.Visible = true;\r
991                         }\r
992                     }\r
993                 break;\r
994                 case "trellis":        // subme\r
995                     if (drop_trellis.SelectedIndex < 2)\r
996                     {\r
997                         slider_psytrellis.Visible = false;\r
998                         slider_psytrellis.Value = 0;\r
999                         lbl_psytrellis.Visible = false;\r
1000                     }\r
1001                     else\r
1002                     {\r
1003                         if ((drop_subpixelMotionEstimation.SelectedIndex == 0 || drop_subpixelMotionEstimation.SelectedIndex >= 7) && check_Cabac.Checked && slider_psytrellis.Visible == false)\r
1004                         {\r
1005                             slider_psytrellis.Visible = true;\r
1006                             lbl_psytrellis.Visible = true;\r
1007                         }\r
1008                     }\r
1009                 break;\r
1010             }\r
1011         }\r
1012     }\r
1013 }\r