2012-06-11 23:24:57 +00:00
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
2013-11-04 01:39:19 +00:00
using BizHawk.Emulation.Common ;
2013-11-03 03:54:37 +00:00
namespace BizHawk.Client.EmuHawk
2012-06-11 23:24:57 +00:00
{
/// <summary>
/// dumps in the "nut" container format
/// uncompressed video and audio
/// </summary>
2014-10-10 18:09:00 +00:00
[VideoWriter("nut", "NUT writer", "Writes a series of .nut files to disk, a container format which can be opened by ffmpeg. All data is uncompressed. Splits occur on resolution changes. NOT RECCOMENDED FOR USE.")]
2012-06-11 23:24:57 +00:00
class NutWriter : IVideoWriter
{
/// <summary>
/// dummy codec token class
/// </summary>
class NutWriterToken : IDisposable
{
public void Dispose ( )
{
}
}
2014-06-18 02:28:07 +00:00
public void SetFrame ( int frame ) { }
2012-06-11 23:24:57 +00:00
public void SetVideoCodecToken ( IDisposable token )
{
// ignored
}
2012-06-16 16:51:47 +00:00
public IDisposable AcquireVideoCodecToken ( System . Windows . Forms . IWin32Window hwnd )
2012-06-11 23:24:57 +00:00
{
return new NutWriterToken ( ) ;
}
/// <summary>
/// avparams
/// </summary>
int fpsnum , fpsden , width , height , sampleRate , channels ;
NutMuxer current = null ;
string baseName ;
int segment ;
public void OpenFile ( string baseName )
{
2012-10-15 13:36:06 +00:00
this . baseName = System . IO . Path . Combine (
System . IO . Path . GetDirectoryName ( baseName ) ,
System . IO . Path . GetFileNameWithoutExtension ( baseName ) ) ;
2012-06-11 23:24:57 +00:00
segment = 0 ;
startsegment ( ) ;
}
void startsegment ( )
{
2012-06-13 15:49:58 +00:00
var currentfile = System . IO . File . Open ( String . Format ( "{0}_{1,4:D4}.nut" , baseName , segment ) , System . IO . FileMode . Create , System . IO . FileAccess . Write ) ;
2012-06-11 23:24:57 +00:00
current = new NutMuxer ( width , height , fpsnum , fpsden , sampleRate , channels , currentfile ) ;
}
void endsegment ( )
{
current . Finish ( ) ;
current = null ;
}
public void CloseFile ( )
{
endsegment ( ) ;
}
public void AddFrame ( IVideoProvider source )
{
if ( source . BufferHeight ! = height | | source . BufferWidth ! = width )
SetVideoParameters ( source . BufferWidth , source . BufferHeight ) ;
2014-07-30 03:12:21 +00:00
current . WriteVideoFrame ( source . GetVideoBuffer ( ) ) ;
2012-06-11 23:24:57 +00:00
}
public void AddSamples ( short [ ] samples )
{
2014-07-30 03:12:21 +00:00
current . WriteAudioFrame ( samples ) ;
2012-06-11 23:24:57 +00:00
}
public void SetMovieParameters ( int fpsnum , int fpsden )
{
this . fpsnum = fpsnum ;
this . fpsden = fpsden ;
if ( current ! = null )
{
endsegment ( ) ;
segment + + ;
startsegment ( ) ;
}
}
public void SetVideoParameters ( int width , int height )
{
this . width = width ;
this . height = height ;
if ( current ! = null )
{
endsegment ( ) ;
segment + + ;
startsegment ( ) ;
}
}
public void SetAudioParameters ( int sampleRate , int channels , int bits )
{
if ( bits ! = 16 )
2015-02-10 04:19:34 +00:00
throw new ArgumentOutOfRangeException ( "bits" , "Audio depth must be 16 bit!" ) ;
2012-06-11 23:24:57 +00:00
this . sampleRate = sampleRate ;
this . channels = channels ;
}
public void SetMetaData ( string gameName , string authors , ulong lengthMS , ulong rerecords )
{
// could be implemented?
}
public void Dispose ( )
{
2012-07-23 00:33:30 +00:00
if ( current ! = null )
endsegment ( ) ;
baseName = null ;
2012-06-11 23:24:57 +00:00
}
2012-06-13 19:50:50 +00:00
public string DesiredExtension ( )
{
return "nut" ;
}
2012-07-23 00:33:30 +00:00
public void SetDefaultVideoCodecToken ( )
{
// ignored
}
2016-03-05 23:19:12 +00:00
public bool UsesAudio { get { return true ; } }
public bool UsesVideo { get { return true ; } }
2012-06-11 23:24:57 +00:00
}
}