diff options
Diffstat (limited to 'recordmydesktop/src')
-rw-r--r-- | recordmydesktop/src/bgr_to_yuv.c | 29 | ||||
-rw-r--r-- | recordmydesktop/src/get_frame.c | 9 | ||||
-rw-r--r-- | recordmydesktop/src/parseargs.c | 6 | ||||
-rw-r--r-- | recordmydesktop/src/recordmydesktop.c | 4 | ||||
-rw-r--r-- | recordmydesktop/src/update_image.c | 25 |
5 files changed, 54 insertions, 19 deletions
diff --git a/recordmydesktop/src/bgr_to_yuv.c b/recordmydesktop/src/bgr_to_yuv.c index 81c7fed..d2b14f4 100644 --- a/recordmydesktop/src/bgr_to_yuv.c +++ b/recordmydesktop/src/bgr_to_yuv.c @@ -27,19 +27,34 @@ #include <recordmydesktop.h> -void XImageToYUV(XImage *imgz,yuv_buffer *yuv){ +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)]]; } - - 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++; + 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++; + } } } } diff --git a/recordmydesktop/src/get_frame.c b/recordmydesktop/src/get_frame.c index 1d6a126..6a93ceb 100644 --- a/recordmydesktop/src/get_frame.c +++ b/recordmydesktop/src/get_frame.c @@ -99,7 +99,8 @@ void *GetFrame(void *pdata){ &((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.noshared, + ((ProgData *)pdata)->args.no_quick_subsample); else{ if(((ProgData *)pdata)->args.noshared){ GetZPixmap( ((ProgData *)pdata)->dpy, @@ -110,12 +111,14 @@ 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); + XImageToYUV(((ProgData *)pdata)->image,&((ProgData *)pdata)->enc_data->yuv, + ((ProgData *)pdata)->args.no_quick_subsample); pthread_mutex_unlock(&((ProgData *)pdata)->yuv_mutex); } else{ pthread_mutex_lock(&((ProgData *)pdata)->yuv_mutex); - XImageToYUV(((ProgData *)pdata)->shimage,&((ProgData *)pdata)->enc_data->yuv); + XImageToYUV(((ProgData *)pdata)->shimage,&((ProgData *)pdata)->enc_data->yuv, + ((ProgData *)pdata)->args.no_quick_subsample); pthread_mutex_unlock(&((ProgData *)pdata)->yuv_mutex); } } diff --git a/recordmydesktop/src/parseargs.c b/recordmydesktop/src/parseargs.c index 8125972..55dfbcd 100644 --- a/recordmydesktop/src/parseargs.c +++ b/recordmydesktop/src/parseargs.c @@ -36,7 +36,7 @@ int ParseArgs(int argc,char **argv,ProgArgs *arg_return){ "\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" + "\t --no-quick-subsampling| --scshot| -scale-shot N| -o filename]^filename\n\n\n" "General Options:\n" "\t-h or --help\t\tPrint this help and exit.\n" @@ -56,6 +56,7 @@ int ParseArgs(int argc,char **argv,ProgArgs *arg_return){ "\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--no-quick-subsampling\tDo subsampling of the chroma planes by averaging,not discarding.\n" "\t-fps N(number>0.0)\tA positive number denoting desired framerate.\n\n" "Sound Options:\n" @@ -397,6 +398,9 @@ int ParseArgs(int argc,char **argv,ProgArgs *arg_return){ arg_return->scshot=1; arg_return->nocondshared=1; } + else if(!strcmp(argv[i],"--no-quick-subsampling")){ + arg_return->no_quick_subsample=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 5588b52..9f6d596 100644 --- a/recordmydesktop/src/recordmydesktop.c +++ b/recordmydesktop/src/recordmydesktop.c @@ -140,9 +140,9 @@ int main(int argc,char **argv){ } InitEncoder(&pdata,&enc_data); if((pdata.args.nocondshared)&&(!pdata.args.noshared)) - XImageToYUV(pdata.shimage,&pdata.enc_data->yuv); + XImageToYUV(pdata.shimage,&pdata.enc_data->yuv,pdata.args.no_quick_subsample); else - XImageToYUV(pdata.shimage,&pdata.enc_data->yuv); + XImageToYUV(pdata.shimage,&pdata.enc_data->yuv,pdata.args.no_quick_subsample); pdata.frametime=(1000000)/pdata.args.fps; diff --git a/recordmydesktop/src/update_image.c b/recordmydesktop/src/update_image.c index bf319e2..0de3f0a 100644 --- a/recordmydesktop/src/update_image.c +++ b/recordmydesktop/src/update_image.c @@ -35,7 +35,8 @@ void UpdateImage(Display * dpy, BRWindow *brwin, EncData *enc, char *datatemp, - int noshmem){ + int noshmem, + int no_quick_subsample){ RectArea *temp; unsigned char *dtap=(unsigned char*)datatemp; temp=*root; @@ -52,18 +53,30 @@ void UpdateImage(Display * dpy, temp->geom.height); pthread_mutex_lock(yuv_mutex); - - UPDATE_YUV_BUFFER_IM(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)); + if(no_quick_subsample){ + UPDATE_YUV_BUFFER_IM_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_IM(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)); + } pthread_mutex_unlock(yuv_mutex); } else{ + if(no_quick_subsample){ + 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, (temp->geom.x-brwin->rgeom.x+enc->x_offset),(temp->geom.y-brwin->rgeom.y+enc->y_offset), (temp->geom.width),(temp->geom.height)); - + } } temp=temp->next; |