OSDN Git Service

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