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