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