repair and speedup tasedit

This commit is contained in:
zeromus 2008-06-03 05:50:58 +00:00
parent f062107e60
commit c366dc1f2b
3 changed files with 63 additions and 38 deletions

View File

@ -87,7 +87,7 @@ void MovieData::TryDumpIncremental()
{ {
if(currFrameCounter < (int)currMovieData.records.size()) if(currFrameCounter < (int)currMovieData.records.size())
{ {
MovieData::dumpSavestateTo(&currMovieData.records[currFrameCounter].savestate,Z_NO_COMPRESSION); MovieData::dumpSavestateTo(&currMovieData.records[currFrameCounter].savestate,Z_DEFAULT_COMPRESSION);
currMovieData.greenZoneCount++; currMovieData.greenZoneCount++;
} }
} }
@ -437,6 +437,7 @@ void MovieData::dumpSavestateTo(std::vector<char>* buf, int compressionLevel)
{ {
memorystream ms(buf); memorystream ms(buf);
FCEUSS_SaveMS(&ms,compressionLevel); FCEUSS_SaveMS(&ms,compressionLevel);
ms.trim();
} }
//begin playing an existing movie //begin playing an existing movie
@ -716,9 +717,12 @@ bool FCEUMOV_ReadState(FILE* st, uint32 size)
fread(&buf[0],1,size,st); fread(&buf[0],1,size,st);
FILE* tmp = tmpfile(); FILE* tmp = tmpfile();
fwrite(&buf[0],1,size,tmp); fwrite(&buf[0],1,size,tmp);
FILE* wtf = fopen("d:\\wtf.txt","wb"); //---------
fwrite(&buf[0],1,size,wtf); //(debug)
fclose(wtf); //FILE* wtf = fopen("d:\\wtf.txt","wb");
//fwrite(&buf[0],1,size,wtf);
//fclose(wtf);
//---------
fseek(tmp,0,SEEK_SET); fseek(tmp,0,SEEK_SET);
MovieData tempMovieData = MovieData(); MovieData tempMovieData = MovieData();
LoadFM2(tempMovieData, tmp); LoadFM2(tempMovieData, tmp);
@ -797,7 +801,8 @@ int FCEUMOV_PostLoad(void)
if(!FCEUI_IsMovieActive()) if(!FCEUI_IsMovieActive())
return 1; return 1;
else else
return load_successful; //mbg tasedit hack!!!!!!!!!
return load_successful || moviePleaseLogSavestates;
} }
int FCEUI_IsMovieActive(void) int FCEUI_IsMovieActive(void)

View File

@ -389,25 +389,26 @@ bool FCEUSS_SaveMS(std::ostream* outstream, int compressionLevel)
FCEUPPU_SaveState(); FCEUPPU_SaveState();
FCEUSND_SaveState(); FCEUSND_SaveState();
totalsize=WriteStateChunk(os,1,SFCPU); totalsize=WriteStateChunk(os,1,SFCPU);
ms.sync();
totalsize+=WriteStateChunk(os,2,SFCPUC); totalsize+=WriteStateChunk(os,2,SFCPUC);
ms.sync();
totalsize+=WriteStateChunk(os,3,FCEUPPU_STATEINFO); totalsize+=WriteStateChunk(os,3,FCEUPPU_STATEINFO);
ms.sync();
totalsize+=WriteStateChunk(os,4,FCEUCTRL_STATEINFO); totalsize+=WriteStateChunk(os,4,FCEUCTRL_STATEINFO);
ms.sync();
totalsize+=WriteStateChunk(os,5,FCEUSND_STATEINFO); totalsize+=WriteStateChunk(os,5,FCEUSND_STATEINFO);
ms.sync();
if(FCEUI_IsMovieActive()) if(FCEUI_IsMovieActive())
{ {
totalsize+=WriteStateChunk(os,6,FCEUMOV_STATEINFO); totalsize+=WriteStateChunk(os,6,FCEUMOV_STATEINFO);
ms.sync();
//MBG tasedit HACK HACK HACK!
//do not save the movie state if we are in tasedit! that is a huge waste of time and space!
extern bool moviePleaseLogSavestates;
if(!moviePleaseLogSavestates)
{
uint32 size = FCEUMOV_WriteState((std::ostream*)0); uint32 size = FCEUMOV_WriteState((std::ostream*)0);
os->put(7); os->put(7);
write32le(size, os); write32le(size, os);
FCEUMOV_WriteState(os); FCEUMOV_WriteState(os);
totalsize += 5 + size; totalsize += 5 + size;
} }
}
// save back buffer // save back buffer
{ {
extern uint8 *XBackBuf; extern uint8 *XBackBuf;
@ -416,7 +417,6 @@ bool FCEUSS_SaveMS(std::ostream* outstream, int compressionLevel)
write32le(size, os); write32le(size, os);
os->write((char*)XBackBuf,size); os->write((char*)XBackBuf,size);
totalsize += 5 + size; totalsize += 5 + size;
ms.sync();
} }
if(SPreSave) SPreSave(); if(SPreSave) SPreSave();
@ -453,7 +453,7 @@ bool FCEUSS_SaveMS(std::ostream* outstream, int compressionLevel)
//dump it to the destination file //dump it to the destination file
outstream->write((char*)header,16); outstream->write((char*)header,16);
outstream->write((char*)cbuf,comprlen); outstream->write((char*)cbuf,comprlen==-1?totalsize:comprlen);
if(cbuf != (uint8*)ms.buf()) delete[] cbuf; if(cbuf != (uint8*)ms.buf()) delete[] cbuf;
return error == Z_OK; return error == Z_OK;
@ -657,9 +657,17 @@ bool FCEUSS_LoadFP(FILE *st, ENUM_SSLOADPARAMS params)
int stateversion = FCEU_de32lsb(header + 8); int stateversion = FCEU_de32lsb(header + 8);
int comprlen = FCEU_de32lsb(header + 12); int comprlen = FCEU_de32lsb(header + 12);
//load the compressed chunk and decompress //load the compressed chunk and decompress if necessary
std::vector<uint8> cbuf(comprlen);
std::vector<uint8> buf(totalsize); std::vector<uint8> buf(totalsize);
if(comprlen == -1)
{
int ret = fread(&buf[0],1,totalsize,st);
if(ret != totalsize)
return false;
}
else
{
std::vector<uint8> cbuf(comprlen);
if(fread(&cbuf[0],1,comprlen,st) != comprlen) if(fread(&cbuf[0],1,comprlen,st) != comprlen)
return false; return false;
@ -667,6 +675,7 @@ bool FCEUSS_LoadFP(FILE *st, ENUM_SSLOADPARAMS params)
int error = uncompress(&buf[0],&uncomprlen,&cbuf[0],comprlen); int error = uncompress(&buf[0],&uncomprlen,&cbuf[0],comprlen);
if(error != Z_OK || uncomprlen != totalsize) if(error != Z_OK || uncomprlen != totalsize)
return false; return false;
}
//dump it back to a tempfile //dump it back to a tempfile
FILE* tmp = tmpfile(); FILE* tmp = tmpfile();

View File

@ -30,13 +30,6 @@ private:
public: public:
//the logical length of the buffer
size_t size()
{
sync();
return length;
}
memory_streambuf() memory_streambuf()
: length(0) : length(0)
, myBuf(true) , myBuf(true)
@ -73,13 +66,19 @@ public:
sync(); sync();
} }
~memory_streambuf() ~memory_streambuf()
{ {
//only cleanup if we own the seq //only cleanup if we own the seq
if(myBuf) delete[] buf; if(myBuf) delete[] buf;
} }
//the logical length of the buffer
size_t size()
{
sync();
return length;
}
//to avoid copying, rebuilds the provided vector and copies the streambuf contents into it //to avoid copying, rebuilds the provided vector and copies the streambuf contents into it
void toVector(std::vector<T>& out) void toVector(std::vector<T>& out)
{ {
@ -93,6 +92,14 @@ public:
return std::vector<T>(buf,buf+length); return std::vector<T>(buf,buf+length);
} }
//if the memorystream wraps a vector, the vector will be trimmed to the correct size,.
//you probably need to use this if you are using the vector wrapper
void trim()
{
if(!usevec) return;
usevec->resize(size());
}
//tells the current read or write position //tells the current read or write position
std::streampos tell(std::ios::openmode which) std::streampos tell(std::ios::openmode which)
{ {
@ -234,13 +241,13 @@ public:
{} {}
memorystream(char* usebuf, int buflength) memorystream(char* usebuf, int buflength)
: streambuf(usebuf, buflength) : std::basic_iostream<char, std::char_traits<char> >(&streambuf)
, std::basic_iostream<char, std::char_traits<char> >(&streambuf) , streambuf(usebuf, buflength)
{} {}
memorystream(std::vector<char>* usevec) memorystream(std::vector<char>* usevec)
: streambuf(usevec) : std::basic_iostream<char, std::char_traits<char> >(&streambuf)
, std::basic_iostream<char, std::char_traits<char> >(&streambuf) , streambuf(usevec)
{} {}
//the underlying memory_streambuf //the underlying memory_streambuf
@ -255,4 +262,8 @@ public:
void sync() { streambuf.sync(); } void sync() { streambuf.sync(); }
//rewinds the cursors to offset 0 //rewinds the cursors to offset 0
void rewind() { streambuf.seekpos(0,std::ios::in | std::ios::out); } void rewind() { streambuf.seekpos(0,std::ios::in | std::ios::out); }
//if the memorystream wraps a vector, the vector will be trimmed to the correct size,.
//you probably need to use this if you are using the vector wrapper
void trim() { streambuf.trim(); }
}; };