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 "me": // Motion Estimation\r
929                     if (drop_MotionEstimationMethod.SelectedIndex < 3)\r
930                     {\r
931                         drop_MotionEstimationRange.Visible = false;\r
932                         lbl_merange.Visible = false;\r
933                         drop_MotionEstimationRange.SelectedIndex = 0;\r
934                     }\r
935                     else\r
936                     {\r
937                         drop_MotionEstimationRange.Visible = true;\r
938                         lbl_merange.Visible = true;\r
939                     }\r
940                     break;\r
941                 case "subq": // subme\r
942                     if (drop_subpixelMotionEstimation.SelectedIndex != 0 &&\r
943                         drop_subpixelMotionEstimation.SelectedIndex < 7)\r
944                     {\r
945                         slider_psyrd.Visible = false;\r
946                         slider_psyrd.Value = 10;\r
947                         lbl_psyrd.Visible = false;\r
948 \r
949                         slider_psytrellis.Visible = false;\r
950                         slider_psytrellis.Value = 0;\r
951                         lbl_psytrellis.Visible = false;\r
952                     }\r
953                     else\r
954                     {\r
955                         slider_psyrd.Visible = true;\r
956                         lbl_psyrd.Visible = true;\r
957 \r
958                         if (drop_trellis.SelectedIndex >= 2 && slider_psytrellis.Visible == false)\r
959                         {\r
960                             slider_psytrellis.Visible = true;\r
961                             lbl_psytrellis.Visible = true;\r
962                         }\r
963                     }\r
964                     break;\r
965                 case "trellis": // subme\r
966                     if (drop_trellis.SelectedIndex > 0 && drop_trellis.SelectedIndex < 2)\r
967                     {\r
968                         slider_psytrellis.Visible = false;\r
969                         slider_psytrellis.Value = 0;\r
970                         lbl_psytrellis.Visible = false;\r
971                     }\r
972                     else\r
973                     {\r
974                         if ((drop_subpixelMotionEstimation.SelectedIndex == 0 || drop_subpixelMotionEstimation.SelectedIndex >= 7) && slider_psytrellis.Visible == false)\r
975                         {\r
976                             slider_psytrellis.Visible = true;\r
977                             lbl_psytrellis.Visible = true;\r
978                         }\r
979                     }\r
980                     break;\r
981             }\r
982         }\r
983 \r
984         /* UI Events */\r
985 \r
986         private void widgetControlChanged(object sender, EventArgs e)\r
987         {\r
988             Control changedControlName = (Control) sender;\r
989             string controlName = string.Empty;\r
990 \r
991             switch (changedControlName.Name.Trim())\r
992             {\r
993                 case "drop_refFrames":\r
994                     controlName = "ref";\r
995                     break;\r
996                 case "drop_bFrames":\r
997                     controlName = "bframes";\r
998                     break;\r
999                 case "drop_directPrediction":\r
1000                     controlName = "direct";\r
1001                     break;\r
1002                 case "check_weightp":\r
1003                     controlName = "weightp";\r
1004                     break;\r
1005                 case "combo_pyrmidalBFrames":\r
1006                     controlName = "b-pyramid";\r
1007                     break;\r
1008                 case "drop_MotionEstimationMethod":\r
1009                     controlName = "me";\r
1010                     break;\r
1011                 case "drop_MotionEstimationRange":\r
1012                     controlName = "merange";\r
1013                     break;\r
1014                 case "drop_subpixelMotionEstimation":\r
1015                     controlName = "subq";\r
1016                     break;\r
1017                 case "drop_analysis":\r
1018                     controlName = "analyse";\r
1019                     break;\r
1020                 case "check_8x8DCT":\r
1021                     controlName = "8x8dct";\r
1022                     break;\r
1023                 case "drop_deblockAlpha":\r
1024                     controlName = "deblock";\r
1025                     break;\r
1026                 case "drop_deblockBeta":\r
1027                     controlName = "deblock";\r
1028                     break;\r
1029                 case "drop_trellis":\r
1030                     controlName = "trellis";\r
1031                     break;\r
1032                 case "check_noDCTDecimate":\r
1033                     controlName = "no-dct-decimate";\r
1034                     break;\r
1035                 case "check_Cabac":\r
1036                     controlName = "cabac";\r
1037                     break;\r
1038                 case "slider_psyrd":\r
1039                     controlName = "psy-rd";\r
1040                     break;\r
1041                 case "slider_psytrellis":\r
1042                     controlName = "psy-rd";\r
1043                     break;\r
1044                 case "slider_adaptiveQuantStrength":\r
1045                     controlName = "aq-strength";\r
1046                     break;\r
1047                 case "drop_adaptBFrames":\r
1048                     controlName = "b-adapt";\r
1049                     break;\r
1050             }\r
1051             OnX264WidgetChange(controlName);\r
1052         }\r
1053 \r
1054         private void rtf_x264Query_TextChanged(object sender, EventArgs e)\r
1055         {\r
1056             if (rtf_x264Query.Text.EndsWith("\n"))\r
1057             {\r
1058                 string query = rtf_x264Query.Text.Replace("\n", string.Empty);\r
1059                 Reset2Defaults();\r
1060                 rtf_x264Query.Text = query;\r
1061                 this.StandardizeOptString();\r
1062                 this.SetCurrentSettingsInPanel();\r
1063 \r
1064                 if (rtf_x264Query.Text == string.Empty)\r
1065                     Reset2Defaults();\r
1066             }\r
1067         }\r
1068 \r
1069         private void btn_reset_Click(object sender, EventArgs e)\r
1070         {\r
1071             rtf_x264Query.Text = string.Empty;\r
1072             Reset2Defaults();\r
1073         }\r
1074     }\r
1075 }