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