Create new interface VideoWriter, which AviWriter inherits from. Sets up for other video dumping systems.

This commit is contained in:
goyuken 2012-05-06 22:08:47 +00:00
parent 857d0a5b39
commit 02ca0e82e9
4 changed files with 81 additions and 10 deletions

View File

@ -10,7 +10,7 @@ using BizHawk;
namespace BizHawk.MultiClient
{
class AviWriter : IDisposable
class AviWriter : VideoWriter
{
CodecToken currVideoCodecToken = null;
AviWriterSegment currSegment;
@ -27,9 +27,12 @@ namespace BizHawk.MultiClient
/// <summary>
/// sets the codec token to be used for video compression
/// </summary>
public void SetVideoCodecToken(CodecToken token)
public void SetVideoCodecToken(IDisposable token)
{
currVideoCodecToken = token;
if (token is CodecToken)
currVideoCodecToken = (CodecToken)token;
else
throw new ArgumentException("AviWriter only takes its own Codec Tokens!");
}
public static IEnumerator<string> CreateBasicNameProvider(string template)
@ -192,7 +195,7 @@ namespace BizHawk.MultiClient
/// Acquires a video codec configuration from the user. you may save it for future use, but you must dispose of it when youre done with it.
/// returns null if the user canceled the dialog
/// </summary>
public static CodecToken AcquireVideoCodecToken(IntPtr hwnd, CodecToken lastToken)
public IDisposable AcquireVideoCodecToken(IntPtr hwnd) //, CodecToken lastToken)
{
var temp_params = new Parameters();
temp_params.height = 256;
@ -206,8 +209,8 @@ namespace BizHawk.MultiClient
string tempfile = Path.GetTempFileName();
File.Delete(tempfile);
tempfile = Path.ChangeExtension(tempfile, "avi");
temp.OpenFile(tempfile, temp_params, lastToken);
CodecToken token = temp.AcquireVideoCodecToken(hwnd);
temp.OpenFile(tempfile, temp_params, null); //lastToken);
CodecToken token = (CodecToken) temp.AcquireVideoCodecToken(hwnd);
temp.CloseFile();
File.Delete(tempfile);
return token;
@ -469,7 +472,7 @@ namespace BizHawk.MultiClient
/// <summary>
/// Acquires a video codec configuration from the user
/// </summary>
public CodecToken AcquireVideoCodecToken(IntPtr hwnd)
public IDisposable AcquireVideoCodecToken(IntPtr hwnd)
{
if (!IsOpen) throw new InvalidOperationException("File must be opened before acquiring a codec token (or else the stream formats wouldnt be known)");

View File

@ -292,6 +292,7 @@
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="VideoWriter.cs" />
<EmbeddedResource Include="config\GifAnimator.resx">
<DependentUpon>GifAnimator.cs</DependentUpon>
</EmbeddedResource>

View File

@ -32,7 +32,7 @@ namespace BizHawk.MultiClient
public bool PressRewind = false;
//avi/wav state
AviWriter CurrAviWriter = null;
VideoWriter CurrAviWriter = null;
//runloop control
bool exit;
@ -2666,13 +2666,13 @@ namespace BizHawk.MultiClient
//TODO - cores should be able to specify exact values for these instead of relying on this to calculate them
int fps = (int)(Global.Emulator.CoreOutputComm.VsyncRate * 0x01000000);
AviWriter aw = new AviWriter();
VideoWriter aw = new AviWriter();
try
{
aw.SetMovieParameters(fps, 0x01000000);
aw.SetVideoParameters(Global.Emulator.VideoProvider.BufferWidth, Global.Emulator.VideoProvider.BufferHeight);
aw.SetAudioParameters(44100, 2, 16);
var token = AviWriter.AcquireVideoCodecToken(Global.MainForm.Handle, null);
var token = aw.AcquireVideoCodecToken(Global.MainForm.Handle); //, null);
aw.SetVideoCodecToken(token);
aw.OpenFile(sfd.FileName);

View File

@ -0,0 +1,67 @@
using System;
using System.Collections;
using System.Collections.Generic;
namespace BizHawk
{
public interface VideoWriter : IDisposable
{
/// <summary>
/// sets the codec token to be used for video compression
/// </summary>
void SetVideoCodecToken(IDisposable token);
// why no OpenFile(IEnumerator<string>) ?
// different video writers may have different ideas of how and why splitting is to occur
/// <summary>
/// opens a recording stream
/// set a video codec token first.
/// </summary>
void OpenFile(string baseName);
/// <summary>
/// close recording stream
/// </summary>
void CloseFile();
/// <summary>
/// adds a frame to the stream
/// </summary>
void AddFrame(IVideoProvider source);
/// <summary>
/// adds audio samples to the stream
/// no attempt is made to sync this to the video
/// </summary>
void AddSamples(short[] samples);
/// <summary>
/// obtain a set of recording compression parameters
/// </summary>
/// <param name="hwnd">hwnd to attach to if the user is shown config dialog</param>
/// <returns>codec token, dispose of it when you're done with it</returns>
IDisposable AcquireVideoCodecToken(IntPtr hwnd);
/// <summary>
/// set framerate to fpsnum/fpsden (assumed to be unchanging over the life of the stream)
/// </summary>
void SetMovieParameters(int fpsnum, int fpsden);
/// <summary>
/// set resolution parameters (width x height)
/// must be set before file is opened
/// can be changed in future
/// should always match IVideoProvider
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
void SetVideoParameters(int width, int height);
/// <summary>
/// set audio parameters. cannot change later
/// </summary>
void SetAudioParameters(int sampleRate, int channels, int bits);
}
}