diff options
| -rw-r--r-- | recordmydesktop/src/bgr_to_yuv.c | 33 | ||||
| -rw-r--r-- | recordmydesktop/src/get_frame.c | 25 | ||||
| -rw-r--r-- | recordmydesktop/src/recordmydesktop.c | 37 | ||||
| -rw-r--r-- | recordmydesktop/src/setbrwindow.c | 51 | ||||
| -rw-r--r-- | recordmydesktop/src/update_image.c | 4 | 
5 files changed, 104 insertions, 46 deletions
| diff --git a/recordmydesktop/src/bgr_to_yuv.c b/recordmydesktop/src/bgr_to_yuv.c index 2266e94..c3730ad 100644 --- a/recordmydesktop/src/bgr_to_yuv.c +++ b/recordmydesktop/src/bgr_to_yuv.c @@ -27,39 +27,6 @@  #include <recordmydesktop.h> -// void XImageToYUV(XImage *imgz,yuv_buffer *yuv,int no_quick_subsample){ -//     unsigned char *dtap=(unsigned char *)imgz->data; -//     unsigned char avg2,avg1,avg0; -//     int i,k,j=0; -//  -//     for(k=0;k<(imgz->width*imgz->height);k++){ -//             yuv->y[k]=Yr[dtap[(k*4)+2]] + Yg[dtap[(k*4)+1]] + Yb[dtap[(k*4)]]; -//     } -//     if(!no_quick_subsample){ -//         for(i=0;i<(imgz->height);i+=2){ -//             for(k=0;k<(imgz->width);k+=2){     -//                 yuv->u[j]=Ur[dtap[i*imgz->bytes_per_line+k*4+2]] + Ug[dtap[i*imgz->bytes_per_line+k*4+1]] + Ub[dtap[i*imgz->bytes_per_line+k*4]]; -//                 yuv->v[j]=Vr[dtap[i*imgz->bytes_per_line+k*4+2]] + Vg[dtap[i*imgz->bytes_per_line+k*4+1]] + Vb[dtap[i*imgz->bytes_per_line+k*4]] ; -//                 j++; -//             } -//         } -//     } -//     else{ -//         for(i=0;i<(imgz->height);i+=2){ -//             for(k=0;k<(imgz->width);k+=2){ -//                 avg2=AVG_4_PIXELS(dtap,(imgz->width),i,k,2); -//                 avg1=AVG_4_PIXELS(dtap,(imgz->width),i,k,1); -//                 avg0=AVG_4_PIXELS(dtap,(imgz->width),i,k,0); -//                  -//                 yuv->u[j]=Ur[avg2] + Ug[avg1] + Ub[avg0]; -//                 yuv->v[j]=Vr[avg2] + Vg[avg1] + Vb[avg0] ; -//                 j++; -//             } -//         } -//     } -// } - -  void MakeMatrices(){      int i;      for(i=0;i<256;i++) diff --git a/recordmydesktop/src/get_frame.c b/recordmydesktop/src/get_frame.c index 6a93ceb..d5673e6 100644 --- a/recordmydesktop/src/get_frame.c +++ b/recordmydesktop/src/get_frame.c @@ -111,14 +111,31 @@ void *GetFrame(void *pdata){                              ((ProgData *)pdata)->brwin.rgeom.width,                              ((ProgData *)pdata)->brwin.rgeom.height);                  pthread_mutex_lock(&((ProgData *)pdata)->yuv_mutex); -                XImageToYUV(((ProgData *)pdata)->image,&((ProgData *)pdata)->enc_data->yuv, -                ((ProgData *)pdata)->args.no_quick_subsample); +                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)); +                } +                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)); +                }                  pthread_mutex_unlock(&((ProgData *)pdata)->yuv_mutex);              }              else{                  pthread_mutex_lock(&((ProgData *)pdata)->yuv_mutex); -                XImageToYUV(((ProgData *)pdata)->shimage,&((ProgData *)pdata)->enc_data->yuv, -                ((ProgData *)pdata)->args.no_quick_subsample); +                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)); +                } +                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)); +                } +                  pthread_mutex_unlock(&((ProgData *)pdata)->yuv_mutex);              }          } diff --git a/recordmydesktop/src/recordmydesktop.c b/recordmydesktop/src/recordmydesktop.c index 9f6d596..a873f70 100644 --- a/recordmydesktop/src/recordmydesktop.c +++ b/recordmydesktop/src/recordmydesktop.c @@ -54,6 +54,7 @@ int main(int argc,char **argv){                      sound_encode_t,                      flush_to_ogg_t;          XShmSegmentInfo shminfo; +        int i;          QUERY_DISPLAY_SPECS(pdata.dpy,&pdata.specs);          if(pdata.specs.depth!=24){ @@ -117,8 +118,7 @@ int main(int argc,char **argv){                  fprintf(stderr,"Failed to attach shared memory to proccess.\n");                  exit(1);              } -            XShmGetImage(pdata.dpy,pdata.specs.root,pdata.shimage,0,0,AllPlanes); - +            XShmGetImage(pdata.dpy,pdata.specs.root,pdata.shimage,pdata.brwin.rgeom.x,pdata.brwin.rgeom.y,AllPlanes);          }          if(pdata.args.scshot){              if(pdata.args.delay>0){ @@ -139,10 +139,35 @@ int main(int argc,char **argv){              pdata.args.nosound=1;          }          InitEncoder(&pdata,&enc_data); -        if((pdata.args.nocondshared)&&(!pdata.args.noshared)) -            XImageToYUV(pdata.shimage,&pdata.enc_data->yuv,pdata.args.no_quick_subsample); -        else -            XImageToYUV(pdata.shimage,&pdata.enc_data->yuv,pdata.args.no_quick_subsample); +        for(i=0;i<(pdata.enc_data->yuv.y_width*pdata.enc_data->yuv.y_height);i++) +            pdata.enc_data->yuv.y[i]=0; +        for(i=0;i<(pdata.enc_data->yuv.uv_width*pdata.enc_data->yuv.uv_height);i++){ +            pdata.enc_data->yuv.v[i]=pdata.enc_data->yuv.u[i]=127; +        } +        if((pdata.args.nocondshared)&&(!pdata.args.noshared)){ +            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((&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{ +            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((&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)); +            } +        }          pdata.frametime=(1000000)/pdata.args.fps; diff --git a/recordmydesktop/src/setbrwindow.c b/recordmydesktop/src/setbrwindow.c index e5035d5..dafcc89 100644 --- a/recordmydesktop/src/setbrwindow.c +++ b/recordmydesktop/src/setbrwindow.c @@ -29,6 +29,7 @@  int SetBRWindow(Display *dpy,BRWindow *brwin,DisplaySpecs *specs,ProgArgs *args){      //before we start recording we have to make sure the ranges are valid +    int octoffset=0;      if(args->windowid==0){//root window          //first set it up          brwin->windowid=specs->root; @@ -79,6 +80,9 @@ int SetBRWindow(Display *dpy,BRWindow *brwin,DisplaySpecs *specs,ProgArgs *args)              return 1;          }      } +    fprintf(stderr, "Initial recording window is set to:\n" +                    "X:%d   Y:%d    Width:%d    Height:%d\n" +                    ,brwin->rgeom.x,brwin->rgeom.y,brwin->rgeom.width,brwin->rgeom.height);      //align in two      //an odd x can always go down and still be in recording area.      //Resolutions come in even numbers @@ -93,7 +97,52 @@ int SetBRWindow(Display *dpy,BRWindow *brwin,DisplaySpecs *specs,ProgArgs *args)      brwin->rgeom.x-=brwin->rgeom.x%2;      brwin->rgeom.y-=brwin->rgeom.y%2; -    brwin->nbytes=(((brwin->rgeom.width+15)>>4)<<4)*(((brwin->rgeom.height+15)>>4)<<4)*4; +    //32 bit pack align +    //we already have disible by two width,so  +    //it's 2, 4 or 6 +    octoffset=(brwin->rgeom.width%8); +    if(octoffset==2){ +        brwin->rgeom.width-=2; + +    } +    else if(octoffset==6){ +        if(brwin->rgeom.width+brwin->rgeom.x+2<=specs->width) +            brwin->rgeom.width+=2; +        else if(brwin->rgeom.x>=2){ +            brwin->rgeom.x-=2; +            brwin->rgeom.width+=2; +        } +        else{ +            brwin->rgeom.x+=2; +            brwin->rgeom.width-=4; +        } +    } +     +    else if(octoffset==4){ +        if((brwin->rgeom.width+brwin->rgeom.x+2<=specs->width)&&(brwin->rgeom.x>=2)){ +            brwin->rgeom.x-=2; +            brwin->rgeom.width+=4; +        } +        else if(brwin->rgeom.width+brwin->rgeom.x+4<=specs->width){ +            brwin->rgeom.width+=4; +        } +        else if(brwin->rgeom.x>=4){ +            brwin->rgeom.x-=4; +            brwin->rgeom.width+=4; +        } +        else{ +            brwin->rgeom.x+=2; +            brwin->rgeom.width-=4; +        } +    } +    fprintf(stderr, "Adjusted recording window is set to:\n" +                    "X:%d   Y:%d    Width:%d    Height:%d\n" +                    ,brwin->rgeom.x,brwin->rgeom.y,brwin->rgeom.width,brwin->rgeom.height); + + +    brwin->nbytes=(((brwin->rgeom.width+15)>>4)<<4)*(((brwin->rgeom.height+15)>>4)<<4)*4; +     +          return 0;  } diff --git a/recordmydesktop/src/update_image.c b/recordmydesktop/src/update_image.c index 0de3f0a..fed9445 100644 --- a/recordmydesktop/src/update_image.c +++ b/recordmydesktop/src/update_image.c @@ -68,12 +68,12 @@ void UpdateImage(Display * dpy,              }              else{                  if(no_quick_subsample){ -                UPDATE_YUV_BUFFER_SH_AVG(yuv,dtap, +                    UPDATE_YUV_BUFFER_SH_AVG(yuv,dtap,                                  (temp->geom.x-brwin->rgeom.x+enc->x_offset),(temp->geom.y-brwin->rgeom.y+enc->y_offset),                                  (temp->geom.width),(temp->geom.height));                  }                  else{ -                UPDATE_YUV_BUFFER_SH(yuv,dtap, +                    UPDATE_YUV_BUFFER_SH(yuv,dtap,                                  (temp->geom.x-brwin->rgeom.x+enc->x_offset),(temp->geom.y-brwin->rgeom.y+enc->y_offset),                                  (temp->geom.width),(temp->geom.height));                  } | 
