diff options
Diffstat (limited to 'recordmydesktop/src')
| -rw-r--r-- | recordmydesktop/src/rmd_get_frame.c | 106 | ||||
| -rw-r--r-- | recordmydesktop/src/rmd_types.h | 6 | ||||
| -rw-r--r-- | recordmydesktop/src/rmd_update_image.c | 14 | ||||
| -rw-r--r-- | recordmydesktop/src/rmd_update_image.h | 3 | 
4 files changed, 67 insertions, 62 deletions
diff --git a/recordmydesktop/src/rmd_get_frame.c b/recordmydesktop/src/rmd_get_frame.c index cec2c80..d186f95 100644 --- a/recordmydesktop/src/rmd_get_frame.c +++ b/recordmydesktop/src/rmd_get_frame.c @@ -120,51 +120,56 @@ static void mark_buffer_area(	unsigned char *data,  //besides taking the first screenshot, this functions primary purpose is to   //initialize the structures and memory. -static int rmdFirstFrame(ProgData *pdata, XImage **image, XShmSegmentInfo *shminfo) { +static int rmdFirstFrame(ProgData *pdata, Image *image) {  	const XRectangle	*rrect = &pdata->brwin.rrect; -	if ((pdata->args.noshared)) { -		(*image) = XGetImage(	pdata->dpy, -					pdata->specs.root, -					rrect->x, -					rrect->y, -					rrect->width, -					rrect->height, -					AllPlanes, -					ZPixmap); +	if (pdata->args.noshared) { +		image->ximage = XGetImage(	pdata->dpy, +						pdata->specs.root, +						rrect->x, +						rrect->y, +						rrect->width, +						rrect->height, +						AllPlanes, +						ZPixmap);  	} else { -		(*image) = XShmCreateImage(	pdata->dpy, +		image->ximage = XShmCreateImage(pdata->dpy,  						pdata->specs.visual,  						pdata->specs.depth,  						ZPixmap,  						NULL, -						shminfo, +						&image->shm_info,  						rrect->width,  						rrect->height); -		(*shminfo).shmid = shmget(IPC_PRIVATE, -					(*image)->bytes_per_line * -					(*image)->height, -					IPC_CREAT|0777); +		image->shm_info.shmid = shmget(	IPC_PRIVATE, +						image->ximage->bytes_per_line * +						image->ximage->height, +						IPC_CREAT|0777); -		if ((*shminfo).shmid == -1) { +		if (image->shm_info.shmid == -1) {  			fprintf(stderr, "Failed to obtain Shared Memory segment!\n");  			return 12;  		} -		(*shminfo).shmaddr = (*image)->data = shmat((*shminfo).shmid, NULL,0); -		(*shminfo).readOnly = False; +		image->shm_info.shmaddr = image->ximage->data = shmat(image->shm_info.shmid, NULL, 0); +		image->shm_info.readOnly = False; -		if (!XShmAttach(pdata->dpy, shminfo)) { +		if (!XShmAttach(pdata->dpy, &image->shm_info)) {  			fprintf(stderr, "Failed to attach shared memory to proccess.\n");  			return 12;  		} -		XShmGetImage(pdata->dpy, pdata->specs.root, (*image), rrect->x, rrect->y, AllPlanes); +		XShmGetImage(	pdata->dpy, +				pdata->specs.root, +				image->ximage, +				rrect->x, +				rrect->y, +				AllPlanes);  	}  	rmdUpdateYuvBuffer(	&pdata->enc_data->yuv, -				((unsigned char*)((*image))->data), +				(unsigned char *)image->ximage->data,  				NULL,  				pdata->enc_data->x_offset,  				pdata->enc_data->y_offset, @@ -252,14 +257,13 @@ void *rmdGetFrame(ProgData *pdata) {  	BRWindow temp_brwin;  	Window root_ret, child_ret; //Frame  	XFixesCursorImage *xcim = NULL; -	XImage *image = NULL, *image_back = NULL;	//the image that holds +	Image image = {}, image_back = {};	//the image that holds  						//the current full screenshot -	XShmSegmentInfo shminfo, shminfo_back;	//info structure for the image above.  	int init_img1 = 0, init_img2 = 0, img_sel, d_buff;  	img_sel = d_buff = pdata->args.full_shots; -	if ((init_img1 = rmdFirstFrame(pdata, &image, &shminfo) != 0)) { +	if ((init_img1 = rmdFirstFrame(pdata, &image) != 0)) {  		if (pdata->args.encOnTheFly) {  			if (remove(pdata->args.filename)) {  				perror("Error while removing file:\n"); @@ -275,7 +279,7 @@ void *rmdGetFrame(ProgData *pdata) {  	}  	if (d_buff) { -		if ((init_img2 = rmdFirstFrame(pdata, &image_back, &shminfo_back) != 0)) { +		if ((init_img2 = rmdFirstFrame(pdata, &image_back) != 0)) {  			if (pdata->args.encOnTheFly) {  				if (remove(pdata->args.filename)) {  					perror("Error while removing file:\n"); @@ -394,8 +398,8 @@ void *rmdGetFrame(ProgData *pdata) {  					rmdRectInsert(&pdata->rect_root, &mouse_pos_temp);  				} else if (d_buff) {  					unsigned char *back_buff= img_sel ? -								((unsigned char*)image->data) : -								((unsigned char*)image_back->data); +								((unsigned char*)image.ximage->data) : +								((unsigned char*)image_back.ximage->data);  					mark_buffer_area(  						back_buff, @@ -430,9 +434,8 @@ void *rmdGetFrame(ProgData *pdata) {  					&pdata->rect_root,  					&temp_brwin,  					pdata->enc_data, -					image->data, +					&image,  					pdata->args.noshared, -					&shminfo,  					pdata->shm_opcode,  					pdata->args.no_quick_subsample); @@ -444,27 +447,28 @@ void *rmdGetFrame(ProgData *pdata) {  			pthread_mutex_unlock(&pdata->yuv_mutex);  		} else { -			unsigned char *front_buff = !img_sel ?	((unsigned char*)image->data): -								((unsigned char*)image_back->data); +			unsigned char *front_buff = !img_sel ?	((unsigned char*)image.ximage->data): +								((unsigned char*)image_back.ximage->data);  			unsigned char *back_buff = !d_buff ? NULL : (img_sel ? -								((unsigned char*)image->data): -								((unsigned char*)image_back->data)); - -			if (!pdata->args.noshared) -				XShmGetImage(	pdata->dpy, -						pdata->specs.root, -						((!img_sel) ? image : image_back), -						temp_brwin.rrect.x, -						temp_brwin.rrect.y, AllPlanes); +								((unsigned char*)image.ximage->data): +								((unsigned char*)image_back.ximage->data)); -			if (pdata->args.noshared) +			if (pdata->args.noshared) {  				rmdGetZPixmap(	pdata->dpy,  						pdata->specs.root, -						image->data, +						image.ximage->data,  						temp_brwin.rrect.x,  						temp_brwin.rrect.y,  						temp_brwin.rrect.width,  						temp_brwin.rrect.height); +			} else { +				XShmGetImage(	pdata->dpy, +						pdata->specs.root, +						((!img_sel) ? image.ximage : image_back.ximage), +						temp_brwin.rrect.x, +						temp_brwin.rrect.y, +						AllPlanes); +			}  			pthread_mutex_lock(&pdata->yuv_mutex);  			for(int i = 0; i < blocknum_x * blocknum_y; i++) @@ -535,8 +539,8 @@ void *rmdGetFrame(ProgData *pdata) {  					//will be the back buffer next time it's   					//used)   					unsigned char *front_buff = !img_sel ? -								((unsigned char*)image->data) : -								((unsigned char*)image_back->data); +								((unsigned char*)image.ximage->data) : +								((unsigned char*)image_back.ximage->data);  					mark_buffer_area(  						front_buff, @@ -576,13 +580,13 @@ void *rmdGetFrame(ProgData *pdata) {  	pthread_mutex_unlock(&pdata->img_buff_ready_mutex);  	if (!pdata->args.noshared) { -		XShmDetach (pdata->dpy, &shminfo); -		shmdt (shminfo.shmaddr); -		shmctl (shminfo.shmid, IPC_RMID, 0); +		XShmDetach(pdata->dpy, &image.shm_info); +		shmdt(image.shm_info.shmaddr); +		shmctl(image.shm_info.shmid, IPC_RMID, 0);  		if (d_buff) { -			XShmDetach (pdata->dpy, &shminfo_back); -			shmdt (shminfo_back.shmaddr); -			shmctl (shminfo_back.shmid, IPC_RMID, 0); +			XShmDetach(pdata->dpy, &image_back.shm_info); +			shmdt(image_back.shm_info.shmaddr); +			shmctl(image_back.shm_info.shmid, IPC_RMID, 0);  		}  	} diff --git a/recordmydesktop/src/rmd_types.h b/recordmydesktop/src/rmd_types.h index cbabb47..051e034 100644 --- a/recordmydesktop/src/rmd_types.h +++ b/recordmydesktop/src/rmd_types.h @@ -31,6 +31,7 @@  #include <pthread.h>  #include <zlib.h>  #include <X11/Xlib.h> +#include <X11/extensions/XShm.h>  #include <theora/theora.h>  #include <vorbis/codec.h>  #include <vorbis/vorbisenc.h> @@ -88,6 +89,11 @@ typedef int boolean;  // Forward declarations   typedef struct _ProgData ProgData; +typedef struct _Image { +	XImage		*ximage; +	XShmSegmentInfo	shm_info; +}Image; +  typedef struct _DisplaySpecs{   //this struct holds some basic information  	int screen;				 //about the display,needed mostly for  	unsigned int width, height; //validity checks at startup diff --git a/recordmydesktop/src/rmd_update_image.c b/recordmydesktop/src/rmd_update_image.c index 615bcd3..52ed478 100644 --- a/recordmydesktop/src/rmd_update_image.c +++ b/recordmydesktop/src/rmd_update_image.c @@ -42,20 +42,18 @@ void rmdUpdateImage(	Display * dpy,  			RectArea **root,  			BRWindow *brwin,  			EncData *enc, -			char *datatemp, +			Image *image,  			int noshmem, -			XShmSegmentInfo *shminfo,  			int shm_opcode,  			int no_quick_subsample){ -	unsigned char *dtap=(unsigned char*)datatemp;  	RectArea *temp;  	for (temp = *root; temp; temp = temp->next) {  		if (noshmem) {  			rmdGetZPixmap(	dpy,  					specs->root, -					datatemp, +					image->ximage->data,  					temp->rect.x,  					temp->rect.y,  					temp->rect.width, @@ -63,19 +61,17 @@ void rmdUpdateImage(	Display * dpy,  		} else {  			rmdGetZPixmapSHM(	dpy,  						specs->root, -						shminfo, +						&image->shm_info,  						shm_opcode, -						datatemp, +						image->ximage->data,  						temp->rect.x,  						temp->rect.y,  						temp->rect.width,  						temp->rect.height);  		} - -  		rmdUpdateYuvBuffer(  			yuv, -			dtap, +			(unsigned char *)image->ximage->data,  			NULL,  			temp->rect.x - brwin->rrect.x + enc->x_offset,  			temp->rect.y - brwin->rrect.y + enc->y_offset, diff --git a/recordmydesktop/src/rmd_update_image.h b/recordmydesktop/src/rmd_update_image.h index e157f35..3057f18 100644 --- a/recordmydesktop/src/rmd_update_image.h +++ b/recordmydesktop/src/rmd_update_image.h @@ -61,9 +61,8 @@ void rmdUpdateImage(Display * dpy,                      RectArea **root,                      BRWindow *brwin,                      EncData *enc, -                    char *datatemp, +                    Image *image,                      int noshmem, -                    XShmSegmentInfo *shminfo,                      int shm_opcode,                      int no_quick_subsample);  | 
