From 95c87ada9f0cd75956fd9a7b9b2bd1978d5ed1da Mon Sep 17 00:00:00 2001 From: sr55 Date: Sun, 16 Jan 2011 19:50:00 +0000 Subject: WinGui: - Switch to .NET 4 Client Profile (Far smaller download size than the full profile .NET 3.5 installer that is currently required if the user does not have .Net installed) - Import HandBrakeInterop library (by RandomEngy) - Added experimental LibScan:IScan service to use libhb for scanning via the interop library. This is automatically used if hb.dll is detected in HandBrake's folder, otherwise HandBrakeCLI is used for the scan. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3752 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- .../Services/LibScan.cs | 328 +++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 win/C#/HandBrake.ApplicationServices/Services/LibScan.cs (limited to 'win/C#/HandBrake.ApplicationServices/Services') diff --git a/win/C#/HandBrake.ApplicationServices/Services/LibScan.cs b/win/C#/HandBrake.ApplicationServices/Services/LibScan.cs new file mode 100644 index 000000000..50be6aa07 --- /dev/null +++ b/win/C#/HandBrake.ApplicationServices/Services/LibScan.cs @@ -0,0 +1,328 @@ +/* LibScan.cs $ + This file is part of the HandBrake source code. + Homepage: . + It may be used under the terms of the GNU General Public License. */ + +namespace HandBrake.ApplicationServices.Services +{ + using System; + using System.Collections.Generic; + using System.Text; + using System.Threading; + + using HandBrake.ApplicationServices.EventArgs; + using HandBrake.ApplicationServices.Model.Encoding; + using HandBrake.ApplicationServices.Parsing; + using HandBrake.ApplicationServices.Services.Interfaces; + using HandBrake.Interop; + + using AudioTrack = HandBrake.ApplicationServices.Parsing.AudioTrack; + using Cropping = HandBrake.ApplicationServices.Model.Encoding.Cropping; + using ScanProgressEventArgs = HandBrake.Interop.ScanProgressEventArgs; + using Size = System.Drawing.Size; + + /// + /// Scan a Source + /// + public class LibScan : IScan + { + /* + * TODO + * 1. Expose the Previews code. + * 2. Expose the Logging. + * + */ + + #region Private Variables + + /// + /// Lock for the log file + /// + static readonly object LogLock = new object(); + + /// + /// LibHB Instance + /// + private readonly HandBrakeInstance instance; + + /// + /// Log data from HandBrakeInstance + /// + private readonly StringBuilder logging; + + #endregion + + /// + /// Initializes a new instance of the class. + /// + public LibScan() + { + logging = new StringBuilder(); + + instance = new HandBrakeInstance(); + instance.Initialize(1); + instance.ScanProgress += this.InstanceScanProgress; + instance.ScanCompleted += this.InstanceScanCompleted; + + HandBrakeUtils.MessageLogged += this.HandBrakeInstanceMessageLogged; + HandBrakeUtils.ErrorLogged += this.HandBrakeInstanceErrorLogged; + } + + #region Events + + /// + /// Scan has Started + /// + public event EventHandler ScanStared; + + /// + /// Scan has completed + /// + public event ScanCompletedStatus ScanCompleted; + + /// + /// Encode process has progressed + /// + public event ScanProgessStatus ScanStatusChanged; + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether IsScanning. + /// + public bool IsScanning { get; private set; } + + /// + /// Gets the Souce Data. + /// + public DVD SouceData { get; private set; } + + /// + /// Gets ActivityLog. + /// + public string ActivityLog + { + get + { + return logging.ToString(); + } + } + + #endregion + + #region Public Methods + + /// + /// Scan a Source Path. + /// Title 0: scan all + /// + /// Path to the file to scan + /// int title number. 0 for scan all + public void Scan(string sourcePath, int title) + { + Thread t = new Thread(unused => this.ScanSource(sourcePath, title)); + t.Start(); + } + + /// + /// Kill the scan + /// + public void Stop() + { + instance.StopScan(); + } + + #endregion + + #region Private Methods + + /// + /// Start a scan for a given source path and title + /// + /// Path to the source file + /// the title number to look at + private void ScanSource(object sourcePath, int title) + { + try + { + IsScanning = true; + if (this.ScanStared != null) + this.ScanStared(this, new EventArgs()); + + if (title != 0) + instance.StartScan(sourcePath.ToString(), 10, title); + else + instance.StartScan(sourcePath.ToString(), 10); + } + catch (Exception exc) + { + this.Stop(); + + if (this.ScanCompleted != null) + this.ScanCompleted(this, new ScanCompletedEventArgs(false, exc, "An Error has occured in ScanService.ScanSource()")); + } + } + + #endregion + + #region HandBrakeInstance Event Handlers + /// + /// Scan Completed Event Handler + /// + /// + /// The sender. + /// + /// + /// The EventArgs. + /// + private void InstanceScanCompleted(object sender, EventArgs e) + { + this.SouceData = new DVD { Titles = ConvertTitles(this.instance.Titles) }; + + IsScanning = false; + + if (this.ScanCompleted != null) + this.ScanCompleted(this, new ScanCompletedEventArgs(true, null, string.Empty)); + } + + /// + /// Scan Progress Event Handler + /// + /// + /// The sender. + /// + /// + /// The EventArgs. + /// + private void InstanceScanProgress(object sender, ScanProgressEventArgs e) + { + if (this.ScanStatusChanged != null) + { + ApplicationServices.EventArgs.ScanProgressEventArgs eventArgs = + new ApplicationServices.EventArgs.ScanProgressEventArgs + { + CurrentTitle = e.CurrentTitle, + Titles = e.Titles + }; + + this.ScanStatusChanged(this, eventArgs); + } + } + + /// + /// Log a message + /// + /// + /// The sender. + /// + /// + /// The MessageLoggedEventArgs. + /// + private void HandBrakeInstanceErrorLogged(object sender, MessageLoggedEventArgs e) + { + lock (LogLock) + { + this.logging.AppendLine(e.Message); + } + } + + /// + /// Log a message + /// + /// + /// The sender. + /// + /// + /// The MessageLoggedEventArgs. + /// + private void HandBrakeInstanceMessageLogged(object sender, MessageLoggedEventArgs e) + { + lock (LogLock) + { + this.logging.AppendLine(e.Message); + } + } + + /// + /// Convert Interop Title objects to App Services Title object + /// + /// + /// The titles. + /// + /// + /// The convert titles. + /// + private static List ConvertTitles(IEnumerable<SourceData.Title> titles) + { + List<Title> titleList = new List<Title>(); + foreach (SourceData.Title title in titles) + { + Title converted = new Title + { + TitleNumber = title.TitleNumber, + Duration = title.Duration, + Resolution = new Size(title.Resolution.Width, title.Resolution.Height), + AspectRatio = title.AspectRatio, + AngleCount = title.AngleCount, + ParVal = new Size(title.ParVal.Width, title.ParVal.Height), + AutoCropDimensions = + Cropping.CreateCroppingObject( + title.AutoCropDimensions.Top, + title.AutoCropDimensions.Bottom, + title.AutoCropDimensions.Left, + title.AutoCropDimensions.Right), + Fps = title.Framerate + }; + + foreach (SourceData.Chapter chapter in title.Chapters) + { + converted.Chapters.Add(new Chapter(chapter.ChapterNumber, string.Empty, chapter.Duration)); + } + + foreach (SourceData.AudioTrack track in title.AudioTracks) + { + converted.AudioTracks.Add(new AudioTrack(track.TrackNumber, track.Language, track.LanguageCode, track.Description, string.Empty, track.SampleRate, track.Bitrate)); + } + + foreach (SourceData.Subtitle track in title.Subtitles) + { + SubtitleType convertedType = new SubtitleType(); + + switch (track.SubtitleSource) + { + case SourceData.SubtitleSource.VobSub: + convertedType = SubtitleType.VobSub; + break; + case SourceData.SubtitleSource.UTF8: + convertedType = SubtitleType.UTF8Sub; + break; + case SourceData.SubtitleSource.TX3G: + convertedType = SubtitleType.TX3G; + break; + case SourceData.SubtitleSource.SSA: + convertedType = SubtitleType.SSA; + break; + case SourceData.SubtitleSource.SRT: + convertedType = SubtitleType.SRT; + break; + case SourceData.SubtitleSource.CC608: + convertedType = SubtitleType.CC; + break; + case SourceData.SubtitleSource.CC708: + convertedType = SubtitleType.CC; + break; + } + + converted.Subtitles.Add(new Subtitle(track.TrackNumber, track.Language, track.LanguageCode, convertedType)); + } + + titleList.Add(converted); + } + + return titleList; + } + #endregion + } +} \ No newline at end of file -- cgit v1.2.3