compress the savestate in fcm

This commit is contained in:
zeromus 2008-05-24 17:53:14 +00:00
parent 2dcd90fc6c
commit bf6d70c56d
1 changed files with 35 additions and 4 deletions

View File

@ -22,6 +22,8 @@
#include "movie.h" #include "movie.h"
#include "utils/memory.h" #include "utils/memory.h"
#include "utils/xstring.h" #include "utils/xstring.h"
#include "zlib.h"
#define MOVIE_MAGIC 0x1a4d4346 // FCM\x1a #define MOVIE_MAGIC 0x1a4d4346 // FCM\x1a
#define MOVIE_VERSION 3 // still at 2 since the format itself is still compatible - to detect which version the movie was made with, check the fceu version stored in the movie header (e.g against FCEU_VERSION_NUMERIC) #define MOVIE_VERSION 3 // still at 2 since the format itself is still compatible - to detect which version the movie was made with, check the fceu version stored in the movie header (e.g against FCEU_VERSION_NUMERIC)
@ -38,6 +40,8 @@ extern char FileBase[];
//which the user would have already converted from fcm //which the user would have already converted from fcm
//also cleanup the whole emulator version bullshit in replay. we dont support that old stuff anymore //also cleanup the whole emulator version bullshit in replay. we dont support that old stuff anymore
//todo - better error handling for the compressed savestate (handle compression)
/* /*
struct MovieHeader struct MovieHeader
{ {
@ -434,11 +438,23 @@ void FCEUI_LoadMovie(char *fname, int _read_only, int _pauseframe)
//WE NEED TO LOAD A SAVESTATE //WE NEED TO LOAD A SAVESTATE
if(!currMovieData.poweronFlag) if(!currMovieData.poweronFlag)
{ {
//uncompress the savestate
int bufsize = ntohl(*(int*)&currMovieData.savestate[0]);
uint8* buf = new uint8[bufsize];
uLongf uncomprlen = bufsize;
uncompress(buf,&uncomprlen,(uint8*)&currMovieData.savestate[4],currMovieData.savestate.size()-4);
//dump it to disk
FILE* fp = tmpfile(); FILE* fp = tmpfile();
fwrite(&currMovieData.savestate[0],1,currMovieData.savestate.size(),fp); fwrite(buf,1,bufsize,fp);
fseek(fp,0,SEEK_SET); fseek(fp,0,SEEK_SET);
//and load the state
bool success = FCEUSS_LoadFP(fp,SSLOADPARAM_BACKUP); bool success = FCEUSS_LoadFP(fp,SSLOADPARAM_BACKUP);
fclose(fp); fclose(fp);
delete[] buf;
if(!success) return; if(!success) return;
} }
@ -506,15 +522,30 @@ void FCEUI_SaveMovie(char *fname, uint8 flags, const char* metadata)
} }
else else
{ {
//dump a savestate //dump a savestate to a tempfile..
FILE* tmp = tmpfile(); FILE* tmp = tmpfile();
FCEUSS_SaveFP(tmp); FCEUSS_SaveFP(tmp);
fseek(tmp,0,SEEK_END); fseek(tmp,0,SEEK_END);
int len = (int)ftell(tmp); int len = (int)ftell(tmp);
fseek(tmp,0,SEEK_SET); fseek(tmp,0,SEEK_SET);
currMovieData.savestate.resize(len); //reloading the savestate from the tempfile..
fread(&currMovieData.savestate[0],1,len,tmp); uint8* buf = new uint8[len];
fread(buf,1,len,tmp);
fclose(tmp); fclose(tmp);
//compress it
uint8* cbuf = new uint8[len*2]; //worst case compression, lets say twice the input buffer size
uLongf destlen;
int error = compress2(cbuf,&destlen,buf,len,Z_BEST_COMPRESSION);
//poke it in the data structure
currMovieData.savestate.resize(destlen+4);
memcpy(&currMovieData.savestate[4],cbuf,destlen);
*(int*)&currMovieData.savestate[0] = htonl(len);
//cleanup
delete[] buf;
delete[] cbuf;
} }
//we are going to go ahead and dump the header. from now on we will only be appending frames //we are going to go ahead and dump the header. from now on we will only be appending frames