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