OSDN Git Service

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