diff options
Diffstat (limited to 'recordmydesktop/src/get_frame.c')
-rw-r--r-- | recordmydesktop/src/get_frame.c | 176 |
1 files changed, 88 insertions, 88 deletions
diff --git a/recordmydesktop/src/get_frame.c b/recordmydesktop/src/get_frame.c index b1da1fe..d020f97 100644 --- a/recordmydesktop/src/get_frame.c +++ b/recordmydesktop/src/get_frame.c @@ -27,47 +27,47 @@ #include <recordmydesktop.h> -void *GetFrame(void *pdata){ +void *GetFrame(ProgData *pdata){ int tlist_sel=0; pthread_mutex_t pmut,tmut; 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; + int pixel_total=pdata->brwin.rgeom.width*pdata->brwin.rgeom.height; XFixesCursorImage *xcim=NULL; mouse_pos_abs.x=mouse_pos_temp.x=0; mouse_pos_abs.y=mouse_pos_temp.y=0; - mouse_pos_abs.width=mouse_pos_temp.width=((ProgData *)pdata)->dummy_p_size; - mouse_pos_abs.height=mouse_pos_temp.height=((ProgData *)pdata)->dummy_p_size; + mouse_pos_abs.width=mouse_pos_temp.width=pdata->dummy_p_size; + mouse_pos_abs.height=mouse_pos_temp.height=pdata->dummy_p_size; pthread_mutex_init(&pmut,NULL); pthread_mutex_init(&tmut,NULL); - while(((ProgData *)pdata)->running){ - + while(pdata->running){ + //if we are left behind we must not wait. - //also before actually pausing we must make sure the streams + //also before actually pausing we must make sure the streams //are synced. sound stops so this should only happen quickly. - if(((ProgData *)pdata)->avd>0){ - pthread_cond_wait(&((ProgData *)pdata)->time_cond,&tmut); + if(pdata->avd>0){ + pthread_cond_wait(&pdata->time_cond,&tmut); if(Paused){ - pthread_cond_wait(&((ProgData *)pdata)->pause_cond,&pmut); + pthread_cond_wait(&pdata->pause_cond,&pmut); } } capture_busy=1; - - /*pthread_cond_wait(&((ProgData *)pdata)->pause_cond,&((ProgData *)pdata)->pause_cond_mutex);*/ + + /*pthread_cond_wait(&pdata->pause_cond,&pdata->pause_cond_mutex);*/ //mutexes and lists with changes are useless when full_shots is enabled - if(!((ProgData *)pdata)->args.full_shots){ - tlist_sel=((ProgData *)pdata)->list_selector; - ((ProgData *)pdata)->list_selector=((((ProgData *)pdata)->list_selector+1)%2); - pthread_mutex_lock(&((ProgData *)pdata)->list_mutex[tlist_sel]); + if(!pdata->args.full_shots){ + tlist_sel=pdata->list_selector; + pdata->list_selector=((pdata->list_selector+1)%2); + pthread_mutex_lock(&pdata->list_mutex[tlist_sel]); } //here we measure the list and decide which way we will go - if(!((ProgData *)pdata)->args.nocondshared){ + if(!pdata->args.nocondshared){ int level=0; - RectArea *temp=((ProgData *)pdata)->rect_root[tlist_sel]; - + RectArea *temp=pdata->rect_root[tlist_sel]; + if(temp!=NULL){ do{ level+=temp->geom.width*temp->geom.height; @@ -75,102 +75,102 @@ void *GetFrame(void *pdata){ }while(temp!=NULL); level*=100; level/=pixel_total; - ((ProgData *)pdata)->args.noshared=(level<((ProgData *)pdata)->args.shared_thres); -// if(!((ProgData *)pdata)->args.noshared){ + pdata->args.noshared=(level<pdata->args.shared_thres); +// if(!pdata->args.noshared){ // fprintf(stderr,"shared screenshot with %d\n",level); // } } } - if(((ProgData *)pdata)->args.xfixes_cursor){ + if(pdata->args.xfixes_cursor){ //xfixes pointer sequence //update previous_position //(if full_shots is enabled this is skipped since it's pointless) - if(!((ProgData *)pdata)->args.full_shots){ - CLIP_DUMMY_POINTER_AREA(mouse_pos_abs,&((ProgData *)pdata)->brwin,&mouse_pos_temp); + if(!pdata->args.full_shots){ + CLIP_DUMMY_POINTER_AREA(mouse_pos_abs,&pdata->brwin,&mouse_pos_temp); if((mouse_pos_temp.x>=0)&&(mouse_pos_temp.y>=0)&&(mouse_pos_temp.width>0)&&(mouse_pos_temp.height>0)) - RectInsert(&((ProgData *)pdata)->rect_root[tlist_sel],&mouse_pos_temp); + RectInsert(&pdata->rect_root[tlist_sel],&mouse_pos_temp); } - xcim=XFixesGetCursorImage(((ProgData *)pdata)->dpy); + xcim=XFixesGetCursorImage(pdata->dpy); mouse_pos_abs.x=xcim->x; mouse_pos_abs.y=xcim->y; mouse_pos_abs.width=xcim->width; mouse_pos_abs.height=xcim->height; } - if(((ProgData *)pdata)->args.have_dummy_cursor){ + if(pdata->args.have_dummy_cursor){ //dummy pointer sequence //update previous_position //(if full_shots is enabled this is skipped since it's pointless) - if(!((ProgData *)pdata)->args.full_shots){ - CLIP_DUMMY_POINTER_AREA(mouse_pos_abs,&((ProgData *)pdata)->brwin,&mouse_pos_temp); + if(!pdata->args.full_shots){ + CLIP_DUMMY_POINTER_AREA(mouse_pos_abs,&pdata->brwin,&mouse_pos_temp); if((mouse_pos_temp.x>=0)&&(mouse_pos_temp.y>=0)&&(mouse_pos_temp.width>0)&&(mouse_pos_temp.height>0)) - RectInsert(&((ProgData *)pdata)->rect_root[tlist_sel],&mouse_pos_temp); + RectInsert(&pdata->rect_root[tlist_sel],&mouse_pos_temp); } //find new one - XQueryPointer(((ProgData *)pdata)->dpy, - ((ProgData *)pdata)->specs.root, + XQueryPointer(pdata->dpy, + pdata->specs.root, &root_ret,&child_ret, &mouse_pos_abs.x,&mouse_pos_abs.y, &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)->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, - &((ProgData *)pdata)->yuv_mutex, - &((ProgData *)pdata)->specs, - &((ProgData *)pdata)->rect_root[tlist_sel], - &((ProgData *)pdata)->brwin, - ((ProgData *)pdata)->enc_data, - ((((ProgData *)pdata)->args.noshared)?(((ProgData *)pdata)->datatemp):((ProgData *)pdata)->shimage->data), - ((ProgData *)pdata)->args.noshared, - ((ProgData *)pdata)->args.no_quick_subsample); + if(!pdata->args.noshared) + XShmGetImage(pdata->dpy,pdata->specs.root,pdata->shimage,(pdata->brwin.rgeom.x),(pdata->brwin.rgeom.y),AllPlanes); + if(!pdata->args.full_shots) + UpdateImage(pdata->dpy, + &pdata->enc_data->yuv, + &pdata->yuv_mutex, + &pdata->specs, + &pdata->rect_root[tlist_sel], + &pdata->brwin, + pdata->enc_data, + ((pdata->args.noshared)?(pdata->datatemp):pdata->shimage->data), + pdata->args.noshared, + pdata->args.no_quick_subsample); else{ - if(((ProgData *)pdata)->args.noshared){ - GetZPixmap( ((ProgData *)pdata)->dpy, - ((ProgData *)pdata)->specs.root, - ((ProgData *)pdata)->image->data, - ((ProgData *)pdata)->brwin.rgeom.x, - ((ProgData *)pdata)->brwin.rgeom.y, - ((ProgData *)pdata)->brwin.rgeom.width, - ((ProgData *)pdata)->brwin.rgeom.height); - pthread_mutex_lock(&((ProgData *)pdata)->yuv_mutex); - if(((ProgData *)pdata)->args.no_quick_subsample){ - UPDATE_YUV_BUFFER_IM_AVG((&((ProgData *)pdata)->enc_data->yuv),((unsigned char*)((ProgData *)pdata)->image->data), - (((ProgData *)pdata)->enc_data->x_offset),(((ProgData *)pdata)->enc_data->y_offset), - (((ProgData *)pdata)->brwin.rgeom.width),(((ProgData *)pdata)->brwin.rgeom.height)); + if(pdata->args.noshared){ + 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); + pthread_mutex_lock(&pdata->yuv_mutex); + if(pdata->args.no_quick_subsample){ + UPDATE_YUV_BUFFER_IM_AVG((&pdata->enc_data->yuv),((unsigned char*)pdata->image->data), + (pdata->enc_data->x_offset),(pdata->enc_data->y_offset), + (pdata->brwin.rgeom.width),(pdata->brwin.rgeom.height)); } else{ - UPDATE_YUV_BUFFER_IM((&((ProgData *)pdata)->enc_data->yuv),((unsigned char*)((ProgData *)pdata)->image->data), - (((ProgData *)pdata)->enc_data->x_offset),(((ProgData *)pdata)->enc_data->y_offset), - (((ProgData *)pdata)->brwin.rgeom.width),(((ProgData *)pdata)->brwin.rgeom.height)); + UPDATE_YUV_BUFFER_IM((&pdata->enc_data->yuv),((unsigned char*)pdata->image->data), + (pdata->enc_data->x_offset),(pdata->enc_data->y_offset), + (pdata->brwin.rgeom.width),(pdata->brwin.rgeom.height)); } - pthread_mutex_unlock(&((ProgData *)pdata)->yuv_mutex); + pthread_mutex_unlock(&pdata->yuv_mutex); } else{ - pthread_mutex_lock(&((ProgData *)pdata)->yuv_mutex); - if(((ProgData *)pdata)->args.no_quick_subsample){ - UPDATE_YUV_BUFFER_IM_AVG((&((ProgData *)pdata)->enc_data->yuv),((unsigned char*)((ProgData *)pdata)->shimage->data), - (((ProgData *)pdata)->enc_data->x_offset),(((ProgData *)pdata)->enc_data->y_offset), - (((ProgData *)pdata)->brwin.rgeom.width),(((ProgData *)pdata)->brwin.rgeom.height)); + pthread_mutex_lock(&pdata->yuv_mutex); + if(pdata->args.no_quick_subsample){ + UPDATE_YUV_BUFFER_IM_AVG((&pdata->enc_data->yuv),((unsigned char*)pdata->shimage->data), + (pdata->enc_data->x_offset),(pdata->enc_data->y_offset), + (pdata->brwin.rgeom.width),(pdata->brwin.rgeom.height)); } else{ - UPDATE_YUV_BUFFER_IM((&((ProgData *)pdata)->enc_data->yuv),((unsigned char*)((ProgData *)pdata)->shimage->data), - (((ProgData *)pdata)->enc_data->x_offset),(((ProgData *)pdata)->enc_data->y_offset), - (((ProgData *)pdata)->brwin.rgeom.width),(((ProgData *)pdata)->brwin.rgeom.height)); + UPDATE_YUV_BUFFER_IM((&pdata->enc_data->yuv),((unsigned char*)pdata->shimage->data), + (pdata->enc_data->x_offset),(pdata->enc_data->y_offset), + (pdata->brwin.rgeom.width),(pdata->brwin.rgeom.height)); } - pthread_mutex_unlock(&((ProgData *)pdata)->yuv_mutex); + pthread_mutex_unlock(&pdata->yuv_mutex); } } - if(((ProgData *)pdata)->args.xfixes_cursor){ + if(pdata->args.xfixes_cursor){ //avoid segfaults - CLIP_DUMMY_POINTER_AREA(mouse_pos_abs,&((ProgData *)pdata)->brwin,&mouse_pos_temp); + CLIP_DUMMY_POINTER_AREA(mouse_pos_abs,&pdata->brwin,&mouse_pos_temp); //draw the cursor if((mouse_pos_temp.x>=0)&&(mouse_pos_temp.y>=0)&&(mouse_pos_temp.width>0)&&(mouse_pos_temp.height>0)){ - XFIXES_POINTER_TO_YUV((&((ProgData *)pdata)->enc_data->yuv),((unsigned char*)xcim->pixels), - (mouse_pos_temp.x-((ProgData *)pdata)->brwin.rgeom.x+((ProgData *)pdata)->enc_data->x_offset), - (mouse_pos_temp.y-((ProgData *)pdata)->brwin.rgeom.y+((ProgData *)pdata)->enc_data->y_offset), + XFIXES_POINTER_TO_YUV((&pdata->enc_data->yuv),((unsigned char*)xcim->pixels), + (mouse_pos_temp.x-pdata->brwin.rgeom.x+pdata->enc_data->x_offset), + (mouse_pos_temp.y-pdata->brwin.rgeom.y+pdata->enc_data->y_offset), mouse_pos_temp.width, mouse_pos_temp.height, (xcim->width-mouse_pos_temp.width)); @@ -179,31 +179,31 @@ void *GetFrame(void *pdata){ xcim=NULL; } - if(((ProgData *)pdata)->args.have_dummy_cursor){ + if(pdata->args.have_dummy_cursor){ //avoid segfaults - CLIP_DUMMY_POINTER_AREA(mouse_pos_abs,&((ProgData *)pdata)->brwin,&mouse_pos_temp); + CLIP_DUMMY_POINTER_AREA(mouse_pos_abs,&pdata->brwin,&mouse_pos_temp); //draw the cursor if((mouse_pos_temp.x>=0)&&(mouse_pos_temp.y>=0)&&(mouse_pos_temp.width>0)&&(mouse_pos_temp.height>0)){ - DUMMY_POINTER_TO_YUV((&((ProgData *)pdata)->enc_data->yuv), - ((ProgData *)pdata)->dummy_pointer, - (mouse_pos_temp.x-((ProgData *)pdata)->brwin.rgeom.x+((ProgData *)pdata)->enc_data->x_offset), - (mouse_pos_temp.y-((ProgData *)pdata)->brwin.rgeom.y+((ProgData *)pdata)->enc_data->y_offset), + DUMMY_POINTER_TO_YUV((&pdata->enc_data->yuv), + pdata->dummy_pointer, + (mouse_pos_temp.x-pdata->brwin.rgeom.x+pdata->enc_data->x_offset), + (mouse_pos_temp.y-pdata->brwin.rgeom.y+pdata->enc_data->y_offset), mouse_pos_temp.width, mouse_pos_temp.height, - ((ProgData *)pdata)->npxl); + pdata->npxl); } } - if(!((ProgData *)pdata)->args.full_shots){ - ClearList(&((ProgData *)pdata)->rect_root[tlist_sel]); - pthread_mutex_unlock(&((ProgData *)pdata)->list_mutex[tlist_sel]); + if(!pdata->args.full_shots){ + ClearList(&pdata->rect_root[tlist_sel]); + pthread_mutex_unlock(&pdata->list_mutex[tlist_sel]); } if(encoder_busy){ frames_lost++; } - pthread_cond_broadcast(&((ProgData *)pdata)->image_buffer_ready); + pthread_cond_broadcast(&pdata->image_buffer_ready); capture_busy=0; } - pthread_cond_broadcast(&((ProgData *)pdata)->image_buffer_ready); + pthread_cond_broadcast(&pdata->image_buffer_ready); pthread_exit(&errno); } |