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         /* \r
15          * TODO This code was ported from the obj-c MacGUI code. It's really messy and could really do with being cleaned up\r
16          * at some point.\r
17          */\r
18 \r
19         /// <summary>\r
20         /// Initializes a new instance of the x264 panel user control\r
21         /// </summary>\r
22         public x264Panel()\r
23         {\r
24             InitializeComponent();\r
25 \r
26             if (Properties.Settings.Default.tooltipEnable)\r
27                 ToolTip.Active = true;\r
28 \r
29             Reset2Defaults();\r
30         }\r
31 \r
32         /// <summary>\r
33         /// Gets or sets the X264 query string\r
34         /// </summary>\r
35         public string X264Query\r
36         {\r
37             get { return " -x " + rtf_x264Query.Text; }\r
38             set { rtf_x264Query.Text = value; }\r
39         }\r
40         \r
41         /// <summary>\r
42         /// Reset all components to defaults and clears the x264 rtf box\r
43         /// </summary>\r
44         public void Reset2Defaults()\r
45         {\r
46             check_8x8DCT.CheckState = CheckState.Checked;\r
47             check_Cabac.CheckState = CheckState.Checked;\r
48             check_mixedReferences.CheckState = CheckState.Checked;\r
49             check_noDCTDecimate.CheckState = CheckState.Unchecked;\r
50             check_noFastPSkip.CheckState = CheckState.Unchecked;\r
51             check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
52             check_weightedBFrames.CheckState = CheckState.Checked;\r
53             drop_analysis.SelectedIndex = 0;\r
54             drop_bFrames.SelectedIndex = 0;\r
55             drop_deblockAlpha.SelectedIndex = 0;\r
56             drop_deblockBeta.SelectedIndex = 0;\r
57             drop_directPrediction.SelectedIndex = 0;\r
58             drop_MotionEstimationMethod.SelectedIndex = 0;\r
59             drop_MotionEstimationRange.SelectedIndex = 0;\r
60             drop_refFrames.SelectedIndex = 0;\r
61             drop_subpixelMotionEstimation.SelectedIndex = 0;\r
62             drop_trellis.SelectedIndex = 0;\r
63             slider_psyrd.Value = 10;\r
64             slider_psytrellis.Value = 0;\r
65             drop_adaptBFrames.SelectedIndex = 0;\r
66 \r
67             rtf_x264Query.Text = "";\r
68         }\r
69 \r
70         /// <summary>\r
71         /// Iterate over every x264 option, standardize it, write the full string to the x264 rtf box\r
72         /// </summary>\r
73         public void X264_StandardizeOptString()\r
74         {\r
75             /* Set widgets depending on the opt string in field */\r
76             String thisOpt; // The separated option such as "bframes=3"\r
77             String optName; // The option name such as "bframes"\r
78             String optValue;// The option value such as "3"\r
79             String changedOptString = "";\r
80             String[] currentOptsArray;\r
81 \r
82             /*First, we get an opt string to process */\r
83             String currentOptString = rtf_x264Query.Text;\r
84 \r
85             /*verify there is an opt string to process */\r
86             if (currentOptString.Contains("="))\r
87             {\r
88                 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/\r
89                 currentOptsArray = currentOptString.Split(':');\r
90 \r
91                 /*iterate through the array and get <opts> and <values*/\r
92                 int loopcounter;\r
93                 int currentOptsArrayCount = currentOptsArray.Length;\r
94                 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)\r
95                 {\r
96                     thisOpt = currentOptsArray[loopcounter];\r
97                     if (currentOptsArray[currentOptsArrayCount - 1] == string.Empty)\r
98                         break;\r
99 \r
100                     String[] splitOptRange = thisOpt.Split('=');\r
101                     if (thisOpt != "")\r
102                     {\r
103                         if (thisOpt.Contains("="))\r
104                         {\r
105                             optName = splitOptRange[0];\r
106                             optValue = splitOptRange[1];\r
107 \r
108                             /* Standardize the names here depending on whats in the string */\r
109                             optName = X264_StandardizeOptNames(optName);\r
110                             thisOpt = optName + "=" + optValue;\r
111                         }\r
112                         else // No value given so we use a default of "1"\r
113                         {\r
114                             optName = thisOpt;\r
115                             /* Standardize the names here depending on whats in the string */\r
116                             optName = X264_StandardizeOptNames(optName);\r
117                             thisOpt = optName + "=1";\r
118                         }\r
119                     }\r
120 \r
121                     /* Construct New String for opts here */\r
122                     if (thisOpt == string.Empty)\r
123                         changedOptString = changedOptString + thisOpt;\r
124                     else\r
125                     {\r
126                         if (changedOptString == string.Empty)\r
127                             changedOptString = thisOpt;\r
128                         else\r
129                             changedOptString = changedOptString + ":" + thisOpt;\r
130                     }\r
131                 }\r
132             }\r
133 \r
134             /* Change the option string to reflect the new standardized option string */\r
135             if (changedOptString != "")\r
136                 rtf_x264Query.Text = changedOptString;\r
137         }\r
138 \r
139         /// <summary>\r
140         /// Take a single option and standardize it. Returns as a String\r
141         /// Input: String. - Single X264 Option. Name only\r
142         /// Output: String - Single X264 Option. Name only. Changed to standard format\r
143         /// </summary>\r
144         /// <param name="cleanOptNameString"></param>\r
145         /// <returns></returns>\r
146         private static string X264_StandardizeOptNames(String cleanOptNameString)\r
147         {\r
148             String input = cleanOptNameString;\r
149 \r
150             if (input.Equals("ref") || input.Equals("frameref"))\r
151                 cleanOptNameString = "ref";\r
152 \r
153             /*No Fast PSkip nofast_pskip*/\r
154             if (input.Equals("no-fast-pskip") || input.Equals("no_fast_pskip") || input.Equals("nofast_pskip"))\r
155                 cleanOptNameString = "no-fast-pskip";\r
156 \r
157             /*No Dict Decimate*/\r
158             if (input.Equals("no-dct-decimate") || input.Equals("no_dct_decimate") || input.Equals("nodct_decimate"))\r
159                 cleanOptNameString = "no-dct-decimate";\r
160 \r
161             /*Subme*/\r
162             if (input.Equals("subme"))\r
163                 cleanOptNameString = "subq";\r
164 \r
165             /*ME Range*/\r
166             if (input.Equals("me-range") || input.Equals("me_range"))\r
167                 cleanOptNameString = "merange";\r
168 \r
169             /*WeightB*/\r
170             if (input.Equals("weight-b") || input.Equals("weight_b"))\r
171                 cleanOptNameString = "weightb";\r
172 \r
173             /*B Pyramid*/\r
174             if (input.Equals("b_pyramid"))\r
175                 cleanOptNameString = "b-pyramid";\r
176 \r
177             /*Direct Prediction*/\r
178             if (input.Equals("direct-pred") || input.Equals("direct_pred"))\r
179                 cleanOptNameString = "direct";\r
180 \r
181             /*Deblocking*/\r
182             if (input.Equals("filter"))\r
183                 cleanOptNameString = "deblock";\r
184 \r
185             /*Analysis*/\r
186             if (input.Equals("partitions"))\r
187                 cleanOptNameString = "analyse";\r
188 \r
189             return cleanOptNameString;\r
190         }\r
191 \r
192         /// <summary>\r
193         /// Resets the GUI widgets to the contents of the option string.\r
194         /// </summary>\r
195         public void X264_SetCurrentSettingsInPanel()\r
196         {\r
197             /* Set widgets depending on the opt string in field */\r
198             String thisOpt; // The separated option such as "bframes=3"\r
199             String optName; // The option name such as "bframes"\r
200             String optValue;// The option value such as "3"\r
201             String[] currentOptsArray;\r
202 \r
203             //Set currentOptString to the contents of the text box.\r
204             String currentOptString = rtf_x264Query.Text.Replace("\n", "");\r
205 \r
206             /*verify there is an opt string to process */\r
207             if (currentOptString.Contains("="))\r
208             {\r
209                 /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/\r
210                 currentOptsArray = currentOptString.Split(':');\r
211 \r
212                 /*iterate through the array and get <opts> and <values*/\r
213                 int loopcounter;\r
214                 int currentOptsArrayCount = currentOptsArray.Length;\r
215 \r
216                 /*iterate through the array and get <opts> and <values*/\r
217                 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)\r
218                 {\r
219                     thisOpt = currentOptsArray[loopcounter];\r
220                     String[] splitOptRange = thisOpt.Split('=');\r
221 \r
222                     if (thisOpt.Contains("="))\r
223                     {\r
224                         optName = splitOptRange[0];\r
225                         optValue = splitOptRange[1];\r
226 \r
227                         /*Run through the available widgets for x264 opts and set them, as you add widgets, \r
228                             they need to be added here. This should be moved to its own method probably*/\r
229                         switch (optName)\r
230                         {\r
231                             case "bframes":\r
232                                 drop_bFrames.SelectedItem = optValue;\r
233                                 continue;\r
234                             case "ref":\r
235                                 drop_refFrames.SelectedItem = optValue;\r
236                                 continue;\r
237                             case "no-fast-pskip":\r
238                                 check_noFastPSkip.CheckState = CheckState.Checked;\r
239                                 continue;\r
240                             case "no-dct-decimate":\r
241                                 check_noDCTDecimate.CheckState = CheckState.Checked;\r
242                                 continue;\r
243                             case "subq":\r
244                                 drop_subpixelMotionEstimation.SelectedItem = optValue;\r
245                                 continue;\r
246                             case "trellis":\r
247                                 drop_trellis.SelectedItem = optValue;\r
248                                 continue;\r
249                             case "mixed-refs":\r
250                                 check_mixedReferences.CheckState = CheckState.Checked;\r
251                                 continue;\r
252                             case "me":\r
253                                 if (optValue.Equals("dia"))\r
254                                     drop_MotionEstimationMethod.SelectedItem = "Diamond";\r
255                                 else if (optValue.Equals("hex"))\r
256                                     drop_MotionEstimationMethod.SelectedItem = "Hexagon";\r
257                                 else if (optValue.Equals("umh"))\r
258                                     drop_MotionEstimationMethod.SelectedItem = "Uneven Multi-Hexagon";\r
259                                 else if (optValue.Equals("esa"))\r
260                                     drop_MotionEstimationMethod.SelectedItem = "Exhaustive";\r
261                                 else if (optValue.Equals("tesa"))\r
262                                     drop_MotionEstimationMethod.SelectedItem = "Transformed Exhaustive";\r
263                                 continue;\r
264                             case "merange":\r
265                                 drop_MotionEstimationRange.SelectedItem = optValue;\r
266                                 continue;\r
267                             case "b-adapt":\r
268                                 int badapt;\r
269                                 int.TryParse(optValue, out badapt);\r
270                                 drop_adaptBFrames.SelectedIndex = (badapt + 1);\r
271                                 continue;\r
272                             case "weightb":\r
273                                 if (optValue != "0")\r
274                                     check_weightedBFrames.CheckState = CheckState.Checked;\r
275                                 else\r
276                                     check_weightedBFrames.CheckState = CheckState.Unchecked;\r
277                                 continue;\r
278                             case "b-pyramid":\r
279                                 check_pyrmidalBFrames.CheckState = CheckState.Checked;\r
280                                 continue;\r
281                             case "direct":\r
282                                 if (optValue == "auto")\r
283                                     optValue = "Automatic";\r
284 \r
285                                 if (optValue != "")\r
286                                 {\r
287                                     Char[] letters = optValue.ToCharArray();\r
288                                     letters[0] = Char.ToUpper(letters[0]);\r
289                                     optValue = new string(letters);\r
290                                 }\r
291 \r
292                                 drop_directPrediction.SelectedItem = optValue;\r
293                                 continue;\r
294                             case "deblock":\r
295                                 string[] splitDeblock = optValue.Split(',');\r
296                                 string alphaDeblock = splitDeblock[0];\r
297                                 string betaDeblock = splitDeblock[1];\r
298 \r
299                                 if (alphaDeblock.Equals("0") && betaDeblock.Replace("\n", "").Equals("0"))\r
300                                 {\r
301                                     drop_deblockAlpha.SelectedItem = "Default (0)";\r
302                                     drop_deblockBeta.SelectedItem = "Default (0)";\r
303                                 }\r
304                                 else\r
305                                 {\r
306                                     drop_deblockAlpha.SelectedItem = !alphaDeblock.Equals("0") ? alphaDeblock : "0";\r
307 \r
308                                     drop_deblockBeta.SelectedItem = !betaDeblock.Replace("\n", "").Equals("0") ? betaDeblock.Replace("\n", "") : "0";\r
309                                 }\r
310                                 continue;\r
311                             case "analyse":\r
312                                 if (optValue.Equals("p8x8,b8x8,i8x8,i4x4"))\r
313                                     drop_analysis.SelectedItem = "Default (some)";\r
314                                 if (optValue.Equals("none"))\r
315                                     drop_analysis.SelectedItem = "None";\r
316                                 if (optValue.Equals("all"))\r
317                                     drop_analysis.SelectedItem = "All";\r
318                                 continue;\r
319                             case "8x8dct":\r
320                                 check_8x8DCT.CheckState = optValue == "1" ? CheckState.Checked : CheckState.Unchecked;\r
321                                 continue;\r
322                             case "cabac":\r
323                                 check_Cabac.CheckState = CheckState.Unchecked;\r
324                                 continue;\r
325                             case "psy-rd":\r
326                                 string[] x = optValue.Split(',');\r
327 \r
328                                 double psyrd, psytrellis;\r
329                                 int val, val2;\r
330 \r
331                                 // default psy-rd = 1 (10 for the slider)\r
332                                 psyrd = double.TryParse(x[0], out psyrd) ? psyrd * 10 : 10.0;\r
333                                 // default psy-trellis = 0\r
334                                 psytrellis = double.TryParse(x[1], out psytrellis) ? psytrellis * 10 : 0.0; \r
335 \r
336                                 int.TryParse(psyrd.ToString(), out val);\r
337                                 int.TryParse(psytrellis.ToString(), out val2);\r
338 \r
339                                 slider_psyrd.Value = val;\r
340                                 slider_psytrellis.Value = val2;\r
341                                 continue;\r
342                         }\r
343                     }\r
344                 }\r
345             }\r
346         }\r
347 \r
348         /// <summary>\r
349         /// This function will update the X264 Query when one of the GUI widgets changes.\r
350         /// </summary>\r
351         private void OnX264WidgetChange(string sender)\r
352         {\r
353             Animate(sender);\r
354             String optNameToChange = sender;\r
355             String currentOptString = rtf_x264Query.Text;\r
356 \r
357             /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after\r
358                 the first character of the opt string (hence the ":") */\r
359             String checkOptNameToChange = ":" + optNameToChange + "=";\r
360             String checkOptNameToChangeBegin = optNameToChange + "=";\r
361 \r
362             // IF the current H264 Option String Contains Multiple Items or Just 1 Item\r
363             if ((currentOptString.Contains(checkOptNameToChange)) || (currentOptString.StartsWith(checkOptNameToChangeBegin)))\r
364                 HasOptions(currentOptString, optNameToChange);\r
365             else // IF there is no options in the rich text box!\r
366                 HasNoOptions(optNameToChange);\r
367         }\r
368 \r
369         /// <summary>\r
370         /// Called when the current x264 option string contains multiple (or a single) item(s) in it seperated by :\r
371         /// it updates the current option that the widget corrosponds to, if it is already in thes string.\r
372         /// </summary>\r
373         /// <param name="currentOptString"></param>\r
374         /// <param name="optNameToChange"></param>\r
375         private void HasOptions(string currentOptString, string optNameToChange)\r
376         {\r
377             String thisOpt;             // The separated option such as "bframes=3"\r
378             String optName;        // The option name such as "bframes"\r
379             String[] currentOptsArray;\r
380 \r
381             /* Create new empty opt string*/\r
382             String changedOptString = "";\r
383 \r
384             /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/\r
385             currentOptsArray = currentOptString.Split(':');\r
386 \r
387             /*iterate through the array and get <opts> and <values*/\r
388             for (int loopcounter = 0; loopcounter < currentOptsArray.Length; loopcounter++)\r
389             {\r
390                 thisOpt = currentOptsArray[loopcounter];\r
391 \r
392                 if (thisOpt.Contains("="))\r
393                 {\r
394                     string[] splitOptRange = thisOpt.Split('=');\r
395 \r
396                     optName = splitOptRange[0];     // e.g bframes\r
397 \r
398                     /* \r
399                      * Run through the available widgets for x264 opts and set them, as you add widgets,\r
400                      * they need to be added here. This should be moved to its own method probably\r
401                      * If the optNameToChange is found, appropriately change the value or delete it if\r
402                      * "unspecified" is set.\r
403                      */\r
404                     if (optName.Equals(optNameToChange))\r
405                     {\r
406                         if (optNameToChange.Equals("deblock"))\r
407                         {\r
408                             String da = drop_deblockAlpha.SelectedItem.ToString();\r
409                             String db = drop_deblockBeta.SelectedItem.ToString();\r
410 \r
411                             if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))\r
412                             {\r
413                                 drop_deblockBeta.SelectedItem = "Default (0)";\r
414                                 drop_deblockAlpha.SelectedItem = "Default (0)";\r
415                                 thisOpt = "";\r
416                             }\r
417                             else if ((!da.Contains("Default")) && (db.Contains("Default")))\r
418                             {\r
419                                 drop_deblockBeta.SelectedItem = "0";\r
420                                 thisOpt = "deblock=" + da + ",0";\r
421                             }\r
422                             else if ((da.Contains("Default")) && (!db.Contains("Default")))\r
423                             {\r
424                                 drop_deblockAlpha.SelectedItem = "0";\r
425                                 thisOpt = "deblock=0," + db;\r
426                             }\r
427                             else if ((!da.Contains("Default")) && (!db.Contains("Default")))\r
428                                 thisOpt = "deblock=" + da + "," + db;\r
429                         }\r
430                         else if (optNameToChange.Equals("psy-rd"))\r
431                         {\r
432                             if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)\r
433                                 thisOpt = "";\r
434                             else\r
435                             {\r
436                                 double psyrd = slider_psyrd.Value * 0.1;\r
437                                 double psytre = slider_psytrellis.Value * 0.1;\r
438 \r
439                                 string rd = psyrd.ToString("f1");\r
440                                 string rt = psytre.ToString("f1");\r
441 \r
442                                 thisOpt = "psy-rd=" + rd + "," + rt;\r
443                             }\r
444                         }\r
445                         else if (optNameToChange.Equals("mixed-refs"))\r
446                             thisOpt = check_mixedReferences.CheckState == CheckState.Checked ? "mixed-refs=1" : "mixed-refs=0";\r
447                         else if (optNameToChange.Equals("weightb"))\r
448                             thisOpt = check_weightedBFrames.CheckState == CheckState.Checked ? "" : "weightb=0";\r
449                         else if (optNameToChange.Equals("b-pyramid"))\r
450                             thisOpt = check_pyrmidalBFrames.CheckState == CheckState.Checked ? "b-pyramid=1" : "";\r
451                         else if (optNameToChange.Equals("no-fast-pskip"))\r
452                             thisOpt = check_noFastPSkip.CheckState == CheckState.Checked ? "no-fast-pskip=1" : "";\r
453                         else if (optNameToChange.Equals("no-dct-decimate"))\r
454                             thisOpt = check_noDCTDecimate.CheckState == CheckState.Checked ? "no-dct-decimate=1" : "";\r
455                         else if (optNameToChange.Equals("8x8dct"))\r
456                             thisOpt = check_8x8DCT.CheckState == CheckState.Checked ? "8x8dct=1" : "8x8dct=0";\r
457                         else if (optNameToChange.Equals("cabac"))\r
458                             thisOpt = check_Cabac.CheckState == CheckState.Checked ? "" : "cabac=0";\r
459                         else if (optNameToChange.Equals("me"))\r
460                         {\r
461                             switch (drop_MotionEstimationMethod.SelectedIndex)\r
462                             {\r
463                                 case 1:\r
464                                     thisOpt = "me=dia";\r
465                                     break;\r
466 \r
467                                 case 2:\r
468                                     thisOpt = "me=hex";\r
469                                     break;\r
470 \r
471                                 case 3:\r
472                                     thisOpt = "me=umh";\r
473                                     break;\r
474 \r
475                                 case 4:\r
476                                     thisOpt = "me=esa";\r
477                                     break;\r
478 \r
479                                 case 5:\r
480                                     thisOpt = "me=tesa";\r
481                                     break;\r
482 \r
483                                 default:\r
484                                     thisOpt = "";\r
485                                     break;\r
486                             }\r
487                         }\r
488                         else if (optNameToChange.Equals("direct"))\r
489                         {\r
490                             switch (drop_directPrediction.SelectedIndex)\r
491                             {\r
492                                 case 1:\r
493                                     thisOpt = "direct=none";\r
494                                     break;\r
495 \r
496                                 case 2:\r
497                                     thisOpt = "direct=spatial";\r
498                                     break;\r
499 \r
500                                 case 3:\r
501                                     thisOpt = "direct=temporal";\r
502                                     break;\r
503 \r
504                                 case 4:\r
505                                     thisOpt = "direct=auto";\r
506                                     break;\r
507 \r
508                                 default:\r
509                                     thisOpt = "";\r
510                                     break;\r
511                             }\r
512                         }\r
513                         else if (optNameToChange.Equals("analyse"))\r
514                         {\r
515                             switch (drop_analysis.SelectedIndex)\r
516                             {\r
517                                 case 1:\r
518                                     thisOpt = "analyse=none";\r
519                                     break;\r
520 \r
521                                 case 2:\r
522                                     thisOpt = "analyse=all";\r
523                                     break;\r
524 \r
525                                 default:\r
526                                     thisOpt = "";\r
527                                     break;\r
528                             }\r
529                         }\r
530                         else if (optNameToChange.Equals("merange"))\r
531                         {\r
532                             thisOpt = !drop_MotionEstimationRange.SelectedItem.ToString().Contains("Default")\r
533                                           ? "merange=" + drop_MotionEstimationRange.SelectedItem\r
534                                           : "";\r
535                         }\r
536                         else if (optNameToChange.Equals("b-adapt"))\r
537                         {\r
538                             thisOpt = !drop_adaptBFrames.SelectedItem.ToString().Contains("Default")\r
539                                           ? "b-adapt=" + (drop_adaptBFrames.SelectedIndex - 1)\r
540                                           : "";\r
541                         }\r
542                         else if (optNameToChange.Equals("ref"))\r
543                         {\r
544                             thisOpt = !drop_refFrames.SelectedItem.ToString().Contains("Default")\r
545                                           ? "ref=" + drop_refFrames.SelectedItem\r
546                                           : "";\r
547                         }\r
548                         else if (optNameToChange.Equals("bframes"))\r
549                         {\r
550                             String value = drop_bFrames.SelectedItem.ToString();\r
551                             thisOpt = !drop_bFrames.SelectedItem.ToString().Contains("Default")\r
552                                           ? "bframes=" + value\r
553                                           : "";\r
554                         }\r
555                         else if (optNameToChange.Equals("subq"))\r
556                         {\r
557                             String value = drop_subpixelMotionEstimation.SelectedItem.ToString();\r
558                             thisOpt = !drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default")\r
559                                           ? "subq=" + value\r
560                                           : "";\r
561                         }\r
562                         else if (optNameToChange.Equals("trellis"))\r
563                         {\r
564                             String value = drop_trellis.SelectedItem.ToString();\r
565                             thisOpt = !drop_trellis.SelectedItem.ToString().Contains("Default")\r
566                                           ? "trellis=" + value\r
567                                           : "";\r
568                         }\r
569                     }\r
570                 }\r
571 \r
572                 /* Construct New String for opts here */\r
573                 if (!thisOpt.Equals(""))\r
574                     changedOptString = changedOptString.Equals("") ? thisOpt : changedOptString + ":" + thisOpt;\r
575             }\r
576 \r
577             /* Change the option string to reflect the new mod settings */\r
578             rtf_x264Query.Text = changedOptString;\r
579         }\r
580 \r
581         /// <summary>\r
582         /// Add's an option to the x264 query string.\r
583         /// Handles 2 cases.  1 Where rtf_x264Query.Text is empty, and one where there is an option with no value,\r
584         /// e.g no-fast-pskip\r
585         /// </summary>\r
586         /// <param name="optNameToChange"></param>\r
587         private void HasNoOptions(IEquatable<string> optNameToChange)\r
588         {\r
589             string colon = "";\r
590             if (rtf_x264Query.Text != "")\r
591                 colon = ":";\r
592 \r
593             string query = rtf_x264Query.Text;\r
594             if (optNameToChange.Equals("me"))\r
595             {\r
596                 switch (drop_MotionEstimationMethod.SelectedIndex)\r
597                 {\r
598                     case 1:\r
599                         query = query + colon + "me=dia";\r
600                         break;\r
601 \r
602                     case 2:\r
603                         query = query + colon + "me=hex";\r
604                         break;\r
605 \r
606                     case 3:\r
607                         query = query + colon + "me=umh";\r
608                         break;\r
609 \r
610                     case 4:\r
611                         query = query + colon + "me=esa";\r
612                         break;\r
613 \r
614                     case 5:\r
615                         query = query + colon + "me=tesa";\r
616                         break;\r
617 \r
618                     default:\r
619                         break;\r
620                 }\r
621             }\r
622             else if (optNameToChange.Equals("direct"))\r
623             {\r
624                 switch (drop_directPrediction.SelectedIndex)\r
625                 {\r
626                     case 1:\r
627                         query = query + colon + "direct=none";\r
628                         break;\r
629 \r
630                     case 2:\r
631                         query = query + colon + "direct=spatial";\r
632                         break;\r
633 \r
634                     case 3:\r
635                         query = query + colon + "direct=temporal";\r
636                         break;\r
637 \r
638                     case 4:\r
639                         query = query + colon + "direct=auto";\r
640                         break;\r
641 \r
642                     default:\r
643                         break;\r
644                 }\r
645             }\r
646             else if (optNameToChange.Equals("analyse"))\r
647             {\r
648                 switch (drop_analysis.SelectedIndex)\r
649                 {\r
650                     case 1:\r
651                         query = query + colon + "analyse=none";\r
652                         break;\r
653 \r
654                     case 2:\r
655                         query = query + colon + "analyse=all";\r
656                         break;\r
657 \r
658                     default:\r
659                         break;\r
660                 }\r
661             }\r
662             else if (optNameToChange.Equals("merange"))\r
663             {\r
664                 int value = drop_MotionEstimationRange.SelectedIndex + 3;\r
665                 query = query + colon + "merange=" + value;\r
666             }\r
667             else if (optNameToChange.Equals("b-adapt"))\r
668             {\r
669                 int value = drop_adaptBFrames.SelectedIndex - 1;\r
670                 query = query + colon + "b-adapt=" + value;\r
671             }\r
672 \r
673             else if (optNameToChange.Equals("deblock"))\r
674             {\r
675                 String da = drop_deblockAlpha.SelectedItem.ToString();\r
676                 String db = drop_deblockBeta.Text;\r
677 \r
678                 if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))\r
679                 {\r
680                     drop_deblockBeta.SelectedItem = "Default (0)";\r
681                     drop_deblockAlpha.SelectedItem = "Default (0)";\r
682                 }\r
683                 else\r
684                 {\r
685                     if (db.Contains("Default"))\r
686                         db = "0";\r
687 \r
688                     if (da.Contains("Default"))\r
689                         da = "0";\r
690 \r
691                     query = query + colon + "deblock=" + da + "," + db;\r
692                 }\r
693             }\r
694             else if (optNameToChange.Equals("psy-rd"))\r
695             {\r
696                 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)\r
697                     query += "";\r
698                 else\r
699                 {\r
700                     double psyrd = slider_psyrd.Value * 0.1;\r
701                     double psytre = slider_psytrellis.Value * 0.1;\r
702 \r
703                     string rd = psyrd.ToString("f1");\r
704                     string rt = psytre.ToString("f1");\r
705 \r
706                     query += colon + "psy-rd=" + rd + "," + rt;\r
707                 }\r
708             }\r
709             else if (optNameToChange.Equals("mixed-refs"))\r
710             {\r
711                 if (check_mixedReferences.CheckState == CheckState.Checked)\r
712                     query = query + colon + "mixed-refs=1";\r
713                 else\r
714                     query = query + colon + "mixed-refs=0";\r
715             }\r
716             else if (optNameToChange.Equals("weightb"))\r
717             {\r
718                 if (check_weightedBFrames.CheckState != CheckState.Checked)\r
719                     query = query + colon + "weightb=0";\r
720             }\r
721             else if (optNameToChange.Equals("b-pyramid"))\r
722             {\r
723                 if (check_pyrmidalBFrames.CheckState == CheckState.Checked)\r
724                     query = query + colon + "b-pyramid=1";\r
725             }\r
726             else if (optNameToChange.Equals("no-fast-pskip"))\r
727             {\r
728                 if (check_noFastPSkip.CheckState == CheckState.Checked)\r
729                     query = query + colon + "no-fast-pskip=1";\r
730             }\r
731             else if (optNameToChange.Equals("no-dct-decimate"))\r
732             {\r
733                 if (check_noDCTDecimate.CheckState == CheckState.Checked)\r
734                     query = query + colon + "no-dct-decimate=1";\r
735             }\r
736             else if (optNameToChange.Equals("8x8dct"))\r
737             {\r
738                 if (check_8x8DCT.CheckState == CheckState.Checked)\r
739                     query = query + colon + "8x8dct=1";\r
740             }\r
741             else if (optNameToChange.Equals("cabac"))\r
742             {\r
743                 if (check_Cabac.CheckState != CheckState.Checked)\r
744                     query = query + colon + "cabac=0";\r
745             }\r
746             else if (optNameToChange.Equals("ref"))\r
747             {\r
748                 if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))\r
749                     query = query + colon + "ref=" + drop_refFrames.SelectedItem;\r
750             }\r
751             else if (optNameToChange.Equals("bframes"))\r
752             {\r
753                 String value = drop_bFrames.SelectedItem.ToString();\r
754                 if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))\r
755                     query = query + colon + "bframes=" + value;\r
756             }\r
757             else if (optNameToChange.Equals("subq"))\r
758             {\r
759                 String value = drop_subpixelMotionEstimation.SelectedItem.ToString();\r
760                 if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))\r
761                     query = query + colon + "subq=" + value;\r
762             }\r
763             else if (optNameToChange.Equals("trellis"))\r
764             {\r
765                 if (!drop_trellis.SelectedItem.ToString().Contains("Default"))\r
766                     query = query + colon + "trellis=" + drop_trellis.SelectedItem;\r
767             }\r
768 \r
769             rtf_x264Query.Text = query;\r
770         }\r
771 \r
772         /// <summary>\r
773         /// Shows and hides controls based on the values of other controls.\r
774         /// </summary>\r
775         /// <param name="sender"></param>\r
776         private void Animate(string sender)\r
777         {\r
778             /* Lots of situations to cover.\r
779                    - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)\r
780                    - CABAC (when 0 turn off trellis)\r
781                    - analysis (if none, turn off 8x8dct)\r
782                    - refs (under 2, disable mixed-refs)\r
783                    - subme (if under 6, turn off psy-rd and psy-trel)\r
784                    - trellis (if 0, turn off psy-trel)\r
785                 */\r
786 \r
787             switch(sender)\r
788             {\r
789                 case "bframes":\r
790                     if (drop_bFrames.SelectedIndex >0 && drop_bFrames.SelectedIndex < 2  )\r
791                     {\r
792                         /* If the b-frame widget is at 0 or 1, the user has chosen\r
793                            not to use b-frames at all. So disable the options\r
794                            that can only be used when b-frames are enabled.        */\r
795                         check_weightedBFrames.Visible = false;\r
796                         check_pyrmidalBFrames.Visible = false;\r
797                         drop_directPrediction.Visible = false;\r
798                         lbl_direct_prediction.Visible = false;\r
799 \r
800                         check_weightedBFrames.CheckState = CheckState.Unchecked;\r
801                         check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
802                         drop_directPrediction.SelectedIndex = 0;\r
803 \r
804                         drop_adaptBFrames.Visible = false;\r
805                         lbl_adaptBFrames.Visible = false;\r
806                         drop_adaptBFrames.SelectedIndex = 0;\r
807                     }\r
808                     else if (drop_bFrames.SelectedIndex == 2)\r
809                     {\r
810                         /* Only 1 b-frame? Disable b-pyramid. */\r
811                         check_pyrmidalBFrames.Visible = false;\r
812                         check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
813 \r
814                         check_weightedBFrames.Visible = true;\r
815                         drop_directPrediction.Visible = true;\r
816                         lbl_direct_prediction.Visible = true;\r
817 \r
818                         drop_adaptBFrames.Visible = true;\r
819                         lbl_adaptBFrames.Visible = true;\r
820                     }\r
821                     else\r
822                     {\r
823                         check_weightedBFrames.Visible = true;\r
824                         check_pyrmidalBFrames.Visible = true;\r
825                         drop_directPrediction.Visible = true;\r
826                         lbl_direct_prediction.Visible = true;\r
827 \r
828                         drop_adaptBFrames.Visible = true;\r
829                         lbl_adaptBFrames.Visible = true;\r
830                     }\r
831                 break;\r
832                 case "cabac":\r
833                     if (check_Cabac.Checked == false)\r
834                     {\r
835                         /* Without CABAC entropy coding, trellis doesn't run. */\r
836                         drop_trellis.Visible = false;\r
837                         drop_trellis.SelectedIndex = 0;\r
838                         lbl_trellis.Visible = false;\r
839                     }\r
840                     else\r
841                     {\r
842                         drop_trellis.Visible = true;\r
843                         lbl_trellis.Visible = true;\r
844                     }\r
845                 break;\r
846                 case "analyse":\r
847                     if (drop_analysis.SelectedIndex == 1)\r
848                     {\r
849                         /* No analysis? Disable 8x8dct */\r
850                         check_8x8DCT.Visible = false;\r
851                         if (sender != "8x8dct")\r
852                             check_8x8DCT.CheckState = CheckState.Unchecked;\r
853                     }\r
854                     else\r
855                         check_8x8DCT.Visible = true;\r
856                 break;\r
857                 case "ref":\r
858                     if (drop_refFrames.SelectedIndex > 0 && drop_refFrames.SelectedIndex < 3)\r
859                     {\r
860                         check_mixedReferences.Visible = false;\r
861                         if (sender != "mixed-refs")\r
862                             check_mixedReferences.CheckState = CheckState.Unchecked;\r
863                     }\r
864                     else\r
865                         check_mixedReferences.Visible = true;\r
866                 break;\r
867                 case "me":        // Motion Estimation\r
868                     if (drop_MotionEstimationMethod.SelectedIndex < 3)\r
869                     {\r
870                         drop_MotionEstimationRange.Visible = false;\r
871                         lbl_merange.Visible = false;\r
872                         drop_MotionEstimationRange.SelectedIndex = 0;\r
873                     }\r
874                     else\r
875                     {\r
876                         drop_MotionEstimationRange.Visible = true;\r
877                         lbl_merange.Visible = true;\r
878                     }\r
879                 break;\r
880                 case "subq":        // subme\r
881                     if (drop_subpixelMotionEstimation.SelectedIndex != 0 && drop_subpixelMotionEstimation.SelectedIndex < 7)\r
882                     {\r
883                         slider_psyrd.Visible = false;\r
884                         slider_psyrd.Value = 10;\r
885                         lbl_psyrd.Visible = false;\r
886 \r
887 \r
888                         slider_psytrellis.Visible = false;\r
889                         slider_psytrellis.Value = 0;\r
890                         lbl_psytrellis.Visible = false;\r
891                     }\r
892                     else\r
893                     {\r
894                         slider_psyrd.Visible = true;\r
895                         lbl_psyrd.Visible = true;\r
896 \r
897                         if (drop_trellis.SelectedIndex >= 2 && check_Cabac.Checked && slider_psytrellis.Visible == false)\r
898                         {\r
899                             slider_psytrellis.Visible = true;\r
900                             lbl_psytrellis.Visible = true;\r
901                         }\r
902                     }\r
903                 break;\r
904                 case "trellis":        // subme\r
905                     if (drop_trellis.SelectedIndex > 0 && drop_trellis.SelectedIndex < 2 )\r
906                     {\r
907                         slider_psytrellis.Visible = false;\r
908                         slider_psytrellis.Value = 0;\r
909                         lbl_psytrellis.Visible = false;\r
910                     }\r
911                     else\r
912                     {\r
913                         if ((drop_subpixelMotionEstimation.SelectedIndex == 0 || drop_subpixelMotionEstimation.SelectedIndex >= 7) && check_Cabac.Checked && slider_psytrellis.Visible == false)\r
914                         {\r
915                             slider_psytrellis.Visible = true;\r
916                             lbl_psytrellis.Visible = true;\r
917                         }\r
918                     }\r
919                 break;\r
920             }\r
921         }\r
922 \r
923 \r
924         private void widgetControlChanged(object sender, EventArgs e)\r
925         {\r
926             Control changedControlName = (Control)sender;\r
927             string controlName = "";\r
928 \r
929             switch (changedControlName.Name.Trim())\r
930             {\r
931                 case "drop_refFrames":\r
932                     controlName = "ref";\r
933                     break;\r
934                 case "check_mixedReferences":\r
935                     controlName = "mixed-refs";\r
936                     break;\r
937                 case "drop_bFrames":\r
938                     controlName = "bframes";\r
939                     break;\r
940                 case "drop_directPrediction":\r
941                     controlName = "direct";\r
942                     break;\r
943                 case "check_weightedBFrames":\r
944                     controlName = "weightb";\r
945                     break;\r
946                 case "check_pyrmidalBFrames":\r
947                     controlName = "b-pyramid";\r
948                     break;\r
949                 case "drop_MotionEstimationMethod":\r
950                     controlName = "me";\r
951                     break;\r
952                 case "drop_MotionEstimationRange":\r
953                     controlName = "merange";\r
954                     break;\r
955                 case "drop_subpixelMotionEstimation":\r
956                     controlName = "subq";\r
957                     break;\r
958                 case "drop_analysis":\r
959                     controlName = "analyse";\r
960                     break;\r
961                 case "check_8x8DCT":\r
962                     controlName = "8x8dct";\r
963                     break;\r
964                 case "drop_deblockAlpha":\r
965                     controlName = "deblock";\r
966                     break;\r
967                 case "drop_deblockBeta":\r
968                     controlName = "deblock";\r
969                     break;\r
970                 case "drop_trellis":\r
971                     controlName = "trellis";\r
972                     break;\r
973                 case "check_noFastPSkip":\r
974                     controlName = "no-fast-pskip";\r
975                     break;\r
976                 case "check_noDCTDecimate":\r
977                     controlName = "no-dct-decimate";\r
978                     break;\r
979                 case "check_Cabac":\r
980                     controlName = "cabac";\r
981                     break;\r
982                 case "slider_psyrd":\r
983                     controlName = "psy-rd";\r
984                     break;\r
985                 case "slider_psytrellis":\r
986                     controlName = "psy-rd";\r
987                     break;\r
988                 case "drop_adaptBFrames":\r
989                     controlName = "b-adapt";\r
990                     break;\r
991             }\r
992             OnX264WidgetChange(controlName);\r
993         }\r
994         private void rtf_x264Query_TextChanged(object sender, EventArgs e)\r
995         {\r
996             if (rtf_x264Query.Text.EndsWith("\n"))\r
997             {\r
998                 string query = rtf_x264Query.Text.Replace("\n", "");\r
999                 Reset2Defaults();\r
1000                 rtf_x264Query.Text = query;\r
1001                 X264_StandardizeOptString();\r
1002                 X264_SetCurrentSettingsInPanel();\r
1003 \r
1004                 if (rtf_x264Query.Text == string.Empty)\r
1005                     Reset2Defaults();\r
1006             }\r
1007         }\r
1008         private void btn_reset_Click(object sender, EventArgs e)\r
1009         {\r
1010             rtf_x264Query.Text = "";\r
1011             Reset2Defaults();\r
1012         }\r
1013     }\r
1014 }