OSDN Git Service

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