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
9 using System.Diagnostics;
\r
11 using System.Runtime.InteropServices;
\r
12 using System.Threading;
\r
13 using System.Windows;
\r
14 using System.Windows.Forms;
\r
17 using HandBrake.ApplicationServices.Services;
\r
18 using HandBrake.ApplicationServices.Services.Interfaces;
\r
20 using QTOControlLib;
\r
23 using MessageBox = System.Windows.Forms.MessageBox;
\r
26 /// The Preview Window
\r
28 public partial class frmPreview : Form
\r
30 #region Private Variables
\r
35 private readonly frmMain mainWindow;
\r
38 /// True if QT is not installed
\r
40 private readonly bool noQt;
\r
43 /// The encode queue
\r
45 private readonly IQueue encodeQueue = new Queue();
\r
48 /// What is currently playing
\r
50 private string currentlyPlaying = string.Empty;
\r
53 /// Play With VLC tracker
\r
55 private bool playWithVlc;
\r
58 /// A Thread for the video player
\r
60 private Thread player;
\r
65 /// Initializes a new instance of the <see cref="frmPreview"/> class.
\r
67 /// <param name="mw">
\r
70 public frmPreview(frmMain mw)
\r
74 InitializeComponent();
\r
80 int borderWidth = (this.Width - this.ClientSize.Width) / 2;
\r
81 int titlebarAndBorder = this.Height - this.ClientSize.Height;
\r
83 this.Height = toolBar.Height + titlebarAndBorder + 1;
\r
84 btn_playQT.Enabled = false;
\r
85 btn_playQT.Visible = false;
\r
88 this.mainWindow = mw;
\r
90 cb_preview.SelectedIndex = 0;
\r
91 cb_duration.SelectedIndex = 1;
\r
93 cb_preview.Items.Clear();
\r
94 for (int i = 1; i <= Properties.Settings.Default.previewScanCount; i++)
\r
96 cb_preview.Items.Add(i.ToString());
\r
99 cb_preview.SelectedIndex = 0;
\r
101 encodeQueue.EncodeStarted += this.EncodeQueueEncodeStarted;
\r
102 encodeQueue.EncodeEnded += this.EncodeQueueEncodeEnded;
\r
107 /// Update UI Delegate
\r
109 /// <param name="sender">
\r
112 /// <param name="e">
\r
115 private delegate void UpdateUiHandler(object sender, EventArgs e);
\r
118 /// The Open Movie Handler
\r
120 private delegate void OpenMovieHandler();
\r
123 #region Event Handlers
\r
125 /// The encode has started
\r
127 /// <param name="sender">
\r
130 /// <param name="e">
\r
133 private void EncodeQueueEncodeStarted(object sender, EventArgs e)
\r
135 encodeQueue.EncodeStatusChanged += this.EncodeQueueEncodeStatusChanged;
\r
139 /// The Enocde has ended
\r
141 /// <param name="sender">
\r
144 /// <param name="e">
\r
147 private void EncodeQueueEncodeEnded(object sender, EventArgs e)
\r
149 encodeQueue.EncodeStatusChanged -= this.EncodeQueueEncodeStatusChanged;
\r
153 if (this.InvokeRequired)
\r
155 this.BeginInvoke(new UpdateUiHandler(EncodeQueueEncodeEnded), new[] { sender, e });
\r
159 ProgressBarStatus.Visible = false;
\r
160 lbl_encodeStatus.Visible = false;
\r
163 btn_playQT.Enabled = true;
\r
164 btn_playVLC.Enabled = true;
\r
166 this.Text = this.Text.Replace(" (Encoding)", string.Empty);
\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
174 // Play back in QT or VLC
\r
180 catch (Exception exc)
\r
182 Main.ShowExceptiowWindow("An Unexpected error has occured", exc.ToString());
\r
187 /// Encode status has changed
\r
189 /// <param name="sender">
\r
192 /// <param name="e">
\r
195 private void EncodeQueueEncodeStatusChanged(object sender, HandBrake.ApplicationServices.EncodeProgressEventArgs e)
\r
197 if (this.InvokeRequired)
\r
199 this.BeginInvoke(new Encode.EncodeProgessStatus(this.EncodeQueueEncodeStatusChanged), new[] { sender, e });
\r
203 lbl_encodeStatus.Text = e.PercentComplete + "%";
\r
204 ProgressBarStatus.Value = (int)Math.Round(e.PercentComplete);
\r
208 #region Encode Sample
\r
213 /// <param name="sender">
\r
216 /// <param name="e">
\r
219 private void PlayVlcClick(object sender, EventArgs e)
\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
230 QTControl.URL = string.Empty;
\r
232 if (File.Exists(this.currentlyPlaying))
\r
233 File.Delete(this.currentlyPlaying);
\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
241 btn_playQT.Enabled = false;
\r
242 btn_playVLC.Enabled = false;
\r
243 this.Text += " (Encoding)";
\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
251 /// Encode and Play with QT
\r
253 /// <param name="sender">
\r
256 /// <param name="e">
\r
259 private void PlayQtClick(object sender, EventArgs e)
\r
261 playWithVlc = false;
\r
262 this.panel1.Visible = true;
\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
270 if (this.mainWindow.text_destination.Text.Contains(".mkv"))
\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
278 ProgressBarStatus.Visible = true;
\r
279 ProgressBarStatus.Value = 0;
\r
280 lbl_encodeStatus.Visible = true;
\r
283 QTControl.URL = string.Empty;
\r
284 if (File.Exists(this.currentlyPlaying))
\r
285 File.Delete(this.currentlyPlaying);
\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
294 btn_playQT.Enabled = false;
\r
295 btn_playVLC.Enabled = false;
\r
296 this.Text += " (Encoding)";
\r
298 int.TryParse(cb_duration.Text, out duration);
\r
299 string query = QueryGenerator.GeneratePreviewQuery(this.mainWindow, duration, cb_preview.Text);
\r
301 ThreadPool.QueueUserWorkItem(this.CreatePreview, query);
\r
306 /// Create the Preview.
\r
308 /// <param name="state">
\r
311 private void CreatePreview(object state)
\r
313 // Make sure we are not already encoding and if we are then display an error.
\r
314 if (encodeQueue.IsEncoding)
\r
318 "Handbrake is already encoding a video!",
\r
320 MessageBoxButtons.OK,
\r
321 MessageBoxIcon.Warning);
\r
326 encodeQueue.CreatePreviewSample((string)state);
\r
334 /// Play the video back in the QuickTime control
\r
336 private void Play()
\r
338 this.player = new Thread(OpenMovie) { IsBackground = true };
\r
339 this.player.Start();
\r
343 /// Play the video back in an external VLC Player
\r
345 private void PlayVlc()
\r
347 // Launch VLC and Play video.
\r
348 if (this.currentlyPlaying != string.Empty)
\r
350 if (File.Exists(this.currentlyPlaying))
\r
352 // Attempt to find VLC if it doesn't exist in the default set location.
\r
355 if (8 == IntPtr.Size ||
\r
356 (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
\r
357 vlcPath = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
\r
359 vlcPath = Environment.GetEnvironmentVariable("ProgramFiles");
\r
361 vlcPath = vlcPath != null
\r
362 ? vlcPath + @"\VideoLAN\VLC\vlc.exe"
\r
363 : @"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe";
\r
365 if (!File.Exists(Properties.Settings.Default.VLC_Path))
\r
367 if (File.Exists(vlcPath))
\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
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
380 if (File.Exists(Properties.Settings.Default.VLC_Path))
\r
382 string args = "\"" + this.currentlyPlaying + "\"";
\r
383 ProcessStartInfo vlc = new ProcessStartInfo(Properties.Settings.Default.VLC_Path, args);
\r
384 Process.Start(vlc);
\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
395 /// QT control - Open the file
\r
398 private void OpenMovie()
\r
402 if (InvokeRequired)
\r
404 BeginInvoke(new OpenMovieHandler(OpenMovie));
\r
407 QTControl.URL = this.currentlyPlaying;
\r
408 QTControl.SetSizing(QTSizingModeEnum.qtControlFitsMovie, true);
\r
409 QTControl.URL = this.currentlyPlaying;
\r
412 this.ClientSize = QTControl.Size;
\r
413 this.Height += toolBar.Height;
\r
415 catch (COMException ex)
\r
417 QTUtils qtu = new QTUtils();
\r
418 Main.ShowExceptiowWindow("Unable to open movie.", ex + Environment.NewLine + qtu.QTErrorFromErrorCode(ex.ErrorCode));
\r
420 catch (Exception ex)
\r
422 Main.ShowExceptiowWindow("Unable to open movie.", ex.ToString());
\r
429 /// Remove any subscribed events then close.
\r
431 /// <param name="e">
\r
434 protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
\r
436 encodeQueue.EncodeStarted -= this.EncodeQueueEncodeStarted;
\r
437 encodeQueue.EncodeEnded -= this.EncodeQueueEncodeEnded;
\r