OSDN Git Service

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