summaryrefslogtreecommitdiff
path: root/recordmydesktop/src
diff options
context:
space:
mode:
Diffstat (limited to 'recordmydesktop/src')
-rw-r--r--recordmydesktop/src/cache_frame.c66
-rw-r--r--recordmydesktop/src/load_cache.c26
-rw-r--r--recordmydesktop/src/recordmydesktop.c3
-rw-r--r--recordmydesktop/src/rmd_cache.c72
4 files changed, 135 insertions, 32 deletions
diff --git a/recordmydesktop/src/cache_frame.c b/recordmydesktop/src/cache_frame.c
index 01d83d6..a968b14 100644
--- a/recordmydesktop/src/cache_frame.c
+++ b/recordmydesktop/src/cache_frame.c
@@ -46,7 +46,7 @@ int CompareBlocks(unsigned char *incoming,unsigned char *old,int blockno,int wid
return 0;
}
-void FlushBlock(unsigned char *buf,int blockno,int width, int height,int divisor,gzFile *fp,FILE *ucfp){
+int FlushBlock(unsigned char *buf,int blockno,int width, int height,int divisor,gzFile *fp,FILE *ucfp){
int j,
block_i=blockno/divisor,//place on the grid
block_k=blockno%divisor;
@@ -63,6 +63,7 @@ void FlushBlock(unsigned char *buf,int blockno,int width, int height,int divisor
buf_reg+=width;
}
}
+ return ((height*width)/pow(divisor,2));
}
void *CacheImageBuffer(void *pdata){
@@ -72,7 +73,13 @@ void *CacheImageBuffer(void *pdata){
yuv_buffer yuv[2];
gzFile *fp=NULL;
FILE *ucfp=NULL;
- int i,current=0,divisor=16,firstrun=1,frameno=0;
+ int i,
+ current=0,
+ divisor=16,
+ firstrun=1,
+ frameno=0,
+ nbytes=0,
+ nth_cache=1;
if(!((ProgData *)pdata)->args.zerocompression){
fp=((ProgData *)pdata)->cache_data->ifp;
@@ -174,34 +181,65 @@ void *CacheImageBuffer(void *pdata){
fheader.Vnum=vnum;
fheader.pad=0;
if(!((ProgData *)pdata)->args.zerocompression){
- gzwrite(fp,(void*)&fheader,sizeof(FrameHeader));
+ nbytes+=gzwrite(fp,(void*)&fheader,sizeof(FrameHeader));
//flush indexes
- if(ynum)gzwrite(fp,yblocks,ynum);
- if(unum)gzwrite(fp,ublocks,unum);
- if(vnum)gzwrite(fp,vblocks,vnum);
+ if(ynum)nbytes+=gzwrite(fp,yblocks,ynum);
+ if(unum)nbytes+=gzwrite(fp,ublocks,unum);
+ if(vnum)nbytes+=gzwrite(fp,vblocks,vnum);
}
else{
- fwrite((void*)&fheader,sizeof(FrameHeader),1,ucfp);
+ nbytes+=sizeof(FrameHeader)*fwrite((void*)&fheader,sizeof(FrameHeader),1,ucfp);
//flush indexes
- if(ynum)fwrite(yblocks,ynum,1,ucfp);
- if(unum)fwrite(ublocks,unum,1,ucfp);
- if(vnum)fwrite(vblocks,vnum,1,ucfp);
+ if(ynum)nbytes+=ynum*fwrite(yblocks,ynum,1,ucfp);
+ if(unum)nbytes+=unum*fwrite(ublocks,unum,1,ucfp);
+ if(vnum)nbytes+=vnum*fwrite(vblocks,vnum,1,ucfp);
}
//flush the blocks for each buffer
if(ynum)
for(j=0;j<ynum;j++)
- FlushBlock(yuv[current].y,yblocks[j],yuv[current].y_width,yuv[current].y_height,divisor,fp,ucfp);
+ nbytes+=FlushBlock( yuv[current].y,yblocks[j],
+ yuv[current].y_width,
+ yuv[current].y_height,
+ divisor,
+ fp,
+ ucfp);
if(unum)
for(j=0;j<unum;j++)
- FlushBlock(yuv[current].u,ublocks[j],yuv[current].uv_width,yuv[current].uv_height,divisor/2,fp,ucfp);
+ nbytes+=FlushBlock( yuv[current].u,ublocks[j],
+ yuv[current].uv_width,
+ yuv[current].uv_height,
+ divisor/2,
+ fp,
+ ucfp);
if(vnum)
for(j=0;j<vnum;j++)
- FlushBlock(yuv[current].v,vblocks[j],yuv[current].uv_width,yuv[current].uv_height,divisor/2,fp,ucfp);
+ nbytes+=FlushBlock( yuv[current].v,vblocks[j],
+ yuv[current].uv_width,
+ yuv[current].uv_height,
+ divisor/2,
+ fp,
+ ucfp);
/**@________________@**/
((ProgData *)pdata)->avd+=((ProgData *)pdata)->frametime*2*((ProgData *)pdata)->args.channels;
-
+ if(nbytes>CACHE_FILE_SIZE_LIMIT){
+ if(SwapCacheFilesWrite(((ProgData *)pdata)->cache_data->imgdata,nth_cache,&fp,&ucfp)){
+ fprintf(stderr,"New cache file could not be created.\nEnding recording...\n");
+ fflush(stderr);
+ raise(SIGINT); //if for some reason we cannot make a new file
+ //we have to stop. If we are out of space,which means
+ //that encoding cannot happen either,
+ //InitEncoder will cause an abrupt end with an
+ //error code and the cache will remain intact.
+ //If we've chosen separate two-stages, the program will make a
+ //clean exit.
+ //In either case data will be preserved so if
+ //space is freed the recording can be proccessed later.
+ }
+ nth_cache++;
+ nbytes=0;
+ }
}
//clean up since we're not finished
diff --git a/recordmydesktop/src/load_cache.c b/recordmydesktop/src/load_cache.c
index ffa3d67..2606900 100644
--- a/recordmydesktop/src/load_cache.c
+++ b/recordmydesktop/src/load_cache.c
@@ -51,6 +51,7 @@ void *LoadCache(void *pdata){
signed char *sound_data=(signed char *)malloc(((ProgData *)pdata)->periodsize);
int j=0,
+ nth_cache=1,
audio_end=0,
extra_frames=0,//total number of duplicated frames
missing_frames=0,//if this is found >0 current run will not load
@@ -171,7 +172,13 @@ void *LoadCache(void *pdata){
}
}
else{
- raise(SIGINT);
+ if(SwapCacheFilesRead(((ProgData *)pdata)->cache_data->imgdata,nth_cache,&ifp,&ucfp)){
+ raise(SIGINT);
+ }
+ else{
+ fprintf(stderr,"\t[Cache File %d]",nth_cache);
+ nth_cache++;
+ }
continue;
}
}
@@ -190,25 +197,8 @@ void *LoadCache(void *pdata){
CLEAR_FRAME(&frame)
free(sound_data);
- if(!((ProgData *)pdata)->args.zerocompression)
- gzclose(ifp);
- else
- fclose(ucfp);
-
- if(remove(((ProgData *)pdata)->cache_data->imgdata)){
- fprintf(stderr,"Couldn't remove temporary file %s",((ProgData *)pdata)->cache_data->imgdata);
- thread_exit=1;
- }
if(!((ProgData *)pdata)->args.nosound){
fclose(afp);
- if(remove(((ProgData *)pdata)->cache_data->audiodata)){
- fprintf(stderr,"Couldn't remove temporary file %s",((ProgData *)pdata)->cache_data->audiodata);
- thread_exit=1;
- }
- }
- if(remove(((ProgData *)pdata)->cache_data->projname)){
- fprintf(stderr,"Couldn't remove temporary directory %s",((ProgData *)pdata)->cache_data->projname);
- thread_exit=1;
}
pthread_exit(&thread_exit);
diff --git a/recordmydesktop/src/recordmydesktop.c b/recordmydesktop/src/recordmydesktop.c
index 77c08ce..7af3038 100644
--- a/recordmydesktop/src/recordmydesktop.c
+++ b/recordmydesktop/src/recordmydesktop.c
@@ -313,6 +313,9 @@ int main(int argc,char **argv){
pthread_join(load_cache_t,NULL);
fprintf(stderr,"Encoding finished!\nWait a moment please...\n");
pthread_join(flush_to_ogg_t,NULL);
+ fprintf(stderr,"Cleanning up cache...\n");
+ if(PurgeCache(pdata.cache_data,!pdata.args.nosound))
+ fprintf(stderr,"Some error occured while cleaning up cache!\n");
fprintf(stderr,"Done!!!\n");
}
}
diff --git a/recordmydesktop/src/rmd_cache.c b/recordmydesktop/src/rmd_cache.c
index ca13095..2a49895 100644
--- a/recordmydesktop/src/rmd_cache.c
+++ b/recordmydesktop/src/rmd_cache.c
@@ -26,6 +26,78 @@
#include <recordmydesktop.h>
+
+void CacheFileN(char *name,char **newname,int n){//nth cache file
+ char numbuf[8];
+ strcpy(*newname,name);
+ strcat(*newname,".");
+ I16TOA((n),numbuf)
+ strcat(*newname,numbuf);
+}
+
+int SwapCacheFilesWrite(char *name,int n,gzFile **fp,FILE **ucfp){
+ char *newname=malloc(strlen(name)+10);
+ CacheFileN(name,&newname,n);
+ if(*fp==NULL){
+ fflush(*ucfp);
+ fclose(*ucfp);
+ *ucfp=fopen(newname,"wb");
+ }
+ else{
+ gzflush(*fp,Z_FINISH);
+ gzclose(*fp);
+ *fp=gzopen(newname,"wb0f");
+ }
+ free(newname);
+ return ((*fp==NULL)&&(*ucfp==NULL));
+}
+
+int SwapCacheFilesRead(char *name,int n,gzFile **fp,FILE **ucfp){
+ char *newname=malloc(strlen(name)+10);
+ CacheFileN(name,&newname,n);
+ if(*fp==NULL){
+ fclose(*ucfp);
+ *ucfp=fopen(newname,"rb");
+ }
+ else{
+
+ gzclose(*fp);
+ *fp=gzopen(newname,"rb");
+ }
+ free(newname);
+ return ((*fp==NULL)&&(*ucfp==NULL));
+}
+
+int PurgeCache(CacheData *cache_data_t,int sound){
+ struct stat buff;
+ char *fname;
+ fname=malloc(strlen(cache_data_t->imgdata)+10);
+ strcpy(fname,cache_data_t->imgdata);
+ int exit_value=0;
+ int nth_cache=1;
+
+ while (stat(fname,&buff)==0){
+ if(remove(fname)){
+ fprintf(stderr,"Couldn't remove temporary file %s",cache_data_t->imgdata);
+ exit_value=1;
+ }
+ CacheFileN(cache_data_t->imgdata,&fname,nth_cache);
+ nth_cache++;
+ }
+ free(fname);
+ if(sound){
+ if(remove(cache_data_t->audiodata)){
+ fprintf(stderr,"Couldn't remove temporary file %s",cache_data_t->audiodata);
+ exit_value=1;
+ }
+ }
+ if(remove(cache_data_t->projname)){
+ fprintf(stderr,"Couldn't remove temporary directory %s",cache_data_t->projname);
+ exit_value=1;
+ }
+ return exit_value;
+}
+
void InitCacheData(ProgData *pdata,EncData *enc_data_t,CacheData *cache_data_t){
int width,height,offset_x,offset_y,pid;
char pidbuf[8];
© All Rights Reserved