OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmPreview.cs
1 /*  frmPreview.cs $\r
2     This file is part of the HandBrake source code.\r
3     Homepage: <http://handbrake.fr/>.\r
4     It may be used under the terms of the GNU General Public License. */\r
5 \r
6 namespace Handbrake\r
7 {\r
8     using System;\r
9     using System.Diagnostics;\r
10     using System.IO;\r
11     using System.Runtime.InteropServices;\r
12     using System.Threading;\r
13     using System.Windows;\r
14     using System.Windows.Forms;\r
15     using Functions;\r
16 \r
17     using HandBrake.ApplicationServices.Services;\r
18     using HandBrake.ApplicationServices.Services.Interfaces;\r
19 \r
20     using QTOControlLib;\r
21     using QTOLibrary;\r
22 \r
23     using MessageBox = System.Windows.Forms.MessageBox;\r
24 \r
25     /// <summary>\r
26     /// The Preview Window\r
27     /// </summary>\r
28     public partial class frmPreview : Form\r
29     {\r
30         #region Private Variables\r
31 \r
32         /// <summary>\r
33         /// The Main Window\r
34         /// </summary>\r
35         private readonly frmMain mainWindow;\r
36 \r
37         /// <summary>\r
38         /// True if QT is not installed\r
39         /// </summary>\r
40         private readonly bool noQt;\r
41 \r
42         /// <summary>\r
43         /// The encode queue\r
44         /// </summary>\r
45         private readonly IQueue encodeQueue = new Queue();\r
46 \r
47         /// <summary>\r
48         /// What is currently playing\r
49         /// </summary>\r
50         private string currentlyPlaying = string.Empty;\r
51 \r
52         /// <summary>\r
53         /// Play With VLC tracker\r
54         /// </summary>\r
55         private bool playWithVlc;\r
56 \r
57         /// <summary>\r
58         /// A Thread for the video player\r
59         /// </summary>\r
60         private Thread player;\r
61 \r
62         #endregion\r
63 \r
64         /// <summary>\r
65         /// Initializes a new instance of the <see cref="frmPreview"/> class.\r
66         /// </summary>\r
67         /// <param name="mw">\r
68         /// The mw.\r
69         /// </param>\r
70         public frmPreview(frmMain mw)\r
71         {\r
72             try\r
73             {\r
74                 InitializeComponent();\r
75             }\r
76             catch (Exception)\r
77             {\r
78                 this.noQt = true;\r
79 \r
80                 int borderWidth = (this.Width - this.ClientSize.Width) / 2;\r
81                 int titlebarAndBorder = this.Height - this.ClientSize.Height;\r
82 \r
83                 this.Height = toolBar.Height + titlebarAndBorder + 1;\r
84                 btn_playQT.Enabled = false;\r
85                 btn_playQT.Visible = false;\r
86             }\r
87 \r
88             this.mainWindow = mw;\r
89 \r
90             cb_preview.SelectedIndex = 0;\r
91             cb_duration.SelectedIndex = 1;\r
92 \r
93             cb_preview.Items.Clear();\r
94             for (int i = 1; i <= Properties.Settings.Default.previewScanCount; i++)\r
95             {\r
96                 cb_preview.Items.Add(i.ToString());\r
97             }\r
98 \r
99             cb_preview.SelectedIndex = 0;\r
100 \r
101             encodeQueue.EncodeStarted += this.EncodeQueueEncodeStarted;\r
102             encodeQueue.EncodeEnded += this.EncodeQueueEncodeEnded;\r
103         }\r
104 \r
105         #region Delegates\r
106         /// <summary>\r
107         /// Update UI Delegate\r
108         /// </summary>\r
109         /// <param name="sender">\r
110         /// The sender.\r
111         /// </param>\r
112         /// <param name="e">\r
113         /// The e.\r
114         /// </param>\r
115         private delegate void UpdateUiHandler(object sender, EventArgs e);\r
116 \r
117         /// <summary>\r
118         /// The Open Movie Handler\r
119         /// </summary>\r
120         private delegate void OpenMovieHandler();\r
121         #endregion\r
122 \r
123         #region Event Handlers\r
124         /// <summary>\r
125         /// The encode has started\r
126         /// </summary>\r
127         /// <param name="sender">\r
128         /// The sender.\r
129         /// </param>\r
130         /// <param name="e">\r
131         /// The e.\r
132         /// </param>\r
133         private void EncodeQueueEncodeStarted(object sender, EventArgs e)\r
134         {\r
135             encodeQueue.EncodeStatusChanged += this.EncodeQueueEncodeStatusChanged;\r
136         }\r
137 \r
138         /// <summary>\r
139         /// The Enocde has ended\r
140         /// </summary>\r
141         /// <param name="sender">\r
142         /// The sender.\r
143         /// </param>\r
144         /// <param name="e">\r
145         /// The e.\r
146         /// </param>\r
147         private void EncodeQueueEncodeEnded(object sender, EventArgs e)\r
148         {\r
149             encodeQueue.EncodeStatusChanged -= this.EncodeQueueEncodeStatusChanged;\r
150 \r
151             try\r
152             {\r
153                 if (this.InvokeRequired)\r
154                 {\r
155                     this.BeginInvoke(new UpdateUiHandler(EncodeQueueEncodeEnded), new[] { sender, e });\r
156                     return;\r
157                 }\r
158 \r
159                 ProgressBarStatus.Visible = false;\r
160                 lbl_encodeStatus.Visible = false;\r
161 \r
162                 if (!this.noQt)\r
163                     btn_playQT.Enabled = true;\r
164                 btn_playVLC.Enabled = true;\r
165 \r
166                 this.Text = this.Text.Replace(" (Encoding)", string.Empty);\r
167 \r
168                 // Get the sample filename\r
169                 if (this.mainWindow.text_destination.Text != string.Empty)\r
170                     this.currentlyPlaying =\r
171                         this.mainWindow.text_destination.Text.Replace(".mp4", "_sample.mp4").Replace(".m4v", "_sample.m4v").\r
172                             Replace(".mkv", "_sample.mkv");\r
173 \r
174                 // Play back in QT or VLC\r
175                 if (!playWithVlc)\r
176                     Play();\r
177                 else\r
178                     PlayVlc();\r
179             }\r
180             catch (Exception exc)\r
181             {\r
182                 Main.ShowExceptiowWindow("An Unexpected error has occured", exc.ToString());\r
183             }\r
184         }\r
185 \r
186         /// <summary>\r
187         /// Encode status has changed\r
188         /// </summary>\r
189         /// <param name="sender">\r
190         /// The sender.\r
191         /// </param>\r
192         /// <param name="e">\r
193         /// The e.\r
194         /// </param>\r
195         private void EncodeQueueEncodeStatusChanged(object sender, HandBrake.ApplicationServices.EncodeProgressEventArgs e)\r
196         {\r
197             if (this.InvokeRequired)\r
198             {\r
199                 this.BeginInvoke(new Encode.EncodeProgessStatus(this.EncodeQueueEncodeStatusChanged), new[] { sender, e });\r
200                 return;\r
201             }\r
202 \r
203             lbl_encodeStatus.Text = e.PercentComplete + "%";\r
204             ProgressBarStatus.Value = (int)Math.Round(e.PercentComplete);\r
205         }\r
206         #endregion\r
207 \r
208         #region Encode Sample\r
209 \r
210         /// <summary>\r
211         /// Play with VLC\r
212         /// </summary>\r
213         /// <param name="sender">\r
214         /// The sender.\r
215         /// </param>\r
216         /// <param name="e">\r
217         /// The e.\r
218         /// </param>\r
219         private void PlayVlcClick(object sender, EventArgs e)\r
220         {\r
221             ProgressBarStatus.Visible = true;\r
222             ProgressBarStatus.Value = 0;\r
223             lbl_encodeStatus.Visible = true;\r
224             playWithVlc = true;\r
225             this.panel1.Visible = false;\r
226             \r
227             try\r
228             {\r
229                 if (!this.noQt)\r
230                     QTControl.URL = string.Empty;\r
231 \r
232                 if (File.Exists(this.currentlyPlaying))\r
233                     File.Delete(this.currentlyPlaying);\r
234             }\r
235             catch (Exception)\r
236             {\r
237                 MessageBox.Show(this, "Unable to delete previous preview file. You may need to restart the application.",\r
238                                 "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
239             }\r
240 \r
241             btn_playQT.Enabled = false;\r
242             btn_playVLC.Enabled = false;\r
243             this.Text += " (Encoding)";\r
244             int duration;\r
245             int.TryParse(cb_duration.Text, out duration);\r
246             string query = QueryGenerator.GeneratePreviewQuery(this.mainWindow, duration, cb_preview.Text);\r
247             ThreadPool.QueueUserWorkItem(this.CreatePreview, query);\r
248         }\r
249 \r
250         /// <summary>\r
251         /// Encode and Play with QT\r
252         /// </summary>\r
253         /// <param name="sender">\r
254         /// The sender.\r
255         /// </param>\r
256         /// <param name="e">\r
257         /// The e.\r
258         /// </param>\r
259         private void PlayQtClick(object sender, EventArgs e)\r
260         {\r
261             playWithVlc = false;\r
262             this.panel1.Visible = true;\r
263             if (this.noQt)\r
264             {\r
265                 MessageBox.Show(this,\r
266                                 "It would appear QuickTime 7 is not installed or not accessible. Please (re)install QuickTime.",\r
267                                 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
268                 return;\r
269             }\r
270             if (this.mainWindow.text_destination.Text.Contains(".mkv"))\r
271             {\r
272                 MessageBox.Show(this,\r
273                                 "The QuickTime Control does not support MKV files, It is recommended you use the VLC option instead.",\r
274                                 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
275             }\r
276             else\r
277             {\r
278                 ProgressBarStatus.Visible = true;\r
279                 ProgressBarStatus.Value = 0;\r
280                 lbl_encodeStatus.Visible = true;\r
281                 try\r
282                 {\r
283                     QTControl.URL = string.Empty;\r
284                     if (File.Exists(this.currentlyPlaying))\r
285                         File.Delete(this.currentlyPlaying);\r
286                 }\r
287                 catch (Exception)\r
288                 {\r
289                     MessageBox.Show(this,\r
290                                     "Unable to delete previous preview file. You may need to restart the application.",\r
291                                     "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
292                 }\r
293 \r
294                 btn_playQT.Enabled = false;\r
295                 btn_playVLC.Enabled = false;\r
296                 this.Text += " (Encoding)";\r
297                 int duration;\r
298                 int.TryParse(cb_duration.Text, out duration);\r
299                 string query = QueryGenerator.GeneratePreviewQuery(this.mainWindow, duration, cb_preview.Text);\r
300 \r
301                 ThreadPool.QueueUserWorkItem(this.CreatePreview, query);\r
302             }\r
303         }\r
304 \r
305         /// <summary>\r
306         /// Create the Preview.\r
307         /// </summary>\r
308         /// <param name="state">\r
309         /// The state.\r
310         /// </param>\r
311         private void CreatePreview(object state)\r
312         {\r
313             // Make sure we are not already encoding and if we are then display an error.\r
314             if (encodeQueue.IsEncoding)\r
315             {\r
316                 MessageBox.Show(\r
317                     this,\r
318                     "Handbrake is already encoding a video!",\r
319                     "Warning",\r
320                     MessageBoxButtons.OK,\r
321                     MessageBoxIcon.Warning);\r
322 \r
323                 return;\r
324             }\r
325 \r
326             encodeQueue.CreatePreviewSample((string)state);\r
327         }\r
328 \r
329         #endregion\r
330 \r
331         #region Playback\r
332 \r
333         /// <summary>\r
334         /// Play the video back in the QuickTime control\r
335         /// </summary>\r
336         private void Play()\r
337         {\r
338             this.player = new Thread(OpenMovie) { IsBackground = true };\r
339             this.player.Start();\r
340         }\r
341 \r
342         /// <summary>\r
343         /// Play the video back in an external VLC Player\r
344         /// </summary>\r
345         private void PlayVlc()\r
346         {\r
347             // Launch VLC and Play video.\r
348             if (this.currentlyPlaying != string.Empty)\r
349             {\r
350                 if (File.Exists(this.currentlyPlaying))\r
351                 {\r
352                     // Attempt to find VLC if it doesn't exist in the default set location.\r
353                     string vlcPath;\r
354 \r
355                     if (8 == IntPtr.Size ||\r
356                         (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))\r
357                         vlcPath = Environment.GetEnvironmentVariable("ProgramFiles(x86)");\r
358                     else\r
359                         vlcPath = Environment.GetEnvironmentVariable("ProgramFiles");\r
360 \r
361                     vlcPath = vlcPath != null\r
362                                   ? vlcPath + @"\VideoLAN\VLC\vlc.exe"\r
363                                   : @"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe";\r
364 \r
365                     if (!File.Exists(Properties.Settings.Default.VLC_Path))\r
366                     {\r
367                         if (File.Exists(vlcPath))\r
368                         {\r
369                             Properties.Settings.Default.VLC_Path = "C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe";\r
370                             Properties.Settings.Default.Save(); // Save this new path if it does\r
371                         }\r
372                         else\r
373                         {\r
374                             MessageBox.Show(this,\r
375                                             "Unable to detect VLC Player. \nPlease make sure VLC is installed and the directory specified in HandBrake's options is correct. (See: \"Tools Menu > Options > Picture Tab\") ",\r
376                                             "VLC", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
377                         }\r
378                     }\r
379 \r
380                     if (File.Exists(Properties.Settings.Default.VLC_Path))\r
381                     {\r
382                         string args = "\"" + this.currentlyPlaying + "\"";\r
383                         ProcessStartInfo vlc = new ProcessStartInfo(Properties.Settings.Default.VLC_Path, args);\r
384                         Process.Start(vlc);\r
385                     }\r
386                 }\r
387                 else\r
388                     MessageBox.Show(this,\r
389                                     "Unable to find the preview file. Either the file was deleted or the encode failed. Check the activity log for details.",\r
390                                     "VLC", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
391             }\r
392         }\r
393 \r
394         /// <summary>\r
395         /// QT control - Open the file\r
396         /// </summary>\r
397         [STAThread]\r
398         private void OpenMovie()\r
399         {\r
400             try\r
401             {\r
402                 if (InvokeRequired)\r
403                 {\r
404                     BeginInvoke(new OpenMovieHandler(OpenMovie));\r
405                     return;\r
406                 }\r
407                 QTControl.URL = this.currentlyPlaying;\r
408                 QTControl.SetSizing(QTSizingModeEnum.qtControlFitsMovie, true);\r
409                 QTControl.URL = this.currentlyPlaying;\r
410                 QTControl.Show();\r
411 \r
412                 this.ClientSize = QTControl.Size;\r
413                 this.Height += toolBar.Height;\r
414             }\r
415             catch (COMException ex)\r
416             {\r
417                 QTUtils qtu = new QTUtils();\r
418                 Main.ShowExceptiowWindow("Unable to open movie.", ex + Environment.NewLine + qtu.QTErrorFromErrorCode(ex.ErrorCode));\r
419             }\r
420             catch (Exception ex)\r
421             {\r
422                 Main.ShowExceptiowWindow("Unable to open movie.", ex.ToString());\r
423             }\r
424         }\r
425 \r
426         #endregion\r
427 \r
428         /// <summary>\r
429         /// Remove any subscribed events then close.\r
430         /// </summary>\r
431         /// <param name="e">\r
432         /// The e.\r
433         /// </param>\r
434         protected override void OnClosing(System.ComponentModel.CancelEventArgs e)\r
435         {\r
436             encodeQueue.EncodeStarted -= this.EncodeQueueEncodeStarted;\r
437             encodeQueue.EncodeEnded -= this.EncodeQueueEncodeEnded;\r
438             base.OnClosing(e);\r
439         }\r
440     }\r
441 }