1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace Handbrake.Parsing
{
/// <summary>
/// A delegate to handle custom events regarding data being parsed from the buffer
/// </summary>
/// <param name="Sender">The object which raised this delegate</param>
/// <param name="Data">The data parsed from the stream</param>
public delegate void DataReadEventHandler(object Sender, string Data);
/// <summary>
/// A delegate to handle events regarding progress during DVD scanning
/// </summary>
/// <param name="Sender">The object who's raising the event</param>
/// <param name="CurrentTitle">The title number currently being processed</param>
/// <param name="TitleCount">The total number of titiles to be processed</param>
public delegate void ScanProgressEventHandler(object Sender, int CurrentTitle, int TitleCount);
/// <summary>
/// A delegate to handle encode progress updates
/// </summary>
/// <param name="Sender">The object which raised the event</param>
/// <param name="CurrentTask">The current task being processed from the queue</param>
/// <param name="TaskCount">The total number of tasks in queue</param>
/// <param name="PercentComplete">The percentage this task is complete</param>
/// <param name="CurrentFps">The current encoding fps</param>
/// <param name="AverageFps">The average encoding fps for this task</param>
/// <param name="TimeRemaining">The estimated time remaining for this task to complete</param>
public delegate void EncodeProgressEventHandler(object Sender, int CurrentTask, int TaskCount, float PercentComplete, float CurrentFps, float AverageFps, TimeSpan TimeRemaining);
/// <summary>
/// A simple wrapper around a StreamReader to keep track of the entire output from a cli process
/// </summary>
internal class Parser : StreamReader
{
private string m_buffer;
/// <summary>
/// The output from the CLI process
/// </summary>
public string Buffer
{
get
{
return this.m_buffer;
}
}
/// <summary>
/// Raised upon a new line being read from stdout/stderr
/// </summary>
public event DataReadEventHandler OnReadLine;
/// <summary>
/// Raised upon the entire stdout/stderr stream being read in a single call
/// </summary>
public event DataReadEventHandler OnReadToEnd;
/// <summary>
/// Raised upon the catching of a "Scanning title # of #..." in the stream
/// </summary>
public event ScanProgressEventHandler OnScanProgress;
public event EncodeProgressEventHandler OnEncodeProgress;
/// <summary>
/// Default constructor for this object
/// </summary>
/// <param name="baseStream">The stream to parse from</param>
public Parser(Stream baseStream) : base(baseStream)
{
this.m_buffer = string.Empty;
}
public override string ReadLine()
{
string tmp = base.ReadLine();
try
{
this.m_buffer += tmp;
Match m = Regex.Match(tmp, "^Scanning title ([0-9]*) of ([0-9]*)");
if (OnReadLine != null)
{
OnReadLine(this, tmp);
}
if (m.Success && OnScanProgress != null)
{
OnScanProgress(this, int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value));
}
m = Regex.Match(tmp, @"^Encoding: task ([0-9]*) of ([0-9]*), ([0-9]*\.[0-9]*) %( \(([0-9]*\.[0-9]*) fps, avg ([0-9]*\.[0-9]*) fps, ETA ([0-9]{2})h([0-9]{2})m([0-9]{2})s\))?");
if (m.Success && OnEncodeProgress != null)
{
int currentTask = int.Parse(m.Groups[1].Value);
int totalTasks = int.Parse(m.Groups[2].Value);
float percent = float.Parse(m.Groups[3].Value, Functions.CLI.Culture);
float currentFps = m.Groups[5].Value == string.Empty ? 0.0F : float.Parse(m.Groups[5].Value, Functions.CLI.Culture);
float avgFps = m.Groups[6].Value == string.Empty ? 0.0F : float.Parse(m.Groups[6].Value, Functions.CLI.Culture);
TimeSpan remaining = TimeSpan.Zero;
if (m.Groups[7].Value != string.Empty)
{
remaining = TimeSpan.Parse(m.Groups[7].Value + ":" + m.Groups[8].Value + ":" + m.Groups[9].Value);
}
OnEncodeProgress(this, currentTask, totalTasks, percent, currentFps, avgFps, remaining);
}
}
catch (Exception exc)
{
MessageBox.Show("Parser.cs - ReadLine " + exc.ToString());
}
return tmp;
}
public override string ReadToEnd()
{
string tmp = base.ReadToEnd();
try
{
this.m_buffer += tmp;
if (OnReadToEnd != null)
{
OnReadToEnd(this, tmp);
}
}
catch (Exception exc)
{
MessageBox.Show("Parser.cs - ReadToEnd " + exc.ToString());
}
return tmp;
}
}
}
|