diff options
author | biocrasher <biocrasher@f606c939-3180-4ac9-a4b8-4b8779d57d0a> | 2006-07-16 09:14:06 +0000 |
---|---|---|
committer | biocrasher <biocrasher@f606c939-3180-4ac9-a4b8-4b8779d57d0a> | 2006-07-16 09:14:06 +0000 |
commit | eb1ffa1e6a6613621b9296c8a546c07e56d36fd6 (patch) | |
tree | 283c0baaa1ae2abbf80141c450b7973f82251ade /recordmydesktop | |
parent | a4abe733b807706958537def6ffc5e021466f793 (diff) |
conditional use of shmem
git-svn-id: https://recordmydesktop.svn.sourceforge.net/svnroot/recordmydesktop/trunk@19 f606c939-3180-4ac9-a4b8-4b8779d57d0a
Diffstat (limited to 'recordmydesktop')
-rw-r--r-- | recordmydesktop/doc/recordmydesktop.1 | 24 | ||||
-rw-r--r-- | recordmydesktop/include/recordmydesktop.h | 11 | ||||
-rw-r--r-- | recordmydesktop/src/get_frame.c | 27 | ||||
-rw-r--r-- | recordmydesktop/src/parseargs.c | 41 | ||||
-rw-r--r-- | recordmydesktop/src/recordmydesktop.c | 18 |
5 files changed, 93 insertions, 28 deletions
diff --git a/recordmydesktop/doc/recordmydesktop.1 b/recordmydesktop/doc/recordmydesktop.1 index 9001d56..0bffe9a 100644 --- a/recordmydesktop/doc/recordmydesktop.1 +++ b/recordmydesktop/doc/recordmydesktop.1 @@ -34,9 +34,7 @@ but this will notably increase the workload. In this case, enabling the \-\-with\-shared option is recommended .br -(by default this option is disabled since copying small areas of display is faster -.br -than uploading the whole image from video memory). +(by default this option is switched on or off at every frame, according to the size of the area to be aquired). .br .br recordMyDesktop doesn't have a commandline interface. @@ -181,7 +179,17 @@ Image Options: .TP .B \-\-with\-shared - Enable usage of MIT\-shared memory extension. + Enable usage of MIT\-shared memory extension at all times. +.br +.TP +.B + \-\-no\-cond\-shared + Do not use the MIT\-shared memory extension when aquiring large areas. +.br +.TP +.B + \-shared\-threshold n + Threshold over which shared memory is used(default 75). .br .TP .B @@ -283,11 +291,13 @@ If no other option is specified, filename can be given without the \-o switch. .br \-display DISPLAY| \-x X| \-y Y|\-width N| \-height N| \-fps N(number>0)| .br -\-v_quality n| \-s_quality n| \-v_bitrate n| \-\-drop\-frames| \-dummy\-cursor color| \-\-no\-dummy\-cursor| +\-v_quality n| \-s_quality n| \-v_bitrate n| \-\-no\-framedrop| \-dummy\-cursor color| +.br +\-\-no\-dummy\-cursor| \-freq N(number>0)| \-channels N(number>0)| \-device SOUND_DEVICE| .br -\-freq N(number>0)| \-channels N(number>0)| \-device SOUND_DEVICE| \-\-nosound| +\-\-nosound| \-\-with\-shared| \-\-no\-cond\-shared| \-shared\-threshold n| \-\-full\-shots| .br -\-\-with\-shared| \-\-full\-shots| \-\-scshot| \-scale\-shot N| \-o filename]^filename +\-\-scshot| \-scale\-shot N| \-o filename]^filename .br .br .br diff --git a/recordmydesktop/include/recordmydesktop.h b/recordmydesktop/include/recordmydesktop.h index f02161e..a3c9782 100644 --- a/recordmydesktop/include/recordmydesktop.h +++ b/recordmydesktop/include/recordmydesktop.h @@ -111,7 +111,9 @@ typedef struct _ProgArgs{ unsigned int channels; //no of channels(default 2) char *device; //default sound device(default according to alsa or oss) int nosound; //do not record sound(default 0) - int noshared; //do not use shared memory extension(default disabled) + int noshared; //do not use shared memory extension(default 1) + int nocondshared; //de not use shared memory on large image aquititions + int shared_thres; //threshold to use shared memory int full_shots; //do not poll damage, take full screenshots int scshot; //take screenshot and exit(default 0) int scale_shot; //screenshot subscale factor(default 1) @@ -160,11 +162,13 @@ typedef struct _ProgData{ BRWindow brwin;//recording window Display *dpy;//curtrent display XImage *image;//the image that holds the current full screenshot + XImage *shimage;//the image that holds the current full screenshot(shared memory) unsigned char *dummy_pointer;//a dummy pointer to be drawn in every frame //data is casted to unsigned for later use in YUV buffer int dummy_p_size;//initially 16x16,always square unsigned char npxl;//this is the no pixel convention when drawing the dummy pointer - char *datamain,//the data of the image above + char *datamain,//the data of image + *datash,//the data of shimage *datatemp;//buffer for the temporary image,which will be //preallocated in case shared memory is not used. RectArea *rect_root[2];//the interchanging list roots for storing the changed regions @@ -267,11 +271,12 @@ unsigned char Yr[256],Yg[256],Yb[256], =(args)->width=(args)->height=(args)->quietmode\ =(args)->nosound=(args)->scshot=(args)->full_shots=0;\ (args)->noshared=(args)->scale_shot=1;\ - (args)->dropframes=0;\ + (args)->dropframes=(args)->nocondshared=0;\ (args)->filename=(char *)malloc(8);\ strcpy((args)->filename,"out.ogg");\ (args)->encoding=OGG_THEORA_VORBIS;\ (args)->cursor_color=1;\ + (args)->shared_thres=75;\ (args)->have_dummy_cursor=1;\ (args)->device=(char *)malloc(8);\ strcpy((args)->device,"hw:0,0");\ diff --git a/recordmydesktop/src/get_frame.c b/recordmydesktop/src/get_frame.c index 44f2ec4..1d6a126 100644 --- a/recordmydesktop/src/get_frame.c +++ b/recordmydesktop/src/get_frame.c @@ -33,6 +33,8 @@ void *GetFrame(void *pdata){ uint msk_ret; WGeometry mouse_pos_abs,mouse_pos_rel,mouse_pos_temp; Window root_ret,child_ret; + int pixel_total=((ProgData *)pdata)->brwin.rgeom.width*((ProgData *)pdata)->brwin.rgeom.height; + mouse_pos_abs.x=0; mouse_pos_abs.y=0; mouse_pos_abs.width=((ProgData *)pdata)->dummy_p_size; @@ -52,7 +54,24 @@ void *GetFrame(void *pdata){ ((ProgData *)pdata)->list_selector=((((ProgData *)pdata)->list_selector+1)%2); pthread_mutex_lock(&((ProgData *)pdata)->list_mutex[tlist_sel]); } - + //here we measure the list and decide which way we will go + if(!((ProgData *)pdata)->args.nocondshared){ + int level=0; + RectArea *temp=((ProgData *)pdata)->rect_root[tlist_sel]; + + if(temp!=NULL){ + do{ + level+=temp->geom.width*temp->geom.height; + temp=temp->next; + }while(temp!=NULL); + level*=100; + level/=pixel_total; + ((ProgData *)pdata)->args.noshared=(level<((ProgData *)pdata)->args.shared_thres); +// if(!((ProgData *)pdata)->args.noshared){ +// fprintf(stderr,"shared screenshot with %d\n",level); +// } + } + } if(((ProgData *)pdata)->args.have_dummy_cursor){ //dummy pointer sequence //update previous_position @@ -70,7 +89,7 @@ void *GetFrame(void *pdata){ &mouse_pos_rel.x,&mouse_pos_rel.y,&msk_ret); } if(!((ProgData *)pdata)->args.noshared) - XShmGetImage(((ProgData *)pdata)->dpy,((ProgData *)pdata)->specs.root,((ProgData *)pdata)->image,(((ProgData *)pdata)->brwin.rgeom.x),(((ProgData *)pdata)->brwin.rgeom.y),AllPlanes); + XShmGetImage(((ProgData *)pdata)->dpy,((ProgData *)pdata)->specs.root,((ProgData *)pdata)->shimage,(((ProgData *)pdata)->brwin.rgeom.x),(((ProgData *)pdata)->brwin.rgeom.y),AllPlanes); if(!((ProgData *)pdata)->args.full_shots) UpdateImage(((ProgData *)pdata)->dpy, &((ProgData *)pdata)->enc_data->yuv, @@ -79,7 +98,7 @@ void *GetFrame(void *pdata){ &((ProgData *)pdata)->rect_root[tlist_sel], &((ProgData *)pdata)->brwin, ((ProgData *)pdata)->enc_data, - ((((ProgData *)pdata)->args.noshared)?(((ProgData *)pdata)->datatemp):((ProgData *)pdata)->image->data), + ((((ProgData *)pdata)->args.noshared)?(((ProgData *)pdata)->datatemp):((ProgData *)pdata)->shimage->data), ((ProgData *)pdata)->args.noshared); else{ if(((ProgData *)pdata)->args.noshared){ @@ -96,7 +115,7 @@ void *GetFrame(void *pdata){ } else{ pthread_mutex_lock(&((ProgData *)pdata)->yuv_mutex); - XImageToYUV(((ProgData *)pdata)->image,&((ProgData *)pdata)->enc_data->yuv); + XImageToYUV(((ProgData *)pdata)->shimage,&((ProgData *)pdata)->enc_data->yuv); pthread_mutex_unlock(&((ProgData *)pdata)->yuv_mutex); } } diff --git a/recordmydesktop/src/parseargs.c b/recordmydesktop/src/parseargs.c index fd1f776..500b778 100644 --- a/recordmydesktop/src/parseargs.c +++ b/recordmydesktop/src/parseargs.c @@ -33,9 +33,10 @@ int ParseArgs(int argc,char **argv,ProgArgs *arg_return){ char *usage="\nUsage:\n" "\trecordmydesktop [-h| --help| --version| -delay n[H|h|M|m]| -windowid id_of_window|\n" "\t-display DISPLAY| -x X| -y Y|-width N| -height N| -fps N(number>0)|\n" - "\t -v_quality n| -s_quality n| -v_bitrate n| --no-framedrop| -dummy-cursor color| --no-dummy-cursor|\n" - "\t -freq N(number>0)| -channels N(number>0)| -device SOUND_DEVICE| --nosound|\n" - "\t --with-shared| --full-shots| --scshot| -scale-shot N| -o filename]^filename\n\n\n" + "\t -v_quality n| -s_quality n| -v_bitrate n| --no-framedrop| -dummy-cursor color|\n" + "\t --no-dummy-cursor| -freq N(number>0)| -channels N(number>0)| -device SOUND_DEVICE|\n" + "\t --nosound| --with-shared| --no-cond-shared| -shared-threshold n| --full-shots|\n" + "\t --scshot| -scale-shot N| -o filename]^filename\n\n\n" "General Options:\n" "\t-h or --help\t\tPrint this help and exit.\n" @@ -51,7 +52,9 @@ int ParseArgs(int argc,char **argv,ProgArgs *arg_return){ "\t-dummy-cursor color\tColor of the dummy cursor [black|white](default black)\n" "\t--no-dummy-cursor\tDisable drawing of a dummy cursor.\n" - "\t--with-shared\t\tEnable usage of MIT-shared memory extension.\n" + "\t--with-shared\t\tEnable usage of MIT-shared memory extension at all times.\n" + "\t--no-cond-shared\tDo not use the MIT-shared memory extension when aquiring large areas.\n" + "\t-shared-threshold n\tThreshold over which shared memory is used(default 75).\n" "\t--full-shots\t\tTake full screenshot at every frame(Not recomended!).\n" "\t-fps N(number>0.0)\tA positive number denoting desired framerate.\n\n" @@ -327,6 +330,22 @@ int ParseArgs(int argc,char **argv,ProgArgs *arg_return){ } i++; } + else if(!strcmp(argv[i],"-shared-threshold")){ + if(i+1<argc){ + int num=atoi(argv[i+1]); + if((num>0)&&(num<100)) + arg_return->shared_thres=num; + else{ + fprintf(stderr,"Argument Usage: --shared-threshold N(0<number<100)\n"); + return 1; + } + } + else{ + fprintf(stderr,"Argument Usage: -channels N(number>0)\n"); + return 1; + } + i++; + } else if(!strcmp(argv[i],"-scale-shot")){ if(i+1<argc){ int num=atoi(argv[i+1]); @@ -360,12 +379,20 @@ int ParseArgs(int argc,char **argv,ProgArgs *arg_return){ arg_return->nosound=1; else if(!strcmp(argv[i],"--drop-frames")) arg_return->dropframes=1; - else if(!strcmp(argv[i],"--with-shared")) + else if(!strcmp(argv[i],"--with-shared")){ arg_return->noshared=0; - else if(!strcmp(argv[i],"--full-shots")) + arg_return->nocondshared=1; + } + else if(!strcmp(argv[i],"--no-cond-shared")) + arg_return->nocondshared=1; + else if(!strcmp(argv[i],"--full-shots")){ arg_return->full_shots=1; - else if(!strcmp(argv[i],"--scshot")) + arg_return->nocondshared=1; + } + else if(!strcmp(argv[i],"--scshot")){ arg_return->scshot=1; + arg_return->nocondshared=1; + } else if(!strcmp(argv[i],"--help")||!strcmp(argv[i],"-h")){ fprintf(stderr,"%s",usage); return 1; diff --git a/recordmydesktop/src/recordmydesktop.c b/recordmydesktop/src/recordmydesktop.c index 7eb76df..5588b52 100644 --- a/recordmydesktop/src/recordmydesktop.c +++ b/recordmydesktop/src/recordmydesktop.c @@ -67,6 +67,7 @@ int main(int argc,char **argv){ //init data + if(!pdata.args.scshot){ fprintf(stderr,"Initializing...\n"); MakeMatrices(); @@ -104,19 +105,19 @@ int main(int argc,char **argv){ GetZPixmap(pdata.dpy,pdata.specs.root,pdata.image->data,pdata.brwin.rgeom.x,pdata.brwin.rgeom.y, pdata.brwin.rgeom.width,pdata.brwin.rgeom.height); } - else{ - pdata.image=XShmCreateImage (pdata.dpy,pdata.specs.visual,pdata.specs.depth,ZPixmap,pdata.datamain, + if((!pdata.args.noshared)||(!pdata.args.nocondshared)){ + pdata.shimage=XShmCreateImage (pdata.dpy,pdata.specs.visual,pdata.specs.depth,ZPixmap,pdata.datash, &shminfo, pdata.brwin.rgeom.width,pdata.brwin.rgeom.height); shminfo.shmid = shmget (IPC_PRIVATE, - pdata.image->bytes_per_line * pdata.image->height, + pdata.shimage->bytes_per_line * pdata.shimage->height, IPC_CREAT|0777); - shminfo.shmaddr = pdata.image->data = shmat (shminfo.shmid, 0, 0); + shminfo.shmaddr = pdata.shimage->data = shmat (shminfo.shmid, 0, 0); shminfo.readOnly = False; if(!XShmAttach(pdata.dpy,&shminfo)){ fprintf(stderr,"Failed to attach shared memory to proccess.\n"); exit(1); } - XShmGetImage(pdata.dpy,pdata.specs.root,pdata.image,0,0,AllPlanes); + XShmGetImage(pdata.dpy,pdata.specs.root,pdata.shimage,0,0,AllPlanes); } if(pdata.args.scshot){ @@ -138,7 +139,10 @@ int main(int argc,char **argv){ pdata.args.nosound=1; } InitEncoder(&pdata,&enc_data); - XImageToYUV(pdata.image,&pdata.enc_data->yuv); + if((pdata.args.nocondshared)&&(!pdata.args.noshared)) + XImageToYUV(pdata.shimage,&pdata.enc_data->yuv); + else + XImageToYUV(pdata.shimage,&pdata.enc_data->yuv); pdata.frametime=(1000000)/pdata.args.fps; @@ -181,7 +185,7 @@ int main(int argc,char **argv){ if(!pdata.args.full_shots) pthread_join(poll_damage_t,NULL); fprintf(stderr,"."); - if(!(pdata.args.noshared)){ + if((!pdata.args.noshared)||(!pdata.args.nocondshared)){ XShmDetach (pdata.dpy, &shminfo); // XDestroyImage (pdata.image); shmdt (&shminfo.shmaddr); |