diff --git a/BizHawk.MultiClient/AVOut/GifWriter.cs b/BizHawk.MultiClient/AVOut/GifWriter.cs index bc0a507a51..a4306ffbe9 100644 --- a/BizHawk.MultiClient/AVOut/GifWriter.cs +++ b/BizHawk.MultiClient/AVOut/GifWriter.cs @@ -11,21 +11,55 @@ namespace BizHawk.MultiClient.AVOut { public class GifToken : IDisposable { + private int _frameskip, _framedelay; + /// /// how many frames to skip for each frame deposited /// - public int frameskip { get; private set; } + public int frameskip + { + get { return _frameskip; } + private set + { + if (value < 0) + _frameskip = 0; + else if (value > 999) + _frameskip = 999; + else + _frameskip = value; + } + } + + /// + /// how long to delay between each gif frame (units of 10ms, -1 = auto) + /// + public int framedelay + { + get { return _framedelay; } + private set + { + if (value < -1) + _framedelay = -1; + else if (value > 100) + _framedelay = 100; + else + _framedelay = value; + } + } + public void Dispose() { } - public GifToken(int frameskip) + public GifToken(int frameskip, int framedelay) { this.frameskip = frameskip; + this.framedelay = framedelay; } public static GifToken LoadFromConfig() { - GifToken ret = new GifToken(0); + GifToken ret = new GifToken(0, 0); ret.frameskip = Global.Config.GifWriterFrameskip; + ret.framedelay = Global.Config.GifWriterDelay; return ret; } } @@ -143,7 +177,11 @@ namespace BizHawk.MultiClient.AVOut { if (token == null) return; - int delay = (100 * fpsden * (token.frameskip + 1) + (fpsnum / 2)) / fpsnum; + int delay; + if (token.framedelay == -1) + delay = (100 * fpsden * (token.frameskip + 1) + (fpsnum / 2)) / fpsnum; + else + delay = token.framedelay; Delay[0] = (byte)(delay & 0xff); Delay[1] = (byte)(delay >> 8 & 0xff); } diff --git a/BizHawk.MultiClient/AVOut/GifWriterForm.Designer.cs b/BizHawk.MultiClient/AVOut/GifWriterForm.Designer.cs index 454fc66fc4..cfd8602d93 100644 --- a/BizHawk.MultiClient/AVOut/GifWriterForm.Designer.cs +++ b/BizHawk.MultiClient/AVOut/GifWriterForm.Designer.cs @@ -32,13 +32,18 @@ this.button2 = new System.Windows.Forms.Button(); this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); this.SuspendLayout(); // // button1 // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.button1.DialogResult = System.Windows.Forms.DialogResult.OK; - this.button1.Location = new System.Drawing.Point(12, 51); + this.button1.Location = new System.Drawing.Point(12, 100); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; @@ -47,8 +52,9 @@ // // button2 // + this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.button2.Location = new System.Drawing.Point(93, 51); + this.button2.Location = new System.Drawing.Point(93, 100); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(75, 23); this.button2.TabIndex = 1; @@ -76,13 +82,47 @@ this.label1.TabIndex = 3; this.label1.Text = "Number of frames to skip for each frame written:"; // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 48); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(67, 13); + this.label2.TabIndex = 4; + this.label2.Text = "Frame delay:"; + // + // numericUpDown2 + // + this.numericUpDown2.Location = new System.Drawing.Point(12, 64); + this.numericUpDown2.Minimum = new decimal(new int[] { + 1, + 0, + 0, + -2147483648}); + this.numericUpDown2.Name = "numericUpDown2"; + this.numericUpDown2.Size = new System.Drawing.Size(120, 20); + this.numericUpDown2.TabIndex = 5; + this.numericUpDown2.ValueChanged += new System.EventHandler(this.numericUpDown2_ValueChanged); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(138, 66); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(35, 13); + this.label3.TabIndex = 6; + this.label3.Text = "label3"; + // // GifWriterForm // this.AcceptButton = this.button1; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.button2; - this.ClientSize = new System.Drawing.Size(269, 83); + this.ClientSize = new System.Drawing.Size(269, 135); + this.Controls.Add(this.label3); + this.Controls.Add(this.numericUpDown2); + this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.Controls.Add(this.numericUpDown1); this.Controls.Add(this.button2); @@ -90,6 +130,7 @@ this.Name = "GifWriterForm"; this.Text = "GifWriter Options"; ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -101,5 +142,8 @@ private System.Windows.Forms.Button button2; private System.Windows.Forms.NumericUpDown numericUpDown1; private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.NumericUpDown numericUpDown2; + private System.Windows.Forms.Label label3; } } \ No newline at end of file diff --git a/BizHawk.MultiClient/AVOut/GifWriterForm.cs b/BizHawk.MultiClient/AVOut/GifWriterForm.cs index 777fc10727..39fb9725d6 100644 --- a/BizHawk.MultiClient/AVOut/GifWriterForm.cs +++ b/BizHawk.MultiClient/AVOut/GifWriterForm.cs @@ -21,16 +21,35 @@ namespace BizHawk.MultiClient.AVOut using (var dlg = new GifWriterForm()) { dlg.numericUpDown1.Value = Global.Config.GifWriterFrameskip; + dlg.numericUpDown2.Value = Global.Config.GifWriterDelay; + dlg.numericUpDown2_ValueChanged(null, null); var result = dlg.ShowDialog(parent); if (result == DialogResult.OK) { Global.Config.GifWriterFrameskip = (int)dlg.numericUpDown1.Value; + Global.Config.GifWriterDelay = (int)dlg.numericUpDown2.Value; return GifWriter.GifToken.LoadFromConfig(); } else return null; } } + + private void numericUpDown2_ValueChanged(object sender, EventArgs e) + { + if (numericUpDown2.Value == -1) + { + label3.Text = "Auto"; + } + else if (numericUpDown2.Value == 0) + { + label3.Text = "Fastest"; + } + else + { + label3.Text = string.Format("{0} FPS", (int)((100 + numericUpDown2.Value / 2) / numericUpDown2.Value)); + } + } } } diff --git a/BizHawk.MultiClient/Config.cs b/BizHawk.MultiClient/Config.cs index f8c5c4df0c..c956d8a070 100644 --- a/BizHawk.MultiClient/Config.cs +++ b/BizHawk.MultiClient/Config.cs @@ -328,6 +328,7 @@ namespace BizHawk.MultiClient public string FFmpegCustomCommand = "-c:a foo -c:v bar -f baz"; public string AVICodecToken = ""; public int GifWriterFrameskip = 3; + public int GifWriterDelay = -1; // NESPPU Settings public bool AutoLoadNESPPU = false;