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