diff options
Diffstat (limited to 'recordmydesktop/src')
| -rw-r--r-- | recordmydesktop/src/get_frame.c | 113 | 
1 files changed, 79 insertions, 34 deletions
diff --git a/recordmydesktop/src/get_frame.c b/recordmydesktop/src/get_frame.c index 98593ed..16eef83 100644 --- a/recordmydesktop/src/get_frame.c +++ b/recordmydesktop/src/get_frame.c @@ -26,9 +26,12 @@  #include <recordmydesktop.h> -// #include <GL/gl.h> -// #include <GL/glu.h> -// #include <GL/glx.h> + +#ifdef USE_GLX_CAP +    #include <GL/gl.h> +    #include <GL/glu.h> +    #include <GL/glx.h> +#endif  int FirstFrame(ProgData *pdata,XImage **image,XShmSegmentInfo *shminfo,                 char **pxl_data){ @@ -96,8 +99,11 @@ int FirstFrame(ProgData *pdata,XImage **image,XShmSegmentInfo *shminfo,  }  void *GetFrame(ProgData *pdata){ -    int tlist_sel=0; -    uint msk_ret; +    int i=0, +        tlist_sel=0, +        blocknum_x=pdata->enc_data->yuv.y_width/Y_UNIT_WIDTH, +        blocknum_y=pdata->enc_data->yuv.y_height/Y_UNIT_WIDTH; +    unsigned int msk_ret;      WGeometry mouse_pos_abs,mouse_pos_rel,mouse_pos_temp;      Window root_ret,child_ret;      XFixesCursorImage *xcim=NULL; @@ -108,20 +114,25 @@ void *GetFrame(ProgData *pdata){          img_sel,d_buff;      char *pxl_data=NULL,*pxl_data_back=NULL; -    img_sel=d_buff=0/*pdata->args.full_shots*/; -//     XVisualInfo vinfo_return; -//     XMatchVisualInfo(pdata->dpy,pdata->specs.screen,pdata->specs.depth,TrueColor,&vinfo_return ); -//     GLXContext ctx=glXCreateContext( pdata->dpy, -//                       &vinfo_return, -//                       NULL, -//                       True); -//     glXMakeCurrent( pdata->dpy, -//                     pdata->args.windowid, -//                     ctx); -// -//     glReadBuffer(GL_FRONT); +#ifdef USE_GLX_CAP +    XVisualInfo vinfo_return; +    XMatchVisualInfo(pdata->dpy,pdata->specs.screen,pdata->specs.depth,TrueColor,&vinfo_return ); +    GLXContext ctx=glXCreateContext( pdata->dpy, +                      &vinfo_return, +                      NULL, +                      True); +//     fprintf(stderr,"here %d",pdata->args.windowid); +    glXMakeCurrent( pdata->dpy, +                    pdata->brwin.windowid, +                    ctx); + +    glReadBuffer(GL_FRONT); +#endif + +    img_sel=d_buff=pdata->args.full_shots; +      if((init_img1=FirstFrame(pdata,&image,&shminfo,&pxl_data)!=0)){          if(pdata->args.encOnTheFly){              if(remove(pdata->args.filename)){ @@ -191,14 +202,17 @@ void *GetFrame(ProgData *pdata){             pdata->args.have_dummy_cursor){              //pointer sequence              //update previous_position -            //(if full_shots is enabled this is skipped since it's pointless) +            //(if full_shots is enabled the new cursor is +            //entered on the list for update. +            //When taking full shots we keep it for further +            //bellow, to mark the area as dirty when dbuffering. +            CLIP_DUMMY_POINTER_AREA(mouse_pos_abs,&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)) +                    (mouse_pos_temp.y>=0)&& +                    (mouse_pos_temp.width>0)&& +                    (mouse_pos_temp.height>0))                      RectInsert(&pdata->rect_root[tlist_sel],&mouse_pos_temp);              }              //find new one @@ -217,10 +231,10 @@ void *GetFrame(ProgData *pdata){                                &mouse_pos_rel.x,&mouse_pos_rel.y,&msk_ret);              }          } -        if(!pdata->args.full_shots) +        if(!pdata->args.full_shots){ +            pthread_mutex_lock(&pdata->yuv_mutex);              UpdateImage(pdata->dpy,                          &pdata->enc_data->yuv, -                        &pdata->yuv_mutex,                          &pdata->specs,                          &pdata->rect_root[tlist_sel],                          &pdata->brwin, @@ -230,6 +244,11 @@ void *GetFrame(ProgData *pdata){                          &shminfo,                          pdata->shm_opcode,                          pdata->args.no_quick_subsample); +            BlocksFromList(&pdata->rect_root[tlist_sel], +                           pdata->enc_data->yuv.y_width/Y_UNIT_WIDTH, +                           pdata->enc_data->yuv.y_height/Y_UNIT_WIDTH); +            pthread_mutex_unlock(&pdata->yuv_mutex); +        }          else{              unsigned char *front_buff=(!img_sel)?((unsigned char*)image->data):                                        ((unsigned char*)image_back->data); @@ -238,18 +257,20 @@ void *GetFrame(ProgData *pdata){                                          ((unsigned char*)image_back->data));              if(!pdata->args.noshared){ +#ifdef USE_GLX_CAP +                glReadPixels(0, +                             0, +                             pdata->brwin.rgeom.width, +                             pdata->brwin.rgeom.height, +                             GL_RGBA, +                             GL_UNSIGNED_BYTE, +                             front_buff); +#else                  XShmGetImage(pdata->dpy,pdata->specs.root,                              ((!img_sel)?image:image_back),                              (pdata->brwin.rgeom.x),                              (pdata->brwin.rgeom.y),AllPlanes); - -//                 glReadPixels(0, -//                              0, -//                              pdata->brwin.rgeom.width, -//                              pdata->brwin.rgeom.height, -//                              GL_RGBA, -//                              GL_UNSIGNED_BYTE, -//                              front_buff); +#endif              }              if(pdata->args.noshared){                  GetZPixmap( pdata->dpy, @@ -261,6 +282,28 @@ void *GetFrame(ProgData *pdata){                              pdata->brwin.rgeom.height);              }              pthread_mutex_lock(&pdata->yuv_mutex); +            for(i=0;i<blocknum_x*blocknum_y;i++){ +                yblocks[i]=ublocks[i]=vblocks[i]=0; +            } +            if((d_buff)&& +               (pdata->args.xfixes_cursor || +                pdata->args.have_dummy_cursor)){ +            //make previous cursor position dirty +                if((mouse_pos_temp.x>=0)&& +                    (mouse_pos_temp.y>=0)&& +                    (mouse_pos_temp.width>0)&& +                    (mouse_pos_temp.height>0)){ + +                    MARK_BACK_BUFFER(   front_buff,\ +                                        back_buff,\ +                                        mouse_pos_temp.x,\ +                                        mouse_pos_temp.y,\ +                                        mouse_pos_temp.width,\ +                                        mouse_pos_temp.height,\ +                                        (pdata->brwin.rgeom.width),\ +                                        pdata->specs.depth) +                } +            }              UPDATE_YUV_BUFFER((&pdata->enc_data->yuv),                                front_buff,back_buff,                                (pdata->enc_data->x_offset), @@ -337,7 +380,9 @@ void *GetFrame(ProgData *pdata){          pthread_mutex_unlock(&pdata->img_buff_ready_mutex);          capture_busy=0;      } -//    glXDestroyContext(pdata->dpy,ctx); +#ifdef USE_GLX_CAP +   glXDestroyContext(pdata->dpy,ctx); +#endif      pthread_mutex_lock(&pdata->img_buff_ready_mutex);      pthread_cond_broadcast(&pdata->image_buffer_ready);      pthread_mutex_unlock(&pdata->img_buff_ready_mutex);  | 
