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