OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / Controls / x264Panel.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.ComponentModel;\r
4 using System.Drawing;\r
5 using System.Data;\r
6 using System.Text;\r
7 using System.Windows.Forms;\r
8 \r
9 namespace Handbrake.Controls\r
10 {\r
11     public partial class x264Panel : UserControl\r
12     {\r
13         public x264Panel()\r
14         {\r
15             InitializeComponent();\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 = 0;\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 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                                     if (!alphaDeblock.Equals("0"))\r
393                                         drop_deblockAlpha.SelectedItem = alphaDeblock;\r
394                                     else\r
395                                         drop_deblockAlpha.SelectedItem = "0";\r
396 \r
397                                     if (!betaDeblock.Replace("\n", "").Equals("0"))\r
398                                         drop_deblockBeta.SelectedItem = betaDeblock.Replace("\n", "");\r
399                                     else\r
400                                         drop_deblockBeta.SelectedItem = "0";\r
401                                 }\r
402                                 continue;\r
403                             case "analyse":\r
404                                 if (optValue.Equals("p8x8,b8x8,i8x8,i4x4"))\r
405                                     drop_analysis.SelectedItem = "Default (some)";\r
406                                 if (optValue.Equals("none"))\r
407                                     drop_analysis.SelectedItem = "None";\r
408                                 if (optValue.Equals("all"))\r
409                                     drop_analysis.SelectedItem = "All";\r
410                                 continue;\r
411                             case "8x8dct":\r
412                                 check_8x8DCT.CheckState = CheckState.Checked;\r
413                                 continue;\r
414                             case "cabac":\r
415                                 check_Cabac.CheckState = CheckState.Unchecked;\r
416                                 continue;\r
417                             case "psy-rd":\r
418                                 string[] x = optValue.Split(',');\r
419 \r
420                                 double psyrd = 0, psytrellis = 0;\r
421                                 int val, val2;\r
422                                 double.TryParse(x[0], out psyrd);\r
423                                 double.TryParse(x[1], out psytrellis);\r
424 \r
425                                 psyrd = psyrd * 10;\r
426                                 psytrellis = psytrellis * 10;\r
427 \r
428                                 int.TryParse(psyrd.ToString(), out val);\r
429                                 int.TryParse(psytrellis.ToString(), out val2);\r
430 \r
431                                 slider_psyrd.Value = val;\r
432                                 slider_psytrellis.Value = val2;\r
433                                 continue;\r
434                         }\r
435                     }\r
436                 }\r
437             }\r
438         }\r
439 \r
440         /// <summary>\r
441         /// This function will update the X264 Query when one of the GUI widgets changes.\r
442         /// </summary>\r
443         private void on_x264_WidgetChange(string sender)\r
444         {\r
445             animate(sender);\r
446             String optNameToChange = sender;\r
447             String currentOptString = rtf_x264Query.Text;\r
448 \r
449             /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after\r
450                 the first character of the opt string (hence the ":") */\r
451             String checkOptNameToChange = ":" + optNameToChange + "=";\r
452             String checkOptNameToChangeBegin = optNameToChange + "=";\r
453 \r
454             // IF the current H264 Option String Contains Multiple Items or Just 1 Item\r
455             if ((currentOptString.Contains(checkOptNameToChange)) || (currentOptString.StartsWith(checkOptNameToChangeBegin)))\r
456                 hasOptions(currentOptString, optNameToChange);\r
457             else // IF there is no options in the rich text box!\r
458                 hasNoOptions(optNameToChange);\r
459         }\r
460 \r
461         /// <summary>\r
462         /// Called when the current x264 option string contains multiple (or a single) item(s) in it seperated by :\r
463         /// it updates the current option that the widget corrosponds to, if it is already in thes string.\r
464         /// </summary>\r
465         /// <param name="currentOptString"></param>\r
466         /// <param name="optNameToChange"></param>\r
467         private void hasOptions(string currentOptString, string optNameToChange)\r
468         {\r
469             String thisOpt;             // The separated option such as "bframes=3"\r
470             String optName;        // The option name such as "bframes"\r
471             String[] currentOptsArray;\r
472 \r
473             /* Create new empty opt string*/\r
474             String changedOptString = "";\r
475 \r
476             /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/\r
477             currentOptsArray = currentOptString.Split(':');\r
478 \r
479             /*iterate through the array and get <opts> and <values*/\r
480             for (int loopcounter = 0; loopcounter < currentOptsArray.Length; loopcounter++)\r
481             {\r
482                 thisOpt = currentOptsArray[loopcounter];\r
483 \r
484                 if (thisOpt.Contains("="))\r
485                 {\r
486                     string[] splitOptRange = thisOpt.Split('=');\r
487 \r
488                     optName = splitOptRange[0];     // e.g bframes\r
489 \r
490                     /* \r
491                      * Run through the available widgets for x264 opts and set them, as you add widgets,\r
492                      * they need to be added here. This should be moved to its own method probably\r
493                      * If the optNameToChange is found, appropriately change the value or delete it if\r
494                      * "unspecified" is set.\r
495                      */\r
496                     if (optName.Equals(optNameToChange))\r
497                     {\r
498                         if (optNameToChange.Equals("deblock"))\r
499                         {\r
500                             String da = drop_deblockAlpha.SelectedItem.ToString();\r
501                             String db = drop_deblockBeta.SelectedItem.ToString();\r
502 \r
503                             if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))\r
504                             {\r
505                                 drop_deblockBeta.SelectedItem = "Default (0)";\r
506                                 drop_deblockAlpha.SelectedItem = "Default (0)";\r
507                                 thisOpt = "";\r
508                             }\r
509                             else if ((!da.Contains("Default")) && (db.Contains("Default")))\r
510                             {\r
511                                 drop_deblockBeta.SelectedItem = "0";\r
512                                 thisOpt = "deblock=" + da + ",0";\r
513                             }\r
514                             else if ((da.Contains("Default")) && (!db.Contains("Default")))\r
515                             {\r
516                                 drop_deblockAlpha.SelectedItem = "0";\r
517                                 thisOpt = "deblock=0," + db;\r
518                             }\r
519                             else if ((!da.Contains("Default")) && (!db.Contains("Default")))\r
520                                 thisOpt = "deblock=" + da + "," + db;\r
521                         }\r
522                         else if (optNameToChange.Equals("psy-rd"))\r
523                         {\r
524                             if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)\r
525                                 thisOpt = "";\r
526                             else\r
527                             {\r
528                                 double psyrd = slider_psyrd.Value * 0.1;\r
529                                 double psytre = slider_psytrellis.Value * 0.1;\r
530                                 string rd, rt;\r
531                                 if (psyrd == 1)\r
532                                     rd = "1.0";\r
533                                 else\r
534                                     rd = psyrd.ToString();\r
535 \r
536                                 if (psytre == 1)\r
537                                     rt = "1.0";\r
538                                 else\r
539                                     rt = psytre.ToString();\r
540 \r
541                                 thisOpt = "psy-rd=" + rd + "," + rt;\r
542                             }\r
543                         }\r
544                         else if (optNameToChange.Equals("mixed-refs"))\r
545                         {\r
546                             if (check_mixedReferences.CheckState == CheckState.Checked)\r
547                                 thisOpt = "mixed-refs=1";\r
548                             else\r
549                                 thisOpt = "";\r
550                         }\r
551                         else if (optNameToChange.Equals("weightb"))\r
552                         {\r
553                             if (check_weightedBFrames.CheckState == CheckState.Checked)\r
554                                 thisOpt = "weightb=1";\r
555                             else\r
556                                 thisOpt = "";\r
557                         }\r
558                         else if (optNameToChange.Equals("b-pyramid"))\r
559                         {\r
560                             if (check_pyrmidalBFrames.CheckState == CheckState.Checked)\r
561                                 thisOpt = "b-pyramid=1";\r
562                             else\r
563                                 thisOpt = "";\r
564                         }\r
565                         else if (optNameToChange.Equals("no-fast-pskip"))\r
566                         {\r
567                             if (check_noFastPSkip.CheckState == CheckState.Checked)\r
568                                 thisOpt = "no-fast-pskip=1";\r
569                             else\r
570                                 thisOpt = "";\r
571                         }\r
572                         else if (optNameToChange.Equals("no-dct-decimate"))\r
573                         {\r
574                             if (check_noDCTDecimate.CheckState == CheckState.Checked)\r
575                                 thisOpt = "no-dct-decimate=1";\r
576                             else\r
577                                 thisOpt = "";\r
578                         }\r
579                         else if (optNameToChange.Equals("8x8dct"))\r
580                         {\r
581                             if (check_8x8DCT.CheckState == CheckState.Checked)\r
582                                 thisOpt = "8x8dct=1";\r
583                             else\r
584                                 thisOpt = "";\r
585                         }\r
586                         else if (optNameToChange.Equals("cabac"))\r
587                         {\r
588                             if (check_Cabac.CheckState == CheckState.Checked)\r
589                                 thisOpt = "";\r
590                             else\r
591                                 thisOpt = "cabac=0";\r
592                         }\r
593                         else if (optNameToChange.Equals("me"))\r
594                         {\r
595                             switch (drop_MotionEstimationMethod.SelectedIndex)\r
596                             {\r
597                                 case 1:\r
598                                     thisOpt = "me=dia";\r
599                                     break;\r
600 \r
601                                 case 2:\r
602                                     thisOpt = "me=hex";\r
603                                     break;\r
604 \r
605                                 case 3:\r
606                                     thisOpt = "me=umh";\r
607                                     break;\r
608 \r
609                                 case 4:\r
610                                     thisOpt = "me=esa";\r
611                                     break;\r
612 \r
613                                 case 5:\r
614                                     thisOpt = "me=tesa";\r
615                                     break;\r
616 \r
617                                 default:\r
618                                     thisOpt = "";\r
619                                     break;\r
620                             }\r
621                         }\r
622                         else if (optNameToChange.Equals("direct"))\r
623                         {\r
624                             switch (drop_directPrediction.SelectedIndex)\r
625                             {\r
626                                 case 1:\r
627                                     thisOpt = "direct=none";\r
628                                     break;\r
629 \r
630                                 case 2:\r
631                                     thisOpt = "direct=spatial";\r
632                                     break;\r
633 \r
634                                 case 3:\r
635                                     thisOpt = "direct=temporal";\r
636                                     break;\r
637 \r
638                                 case 4:\r
639                                     thisOpt = "direct=auto";\r
640                                     break;\r
641 \r
642                                 default:\r
643                                     thisOpt = "";\r
644                                     break;\r
645                             }\r
646                         }\r
647                         else if (optNameToChange.Equals("analyse"))\r
648                         {\r
649                             switch (drop_analysis.SelectedIndex)\r
650                             {\r
651                                 case 1:\r
652                                     thisOpt = "analyse=none";\r
653                                     break;\r
654 \r
655                                 case 2:\r
656                                     thisOpt = "analyse=all";\r
657                                     break;\r
658 \r
659                                 default:\r
660                                     thisOpt = "";\r
661                                     break;\r
662                             }\r
663                         }\r
664                         else if (optNameToChange.Equals("merange"))\r
665                         {\r
666                             if (!drop_MotionEstimationRange.SelectedItem.ToString().Contains("Default"))\r
667                                 thisOpt = "merange=" + drop_MotionEstimationRange.SelectedItem;\r
668                             else\r
669                                 thisOpt = "";\r
670                         }\r
671                         else if (optNameToChange.Equals("b-adapt"))\r
672                         {\r
673                             if (!drop_adaptBFrames.SelectedItem.ToString().Contains("Default"))\r
674                                 thisOpt = "b-adapt=" + (drop_adaptBFrames.SelectedIndex - 1);\r
675                             else\r
676                                 thisOpt = "";\r
677                         }\r
678                         else if (optNameToChange.Equals("ref"))\r
679                         {\r
680                             if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))\r
681                                 thisOpt = "ref=" + drop_refFrames.SelectedItem;\r
682                             else\r
683                                 thisOpt = "";\r
684                         }\r
685                         else if (optNameToChange.Equals("bframes"))\r
686                         {\r
687                             String value = drop_bFrames.SelectedItem.ToString();\r
688                             if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))\r
689                                 thisOpt = "bframes=" + value;\r
690                             else\r
691                                 thisOpt = "";\r
692                         }\r
693                         else if (optNameToChange.Equals("subq"))\r
694                         {\r
695                             String value = drop_subpixelMotionEstimation.SelectedItem.ToString();\r
696                             if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))\r
697                                 thisOpt = "subq=" + value;\r
698                             else\r
699                                 thisOpt = "";\r
700                         }\r
701                         else if (optNameToChange.Equals("trellis"))\r
702                         {\r
703                             String value = drop_trellis.SelectedItem.ToString();\r
704                             if (!drop_trellis.SelectedItem.ToString().Contains("Default"))\r
705                                 thisOpt = "trellis=" + value;\r
706                             else\r
707                                 thisOpt = "";\r
708                         }\r
709                     }\r
710                 }\r
711 \r
712                 /* Construct New String for opts here */\r
713                 if (!thisOpt.Equals(""))\r
714                 {\r
715                     if (changedOptString.Equals(""))\r
716                         changedOptString = thisOpt;\r
717                     else\r
718                         changedOptString = changedOptString + ":" + thisOpt;\r
719                 }\r
720             }\r
721 \r
722             /* Change the option string to reflect the new mod settings */\r
723             rtf_x264Query.Text = changedOptString;\r
724         }\r
725 \r
726         /// <summary>\r
727         /// Add's an option to the x264 query string.\r
728         /// Handles 2 cases.  1 Where rtf_x264Query.Text is empty, and one where there is an option with no value,\r
729         /// e.g no-fast-pskip\r
730         /// </summary>\r
731         /// <param name="optNameToChange"></param>\r
732         private void hasNoOptions(string optNameToChange)\r
733         {\r
734             string colon = "";\r
735             if (rtf_x264Query.Text != "")\r
736                 colon = ":";\r
737 \r
738             string query = rtf_x264Query.Text;\r
739             if (optNameToChange.Equals("me"))\r
740             {\r
741                 switch (drop_MotionEstimationMethod.SelectedIndex)\r
742                 {\r
743                     case 1:\r
744                         query = query + colon + "me=dia";\r
745                         break;\r
746 \r
747                     case 2:\r
748                         query = query + colon + "me=hex";\r
749                         break;\r
750 \r
751                     case 3:\r
752                         query = query + colon + "me=umh";\r
753                         break;\r
754 \r
755                     case 4:\r
756                         query = query + colon + "me=esa";\r
757                         break;\r
758 \r
759                     case 5:\r
760                         query = query + colon + "me=tesa";\r
761                         break;\r
762 \r
763                     default:\r
764                         break;\r
765                 }\r
766             }\r
767             else if (optNameToChange.Equals("direct"))\r
768             {\r
769                 switch (drop_directPrediction.SelectedIndex)\r
770                 {\r
771                     case 1:\r
772                         query = query + colon + "direct=none";\r
773                         break;\r
774 \r
775                     case 2:\r
776                         query = query + colon + "direct=spatial";\r
777                         break;\r
778 \r
779                     case 3:\r
780                         query = query + colon + "direct=temporal";\r
781                         break;\r
782 \r
783                     case 4:\r
784                         query = query + colon + "direct=auto";\r
785                         break;\r
786 \r
787                     default:\r
788                         break;\r
789                 }\r
790             }\r
791             else if (optNameToChange.Equals("analyse"))\r
792             {\r
793                 switch (drop_analysis.SelectedIndex)\r
794                 {\r
795                     case 1:\r
796                         query = query + colon + "analyse=none";\r
797                         break;\r
798 \r
799                     case 2:\r
800                         query = query + colon + "analyse=all";\r
801                         break;\r
802 \r
803                     default:\r
804                         break;\r
805                 }\r
806             }\r
807             else if (optNameToChange.Equals("merange"))\r
808             {\r
809                 int value = drop_MotionEstimationRange.SelectedIndex + 3;\r
810                 query = query + colon + "merange=" + value;\r
811             }\r
812             else if (optNameToChange.Equals("b-adapt"))\r
813             {\r
814                 int value = drop_adaptBFrames.SelectedIndex - 1;\r
815                 query = query + colon + "b-adapt=" + value;\r
816             }\r
817 \r
818             else if (optNameToChange.Equals("deblock"))\r
819             {\r
820                 String da = drop_deblockAlpha.SelectedItem.ToString();\r
821                 String db = drop_deblockBeta.Text;\r
822 \r
823                 if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))\r
824                 {\r
825                     drop_deblockBeta.SelectedItem = "Default (0)";\r
826                     drop_deblockAlpha.SelectedItem = "Default (0)";\r
827                 }\r
828                 else\r
829                 {\r
830                     if (db.Contains("Default"))\r
831                         db = "0";\r
832 \r
833                     if (da.Contains("Default"))\r
834                         da = "0";\r
835 \r
836                     query = query + colon + "deblock=" + da + "," + db;\r
837                 }\r
838             }\r
839             else if (optNameToChange.Equals("psy-rd"))\r
840             {\r
841                 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)\r
842                     query += "";\r
843                 else\r
844                 {\r
845                     double psyrd = slider_psyrd.Value * 0.1;\r
846                     double psytre = slider_psytrellis.Value * 0.1;\r
847                     string rd, rt;\r
848                     if (psyrd == 1)\r
849                         rd = "1.0";\r
850                     else\r
851                         rd = psyrd.ToString();\r
852 \r
853                     if (psytre == 1)\r
854                         rt = "1.0";\r
855                     else\r
856                         rt = psytre.ToString();\r
857 \r
858                     query += colon + "psy-rd=" + rd + "," + rt;\r
859                 }\r
860             }\r
861             else if (optNameToChange.Equals("mixed-refs"))\r
862             {\r
863                 if (check_mixedReferences.CheckState == CheckState.Checked)\r
864                     query = query + colon + "mixed-refs=1";\r
865             }\r
866             else if (optNameToChange.Equals("weightb"))\r
867             {\r
868                 if (check_weightedBFrames.CheckState == CheckState.Checked)\r
869                     query = query + colon + "weightb=1";\r
870             }\r
871             else if (optNameToChange.Equals("b-pyramid"))\r
872             {\r
873                 if (check_pyrmidalBFrames.CheckState == CheckState.Checked)\r
874                     query = query + colon + "b-pyramid=1";\r
875             }\r
876             else if (optNameToChange.Equals("no-fast-pskip"))\r
877             {\r
878                 if (check_noFastPSkip.CheckState == CheckState.Checked)\r
879                     query = query + colon + "no-fast-pskip=1";\r
880             }\r
881             else if (optNameToChange.Equals("no-dct-decimate"))\r
882             {\r
883                 if (check_noDCTDecimate.CheckState == CheckState.Checked)\r
884                     query = query + colon + "no-dct-decimate=1";\r
885             }\r
886             else if (optNameToChange.Equals("8x8dct"))\r
887             {\r
888                 if (check_8x8DCT.CheckState == CheckState.Checked)\r
889                     query = query + colon + "8x8dct=1";\r
890             }\r
891             else if (optNameToChange.Equals("cabac"))\r
892             {\r
893                 if (check_Cabac.CheckState != CheckState.Checked)\r
894                     query = query + colon + "cabac=0";\r
895             }\r
896             else if (optNameToChange.Equals("ref"))\r
897             {\r
898                 if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))\r
899                     query = query + colon + "ref=" + drop_refFrames.SelectedItem;\r
900             }\r
901             else if (optNameToChange.Equals("bframes"))\r
902             {\r
903                 String value = drop_bFrames.SelectedItem.ToString();\r
904                 if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))\r
905                     query = query + colon + "bframes=" + value;\r
906             }\r
907             else if (optNameToChange.Equals("subq"))\r
908             {\r
909                 String value = drop_subpixelMotionEstimation.SelectedItem.ToString();\r
910                 if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))\r
911                     query = query + colon + "subq=" + value;\r
912             }\r
913             else if (optNameToChange.Equals("trellis"))\r
914             {\r
915                 if (!drop_trellis.SelectedItem.ToString().Contains("Default"))\r
916                     query = query + colon + "trellis=" + drop_trellis.SelectedItem;\r
917             }\r
918 \r
919             rtf_x264Query.Text = query;\r
920         }\r
921 \r
922         /// <summary>\r
923         /// Shows and hides controls based on the values of other controls.\r
924         /// </summary>\r
925         /// <param name="sender"></param>\r
926         private void animate(string sender)\r
927         {\r
928             /* Lots of situations to cover.\r
929                    - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)\r
930                    - CABAC (when 0 turn off trellis)\r
931                    - analysis (if none, turn off 8x8dct)\r
932                    - refs (under 2, disable mixed-refs)\r
933                    - subme (if under 6, turn off psy-rd and psy-trel)\r
934                    - trellis (if 0, turn off psy-trel)\r
935                 */\r
936 \r
937             switch(sender)\r
938             {\r
939                 case "bframes":\r
940                     if (drop_bFrames.SelectedIndex < 2)\r
941                     {\r
942                         /* If the b-frame widget is at 0 or 1, the user has chosen\r
943                            not to use b-frames at all. So disable the options\r
944                            that can only be used when b-frames are enabled.        */\r
945                         check_weightedBFrames.Visible = false;\r
946                         check_pyrmidalBFrames.Visible = false;\r
947                         drop_directPrediction.Visible = false;\r
948                         lbl_direct_prediction.Visible = false;\r
949 \r
950                         check_weightedBFrames.CheckState = CheckState.Unchecked;\r
951                         check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
952                         drop_directPrediction.SelectedIndex = 0;\r
953 \r
954                         drop_adaptBFrames.Visible = false;\r
955                         lbl_adaptBFrames.Visible = false;\r
956                         drop_adaptBFrames.SelectedIndex = 0;\r
957                     }\r
958                     else if (drop_bFrames.SelectedIndex == 2)\r
959                     {\r
960                         /* Only 1 b-frame? Disable b-pyramid. */\r
961                         check_pyrmidalBFrames.Visible = false;\r
962                         check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
963 \r
964                         check_weightedBFrames.Visible = true;\r
965                         drop_directPrediction.Visible = true;\r
966                         lbl_direct_prediction.Visible = true;\r
967 \r
968                         drop_adaptBFrames.Visible = true;\r
969                         lbl_adaptBFrames.Visible = true;\r
970                     }\r
971                     else\r
972                     {\r
973                         check_weightedBFrames.Visible = true;\r
974                         check_pyrmidalBFrames.Visible = true;\r
975                         drop_directPrediction.Visible = true;\r
976                         lbl_direct_prediction.Visible = true;\r
977 \r
978                         drop_adaptBFrames.Visible = true;\r
979                         lbl_adaptBFrames.Visible = true;\r
980                     }\r
981                 break;\r
982                 case "cabac":\r
983                     if (check_Cabac.Checked == false)\r
984                     {\r
985                         /* Without CABAC entropy coding, trellis doesn't run. */\r
986                         drop_trellis.Visible = false;\r
987                         drop_trellis.SelectedIndex = 0;\r
988                         lbl_trellis.Visible = false;\r
989                     }\r
990                     else\r
991                     {\r
992                         drop_trellis.Visible = true;\r
993                         lbl_trellis.Visible = true;\r
994                     }\r
995                 break;\r
996                 case "analyse":\r
997                     if (drop_analysis.SelectedIndex == 1)\r
998                     {\r
999                         /* No analysis? Disable 8x8dct */\r
1000                         check_8x8DCT.Visible = false;\r
1001                         if (sender != "8x8dct")\r
1002                             check_8x8DCT.CheckState = CheckState.Unchecked;\r
1003                     }\r
1004                     else\r
1005                         check_8x8DCT.Visible = true;\r
1006                 break;\r
1007                 case "ref":\r
1008                     if (drop_refFrames.SelectedIndex < 3)\r
1009                     {\r
1010                         check_mixedReferences.Visible = false;\r
1011                         if (sender != "mixed-refs")\r
1012                             check_mixedReferences.CheckState = CheckState.Unchecked;\r
1013                     }\r
1014                     else\r
1015                         check_mixedReferences.Visible = true;\r
1016                 break;\r
1017                 case "me":        // Motion Estimation\r
1018                     if (drop_MotionEstimationMethod.SelectedIndex < 3)\r
1019                     {\r
1020                         drop_MotionEstimationRange.Visible = false;\r
1021                         lbl_merange.Visible = false;\r
1022                         drop_MotionEstimationRange.SelectedIndex = 0;\r
1023                     }\r
1024                     else\r
1025                     {\r
1026                         drop_MotionEstimationRange.Visible = true;\r
1027                         lbl_merange.Visible = true;\r
1028                     }\r
1029                 break;\r
1030                 case "subq":        // subme\r
1031                     if (drop_subpixelMotionEstimation.SelectedIndex != 0 && drop_subpixelMotionEstimation.SelectedIndex < 7)\r
1032                     {\r
1033                         slider_psyrd.Visible = false;\r
1034                         slider_psyrd.Value = 10;\r
1035                         lbl_psyrd.Visible = false;\r
1036 \r
1037 \r
1038                         slider_psytrellis.Visible = false;\r
1039                         slider_psytrellis.Value = 0;\r
1040                         lbl_psytrellis.Visible = false;\r
1041                     }\r
1042                     else\r
1043                     {\r
1044                         slider_psyrd.Visible = true;\r
1045                         lbl_psyrd.Visible = true;\r
1046 \r
1047                         if (drop_trellis.SelectedIndex >= 2 && check_Cabac.Checked && slider_psytrellis.Visible == false)\r
1048                         {\r
1049                             slider_psytrellis.Visible = true;\r
1050                             lbl_psytrellis.Visible = true;\r
1051                         }\r
1052                     }\r
1053                 break;\r
1054                 case "trellis":        // subme\r
1055                     if (drop_trellis.SelectedIndex < 2)\r
1056                     {\r
1057                         slider_psytrellis.Visible = false;\r
1058                         slider_psytrellis.Value = 0;\r
1059                         lbl_psytrellis.Visible = false;\r
1060                     }\r
1061                     else\r
1062                     {\r
1063                         if ((drop_subpixelMotionEstimation.SelectedIndex == 0 || drop_subpixelMotionEstimation.SelectedIndex >= 7) && check_Cabac.Checked && slider_psytrellis.Visible == false)\r
1064                         {\r
1065                             slider_psytrellis.Visible = true;\r
1066                             lbl_psytrellis.Visible = true;\r
1067                         }\r
1068                     }\r
1069                 break;\r
1070             }\r
1071         }\r
1072     }\r
1073 }