diff options
Diffstat (limited to 'rMD-exp/src')
| -rw-r--r-- | rMD-exp/src/Makefile.am | 32 | ||||
| -rw-r--r-- | rMD-exp/src/bgr_to_yuv.c | 54 | ||||
| -rw-r--r-- | rMD-exp/src/cache_audio.c | 67 | ||||
| -rw-r--r-- | rMD-exp/src/cache_frame.c | 193 | ||||
| -rw-r--r-- | rMD-exp/src/capture_sound.c | 109 | ||||
| -rw-r--r-- | rMD-exp/src/encode_image_buffer.c | 83 | ||||
| -rw-r--r-- | rMD-exp/src/encode_sound_buffer.c | 121 | ||||
| -rw-r--r-- | rMD-exp/src/flush_to_ogg.c | 81 | ||||
| -rw-r--r-- | rMD-exp/src/get_frame.c | 209 | ||||
| -rw-r--r-- | rMD-exp/src/getzpixmap.c | 55 | ||||
| -rw-r--r-- | rMD-exp/src/init_encoder.c | 202 | ||||
| -rw-r--r-- | rMD-exp/src/load_cache.c | 187 | ||||
| -rw-r--r-- | rMD-exp/src/make_dummy_pointer.c | 76 | ||||
| -rw-r--r-- | rMD-exp/src/opendev.c | 103 | ||||
| -rw-r--r-- | rMD-exp/src/parseargs.c | 425 | ||||
| -rw-r--r-- | rMD-exp/src/poll_damage.c | 88 | ||||
| -rw-r--r-- | rMD-exp/src/queryextensions.c | 48 | ||||
| -rw-r--r-- | rMD-exp/src/recordmydesktop.c | 354 | ||||
| -rw-r--r-- | rMD-exp/src/rectinsert.c | 499 | ||||
| -rw-r--r-- | rMD-exp/src/register_callbacks.c | 91 | ||||
| -rw-r--r-- | rMD-exp/src/rmd_cache.c | 102 | ||||
| -rw-r--r-- | rMD-exp/src/setbrwindow.c | 176 | ||||
| -rw-r--r-- | rMD-exp/src/update_image.c | 86 | ||||
| -rw-r--r-- | rMD-exp/src/wm_check.c | 68 | 
24 files changed, 0 insertions, 3509 deletions
| diff --git a/rMD-exp/src/Makefile.am b/rMD-exp/src/Makefile.am deleted file mode 100644 index d5fa847..0000000 --- a/rMD-exp/src/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -bin_PROGRAMS = recordmydesktop - - - -recordmydesktop_SOURCES=	recordmydesktop.c\ -							getzpixmap.c\ -							parseargs.c\ -							rectinsert.c\ -							setbrwindow.c\ -							queryextensions.c\ -							register_callbacks.c\ -							get_frame.c\ -							update_image.c\ -							poll_damage.c\ -							encode_image_buffer.c\ -							bgr_to_yuv.c\ -							flush_to_ogg.c\ -							make_dummy_pointer.c\ -							opendev.c\ -							capture_sound.c\ -							encode_sound_buffer.c\ -							init_encoder.c\ -							cache_frame.c\ -							cache_audio.c\ -							rmd_cache.c\ -							load_cache.c\ -							wm_check.c - -INCLUDES= $(all_includes) -I../include - -recordmydesktop_LDFLAGS = @X_LIBS@ @X_EXTRA_LIBS@ @X_PRE_LIBS@ -recordmydesktop_CFLAGS = -D_THREAD_SAFE -pthread -Wall diff --git a/rMD-exp/src/bgr_to_yuv.c b/rMD-exp/src/bgr_to_yuv.c deleted file mode 100644 index 0f775e2..0000000 --- a/rMD-exp/src/bgr_to_yuv.c +++ /dev/null @@ -1,54 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - -void MakeMatrices(){ -    int i; - -    for(i=0;i<256;i++) -        Yr[i]=(2104.0*i)/8192.0+8.0; -    for(i=0;i<256;i++) -        Yg[i]=(4130.0*i)/8192.0+8.0; -    for(i=0;i<256;i++) -        Yb[i]=(802.0*i)/8192.0; - -    for(i=0;i<256;i++) -        Ur[i]=37.8-(1204.0*i)/8192.0+8.0; -    for(i=0;i<256;i++) -        Ug[i]=74.2-(2384.0*i)/8192.0+8.0; -    for(i=0;i<256;i++) -        Ub[i]=(3598.0*i)/8192.0 ; - -    for(i=0;i<256;i++) -        Vr[i]=(3598.0*i)/8192.0; -    for(i=0;i<256;i++) -        Vg[i]=93.8-(3013.0*i)/8192.0+8.0; -    for(i=0;i<256;i++) -        Vb[i]=18.2-(585.0*i)/8192.0+8.0; -} - diff --git a/rMD-exp/src/cache_audio.c b/rMD-exp/src/cache_audio.c deleted file mode 100644 index 7b17d7b..0000000 --- a/rMD-exp/src/cache_audio.c +++ /dev/null @@ -1,67 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - -#include <recordmydesktop.h> -void *CacheSoundBuffer(void *pdata){ -//We are simply going to throw sound on the disk. -//It's sound is tiny compared to that of image, so -//compressing would reducethe overall size by only an -//insignificant fraction. -    pthread_mutex_t smut; -    pthread_mutex_init(&smut,NULL); -    while((((ProgData *)pdata)->running)){ -        SndBuffer *buff; - -        if(Paused){ -            pthread_mutex_t tmut; -            pthread_mutex_init(&tmut,NULL); -            pthread_cond_wait(&((ProgData *)pdata)->pause_cond,&tmut); -        } - -        if(((ProgData *)pdata)->sound_buffer==NULL) -            pthread_cond_wait(&((ProgData *)pdata)->sound_data_read,&smut); - -        pthread_mutex_lock(&((ProgData *)pdata)->sound_buffer_mutex); -        buff=((ProgData *)pdata)->sound_buffer; -        //advance the list -        ((ProgData *)pdata)->sound_buffer=((ProgData *)pdata)->sound_buffer->next; -        pthread_mutex_unlock(&((ProgData *)pdata)->sound_buffer_mutex); - -        fwrite(buff->data,((ProgData *)pdata)->periodsize,1,((ProgData *)pdata)->cache_data->afp); - - - -        ((ProgData *)pdata)->avd-=((ProgData *)pdata)->periodtime; - -        free(buff->data); -        free(buff); -    } - -    fclose(((ProgData *)pdata)->cache_data->afp); -    pthread_exit(&errno); -} - -  diff --git a/rMD-exp/src/cache_frame.c b/rMD-exp/src/cache_frame.c deleted file mode 100644 index c100505..0000000 --- a/rMD-exp/src/cache_frame.c +++ /dev/null @@ -1,193 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - -#include <recordmydesktop.h> - - -int CompareBlocks(unsigned char *incoming,unsigned char *old,int blockno,int width, int height,int divisor){ -    int j,i, -        block_i=blockno/divisor,//place on the grid -        block_k=blockno%divisor; -    register unsigned char *incoming_reg=&(incoming[block_i*(width*height/divisor)+block_k*width/divisor]), -                           *old_reg=&(old[block_i*(width*height/divisor)+block_k*width/divisor]); - -    for(j=0;j<height/divisor;j++){ -        for(i=0;i<width/divisor;i++){ -            if((*(incoming_reg++))!=(*(old_reg++))) -                return 1; -        } -        incoming_reg+=(width-width/divisor); -        old_reg+=(width-width/divisor); -    } - -    return 0; -} - -void FlushBlock(unsigned char *buf,int blockno,int width, int height,int divisor,gzFile *fp){ -    int j, -        block_i=blockno/divisor,//place on the grid -        block_k=blockno%divisor; -    register unsigned char *buf_reg=(&buf[block_i*(width*height/divisor)+block_k*width/divisor]); -    for(j=0;j<height/divisor;j++){//we flush in rows -        gzwrite(fp,(void *)buf_reg,width/divisor); -        buf_reg+=width; -    } -} - -void *CacheImageBuffer(void *pdata){ -    pthread_mutex_t pmut,imut; -    pthread_mutex_init(&pmut,NULL); -    pthread_mutex_init(&imut,NULL); -    yuv_buffer yuv[2]; -    gzFile *fp=((ProgData *)pdata)->cache_data->ifp; - -    if(fp==NULL)exit(13); - -    int i,current=0,divisor=16,firstrun=1,frameno=0; - -    for(i=0;i<2;i++){ -        yuv[i].y_width=((ProgData *)pdata)->enc_data->yuv.y_width; -        yuv[i].y_height=((ProgData *)pdata)->enc_data->yuv.y_height; -        yuv[i].uv_width=((ProgData *)pdata)->enc_data->yuv.uv_width; -        yuv[i].uv_height=((ProgData *)pdata)->enc_data->yuv.uv_height; - -        yuv[i].y=(unsigned char *)malloc(yuv[i].y_width*yuv[i].y_height); -        yuv[i].u=(unsigned char *)malloc(yuv[i].uv_width*yuv[i].uv_height); -        yuv[i].v=(unsigned char *)malloc(yuv[i].uv_width*yuv[i].uv_height); -    } - - -    while(((ProgData *)pdata)->running){ -        int prev; -        int j; -        unsigned short ynum,unum,vnum; -        unsigned char yblocks[256],ublocks[64],vblocks[64]; -        FrameHeader fheader; -        ynum=unum=vnum=0; - -        pthread_cond_wait(&((ProgData *)pdata)->image_buffer_ready,&imut); -        if(Paused) -            pthread_cond_wait(&((ProgData *)pdata)->pause_cond,&pmut); -        pthread_mutex_lock(&((ProgData *)pdata)->yuv_mutex); - -        //rotate buffers -        prev=current; -        current=(current)?0:1; -        //copy incoming -        memcpy(yuv[current].y,((ProgData *)pdata)->enc_data->yuv.y,yuv[current].y_width*yuv[current].y_height); -        memcpy(yuv[current].u,((ProgData *)pdata)->enc_data->yuv.u,yuv[current].uv_width*yuv[current].uv_height); -        memcpy(yuv[current].v,((ProgData *)pdata)->enc_data->yuv.v,yuv[current].uv_width*yuv[current].uv_height); -        //release main buffer -        pthread_mutex_unlock(&((ProgData *)pdata)->yuv_mutex); -        //get checksums for new - -        //find and flush different blocks -        if(firstrun){ -            firstrun=0; -            for(j=0;j<pow(divisor,2);j++){ -                    ynum++; -                    yblocks[ynum-1]=j; -            } -            for(j=0;j<pow(divisor/2,2);j++){ -                    unum++; -                    ublocks[unum-1]=j; -            } -            for(j=0;j<pow(divisor/2,2);j++){ -                    vnum++; -                    vblocks[vnum-1]=j; -            } - -        } -        else{ -            for(j=0;j<pow(divisor,2);j++){ -                if(CompareBlocks(yuv[current].y,yuv[prev].y,j,yuv[current].y_width,yuv[current].y_height,divisor)){ -                    ynum++; -                    yblocks[ynum-1]=j; -                } -            } -            for(j=0;j<pow(divisor/2,2);j++){ -                if(CompareBlocks(yuv[current].u,yuv[prev].u,j,yuv[current].uv_width,yuv[current].uv_height,divisor/2)){ -                    unum++; -                    ublocks[unum-1]=j; -                } -            } -            for(j=0;j<pow(divisor/2,2);j++){ -                if(CompareBlocks(yuv[current].v,yuv[prev].v,j,yuv[current].uv_width,yuv[current].uv_height,divisor/2)){ -                    vnum++; -                    vblocks[vnum-1]=j; -                } -            } - -        } -        /**WRITE FRAME TO DISK*/ -        if(!((ProgData *)pdata)->args.zerocompression){ -            if(ynum+unum+vnum>(pow(divisor,2)+pow(divisor/2,2)*2)/10) -                gzsetparams (fp,1,Z_FILTERED); -            else -                gzsetparams (fp,0,Z_FILTERED); -        } - -        strncpy(fheader.frame_prefix,"FRAM",4); -        fheader.frameno=++frameno; -        fheader.current_total=frames_total; -        fheader.Ynum=ynum; -        fheader.Unum=unum; -        fheader.Vnum=vnum; -        fheader.pad=0; -        gzwrite(fp,(void*)&fheader,sizeof(FrameHeader)); -        //flush indexes -        if(ynum)gzwrite(fp,yblocks,ynum); -        if(unum)gzwrite(fp,ublocks,unum); -        if(vnum)gzwrite(fp,vblocks,vnum); - - -        //flush the blocks for each buffer -        if(ynum) -            for(j=0;j<ynum;j++) -                FlushBlock(yuv[current].y,yblocks[j],yuv[current].y_width,yuv[current].y_height,divisor,fp); -        if(unum) -            for(j=0;j<unum;j++) -                FlushBlock(yuv[current].u,ublocks[j],yuv[current].uv_width,yuv[current].uv_height,divisor/2,fp); -        if(vnum) -            for(j=0;j<vnum;j++) -                FlushBlock(yuv[current].v,vblocks[j],yuv[current].uv_width,yuv[current].uv_height,divisor/2,fp); - - -        /**@________________@**/ -        ((ProgData *)pdata)->avd+=((ProgData *)pdata)->frametime*2*((ProgData *)pdata)->args.channels; - -    } - -    //clean up since we're not finished -    for(i=0;i<2;i++){ -        free(yuv[i].y); -        free(yuv[i].u); -        free(yuv[i].v); -    } -    fprintf(stderr,"Saved %d frames in a total of %d requests\n",frameno,frames_total); -    gzclose(fp); -    pthread_exit(&errno); -} diff --git a/rMD-exp/src/capture_sound.c b/rMD-exp/src/capture_sound.c deleted file mode 100644 index 3bda596..0000000 --- a/rMD-exp/src/capture_sound.c +++ /dev/null @@ -1,109 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - -void *CaptureSound(void *pdata){ - -    int frames=((ProgData *)pdata)->periodsize>>((ProgData *)pdata)->args.channels; -//     fprintf(stderr,"fr %d  ps %d\n",frames,((ProgData *)pdata)->periodsize);fflush(stderr); -    pthread_mutex_t pmut; -    pthread_mutex_init(&pmut,NULL); -    ((ProgData *)pdata)->sound_buffer=NULL; - -    while(((ProgData *)pdata)->running){ -        int sret=0; -        SndBuffer *newbuf,*tmp; -        if(Paused){ -            if(!((ProgData *)pdata)->hard_pause){ -                snd_pcm_pause(((ProgData *)pdata)->sound_handle,1); -                pthread_cond_wait(&((ProgData *)pdata)->pause_cond,&pmut); -                snd_pcm_pause(((ProgData *)pdata)->sound_handle,0); -            } -            else{//device doesn't support pause(is this the norm?mine doesn't) -                snd_pcm_close(((ProgData *)pdata)->sound_handle); -                pthread_cond_wait(&((ProgData *)pdata)->pause_cond,&pmut); - -                ((ProgData *)pdata)->sound_handle= -                    OpenDev(((ProgData *)pdata)->args.device, -                            &((ProgData *)pdata)->args.channels, -                            &((ProgData *)pdata)->args.frequency, -                            NULL, -                            NULL, -                            NULL//let's hope that the device capabilities didn't magically change -                            ); -                if(((ProgData *)pdata)->sound_handle==NULL){ -                    fprintf(stderr,"Couldn't reopen sound device.Exiting\n"); -                    ((ProgData *)pdata)->running=0; -                    errno=3; -                    pthread_exit(&errno); -                }                 -            } -        } - -        //create new buffer -        newbuf=(SndBuffer *)malloc(sizeof(SndBuffer *)); -        newbuf->data=(signed char *)malloc(((ProgData *)pdata)->periodsize); -        newbuf->next=NULL; -        -        //read data into new buffer  -        while(sret<frames){ -            int temp_sret=snd_pcm_readi(((ProgData *)pdata)->sound_handle, -                                newbuf->data+2*((ProgData *)pdata)->args.channels*sret, -                                frames-sret); -            if(temp_sret==-EPIPE) -                snd_pcm_prepare(((ProgData *)pdata)->sound_handle); -            else if (temp_sret<0){ -                fprintf(stderr,"An error occured while reading sound data:\n %s\n",snd_strerror(temp_sret)); -                snd_pcm_prepare(((ProgData *)pdata)->sound_handle); -            } -            else -                sret+=temp_sret; -        } - -        //queue the new buffer -        pthread_mutex_lock(&((ProgData *)pdata)->sound_buffer_mutex); -        tmp=((ProgData *)pdata)->sound_buffer; -        if(((ProgData *)pdata)->sound_buffer==NULL) -                ((ProgData *)pdata)->sound_buffer=newbuf; -        else{ -            while(tmp->next!=NULL) -                tmp=tmp->next; -            tmp->next=newbuf; -        } -        pthread_mutex_unlock(&((ProgData *)pdata)->sound_buffer_mutex); - - -        //signal that there are data to be proccessed -        pthread_cond_signal(&((ProgData *)pdata)->sound_data_read); -    } -    snd_pcm_close(((ProgData *)pdata)->sound_handle); -    pthread_exit(&errno); -}  - - - diff --git a/rMD-exp/src/encode_image_buffer.c b/rMD-exp/src/encode_image_buffer.c deleted file mode 100644 index 8ff9629..0000000 --- a/rMD-exp/src/encode_image_buffer.c +++ /dev/null @@ -1,83 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - -#include <recordmydesktop.h> -void *EncodeImageBuffer(void *pdata){ -    pthread_mutex_t pmut,imut; -    pthread_mutex_init(&pmut,NULL); -    pthread_mutex_init(&imut,NULL); -    while(((ProgData *)pdata)->running){ -        pthread_cond_wait(&((ProgData *)pdata)->image_buffer_ready,&imut); -        encoder_busy=1; -        if(Paused) -            pthread_cond_wait(&((ProgData *)pdata)->pause_cond,&pmut);//this may not be needed -        pthread_mutex_lock(&((ProgData *)pdata)->yuv_mutex); -        if(theora_encode_YUVin(&((ProgData *)pdata)->enc_data->m_th_st,&((ProgData *)pdata)->enc_data->yuv)){ -            fprintf(stderr,"Encoder not ready!\n"); -            pthread_mutex_unlock(&((ProgData *)pdata)->yuv_mutex); -        } -        else{ -            pthread_mutex_unlock(&((ProgData *)pdata)->yuv_mutex); -            if(theora_encode_packetout(&((ProgData *)pdata)->enc_data->m_th_st,0,&((ProgData *)pdata)->enc_data->m_ogg_pckt1)==1){ -                pthread_mutex_lock(&((ProgData *)pdata)->libogg_mutex); -                ogg_stream_packetin(&((ProgData *)pdata)->enc_data->m_ogg_ts,&((ProgData *)pdata)->enc_data->m_ogg_pckt1); -                pthread_mutex_unlock(&((ProgData *)pdata)->libogg_mutex); -                ((ProgData *)pdata)->avd+=((ProgData *)pdata)->frametime*2*((ProgData *)pdata)->args.channels; -            } -        } -        encoder_busy=0; -    } -    //last packet -    if(theora_encode_YUVin(&((ProgData *)pdata)->enc_data->m_th_st,&((ProgData *)pdata)->enc_data->yuv)){ -            fprintf(stderr,"Encoder not ready!\n"); -    } - -    theora_encode_packetout(&((ProgData *)pdata)->enc_data->m_th_st,1,&((ProgData *)pdata)->enc_data->m_ogg_pckt1); - -//     ogg_stream_packetin(&((ProgData *)pdata)->enc_data->m_ogg_ts,&((ProgData *)pdata)->enc_data->m_ogg_pckt); - -    pthread_exit(&errno); -} - -//this function is meant to be called normally -//not through a thread of it's own -void SyncEncodeImageBuffer(ProgData *pdata){ -    if(theora_encode_YUVin(&pdata->enc_data->m_th_st, -                            &pdata->enc_data->yuv)){ -        fprintf(stderr,"Encoder not ready!\n"); -    } -    else{ -        if(theora_encode_packetout(&pdata->enc_data->m_th_st,0, -                                    &pdata->enc_data->m_ogg_pckt1)==1){ -            pthread_mutex_lock(&pdata->libogg_mutex); -            ogg_stream_packetin(&pdata->enc_data->m_ogg_ts, -                                &pdata->enc_data->m_ogg_pckt1); -            pthread_mutex_unlock(&pdata->libogg_mutex); -            pdata->avd+=pdata->frametime*2*pdata->args.channels; -        } -    } -} - diff --git a/rMD-exp/src/encode_sound_buffer.c b/rMD-exp/src/encode_sound_buffer.c deleted file mode 100644 index 73f6d48..0000000 --- a/rMD-exp/src/encode_sound_buffer.c +++ /dev/null @@ -1,121 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - -void *EncodeSoundBuffer(void *pdata){ - -    int sampread=((ProgData *)pdata)->periodsize/(2*((ProgData *)pdata)->args.channels); -    pthread_mutex_t smut; -    pthread_mutex_init(&smut,NULL); -    while((((ProgData *)pdata)->running)){ -        float **vorbis_buffer; -        int count=0,i,j; -        SndBuffer *buff; - -        if(Paused){ -            pthread_mutex_t tmut; -            pthread_mutex_init(&tmut,NULL); -            pthread_cond_wait(&((ProgData *)pdata)->pause_cond,&tmut); -        } - -        if(((ProgData *)pdata)->sound_buffer==NULL) -            pthread_cond_wait(&((ProgData *)pdata)->sound_data_read,&smut); - -        pthread_mutex_lock(&((ProgData *)pdata)->sound_buffer_mutex); -        buff=((ProgData *)pdata)->sound_buffer; -        //advance the list -        ((ProgData *)pdata)->sound_buffer=((ProgData *)pdata)->sound_buffer->next; -        pthread_mutex_unlock(&((ProgData *)pdata)->sound_buffer_mutex); -                 -        vorbis_buffer=vorbis_analysis_buffer(&((ProgData *)pdata)->enc_data->m_vo_dsp,sampread); -        for(i=0;i<sampread;i++){ -            for(j=0;j<((ProgData *)pdata)->args.channels;j++){ -                vorbis_buffer[j][i]=((buff->data[count+1]<<8)| -                                        (0x00ff&(int)buff->data[count]))/32768.f; -                count+=2; -            } -        } -        vorbis_analysis_wrote(&((ProgData *)pdata)->enc_data->m_vo_dsp,sampread); - -        while(vorbis_analysis_blockout(&((ProgData *)pdata)->enc_data->m_vo_dsp,&((ProgData *)pdata)->enc_data->m_vo_block)==1){ -             -            vorbis_analysis(&((ProgData *)pdata)->enc_data->m_vo_block,NULL); -            vorbis_bitrate_addblock(&((ProgData *)pdata)->enc_data->m_vo_block); -             -            while(vorbis_bitrate_flushpacket(&((ProgData *)pdata)->enc_data->m_vo_dsp,&((ProgData *)pdata)->enc_data->m_ogg_pckt2)){ -                pthread_mutex_lock(&((ProgData *)pdata)->libogg_mutex); -                ogg_stream_packetin(&((ProgData *)pdata)->enc_data->m_ogg_vs,&((ProgData *)pdata)->enc_data->m_ogg_pckt2); -                pthread_mutex_unlock(&((ProgData *)pdata)->libogg_mutex); -            } -        } -        ((ProgData *)pdata)->avd-=((ProgData *)pdata)->periodtime; - -        free(buff->data); -        free(buff); -    } - -    vorbis_analysis_wrote(&((ProgData *)pdata)->enc_data->m_vo_dsp,0); -//     while(vorbis_analysis_blockout(&((ProgData *)pdata)->enc_data->m_vo_dsp,&((ProgData *)pdata)->enc_data->m_vo_block)==1){ -//         vorbis_analysis(&((ProgData *)pdata)->enc_data->m_vo_block,NULL); -//         vorbis_bitrate_addblock(&((ProgData *)pdata)->enc_data->m_vo_block); -//         while(vorbis_bitrate_flushpacket(&((ProgData *)pdata)->enc_data->m_vo_dsp,&((ProgData *)pdata)->enc_data->m_ogg_pckt2)) -//             ogg_stream_packetin(&((ProgData *)pdata)->enc_data->m_ogg_vs,&((ProgData *)pdata)->enc_data->m_ogg_pckt2); -//     } - -    pthread_exit(&errno); -} - -void SyncEncodeSoundBuffer(ProgData *pdata,signed char *buff){ -    float **vorbis_buffer; -    int count=0,i,j; -    int sampread=pdata->periodsize/(2*pdata->args.channels); -    vorbis_buffer=vorbis_analysis_buffer(&pdata->enc_data->m_vo_dsp,sampread); -    for(i=0;i<sampread;i++){ -        for(j=0;j<pdata->args.channels;j++){ -            vorbis_buffer[j][i]=((buff[count+1]<<8)| -                                    (0x00ff&(int)buff[count]))/32768.f; -            count+=2; -        } -    } - -    vorbis_analysis_wrote(&pdata->enc_data->m_vo_dsp,sampread); - -    while(vorbis_analysis_blockout(&pdata->enc_data->m_vo_dsp,&pdata->enc_data->m_vo_block)==1){ -         -        vorbis_analysis(&pdata->enc_data->m_vo_block,NULL); -        vorbis_bitrate_addblock(&pdata->enc_data->m_vo_block); -         -        while(vorbis_bitrate_flushpacket(&pdata->enc_data->m_vo_dsp,&pdata->enc_data->m_ogg_pckt2)){ -            pthread_mutex_lock(&pdata->libogg_mutex); -            ogg_stream_packetin(&pdata->enc_data->m_ogg_vs,&pdata->enc_data->m_ogg_pckt2); -            pthread_mutex_unlock(&pdata->libogg_mutex); -        } -    } -    pdata->avd-=pdata->periodtime; -} - diff --git a/rMD-exp/src/flush_to_ogg.c b/rMD-exp/src/flush_to_ogg.c deleted file mode 100644 index fed07c5..0000000 --- a/rMD-exp/src/flush_to_ogg.c +++ /dev/null @@ -1,81 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - -#include <recordmydesktop.h> - -void *FlushToOgg(void *pdata){ -    int videoflag=0,audioflag=0; -    double video_bytesout=0,audio_bytesout=0; -    ogg_page videopage,audiopage; -    while(((ProgData *)pdata)->running){ -        pthread_mutex_lock(&((ProgData *)pdata)->libogg_mutex); -        videoflag=ogg_stream_pageout(&((ProgData *)pdata)->enc_data->m_ogg_ts,&videopage); -        pthread_mutex_unlock(&((ProgData *)pdata)->libogg_mutex); -        if(videoflag){ -            video_bytesout+=fwrite(videopage.header,1,videopage.header_len,((ProgData *)pdata)->enc_data->fp); -            video_bytesout+=fwrite(videopage.body,1,videopage.body_len,((ProgData *)pdata)->enc_data->fp); -            videoflag=0; -            if(!((ProgData *)pdata)->args.nosound){ -                pthread_mutex_lock(&((ProgData *)pdata)->libogg_mutex); -                audioflag=ogg_stream_pageout(&((ProgData *)pdata)->enc_data->m_ogg_vs,&audiopage); -                pthread_mutex_unlock(&((ProgData *)pdata)->libogg_mutex); -                if(audioflag){ -                    audio_bytesout+=fwrite(audiopage.header,1,audiopage.header_len,((ProgData *)pdata)->enc_data->fp); -                    audio_bytesout+=fwrite(audiopage.body,1,audiopage.body_len,((ProgData *)pdata)->enc_data->fp); -                    audioflag=0; -                } -            } -        } -        else -            usleep(10000); -       -    } -    //last packages -    videoflag=ogg_stream_flush(&((ProgData *)pdata)->enc_data->m_ogg_ts,&videopage); -    if(videoflag){ -        video_bytesout+=fwrite(videopage.header,1,videopage.header_len,((ProgData *)pdata)->enc_data->fp); -        video_bytesout+=fwrite(videopage.body,1,videopage.body_len,((ProgData *)pdata)->enc_data->fp); -        videoflag=0; -    } -    if(!((ProgData *)pdata)->args.nosound) -        audioflag=ogg_stream_flush(&((ProgData *)pdata)->enc_data->m_ogg_vs,&audiopage); -    if(audioflag){ -        audio_bytesout+=fwrite(audiopage.header,1,audiopage.header_len,((ProgData *)pdata)->enc_data->fp); -        audio_bytesout+=fwrite(audiopage.body,1,audiopage.body_len,((ProgData *)pdata)->enc_data->fp); -        audioflag=0; -    } - -    ogg_stream_clear(&((ProgData *)pdata)->enc_data->m_ogg_ts); -    if(!((ProgData *)pdata)->args.nosound) -        ogg_stream_clear(&((ProgData *)pdata)->enc_data->m_ogg_vs); -//this always gives me a segfault :( -//     theora_clear(&((ProgData *)pdata)->enc_data->m_th_st); -     -    if(((ProgData *)pdata)->enc_data->fp)fclose(((ProgData *)pdata)->enc_data->fp); - -    fprintf(stderr,"\r   \nDone.\nWritten %.0f bytes\n(%.0f of which were video data and %.0f audio data)\n\n",video_bytesout+audio_bytesout,video_bytesout,audio_bytesout); -    pthread_exit(&errno); -} diff --git a/rMD-exp/src/get_frame.c b/rMD-exp/src/get_frame.c deleted file mode 100644 index b1da1fe..0000000 --- a/rMD-exp/src/get_frame.c +++ /dev/null @@ -1,209 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - -void *GetFrame(void *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; -    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; -    pthread_mutex_init(&pmut,NULL); -    pthread_mutex_init(&tmut,NULL); - -    while(((ProgData *)pdata)->running){ -         -        //if we are left behind we must not wait. -        //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(Paused){ -                pthread_cond_wait(&((ProgData *)pdata)->pause_cond,&pmut); -            } -        } -        capture_busy=1; -         -        /*pthread_cond_wait(&((ProgData *)pdata)->pause_cond,&((ProgData *)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]); -        } -        //here we measure the list and decide which way we will go -        if(!((ProgData *)pdata)->args.nocondshared){ -            int level=0; -            RectArea *temp=((ProgData *)pdata)->rect_root[tlist_sel]; -             -            if(temp!=NULL){ -                do{ -                    level+=temp->geom.width*temp->geom.height; -                    temp=temp->next; -                }while(temp!=NULL); -                level*=100; -                level/=pixel_total; -                ((ProgData *)pdata)->args.noshared=(level<((ProgData *)pdata)->args.shared_thres); -//                 if(!((ProgData *)pdata)->args.noshared){ -//                     fprintf(stderr,"shared screenshot with %d\n",level); -//                 } -            } -        } -        if(((ProgData *)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((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);         -            } -            xcim=XFixesGetCursorImage(((ProgData *)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){ -        //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((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);         -            } -        //find new one -            XQueryPointer(((ProgData *)pdata)->dpy, -                            ((ProgData *)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); -        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)); -                } -                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); -                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); -            } -        } -        if(((ProgData *)pdata)->args.xfixes_cursor){ -        //avoid segfaults -            CLIP_DUMMY_POINTER_AREA(mouse_pos_abs,&((ProgData *)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), -                        mouse_pos_temp.width, -                        mouse_pos_temp.height, -                        (xcim->width-mouse_pos_temp.width)); -            } -            XFree(xcim); -            xcim=NULL; -        } - -        if(((ProgData *)pdata)->args.have_dummy_cursor){ -        //avoid segfaults -            CLIP_DUMMY_POINTER_AREA(mouse_pos_abs,&((ProgData *)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), -                                    mouse_pos_temp.width, -                                    mouse_pos_temp.height, -                                    ((ProgData *)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(encoder_busy){ -            frames_lost++; -        } -        pthread_cond_broadcast(&((ProgData *)pdata)->image_buffer_ready); -        capture_busy=0; -    } -    pthread_cond_broadcast(&((ProgData *)pdata)->image_buffer_ready); -    pthread_exit(&errno); -} - diff --git a/rMD-exp/src/getzpixmap.c b/rMD-exp/src/getzpixmap.c deleted file mode 100644 index 4a7a7de..0000000 --- a/rMD-exp/src/getzpixmap.c +++ /dev/null @@ -1,55 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - -int GetZPixmap(Display *dpy,Window root,char *data,int x,int y,int width,int height) { -    xGetImageReply reply; -    xGetImageReq *request; -    long nbytes; -     -    LockDisplay(dpy); -    GetReq(GetImage,request); -    request->drawable=root; -    request->x=x; -    request->y=y; -    request->width=width; -    request->height=height; -    request->planeMask=AllPlanes; -    request->format=ZPixmap; -    if((!_XReply(dpy,(xReply *)&reply,0,xFalse))||(!reply.length)){ -        UnlockDisplay(dpy); -        SyncHandle(); -        return 1; -    } -    nbytes=(long)reply.length<<2; -    _XReadPad(dpy,data,nbytes); -    UnlockDisplay(dpy); -    SyncHandle(); -    return 0; -} -  diff --git a/rMD-exp/src/init_encoder.c b/rMD-exp/src/init_encoder.c deleted file mode 100644 index 84d36aa..0000000 --- a/rMD-exp/src/init_encoder.c +++ /dev/null @@ -1,202 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - -int IncrementalNaming(char **name){ -    struct stat buff; -    char *base_name; -    int i=0; -    base_name=malloc(strlen(*name)); -    strcpy(base_name,*name); - -    //this will go on an endless loop if you have 65536? files with the same name -    //or it will crash and die.anyone interested in trying ? -    while (stat(*name,&buff)==0){ -        //create new name -        char *tname=malloc(strlen(*name)+10); -        char numbuf[8]; - -        strcpy(tname,base_name); -        strcat(tname,"."); -        I16TOA((++i),numbuf) -        strcat(tname,numbuf); -        //save new name -        free(*name); -        *name=malloc(strlen(tname)+1); -        strcpy(*name,tname); -        free(tname); -    } -    free(base_name); -    return 0; -} - -void InitEncoder(ProgData *pdata,EncData *enc_data_t,int buffer_ready){ -    int y1,y2; -    (pdata)->enc_data=enc_data_t; -    srand(time(NULL)); -    y1=rand(); -    y2=rand(); -    y2+=(y1==y2); - -    ogg_stream_init(&(enc_data_t)->m_ogg_ts,y1); -    if(!pdata->args.nosound) -        ogg_stream_init(&(enc_data_t)->m_ogg_vs,y2); -    if(!pdata->args.overwrite) -        IncrementalNaming(&(pdata)->args.filename); -    (enc_data_t)->fp=fopen((pdata)->args.filename,"w"); -    if((enc_data_t)->fp==NULL){ -        fprintf(stderr,"Cannot open file %s for writting!\n",(pdata)->args.filename); -        exit(13); -    } -    theora_info_init(&(enc_data_t)->m_th_inf); -    (enc_data_t)->m_th_inf.frame_width=(pdata)->brwin.rgeom.width; -    (enc_data_t)->m_th_inf.frame_height=(pdata)->brwin.rgeom.height; -    (enc_data_t)->m_th_inf.width=(((enc_data_t)->m_th_inf.frame_width + 15) >>4)<<4; -    (enc_data_t)->m_th_inf.height=(((enc_data_t)->m_th_inf.frame_height + 15) >>4)<<4; -    (enc_data_t)->m_th_inf.offset_x=(((enc_data_t)->m_th_inf.width-(enc_data_t)->m_th_inf.frame_width)/2)&~1; -    (enc_data_t)->m_th_inf.offset_y=(((enc_data_t)->m_th_inf.height-(enc_data_t)->m_th_inf.frame_height)/2)&~1; -    (enc_data_t)->m_th_inf.fps_numerator=((pdata)->args.fps*100.0); -    (enc_data_t)->m_th_inf.fps_denominator=100; -    (enc_data_t)->m_th_inf.aspect_numerator=1;//(pdata)->brwin.rgeom.width; -    (enc_data_t)->m_th_inf.aspect_denominator=1;//(pdata)->brwin.rgeom.height; -    (enc_data_t)->m_th_inf.colorspace=OC_CS_UNSPECIFIED; -    (enc_data_t)->m_th_inf.pixelformat=OC_PF_420; -    (enc_data_t)->m_th_inf.target_bitrate=(pdata)->args.v_bitrate; -    (enc_data_t)->m_th_inf.quality=(pdata)->args.v_quality; -    (enc_data_t)->m_th_inf.dropframes_p=(pdata)->args.dropframes; -    (enc_data_t)->m_th_inf.quick_p=1; -    (enc_data_t)->m_th_inf.keyframe_auto_p=1; -    (enc_data_t)->m_th_inf.keyframe_frequency=64; -    (enc_data_t)->m_th_inf.keyframe_frequency_force=64; -    (enc_data_t)->m_th_inf.keyframe_data_target_bitrate=(enc_data_t)->m_th_inf.quality*1.5; -    (enc_data_t)->m_th_inf.keyframe_auto_threshold=80; -    (enc_data_t)->m_th_inf.keyframe_mindistance=8; -    (enc_data_t)->m_th_inf.noise_sensitivity=1; -    (enc_data_t)->m_th_inf.sharpness=2; - -    theora_encode_init(&(enc_data_t)->m_th_st,&(enc_data_t)->m_th_inf); - - - -    if(!pdata->args.nosound){ -        int ret; -        vorbis_info_init(&(enc_data_t)->m_vo_inf); -        ret = vorbis_encode_init_vbr(&(enc_data_t)->m_vo_inf,pdata->args.channels,pdata->args.frequency,(float)pdata->args.s_quality*0.1); -        if(ret){ -            fprintf(stderr,"Error while setting up vorbis stream quality!\n"); -            exit(2); -        } -        vorbis_comment_init(&(enc_data_t)->m_vo_cmmnt); -        vorbis_analysis_init(&(enc_data_t)->m_vo_dsp,&(enc_data_t)->m_vo_inf); -        vorbis_block_init(&(enc_data_t)->m_vo_dsp,&(enc_data_t)->m_vo_block); -    } - - -    theora_encode_header(&(enc_data_t)->m_th_st,&(enc_data_t)->m_ogg_pckt1); -    ogg_stream_packetin(&(enc_data_t)->m_ogg_ts,&(enc_data_t)->m_ogg_pckt1); -    if(ogg_stream_pageout(&(enc_data_t)->m_ogg_ts,&(enc_data_t)->m_ogg_pg)!=1){ -        fprintf(stderr,"Internal Ogg library error.\n"); -        exit(2); -    } -    fwrite((enc_data_t)->m_ogg_pg.header,1,(enc_data_t)->m_ogg_pg.header_len,(enc_data_t)->fp); -    fwrite((enc_data_t)->m_ogg_pg.body,1,(enc_data_t)->m_ogg_pg.body_len,(enc_data_t)->fp); - -    theora_comment_init(&(enc_data_t)->m_th_cmmnt); -    theora_comment_add_tag(&(enc_data_t)->m_th_cmmnt,"recordMyDesktop",VERSION); -    theora_encode_comment(&(enc_data_t)->m_th_cmmnt,&(enc_data_t)->m_ogg_pckt1); -    ogg_stream_packetin(&(enc_data_t)->m_ogg_ts,&(enc_data_t)->m_ogg_pckt1); -    theora_encode_tables(&(enc_data_t)->m_th_st,&(enc_data_t)->m_ogg_pckt1); -    ogg_stream_packetin(&(enc_data_t)->m_ogg_ts,&(enc_data_t)->m_ogg_pckt1); - - -    if(!pdata->args.nosound){ -        ogg_packet header; -        ogg_packet header_comm; -        ogg_packet header_code; - -        vorbis_analysis_headerout(&(enc_data_t)->m_vo_dsp,&(enc_data_t)->m_vo_cmmnt,&header,&header_comm,&header_code); -        ogg_stream_packetin(&(enc_data_t)->m_ogg_vs,&header); -        if(ogg_stream_pageout(&(enc_data_t)->m_ogg_vs,&(enc_data_t)->m_ogg_pg)!=1){ -            fprintf(stderr,"Internal Ogg library error.\n"); -            exit(2); -        } -        fwrite((enc_data_t)->m_ogg_pg.header,1,(enc_data_t)->m_ogg_pg.header_len,(enc_data_t)->fp); -        fwrite((enc_data_t)->m_ogg_pg.body,1,(enc_data_t)->m_ogg_pg.body_len,(enc_data_t)->fp); - -        ogg_stream_packetin(&(enc_data_t)->m_ogg_vs,&header_comm); -        ogg_stream_packetin(&(enc_data_t)->m_ogg_vs,&header_code); -    } - - - -    while(1){ -        int result = ogg_stream_flush(&(enc_data_t)->m_ogg_ts,&(enc_data_t)->m_ogg_pg); -        if(result<0){ -            fprintf(stderr,"Internal Ogg library error.\n"); -            exit(2); -        } -        if(result==0)break; -        fwrite((enc_data_t)->m_ogg_pg.header,1,(enc_data_t)->m_ogg_pg.header_len,(enc_data_t)->fp); -        fwrite((enc_data_t)->m_ogg_pg.body,1,(enc_data_t)->m_ogg_pg.body_len,(enc_data_t)->fp); -    } - -    if(!pdata->args.nosound){ -        while(1){ -            int result=ogg_stream_flush(&(enc_data_t)->m_ogg_vs,&(enc_data_t)->m_ogg_pg); -            if(result<0){ -                fprintf(stderr,"Internal Ogg library error.\n"); -                exit(2); -            } -            if(result==0)break; -            fwrite((enc_data_t)->m_ogg_pg.header,1,(enc_data_t)->m_ogg_pg.header_len,(enc_data_t)->fp); -            fwrite((enc_data_t)->m_ogg_pg.body,1,(enc_data_t)->m_ogg_pg.body_len,(enc_data_t)->fp); -        } -    } - - -    if(!buffer_ready){ -        (enc_data_t)->yuv.y=(unsigned char *)malloc((enc_data_t)->m_th_inf.height*(enc_data_t)->m_th_inf.width); -        (enc_data_t)->yuv.u=(unsigned char *)malloc((enc_data_t)->m_th_inf.height*(enc_data_t)->m_th_inf.width/4); -        (enc_data_t)->yuv.v=(unsigned char *)malloc((enc_data_t)->m_th_inf.height*(enc_data_t)->m_th_inf.width/4); -        (enc_data_t)->yuv.y_width=(enc_data_t)->m_th_inf.width; -        (enc_data_t)->yuv.y_height=(enc_data_t)->m_th_inf.height; -        (enc_data_t)->yuv.y_stride=(enc_data_t)->m_th_inf.width; - -        (enc_data_t)->yuv.uv_width=(enc_data_t)->m_th_inf.width/2; -        (enc_data_t)->yuv.uv_height=(enc_data_t)->m_th_inf.height/2; -        (enc_data_t)->yuv.uv_stride=(enc_data_t)->m_th_inf.width/2; -        (enc_data_t)->x_offset=(enc_data_t)->m_th_inf.offset_x; -        (enc_data_t)->y_offset=(enc_data_t)->m_th_inf.offset_y; -    } -    theora_info_clear(&(enc_data_t)->m_th_inf); - -} - - - - diff --git a/rMD-exp/src/load_cache.c b/rMD-exp/src/load_cache.c deleted file mode 100644 index cd09956..0000000 --- a/rMD-exp/src/load_cache.c +++ /dev/null @@ -1,187 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - -void LoadBlock(unsigned char *dest,unsigned char *source,int blockno,int width, int height,int divisor){ -    int j, -        block_i=blockno/divisor,//place on the grid -        block_k=blockno%divisor; - -    for(j=0;j<height/divisor;j++)//we copy rows -        memcpy( &dest[block_i*(width*height/divisor)+j*width+block_k*width/divisor], -                &source[j*width/divisor], -                width/divisor); -} - - - -void *LoadCache(void *pdata){ - -    yuv_buffer *yuv=&((ProgData *)pdata)->enc_data->yuv; -    gzFile *ifp=((ProgData *)pdata)->cache_data->ifp; -    FILE *afp=((ProgData *)pdata)->cache_data->afp; -    FrameHeader fheader; -    CachedFrame frame; -    signed char *sound_data=(signed char *)malloc(((ProgData *)pdata)->periodsize); - -    int j=0, -        audio_end=0, -        extra_frames=0,//total number of duplicated frames -        missing_frames=0,//if this is found >0 current run will not load -                        //a frame but it will proccess the previous -        thread_exit=0,//0 success, -1 couldn't find files,1 couldn't remove -        divisor=16, -        blockszy=0,//size of y plane block in bytes -        blockszuv=0;//size of u,v plane blocks in bytes -    //we allocate the frame that we will use -    INIT_FRAME(&frame,&fheader,yuv) -    //and the we open our files -    ifp=gzopen(((ProgData *)pdata)->cache_data->imgdata,"rb"); -    if(ifp==NULL){ -        thread_exit=-1; -        pthread_exit(&thread_exit); -    } - -    if(!((ProgData *)pdata)->args.nosound){ -        afp=fopen(((ProgData *)pdata)->cache_data->audiodata,"rb"); -        if(afp==NULL){ -            thread_exit=-1; -            pthread_exit(&thread_exit); -        } -    } -    //these two are likely to be the same, but not guaranteed, especially on -    //low resolutions -    blockszy=(yuv->y_width*yuv->y_height )/pow(divisor,2); -    blockszuv=(yuv->uv_width*yuv->uv_height)/pow(divisor/2,2); - -    //this will be used now to define if we proccess audio or video -    //on any given loop. -    ((ProgData *)pdata)->avd=0; -    //If sound finishes first,we go on with the video. -    //If video ends we will do one more run to flush audio in the ogg file - -    while(((ProgData *)pdata)->running){ -        //video load and encoding -        if(((ProgData *)pdata)->avd<=0 || ((ProgData *)pdata)->args.nosound || audio_end){ -            if(missing_frames>0){ -                extra_frames++; -                missing_frames--; -                SyncEncodeImageBuffer((ProgData *)pdata); -            } -            else if(gzread(ifp,frame.header,sizeof(FrameHeader))==sizeof(FrameHeader)){ -                //sync -                missing_frames+=frame.header->current_total-(extra_frames+frame.header->frameno); -                fprintf(stdout,"\r[%d%%] ", -                ((frame.header->frameno+extra_frames)*100)/frames_total); - -                fflush(stdout); -                if( (frame.header->Ynum<=pow(divisor,2)) && -                    (frame.header->Unum<=pow(divisor/2,2)) && -                    (frame.header->Vnum<=pow(divisor/2,2)) && -                    (gzread(ifp,frame.YBlocks,frame.header->Ynum)==frame.header->Ynum) && -                    (gzread(ifp,frame.UBlocks,frame.header->Unum)==frame.header->Unum) && -                    (gzread(ifp,frame.VBlocks,frame.header->Vnum)==frame.header->Vnum) && -                    (gzread(ifp,frame.YData,blockszy*frame.header->Ynum)==blockszy*frame.header->Ynum) && -                    (gzread(ifp,frame.UData,(blockszuv*frame.header->Unum))==(blockszuv*frame.header->Unum)) && -                    (gzread(ifp,frame.VData,(blockszuv*frame.header->Vnum))==(blockszuv*frame.header->Vnum))){ -                        //load the blocks for each buffer -                        if(frame.header->Ynum) -                            for(j=0;j<frame.header->Ynum;j++) -                                LoadBlock(  yuv->y, -                                            &frame.YData[j*blockszy], -                                            frame.YBlocks[j], -                                            yuv->y_width, -                                            yuv->y_height, -                                            divisor); -                        if(frame.header->Unum) -                            for(j=0;j<frame.header->Unum;j++) -                                LoadBlock(  yuv->u, -                                            &frame.UData[j*blockszuv], -                                            frame.UBlocks[j], -                                            yuv->uv_width, -                                            yuv->uv_height, -                                            divisor/2); -                        if(frame.header->Vnum) -                            for(j=0;j<frame.header->Vnum;j++) -                                LoadBlock(  yuv->v, -                                            &frame.VData[j*blockszuv], -                                            frame.VBlocks[j], -                                            yuv->uv_width, -                                            yuv->uv_height, -                                            divisor/2); -                        //encode. This is not made in a thread since now blocking is not a problem -                        //and this way sync problems can be avoided more easily. -                        SyncEncodeImageBuffer((ProgData *)pdata); -                } -                else{ -                    raise(SIGINT); -                    continue; -                } -            } -            else{ -                raise(SIGINT); -                continue; -            } -        } -        //audio load and encoding -        else{ -            if(!audio_end){ -                int nbytes=fread(sound_data,((ProgData *)pdata)->periodsize,1,afp); -                if(nbytes<=0) -                    audio_end=1; -                else -                    SyncEncodeSoundBuffer((ProgData *)pdata,sound_data); -            } -        } -    } -    fprintf(stdout,"\n"); -    CLEAR_FRAME(&frame) -    free(sound_data); -    gzclose(ifp); - -    if(remove(((ProgData *)pdata)->cache_data->imgdata)){ -        fprintf(stderr,"Couldn't remove temporary file %s",((ProgData *)pdata)->cache_data->imgdata); -        thread_exit=1; -    } -    if(!((ProgData *)pdata)->args.nosound){ -        fclose(afp); -        if(remove(((ProgData *)pdata)->cache_data->audiodata)){ -            fprintf(stderr,"Couldn't remove temporary file %s",((ProgData *)pdata)->cache_data->audiodata); -            thread_exit=1; -        } -    } -    if(remove(((ProgData *)pdata)->cache_data->projname)){ -        fprintf(stderr,"Couldn't remove temporary directory %s",((ProgData *)pdata)->cache_data->projname); -        thread_exit=1; -    } - -    pthread_exit(&thread_exit); - - -} - diff --git a/rMD-exp/src/make_dummy_pointer.c b/rMD-exp/src/make_dummy_pointer.c deleted file mode 100644 index 00a346e..0000000 --- a/rMD-exp/src/make_dummy_pointer.c +++ /dev/null @@ -1,76 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - -unsigned char *MakeDummyPointer(DisplaySpecs *specs,int size,int color,int type,unsigned char *npxl){ -    int i,k,o='.'; -    unsigned long   b=(color)?'w':'b', -                    w=(color)?'b':'w'; -    char pmask[1][16][16]={{ -        {w,w,w,w,w,w,o,o,o,o,o,o,o,o,o,o}, -        {w,b,b,w,w,w,w,o,o,o,o,o,o,o,o,o}, -        {w,b,b,b,w,w,w,w,o,o,o,o,o,o,o,o}, -        {w,b,b,b,b,w,w,w,w,o,o,o,o,o,o,o}, -        {w,b,b,b,b,b,w,w,w,w,o,o,o,o,o,o}, -        {w,b,b,b,b,b,b,w,w,w,w,o,o,o,o,o}, -        {w,b,b,b,b,b,b,b,w,w,w,w,o,o,o,o}, -        {w,b,b,b,b,b,b,b,b,w,w,w,w,o,o,o}, -        {w,b,b,b,b,b,b,b,b,b,w,w,w,w,o,o}, -        {w,b,b,b,b,b,b,b,b,b,b,w,w,w,w,o}, -        {w,b,b,b,b,b,b,b,b,w,w,w,w,o,o,o}, -        {w,b,b,b,b,b,b,b,b,w,w,w,w,o,o,o}, -        {w,w,w,w,w,b,b,b,b,b,w,w,w,o,o,o}, -        {w,w,w,w,w,w,b,b,b,b,w,w,w,o,o,o}, -        {o,o,o,o,o,w,w,b,b,b,w,w,w,o,o,o}, -        {o,o,o,o,o,o,w,w,w,w,w,w,w,o,o,o}} -    }; -    unsigned char *ret=malloc(size*sizeof(char[size*4])); -    unsigned char wp[4]={ -        ((specs->wpixel^0xff000000)>>24), -        ((specs->wpixel^0x00ff0000)>>16), -        ((specs->wpixel^0x0000ff00)>>8), -        ((specs->wpixel^0x000000ff)) -    }; -    unsigned char bp[4]={ -        ((specs->bpixel^0xff000000)>>24), -        ((specs->bpixel^0x00ff0000)>>16), -        ((specs->bpixel^0x0000ff00)>>8), -        ((specs->bpixel^0x000000ff)) -    }; -    *npxl=((wp[0]-1)!=bp[0])?wp[0]-100:wp[0]-102; -    for(i=0;i<size;i++){ -        for(k=0;k<size;k++){ -            ret[(i*size+k)*4+__ABYTE]=(pmask[type][i][k]=='w')?wp[0]:(pmask[type][i][k]=='b')?bp[0]:*npxl; -            ret[(i*size+k)*4+__RBYTE]=(pmask[type][i][k]=='w')?wp[1]:(pmask[type][i][k]=='b')?bp[1]:*npxl; -            ret[(i*size+k)*4+__GBYTE]=(pmask[type][i][k]=='w')?wp[2]:(pmask[type][i][k]=='b')?bp[2]:*npxl; -            ret[(i*size+k)*4+__BBYTE]=(pmask[type][i][k]=='w')?wp[3]:(pmask[type][i][k]=='b')?bp[3]:*npxl; -        } -    } -     -    return ret; -} diff --git a/rMD-exp/src/opendev.c b/rMD-exp/src/opendev.c deleted file mode 100644 index 7eb5d2b..0000000 --- a/rMD-exp/src/opendev.c +++ /dev/null @@ -1,103 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - - - -#include <recordmydesktop.h> - - -snd_pcm_t *OpenDev(const char *pcm_dev,unsigned int *channels,unsigned int *frequency,snd_pcm_uframes_t *periodsize,unsigned int *periodtime,int *hard_pause){ -     -    snd_pcm_t *mhandle; -    snd_pcm_hw_params_t *hwparams; -    unsigned int periods=2; -    unsigned int exactrate = *frequency; - -    snd_pcm_hw_params_alloca(&hwparams); -    snd_pcm_uframes_t buffsize=4096; - -    if (snd_pcm_open(&mhandle, pcm_dev, SND_PCM_STREAM_CAPTURE, SND_PCM_ASYNC)<0){ -        fprintf(stderr, "Couldn't open PCM device %s\n", pcm_dev); -        return NULL; -    } -    if (snd_pcm_hw_params_any(mhandle, hwparams)<0){ -        fprintf(stderr, "Couldn't configure PCM device.\n"); -        return NULL; -    } -    if (snd_pcm_hw_params_set_access(mhandle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)<0)    { -        fprintf(stderr, "Couldn't set access.\n"); -        return NULL; -    } -    if (snd_pcm_hw_params_set_format(mhandle, hwparams, SND_PCM_FORMAT_S16_LE)<0){ -        fprintf(stderr, "Couldn't set format.\n"); -        return NULL; -    } -    if (snd_pcm_hw_params_set_rate_near(mhandle, hwparams, &exactrate, 0)<0){ -        fprintf(stderr, "Couldn't set frequency.\n"); -        return NULL; -    } -    if (*frequency != exactrate){ -        fprintf(stderr, "Playback frequency %dHz is not available...\nUsing %dHz instead.\n",*frequency,exactrate); -        *frequency=exactrate; -    } -    if (snd_pcm_hw_params_set_channels_near(mhandle, hwparams, channels)<0){ -        fprintf(stderr, "Couldn't set channels number.\n"); -        return NULL; -    } -    if(*channels>2){ -        fprintf(stderr,"Channels number should be 1(mono) or 2(stereo).\n"); -        return NULL; -    } -    if (snd_pcm_hw_params_set_periods_near(mhandle, hwparams, &periods,0)<0)    { -        fprintf(stderr, "Couldn't set periods.\n"); -        return NULL; -    } -    buffsize=(exactrate*(*channels))/2; -    if (snd_pcm_hw_params_set_buffer_size_near(mhandle, hwparams,&buffsize)<0){ -        fprintf(stderr, "Couldn't set buffer size.\n"); -        return NULL; -    } -    if (snd_pcm_hw_params(mhandle, hwparams)<0){ -        fprintf(stderr, "Couldn't set hardware parameters.\n"); -        return NULL; -    } -    if(hard_pause!=NULL) -        if(!snd_pcm_hw_params_can_pause(hwparams)){ -//             fprintf(stderr, "Current sound device doesn't seem to support pausing!\nI will attempt to close/reopen device in case you opt to pause during recording.\n"); -            *hard_pause=1; -        } -    if(periodsize!=NULL) -        snd_pcm_hw_params_get_period_size(hwparams,periodsize,0); -    if(periodtime!=NULL) -        snd_pcm_hw_params_get_period_time(hwparams,periodtime,0); -    fprintf(stderr,"Recording on device %s is set to:\n%d channels at %dHz\n",pcm_dev,*channels,*frequency); -    snd_pcm_prepare(mhandle); - -    return mhandle; -} - - diff --git a/rMD-exp/src/parseargs.c b/rMD-exp/src/parseargs.c deleted file mode 100644 index c7d20fd..0000000 --- a/rMD-exp/src/parseargs.c +++ /dev/null @@ -1,425 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - - -int ParseArgs(int argc,char **argv,ProgArgs *arg_return){ -    int i; -    char *usage="\nUsage:\n" -    "\trecordmydesktop [-h| --help| --version| -delay n[H|h|M|m]| -windowid id_of_window|\n" -    "\t-display DISPLAY| -x X| -y Y|-width N| -height N| -fps N(number>0)| --on-the-fly-encoding|\n" -    "\t -v_quality n| -s_quality n| -v_bitrate n| --no-framedrop| -dummy-cursor color|\n" -    "\t --no-cursor| -freq N(number>0)| -channels N(number>0)| -device SOUND_DEVICE|\n" -    "\t --no-sound| --with-shared| --no-cond-shared| -shared-threshold n| --full-shots|\n" -    "\t --quick-subsampling| -workdir DIR| --zero-compression| --no-wm-check| --overwite| -o filename]^filename\n\n\n" - -    "General Options:\n" -    "\t-h or --help\t\tPrint this help and exit.\n" -    "\t--version\t\tPrint program version and exit.\n\n" - -    "Image Options:\n" -    "\t-windowid id_of_window\tid of window to be recorded.\n" -    "\t-display DISPLAY\tDisplay to connect to.\n" -    "\t-x X\t\t\tOffset in x direction.\n" -    "\t-y Y\t\t\tOffset in y direction.\n" -    "\t-width N\t\tWidth of recorded window.\n" -    "\t-height N\t\tHeight of recorded window.\n\n" - -    "\t-dummy-cursor color\tColor of the dummy cursor [black|white]\n" -    "\t--no-cursor\t\tDisable drawing of the cursor.\n" -    "\t--with-shared\t\tEnable usage of MIT-shared memory extension at all times.\n" -    "\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--quick-subsampling\tDo subsampling of the chroma planes by discarding,not averaging.\n" -    "\t-fps N(number>0.0)\tA positive number denoting desired framerate.\n\n" - -    "Sound Options:\n" -    "\t-channels N(number>0)\tA positive number denoting desired sound channels in recording.\n" -    "\t-freq N(number>0)\tA positive number denoting desired sound frequency.\n" -    "\t-device SOUND_DEVICE\tSound device(default hw0:0).\n" -    "\t--no-sound\t\tDo not record sound.\n\n" - -    "Encoding Options\n" -    "\t--on-the-fly-encoding\tEncode the audio-video data, while recording.\n" -    "\t-v_quality n\t\tA number from 0 to 63 for desired encoded video quality(default 63).\n" -    "\t-v_bitrate n\t\tA number from 45000 to 2000000 for desired encoded video bitrate(default 45000).\n" -    "\t--drop-frames\t\tAllow theora encoder to drop frames.\n" -    "\t-s_quality n\t\tDesired audio quality(-1 to 10).\n\n" - -    "Misc Options:\n" -    "\t--no-wm-check\tDo not try to detect the window manager(and set options according to it)\n" -    "\t--zero-compression\tImage data are always cached uncompressed.\n" -    "\t-workdir DIR\t\tLocation where a temporary directory will be created to hold project files(default $HOME).\n" -    "\t-delay n[H|h|M|m]\tNumber of secs(default),minutes or hours before capture starts(number can be float)\n" -    "\t--overwrite\t\tIf there is already a file with the same name, delete it\n" -    "\t\t\t\t(default is to add a number postfix to the new one).\n" -    "\t-o filename\t\tName of recorded video(default out.ogg).\n" -    "\n\tIf no other options are specified, filename can be given without the -o switch.\n\n\n"; - -    if(argc==2){ -        if(argv[1][0]!='-'){ -            free(arg_return->filename); -            arg_return->filename=malloc(strlen(argv[1])+1); -            strcpy(arg_return->filename,argv[1]); -            return 0; -        } -    } -    for(i=1;i<argc;i++){ -        if(!strcmp(argv[i],"-delay")){ -            if(i+1<argc){ -                float num=atof(argv[i+1]); -                if(num>0.0){ -                    int k; -                    for(k=0;k<strlen(argv[i+1]);k++){ -                        if((argv[i+1][k]=='M')||(argv[i+1][k]=='m')){ -                            num*=60.0; -                            break; -                        } -                        else if((argv[i+1][k]=='H')||(argv[i+1][k]=='h')){ -                            num*=3600.0; -                            break; -                        } -                    } -                    arg_return->delay=(int)num; -                } -                else{ -                    fprintf(stderr,"Argument Usage: -delay n[H|h|M|m]\nwhere n is a float number\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -delay n[H|h|M|m]\nwhere n is a float number\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-windowid")){ -            if(i+1<argc){ -                Window num=strtod(argv[i+1],NULL); -                if(num>0) -                    arg_return->windowid=num; -                else{ -                    fprintf(stderr,"Argument Usage: -windowid id_of_window(number)\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -windowid id_of_window(number)\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-display")){ -            if(i+1<argc){ -                if(arg_return->display!=NULL) -                    free(arg_return->display); -                arg_return->display=malloc(strlen(argv[i+1])+1); -                strcpy(arg_return->display,argv[i+1]); -            } -            else{ -                fprintf(stderr,"Argument Usage: -display DISPLAY\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-x")){ -            if(i+1<argc){ -                int num=atoi(argv[i+1]); -                if(num>0) -                    arg_return->x=num; -                else{ -                    fprintf(stderr,"Argument Usage: -x X(number>0)\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -x X(number>0)\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-y")){ -            if(i+1<argc){ -                int num=atoi(argv[i+1]); -                if(num>0) -                    arg_return->y=num; -                else{ -                    fprintf(stderr,"Argument Usage: -y Y(number>0)\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -y Y(number>0)\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-width")){ -            if(i+1<argc){ -                int num=atoi(argv[i+1]); -                if(num>0) -                    arg_return->width=num; -                else{ -                    fprintf(stderr,"Argument Usage: -width N(number>0)\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -width N(number>0)\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-height")){ -            if(i+1<argc){ -                int num=atoi(argv[i+1]); -                if(num>0) -                    arg_return->height=num; -                else{ -                    fprintf(stderr,"Argument Usage: -height N(number>0)\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -height N(number>0)\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-o")){ -            if(i+1<argc){ -                free(arg_return->filename); -                arg_return->filename=malloc(strlen(argv[i+1])+1); -                strcpy(arg_return->filename,argv[i+1]); -            } -            else{ -                fprintf(stderr,"Argument Usage: -o filename\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-fps")){ -            if(i+1<argc){ -                float num=atof(argv[i+1]); -                if(num>0.0) -                    arg_return->fps=num; -                else{ -                    fprintf(stderr,"Argument Usage: -fps N(number>0)\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -fps N(number>0)\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-v_quality")){ -            if(i+1<argc){ -                int num=atoi(argv[i+1]); -                if((num>=0)&&(num<64)) -                    arg_return->v_quality=num; -                else{ -                    fprintf(stderr,"Argument Usage: -v_quality n(number 0-63)\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -v_quality n(number 0-63)\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-v_bitrate")){ -            if(i+1<argc){ -                int num=atoi(argv[i+1]); -                if((num>=45000)&&(num<=2000000)) -                    arg_return->v_bitrate=num; -                else{ -                    fprintf(stderr,"Argument Usage: -v_bitrate n(number 45000-2000000)\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -v_bitrate n(number 45000-2000000)\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-dummy-cursor")){ -            if(i+1<argc){ -                if(!strcmp(argv[i+1],"white")) -                    arg_return->cursor_color=0; -                else if(!strcmp(argv[i+1],"black")) -                    arg_return->cursor_color=1; -                else{ -                    fprintf(stderr,"Argument Usage: -dummy-cursor [black|white]\n"); -                    return 1; -                } -                arg_return->have_dummy_cursor=1; -                arg_return->xfixes_cursor=0; -            } -            else{ -                fprintf(stderr,"Argument Usage: -dummy-cursor [black|white]\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"--no-cursor")) -            arg_return->xfixes_cursor=0; -        else if(!strcmp(argv[i],"-freq")){ -            if(i+1<argc){ -                int num=atoi(argv[i+1]); -                if(num>0) -                    arg_return->frequency=num; -                else{ -                    fprintf(stderr,"Argument Usage: -freq N(number>0)\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -freq N(number>0)\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-channels")){ -            if(i+1<argc){ -                int num=atoi(argv[i+1]); -                if(num>0) -                    arg_return->channels=num; -                else{ -                    fprintf(stderr,"Argument Usage: -channels N(number>0)\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -channels N(number>0)\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-s_quality")){ -            if(i+1<argc){ -                int num=atoi(argv[i+1]); -                if((num>=-1)&&(num<=10)) -                    arg_return->s_quality=num; -                else{ -                    fprintf(stderr,"Argument Usage: -s_quality n(number -1 to 10)\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -s_quality n(number -1 to 10)\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-shared-threshold")){ -            if(i+1<argc){ -                int num=atoi(argv[i+1]); -                if((num>0)&&(num<100)) -                    arg_return->shared_thres=num; -                else{ -                    fprintf(stderr,"Argument Usage: -shared-threshold N(0<number<100)\n"); -                    return 1; -                } -            } -            else{ -                fprintf(stderr,"Argument Usage: -shared-threshold N(0<number<100)\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-device")){ -            if(i+1<argc){ -                free(arg_return->device); -                arg_return->device=malloc(strlen(argv[i+1])+1); -                strcpy(arg_return->device,argv[i+1]); -            } -            else{ -                fprintf(stderr,"Argument Usage: -device SOUND_DEVICE\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"-workdir")){ -            if(i+1<argc){ -                free(arg_return->workdir); -                arg_return->workdir=malloc(strlen(argv[i+1])+1); -                strcpy(arg_return->workdir,argv[i+1]); -            } -            else{ -                fprintf(stderr,"Argument Usage: -workdir DIR\n"); -                return 1; -            } -            i++; -        } -        else if(!strcmp(argv[i],"--no-sound")) -            arg_return->nosound=1; -        else if(!strcmp(argv[i],"--drop-frames")) -            arg_return->dropframes=1; -        else if(!strcmp(argv[i],"--with-shared")){ -            arg_return->noshared=0; -            arg_return->nocondshared=1; -        } -        else if(!strcmp(argv[i],"--no-cond-shared")) -            arg_return->nocondshared=1; -        else if(!strcmp(argv[i],"--full-shots")){ -            arg_return->full_shots=1; -            arg_return->nocondshared=1; -        } -        else if(!strcmp(argv[i],"--quick-subsampling")){ -            arg_return->no_quick_subsample=0; -        } -        else if(!strcmp(argv[i],"--on-the-fly-encoding")){ -            arg_return->encOnTheFly=1; -        } -        else if(!strcmp(argv[i],"--overwrite")) -            arg_return->overwrite=1; -        else if(!strcmp(argv[i],"--no-wm-check")) -            arg_return->nowmcheck=1; -        else if(!strcmp(argv[i],"--zero-compression")){ -            arg_return->zerocompression=1; -        } -        else if(!strcmp(argv[i],"--help")||!strcmp(argv[i],"-h")){ -            fprintf(stderr,"%s",usage); -            return 1; -        } -        else if(!strcmp(argv[i],"--version")){ -            fprintf(stderr,"recordMyDesktop v%s\n\n",VERSION); -            return 1; -        } -        else{ -            fprintf(stderr,"\n\tError parsing arguments.\n\tType --help or -h for usage.\n\n"); -            return 1; -        } -    } -    return 0; -} diff --git a/rMD-exp/src/poll_damage.c b/rMD-exp/src/poll_damage.c deleted file mode 100644 index 9bf7ee2..0000000 --- a/rMD-exp/src/poll_damage.c +++ /dev/null @@ -1,88 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - -void *PollDamage(void *pdata){ -    Window root_return, -           parent_return, -           *children; -    unsigned int i, -                 nchildren, -                 inserts=0; -    XEvent event; - -    XSelectInput (((ProgData *)pdata)->dpy,((ProgData *)pdata)->specs.root, SubstructureNotifyMask); - -    XQueryTree (((ProgData *)pdata)->dpy, -                ((ProgData *)pdata)->specs.root, -                &root_return, -                &parent_return, -                &children, -                &nchildren); - -    for (i = 0; i < nchildren; i++){ -        XWindowAttributes attribs; -        if (XGetWindowAttributes (((ProgData *)pdata)->dpy,children[i],&attribs)){ -            if (!attribs.override_redirect && attribs.depth==((ProgData *)pdata)->specs.depth) -                XDamageCreate (((ProgData *)pdata)->dpy, children[i],XDamageReportRawRectangles); -        } -    } - -    XDamageCreate( ((ProgData *)pdata)->dpy, ((ProgData *)pdata)->brwin.windowid, XDamageReportRawRectangles); - - -    while(((ProgData *)pdata)->running){ -        //damage polling doesn't stop,eventually full image may be needed -        //30/10/2006 : when and why did I write the above line? what did I mean? -        XNextEvent(((ProgData *)pdata)->dpy,&event); -        if (event.type == MapNotify ){ -            XWindowAttributes attribs; -            if (!((XMapEvent *)(&event))->override_redirect && XGetWindowAttributes (((ProgData *)pdata)->dpy, -                                        event.xcreatewindow.window, -                                        &attribs)){ -                if (!attribs.override_redirect && attribs.depth==((ProgData *)pdata)->specs.depth) -                    XDamageCreate (((ProgData *)pdata)->dpy,event.xcreatewindow.window,XDamageReportRawRectangles); -            } -        } -        else if(event.type == ((ProgData *)pdata)->damage_event + XDamageNotify ){ -            XDamageNotifyEvent *e =(XDamageNotifyEvent *)( &event ); -            WGeometry wgeom; -            CLIP_EVENT_AREA(e,&(((ProgData *)pdata)->brwin),&wgeom); -            if((wgeom.x>=0)&&(wgeom.y>=0)&&(wgeom.width>0)&&(wgeom.height>0)) -            { -                int tlist_sel=((ProgData *)pdata)->list_selector; -                pthread_mutex_lock(&((ProgData *)pdata)->list_mutex[tlist_sel]); -                inserts+=RectInsert(&((ProgData *)pdata)->rect_root[tlist_sel],&wgeom); -                pthread_mutex_unlock(&((ProgData *)pdata)->list_mutex[tlist_sel]); -            } -        } - -    } -    pthread_exit(&errno); -} - diff --git a/rMD-exp/src/queryextensions.c b/rMD-exp/src/queryextensions.c deleted file mode 100644 index 0b311b9..0000000 --- a/rMD-exp/src/queryextensions.c +++ /dev/null @@ -1,48 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - -void QueryExtensions(Display *dpy,ProgArgs *args,int *damage_event,int *damage_error){ -    int xf_event_basep, -        xf_error_basep; - -    if(!XDamageQueryExtension( dpy, damage_event, damage_error)){ -        fprintf(stderr,"XDamage extension not found!!!\n"); -        exit(4); -    } -    if((!args->noshared)&&(XShmQueryExtension(dpy)==False)){ -        args->noshared=1; -        fprintf(stderr,"Shared Memory extension not present!\nTry again removing the --with-shared option(if you used it)\nand add the --no-cond-shared option.\n"); -        exit(5); -    } -    if((args->xfixes_cursor)&&(XFixesQueryExtension(dpy,&xf_event_basep,&xf_error_basep)==False)){ -        args->xfixes_cursor=0; -        fprintf(stderr,"Xfixes extension not present!\nPlease run with the -dummy-cursor or --no-cursor option.\n"); -        exit(6); -    } -} diff --git a/rMD-exp/src/recordmydesktop.c b/rMD-exp/src/recordmydesktop.c deleted file mode 100644 index 77c08ce..0000000 --- a/rMD-exp/src/recordmydesktop.c +++ /dev/null @@ -1,354 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - - -int main(int argc,char **argv){ -    ProgData pdata; -    int exit_status=0; -    if(XInitThreads ()==0){ -        fprintf(stderr,"Couldn't initialize thread support!\n"); -        exit(7); -    } -    DEFAULT_ARGS(&pdata.args); -    if(ParseArgs(argc,argv,&pdata.args)){ -        exit(1); -    } -    if(pdata.args.display!=NULL) -        pdata.dpy = XOpenDisplay(pdata.args.display); -    else{ -        fprintf(stderr,"No display specified for connection!\n"); -        exit(8); -    } -    if (pdata.dpy == NULL) { -        fprintf(stderr, "Cannot connect to X server %s\n",pdata.args.display); -        exit(9); -    } -    else{ -        EncData enc_data; -        CacheData cache_data; -        pthread_t   poll_damage_t, -                    image_capture_t, -                    image_encode_t, -                    image_cache_t, -                    sound_capture_t, -                    sound_encode_t, -                    sound_cache_t, -                    flush_to_ogg_t, -                    load_cache_t; -        XShmSegmentInfo shminfo; -        int i; - -        QUERY_DISPLAY_SPECS(pdata.dpy,&pdata.specs); -        if(pdata.specs.depth!=24){ -            fprintf(stderr,"Only 24bpp color depth mode is currently supported.\n"); -            exit(10); -        } -        if(SetBRWindow(pdata.dpy,&pdata.brwin,&pdata.specs,&pdata.args)) -            exit(11); - - -        //check if we are under compiz or beryl,in which case we must enable full-shots -        //and with it use of shared memory.User can override this -        pdata.window_manager=((pdata.args.nowmcheck)?NULL:rmdWMCheck(pdata.dpy,pdata.specs.root)); -        if(pdata.window_manager==NULL){ -            fprintf(stderr,"Not taking window manager into account.\n"); -        } -        //Right now only wm's that I know of performing 3d compositing are beryl and compiz. -        //No, the blue screen in metacity doesn't count :) -        //names can be compiz for compiz and beryl/beryl-co/beryl-core for beryl(so it's strncmp ) -        else if(!strcmp(pdata.window_manager,"compiz") || !strncmp(pdata.window_manager,"beryl",5)){ -            fprintf(stderr,"\nDetected 3d compositing window manager.\n" -                           "Reverting to full screen capture at every frame.\n" -                           "To disable this check run with --no-wm-check\n" -                           "(though that is not advised, since it will probably produce faulty results).\n\n"); -            pdata.args.full_shots=1; -            pdata.args.noshared=0; -            pdata.args.nocondshared=1; -        } - -        QueryExtensions(pdata.dpy,&pdata.args,&pdata.damage_event, &pdata.damage_error); - - - - -        //init data - -        //these are globals, look for them at the header -        frames_total=frames_lost=encoder_busy=capture_busy=0; - -        fprintf(stderr,"Initializing...\n"); -        MakeMatrices(); -        if(pdata.args.have_dummy_cursor){ -            pdata.dummy_pointer=MakeDummyPointer(&pdata.specs,16,pdata.args.cursor_color,0,&pdata.npxl); -            pdata.dummy_p_size=16; -        } - -        if((pdata.args.noshared)) -            pdata.datamain=(char *)malloc(pdata.brwin.nbytes); - -        if(pdata.args.noshared) -            pdata.datatemp=(char *)malloc(pdata.brwin.nbytes); -        pdata.rect_root[0]=pdata.rect_root[1]=NULL; -        pthread_mutex_init(&pdata.list_mutex[0],NULL); -        pthread_mutex_init(&pdata.list_mutex[1],NULL); -        pthread_mutex_init(&pdata.sound_buffer_mutex,NULL); -        pthread_mutex_init(&pdata.libogg_mutex,NULL); -        pthread_mutex_init(&pdata.yuv_mutex,NULL); - -        pthread_cond_init(&pdata.time_cond,NULL); -        pthread_cond_init(&pdata.pause_cond,NULL); -        pthread_cond_init(&pdata.image_buffer_ready,NULL); -        pthread_cond_init(&pdata.sound_buffer_ready,NULL); -        pthread_cond_init(&pdata.sound_data_read,NULL); -        pdata.list_selector=Paused=Aborted=pdata.avd=0; -        pdata.running=1; -        time_cond=&pdata.time_cond; -        pause_cond=&pdata.pause_cond; -        Running=&pdata.running; - -        if((pdata.args.noshared)){ -            pdata.image=XCreateImage(pdata.dpy, pdata.specs.visual, pdata.specs.depth, ZPixmap, 0,pdata.datamain,pdata.brwin.rgeom.width, -                        pdata.brwin.rgeom.height, 8, 0); -            XInitImage(pdata.image); -            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); -        } -        if((!pdata.args.noshared)||(!pdata.args.nocondshared)){ -            pdata.shimage=XShmCreateImage (pdata.dpy,pdata.specs.visual,pdata.specs.depth,ZPixmap,pdata.datash, -                         &shminfo, pdata.brwin.rgeom.width,pdata.brwin.rgeom.height); -            shminfo.shmid = shmget (IPC_PRIVATE, -                                    pdata.shimage->bytes_per_line * pdata.shimage->height, -                                    IPC_CREAT|0777); -            shminfo.shmaddr = pdata.shimage->data = shmat (shminfo.shmid, 0, 0); -            shminfo.readOnly = False; -            if(!XShmAttach(pdata.dpy,&shminfo)){ -                fprintf(stderr,"Failed to attach shared memory to proccess.\n"); -                exit(12); -            } -            XShmGetImage(pdata.dpy,pdata.specs.root,pdata.shimage,pdata.brwin.rgeom.x,pdata.brwin.rgeom.y,AllPlanes); -        } -        if(!pdata.args.nosound){ -            pdata.sound_handle=OpenDev(pdata.args.device,&pdata.args.channels,&pdata.args.frequency,&pdata.periodsize,            &pdata.periodtime,&pdata.hard_pause); -            if(pdata.sound_handle==NULL){ -                fprintf(stderr,"Error while opening/configuring soundcard %s\nTry running with the --no-sound or specify a correct device.\n",pdata.args.device); -                exit(3); -            } -        } - -        if(pdata.args.encOnTheFly) -            InitEncoder(&pdata,&enc_data,0); -        else -            InitCacheData(&pdata,&enc_data,&cache_data); - -        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; - -        if(pdata.args.delay>0){ -            fprintf(stderr,"Will sleep for %d seconds now.\n",pdata.args.delay); -            sleep(pdata.args.delay); -        } - -        /*start threads*/ -        if(!pdata.args.full_shots) -            pthread_create(&poll_damage_t,NULL,PollDamage,(void *)&pdata); -        pthread_create(&image_capture_t,NULL,GetFrame,(void *)&pdata); -        if(pdata.args.encOnTheFly) -            pthread_create(&image_encode_t,NULL,EncodeImageBuffer,(void *)&pdata); -        else -            pthread_create(&image_cache_t,NULL,CacheImageBuffer,(void *)&pdata); - -        if(!pdata.args.nosound){ -            pthread_create(&sound_capture_t,NULL,CaptureSound,(void *)&pdata); -            if(pdata.args.encOnTheFly) -                pthread_create(&sound_encode_t,NULL,EncodeSoundBuffer,(void *)&pdata); -            else -                pthread_create(&sound_cache_t,NULL,CacheSoundBuffer,(void *)&pdata); -        } -        if(pdata.args.encOnTheFly) -            pthread_create(&flush_to_ogg_t,NULL,FlushToOgg,(void *)&pdata); - - -        RegisterCallbacks(&pdata.args); -        fprintf(stderr,"Capturing!\n"); - -        //wait all threads to finish - -        pthread_join(image_capture_t,NULL); -        fprintf(stderr,"Shutting down."); -        //if no damage events have been received the thread will get stuck -        pthread_cond_broadcast(&pdata.image_buffer_ready); -        if(pdata.args.encOnTheFly) -            pthread_join(image_encode_t,NULL); -        else -            pthread_join(image_cache_t,NULL); - - -        fprintf(stderr,"."); -        if(!pdata.args.nosound){ -            int *snd_exit; -            pthread_join(sound_capture_t,(void *)(&snd_exit)); -            fprintf(stderr,"."); - -            if(pdata.args.encOnTheFly){ -                if(!(*snd_exit)) -                    pthread_join(sound_encode_t,NULL); -                else{ -                    pthread_cancel(sound_encode_t); -                    exit_status=*snd_exit; -                } -            } -            else{ -                if(!(*snd_exit)) -                    pthread_join(sound_cache_t,NULL); -                else{ -                    pthread_cancel(sound_cache_t); -                    exit_status=*snd_exit; -                } -            } -        } -        else -            fprintf(stderr,".."); - -        if(pdata.args.encOnTheFly) -            pthread_join(flush_to_ogg_t,NULL); -        fprintf(stderr,"."); - -        if(!pdata.args.full_shots) -            pthread_join(poll_damage_t,NULL); - - -        fprintf(stderr,"."); -        if((!pdata.args.noshared)||(!pdata.args.nocondshared)){ -            XShmDetach (pdata.dpy, &shminfo); -            shmdt (&shminfo.shmaddr); -            shmctl (shminfo.shmid, IPC_RMID, 0); -        } -        fprintf(stderr,"\n"); - - -        //Now that we are done with recording we cancel the timer -        CancelTimer(); - -/**               Encoding                          */ -        if(!pdata.args.encOnTheFly){ -            if(!Aborted){ -                fprintf(stderr,"Encoding started!\nThis may take several minutes.\n" -                "Pressing Ctrl-C will cancel the procedure (resuming will not be possible, but\n" -                "any portion of the video, which is already encoded won't be deleted).\n" -                "Please wait...\n"); -                pdata.running=1; -                InitEncoder(&pdata,&enc_data,1); -                //load encoding and flushing threads -                if(!pdata.args.nosound){ -                    //before we start loading again -                    //we need to free any left-overs -                    while(pdata.sound_buffer!=NULL){ -                        free(pdata.sound_buffer->data); -                        pdata.sound_buffer=pdata.sound_buffer->next; -                    } -                } -                pthread_create(&flush_to_ogg_t,NULL,FlushToOgg,(void *)&pdata); - - -                //start loading image and audio -                pthread_create(&load_cache_t,NULL,LoadCache,(void *)&pdata); - -                //join and finish -                pthread_join(load_cache_t,NULL); -                fprintf(stderr,"Encoding finished!\nWait a moment please...\n"); -                pthread_join(flush_to_ogg_t,NULL); -                fprintf(stderr,"Done!!!\n"); -            } -        } -/**@_______________________________________________@*/ - -        //This can happen earlier, but in some cases it might get stuck. -        //So we must make sure the recording is not wasted. -        XCloseDisplay(pdata.dpy); - -        if(Aborted){ -            if(remove(pdata.args.filename)){ -                perror("Error while removing file:\n"); -                return 1; -            } -            else{ -                fprintf(stderr,"SIGABRT received,file %s removed\n",pdata.args.filename); -                return 0; -            } -        } -        else -            fprintf(stderr,"Goodbye!\n"); -    } -    return exit_status; -} - - - - - - - - - - - - - - - diff --git a/rMD-exp/src/rectinsert.c b/rMD-exp/src/rectinsert.c deleted file mode 100644 index aefeb1e..0000000 --- a/rMD-exp/src/rectinsert.c +++ /dev/null @@ -1,499 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> -//return 1 and null if geom1 in geom2 ,2 and null if geom2 in geom1,0 if they don't collide -//-1 and two geoms if they collide and geom1 is broken.//-2 and one or two geoms if they collide and geom2 is broken. -//-10 if group and replace is possible -int CollideRects(WGeometry *wgeom1,WGeometry *wgeom2,WGeometry **wgeom_return,int *ngeoms){ -    //1 fits in 2 -    if((wgeom1->x>=wgeom2->x)&& -        (wgeom1->x+wgeom1->width<=wgeom2->x+wgeom2->width)&& -        (wgeom1->y>=wgeom2->y)&& -        (wgeom1->y+wgeom1->height<=wgeom2->y+wgeom2->height)){ -        *ngeoms=0; -        return 1; -    } -    //2 fits in 1 -    else if((wgeom2->x>=wgeom1->x)&& -        (wgeom2->x+wgeom2->width<=wgeom1->x+wgeom1->width)&& -        (wgeom2->y>=wgeom1->y)&& -        (wgeom2->y+wgeom2->height<=wgeom1->y+wgeom1->height)){ -        *ngeoms=0; -        return 2; -    } -    //no collision -    else if((wgeom1->x+wgeom1->width<wgeom2->x)|| -        (wgeom2->x+wgeom2->width<wgeom1->x)|| -        (wgeom1->y+wgeom1->height<wgeom2->y)|| -        (wgeom2->y+wgeom2->height<wgeom1->y)){ -        *ngeoms=0; -        return 0; -    } -    else{ -//overlapping points are considered enclosed -//this happens because libxdamage may generate many events for one change -//and some of them may be in the the exact same region -//so identical rects would be considered not colliding -//in order though to avoid endless recursion on the RectInsert  -//function should always start at the next element(which is logical since -//if any rect makes it to a points none of it's part collides with previous  -//nodes on the list, too) -        int x1[2]={wgeom1->x,wgeom1->x+wgeom1->width}; -        int y1[2]={wgeom1->y,wgeom1->y+wgeom1->height}; -        int x2[2]={wgeom2->x,wgeom2->x+wgeom2->width}; -        int y2[2]={wgeom2->y,wgeom2->y+wgeom2->height}; -        int enclosed[2][4],tot1,tot2; -        enclosed[0][0]=(((x1[0]>=x2[0])&&(x1[0]<=x2[1])&& -                    (y1[0]>=y2[0])&&(y1[0]<=y2[1]))?1:0); -        enclosed[0][1]=(((x1[1]>=x2[0])&&(x1[1]<=x2[1])&& -                    (y1[0]>=y2[0])&&(y1[0]<=y2[1]))?1:0); -        enclosed[0][2]=(((x1[0]>=x2[0])&&(x1[0]<=x2[1])&& -                    (y1[1]>=y2[0])&&(y1[1]<=y2[1]))?1:0); -        enclosed[0][3]=(((x1[1]>=x2[0])&&(x1[1]<=x2[1])&& -                    (y1[1]>=y2[0])&&(y1[1]<=y2[1]))?1:0); -        enclosed[1][0]=(((x2[0]>=x1[0])&&(x2[0]<=x1[1])&& -                    (y2[0]>=y1[0])&&(y2[0]<=y1[1]))?1:0); -        enclosed[1][1]=(((x2[1]>=x1[0])&&(x2[1]<=x1[1])&& -                    (y2[0]>=y1[0])&&(y2[0]<=y1[1]))?1:0); -        enclosed[1][2]=(((x2[0]>=x1[0])&&(x2[0]<=x1[1])&& -                    (y2[1]>=y1[0])&&(y2[1]<=y1[1]))?1:0); -        enclosed[1][3]=(((x2[1]>=x1[0])&&(x2[1]<=x1[1])&& -                    (y2[1]>=y1[0])&&(y2[1]<=y1[1]))?1:0); -        tot1=enclosed[0][0]+enclosed[0][1]+enclosed[0][2]+enclosed[0][3]; -        tot2=enclosed[1][0]+enclosed[1][1]+enclosed[1][2]+enclosed[1][3]; -        if((tot1==2)&&(tot2==2)){//same width or height, which is the best case -            //group -            if((enclosed[1][0]&&enclosed[1][1])&&(wgeom1->width==wgeom2->width)){ -                wgeom_return[0]=(WGeometry *)malloc(sizeof(WGeometry)); -                *ngeoms=1; -                wgeom_return[0]->x=wgeom1->x; -                wgeom_return[0]->y=wgeom1->y; -                wgeom_return[0]->width=wgeom1->width; -                wgeom_return[0]->height=wgeom2->height+wgeom2->y-wgeom1->y; -                return -10; -            } -            else if((enclosed[1][0]&&enclosed[1][2])&&(wgeom1->height==wgeom2->height)){ -//                 wgeom_return[0]=(WGeometry *)malloc(sizeof(WGeometry)); -                *ngeoms=1; -                wgeom_return[0]->x=wgeom1->x; -                wgeom_return[0]->y=wgeom1->y; -                wgeom_return[0]->width=wgeom2->width+wgeom2->x-wgeom1->x; -                wgeom_return[0]->height=wgeom1->height;     -                return -10; -            } -            else if((enclosed[1][3]&&enclosed[1][1])&&(wgeom1->height==wgeom2->height)){ -//                 wgeom_return[0]=(WGeometry *)malloc(sizeof(WGeometry)); -                *ngeoms=1; -                wgeom_return[0]->x=wgeom2->x; -                wgeom_return[0]->y=wgeom2->y; -                wgeom_return[0]->width=wgeom1->width+wgeom1->x-wgeom2->x; -                wgeom_return[0]->height=wgeom2->height; -                return -10; -            } -            else if((enclosed[1][3]&&enclosed[1][2])&&(wgeom1->width==wgeom2->width)){ -//                 wgeom_return[0]=(WGeometry *)malloc(sizeof(WGeometry)); -                *ngeoms=1; -                wgeom_return[0]->x=wgeom2->x; -                wgeom_return[0]->y=wgeom2->y; -                wgeom_return[0]->width=wgeom2->width; -                wgeom_return[0]->height=wgeom1->height+wgeom1->y-wgeom2->y; -                return -10; -            } -            //if control reaches here therewasn't a group and we go on -        } -        if(tot2==2){ -            //break geom2 -//             wgeom_return[0]=(WGeometry *)malloc(sizeof(WGeometry)); -            wgeom_return[0]->x=wgeom2->x; -            wgeom_return[0]->y=wgeom2->y; -            wgeom_return[0]->width=wgeom2->width; -            wgeom_return[0]->height=wgeom2->height; -            *ngeoms=1; -            if(enclosed[1][0]&&enclosed[1][1]){ -                wgeom_return[0]->y=y1[1]; -                wgeom_return[0]->height-=y1[1]-y2[0]; -            } -            else if(enclosed[1][0]&&enclosed[1][2]){ -                wgeom_return[0]->x=x1[1]; -                wgeom_return[0]->width-=x1[1]-x2[0]; -            } -            else if(enclosed[1][3]&&enclosed[1][1]) -                wgeom_return[0]->width-=x2[1]-x1[0]; -            else if(enclosed[1][3]&&enclosed[1][2]) -                wgeom_return[0]->height-=y2[1]-y1[0]; -            return -2; -        } -        else if(tot1==2){ -            //if the first one breaks(which is already inserted) -            //then we reenter the part that was left and the one  -            //that was to be inserted -//             wgeom_return[1]=wgeom2; -            wgeom_return[1]->x=wgeom2->x; -            wgeom_return[1]->y=wgeom2->y; -            wgeom_return[1]->width=wgeom2->width; -            wgeom_return[1]->height=wgeom2->height; -//             wgeom_return[0]=(WGeometry *)malloc(sizeof(WGeometry)); -            wgeom_return[0]->x=wgeom1->x; -            wgeom_return[0]->y=wgeom1->y; -            wgeom_return[0]->width=wgeom1->width; -            wgeom_return[0]->height=wgeom1->height; -            *ngeoms=1; -            if(enclosed[0][0]&&enclosed[0][1]){ -                wgeom_return[0]->y=y2[1]; -                wgeom_return[0]->height-=y2[1]-y1[0]; -            } -            else if(enclosed[0][0]&&enclosed[0][2]){ -                wgeom_return[0]->x=x2[1]; -                wgeom_return[0]->width-=x2[1]-x1[0]; -            } -            else if(enclosed[0][3]&&enclosed[0][1]) -                wgeom_return[0]->width-=x1[1]-x2[0]; -            else if(enclosed[0][3]&&enclosed[0][2]) -                wgeom_return[0]->height-=y1[1]-y2[0]; -            return -1; - -        } -        else if(tot2==1){//in which case there is also tot1==1 but we rather not break that -            //break geom2 in two -//             wgeom_return[0]=(WGeometry *)malloc(sizeof(WGeometry)); -//             wgeom_return[1]=(WGeometry *)malloc(sizeof(WGeometry)); -            *ngeoms=2; -            if(enclosed[1][0]){ -//first -                wgeom_return[0]->x=x1[1]; -                wgeom_return[0]->y=y2[0]; -                wgeom_return[0]->width=wgeom2->width-x1[1]+x2[0]; -                wgeom_return[0]->height=wgeom2->height; -//second -                wgeom_return[1]->x=x2[0]; -                wgeom_return[1]->y=y1[1]; -                wgeom_return[1]->width=x1[1]-x2[0]; -                wgeom_return[1]->height=wgeom2->height-y1[1]+y2[0]; -            } -            else if(enclosed[1][1]){ -//first -                wgeom_return[0]->x=x2[0]; -                wgeom_return[0]->y=y2[0]; -                wgeom_return[0]->width=wgeom2->width-x2[1]+x1[0]; -                wgeom_return[0]->height=wgeom2->height; -//second -                wgeom_return[1]->x=x1[0]; -                wgeom_return[1]->y=y1[1]; -                wgeom_return[1]->width=x2[1]-x1[0]; -                wgeom_return[1]->height=wgeom2->height-y1[1]+y2[0];             -            } -            else if(enclosed[1][2]){ -//first(same as [1][0]) -                wgeom_return[0]->x=x1[1]; -                wgeom_return[0]->y=y2[0]; -                wgeom_return[0]->width=wgeom2->width-x1[1]+x2[0]; -                wgeom_return[0]->height=wgeom2->height; -//second -                wgeom_return[1]->x=x2[0]; -                wgeom_return[1]->y=y2[0]; -                wgeom_return[1]->width=x1[1]-x2[0]; -                wgeom_return[1]->height=wgeom2->height-y2[1]+y1[0]; -            } -            else if(enclosed[1][3]){ -//first(same as [1][1]) -                wgeom_return[0]->x=x2[0]; -                wgeom_return[0]->y=y2[0]; -                wgeom_return[0]->width=wgeom2->width-x2[1]+x1[0]; -                wgeom_return[0]->height=wgeom2->height; -//second -                wgeom_return[1]->x=x1[0]; -                wgeom_return[1]->y=y2[0]; -                wgeom_return[1]->width=x2[1]-x1[0]; -                wgeom_return[1]->height=wgeom2->height-y2[1]+y1[0]; -            } -            return -2; -        } -        else{//polygons collide but no point of one is in the other -            //so we just keep the two parts of geom2 that are outside geom1 - -            //break geom2 in two -            //two cases: -            //geom2 crossing vertically geom1 -            //and geom2 crossing horizontally geom1 -            //The proper one can be found by simply checking x,y positions -//             wgeom_return[0]=(WGeometry *)malloc(sizeof(WGeometry)); -//             wgeom_return[1]=(WGeometry *)malloc(sizeof(WGeometry)); -            *ngeoms=2; -            if(wgeom2->y<wgeom1->y){ -                //common -                wgeom_return[0]->x=wgeom_return[1]->x=x2[0]; -                wgeom_return[0]->width=wgeom_return[1]->width=wgeom2->width; - -                wgeom_return[0]->y=y2[0]; -                wgeom_return[0]->height=wgeom2->height-y2[1]+y1[0]; -                wgeom_return[1]->y=y1[1]; -                wgeom_return[1]->height=y2[1]-y1[1]; -            } -            else{ -                //common -                wgeom_return[0]->y=wgeom_return[1]->y=y2[0]; -                wgeom_return[0]->height=wgeom_return[1]->height=wgeom2->height; - -                wgeom_return[0]->x=x2[0]; -                wgeom_return[0]->width=wgeom2->width-x2[1]+x1[0]; -                wgeom_return[1]->x=x1[1]; -                wgeom_return[1]->width=x2[1]-x1[1]; -            } -            return -2; -        } -    } -} - -int RectInsert(RectArea **root,WGeometry *wgeom){ - -    int total_insertions=0; -    RectArea *temp=NULL,*newnode=(RectArea *)malloc(sizeof(RectArea)); -    //align -    //we do need to know boundaries -    wgeom->width+=(wgeom->width%2)|(wgeom->x%2); -    wgeom->height+=(wgeom->height%2)|(wgeom->y%2); -    wgeom->width+=(wgeom->width%2); -    wgeom->height+=(wgeom->height%2); -    wgeom->x-=wgeom->x%2; -    wgeom->y-=wgeom->y%2; -//     fprintf(stderr," %d %d %d %d\n",wgeom->x, - -    newnode->geom.x=wgeom->x; -    newnode->geom.y=wgeom->y; -    newnode->geom.width=wgeom->width; -    newnode->geom.height=wgeom->height; -    newnode->prev=newnode->next=NULL; -    if(*root==NULL){ -        *root=newnode; -        total_insertions=1; -    } -    else{ -        WGeometry *wgeom_return[2]; -        wgeom_return[0]=(WGeometry *)malloc(sizeof(WGeometry)); -        wgeom_return[1]=(WGeometry *)malloc(sizeof(WGeometry)); - -        int ngeoms=0,insert_ok=1,i=0; -        temp=*root; -        while(insert_ok){//if something is broken list does not procceed(except on -1 collres case) -            int collres/*=0;//*/=CollideRects(&(temp->geom),wgeom,wgeom_return,&ngeoms); -            if((!collres)) -                insert_ok=1; -            else{ -                for(i=0;i<ngeoms;i++){ -                    wgeom_return[i]->width+=(wgeom_return[i]->width%2)|(wgeom_return[i]->x%2); -                    wgeom_return[i]->height+=(wgeom_return[i]->height%2)|(wgeom_return[i]->y%2); -                    wgeom_return[i]->width+=(wgeom_return[i]->width%2); -                    wgeom_return[i]->height+=(wgeom_return[i]->height%2); -                    wgeom_return[i]->x-=wgeom_return[i]->x%2; -                    wgeom_return[i]->y-=wgeom_return[i]->y%2; -                } -                insert_ok=0; -                switch(collres){ -                    case 1://remove current node,reinsert new one -                        total_insertions--; -                        if(temp->prev!=NULL){//no root -                            if(temp->next!=NULL){// -                                RectArea *temp1=temp->next; -                                temp->prev->next=temp->next; -                                temp->next->prev=temp->prev; -                                free(temp); -                                if((wgeom->width>0)&&(wgeom->height>0)) -                                    total_insertions+=RectInsert(&temp1,wgeom); -                            } -                            else{ -                                temp->prev->next=newnode; -                                newnode->prev=temp->prev; -                                total_insertions++; -                                free(temp); -                            } -                        } -                        else{//root -                            if((*root)->next!=NULL){ -                                (*root)=(*root)->next; -                                (*root)->prev=NULL; -                                if((wgeom->width>0)&&(wgeom->height>0)) -                                    total_insertions+=RectInsert(root,wgeom); -                            } -                            else if((wgeom->width>0)&&(wgeom->height>0)){ -                                *root=newnode; -                                total_insertions++; -                            } -                            else{ -                                *root=NULL; -                                total_insertions++; -                            } -                            free(temp); -                         } -                        break; -                    case 2://done,area is already covered -                        free(newnode); -                        break; -                    case -1://current node is broken and reinserted(in same pos) -                            //newnode is also reinserted -                        if((wgeom_return[0]->width>0)&&(wgeom_return[0]->height>0)){ -                            temp->geom.x=wgeom_return[0]->x; -                            temp->geom.y=wgeom_return[0]->y; -                            temp->geom.width=wgeom_return[0]->width; -                            temp->geom.height=wgeom_return[0]->height; -                            if(temp->next==NULL){ -                                temp->next=newnode; -                                newnode->prev=temp; -                                total_insertions++; -                            } -                            else{ -                                insert_ok=1; -                            } -                        } -                        else{//it might happen that the old and now broken node  -                            //is of zero width or height(so it isn't reinserted) -                            /*TODO this may cause lines to be left not updated -                            so maybe it is needed to increase the size by one -                            pixel(zero width or height cause BadValue*/ -                            if((temp->prev==NULL)&&(temp->next!=NULL)){ -                                *root=(*root)->next; -                                (*root)->prev=NULL; -                            } -                            else if((temp->next==NULL)&&(temp->prev!=NULL)){ -                                temp->prev->next=newnode; -                                newnode->prev=temp->prev; -                            } -                            else if((temp->next==NULL)&&(temp->prev==NULL)) -                                (*root)=newnode; -                            else{ -                                total_insertions--; -                                temp->next->prev=temp->prev; -                                temp->prev->next=temp->next; -                                total_insertions+=RectInsert(&temp->next,wgeom); -                            } -                            free(temp); -                        } -                        break; -                    case -2://new is broken and reinserted -                        if(temp->next==NULL){ -                            total_insertions+=ngeoms; -                            newnode->geom.x=wgeom_return[0]->x; -                            newnode->geom.y=wgeom_return[0]->y; -                            newnode->geom.width=wgeom_return[0]->width; -                            newnode->geom.height=wgeom_return[0]->height; -                            temp->next=newnode; -                            newnode->prev=temp; -                            if(ngeoms>1){ -                                RectArea *newnode1=(RectArea *)malloc(sizeof(RectArea)); -                                newnode1->geom.x=wgeom_return[1]->x; -                                newnode1->geom.y=wgeom_return[1]->y; -                                newnode1->geom.width=wgeom_return[1]->width; -                                newnode1->geom.height=wgeom_return[1]->height; -                                newnode->next=newnode1; -                                newnode1->prev=newnode; -                                newnode1->next=NULL; -                            } -                        } -                        else{ -                            for(i=0;i<ngeoms;i++){ -                                if((wgeom_return[i]->width>0)&&(wgeom_return[i]->height>0)) -                                    total_insertions+=RectInsert(&temp->next,wgeom_return[i]); -                            } -                        } -                        break; -                    case -10://grouped -                        if(temp->prev==NULL){ -                            if(temp->next==NULL){//empty list -                                    newnode->geom.x=wgeom_return[0]->x; -                                    newnode->geom.y=wgeom_return[0]->y; -                                    newnode->geom.width=wgeom_return[0]->width; -                                    newnode->geom.height=wgeom_return[0]->height; -                                    *root=newnode; -                                    free(temp); -                            } -                            else{ -                                total_insertions--; -                                *root=temp->next; -                                (*root)->prev=NULL; -                                free(temp); -                                if((wgeom_return[0]->width>0)&&(wgeom_return[0]->height>0)) -                                    total_insertions+=RectInsert(root,wgeom_return[0]); -                            } -                        } -                        else if(temp->next==NULL){//last, enter anyway -                            newnode->geom.x=wgeom_return[0]->x; -                            newnode->geom.y=wgeom_return[0]->y; -                            newnode->geom.width=wgeom_return[0]->width; -                            newnode->geom.height=wgeom_return[0]->height; -                            temp->prev->next=newnode; -                            newnode->prev=temp->prev; -                            free(temp); -                        } -                        else{//remove node and reinsert, starting where we were -                            total_insertions--; -                            RectArea *temp1=temp->next; -                            temp->prev->next=temp->next; -                            temp->next->prev=temp->prev; -                            free(temp); -                            if((wgeom_return[0]->width>0)&&(wgeom_return[0]->height>0)) -                                total_insertions+=RectInsert(&temp1,wgeom_return[0]); -                        } -                        break; -                } -            } -            if(insert_ok){ -                if(temp->next==NULL){ -                    temp->next=newnode; -                    newnode->prev=temp; -                    total_insertions++; -                    break; -                } -                else{ -                    temp=temp->next; -                } -            } -            else{ -                break; -            } -        }; - -        free(wgeom_return[0]); -        free(wgeom_return[1]); -    } -    return total_insertions; -}  -     -void ClearList(RectArea **root){ - -    RectArea *temp; -    temp=*root; -    if(temp!=NULL){ -        while(temp->next!=NULL){ -            temp=temp->next; -            free(temp->prev); -             -        } -        free(temp); -        *root=NULL; -    } -} - diff --git a/rMD-exp/src/register_callbacks.c b/rMD-exp/src/register_callbacks.c deleted file mode 100644 index 08c528f..0000000 --- a/rMD-exp/src/register_callbacks.c +++ /dev/null @@ -1,91 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h>  -void SetExpired(int signum){ -    frames_total++; -    if(capture_busy){ -        frames_lost++; -    } -    pthread_cond_broadcast(time_cond);//sig handlers should not call this func -                                    //could be a set_expired and main thread -                                    //doing a while(running) if set_expired broadcast else usleep(n) -} - -void SetPaused(int signum){ -    if(!Paused) -        Paused=1; -    else{ -//         pthread_cond_broadcast(pause_cond);//thsi should work, but it doesn't -        int i;//this is a bug -        Paused=0;//normally with the broadcast all the threads should restart, but sound capture thread -        for(i=0;i<15;i++)//remains dead. If a bunch of signals, restarts all threads, why can't a broadcast do the same? -            pthread_cond_signal(pause_cond);//if you have any idea please contact me. -                                            //(misses the signal?) -    } -} - - -void SetRunning(int signum){ -    *Running=0; -    if(signum==SIGABRT) -        Aborted=1; -} - -void CancelTimer(void){ -    struct itimerval value; -    value.it_interval.tv_sec= -    value.it_value.tv_sec= -    value.it_interval.tv_usec= -    value.it_value.tv_usec=0; - -    setitimer(ITIMER_REAL,&value,NULL); -} - -void RegisterCallbacks(ProgArgs *args){ - -    struct itimerval value; -    struct sigaction time_act,pause_act,end_act; - - -    value.it_interval.tv_sec=value.it_value.tv_sec=0; -    value.it_interval.tv_usec=value.it_value.tv_usec=(1000000)/args->fps; -    setitimer(ITIMER_REAL,&value,NULL); -    time_act.sa_handler=SetExpired; -    pause_act.sa_handler=SetPaused; -    end_act.sa_handler=SetRunning; -    sigfillset(&(time_act.sa_mask));  -    sigfillset(&(pause_act.sa_mask));  -    sigfillset(&(end_act.sa_mask));  -    time_act.sa_flags=pause_act.sa_flags=end_act.sa_flags=0; -    sigaction(SIGALRM,&time_act,NULL); -    sigaction(SIGUSR1,&pause_act,NULL); -    sigaction(SIGINT,&end_act,NULL); -    sigaction(SIGTERM,&end_act,NULL); -    sigaction(SIGABRT,&end_act,NULL); -} - diff --git a/rMD-exp/src/rmd_cache.c b/rMD-exp/src/rmd_cache.c deleted file mode 100644 index 9cb76d5..0000000 --- a/rMD-exp/src/rmd_cache.c +++ /dev/null @@ -1,102 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - -#include <recordmydesktop.h> - -void InitCacheData(ProgData *pdata,EncData *enc_data_t,CacheData *cache_data_t){ -    int width,height,offset_x,offset_y,pid; -    char pidbuf[8]; - -    //we set the buffer only since there's -    //no need to initialize the encoder from now. -    width=((pdata->brwin.rgeom.width + 15) >>4)<<4; -    height=((pdata->brwin.rgeom.height + 15) >>4)<<4; -    offset_x=((width-pdata->brwin.rgeom.width)/2)&~1; -    offset_y=((height-pdata->brwin.rgeom.height)/2)&~1; - -    (pdata)->enc_data=enc_data_t; - -    enc_data_t->yuv.y=(unsigned char *)malloc(height*width); -    enc_data_t->yuv.u=(unsigned char *)malloc(height*width/4); -    enc_data_t->yuv.v=(unsigned char *)malloc(height*width/4); -    enc_data_t->yuv.y_width=width; -    enc_data_t->yuv.y_height=height; -    enc_data_t->yuv.y_stride=width; - -    enc_data_t->yuv.uv_width=width/2; -    enc_data_t->yuv.uv_height=height/2; -    enc_data_t->yuv.uv_stride=width/2; -    enc_data_t->x_offset=offset_x; -    enc_data_t->y_offset=offset_y; - - -    //now we set the cache files -    (pdata)->cache_data=cache_data_t; - -    cache_data_t->workdir=(pdata->args).workdir; -    pid=getpid(); - -    I16TOA(pid,pidbuf) -    //names are stored relatively to current dir(i.e. no chdir) -    cache_data_t->projname=malloc(strlen(cache_data_t->workdir)+12+strlen(pidbuf)+3); -    //projname -    strcpy(cache_data_t->projname,cache_data_t->workdir); -    strcat(cache_data_t->projname,"/"); -    strcat(cache_data_t->projname,"rMD-session-"); -    strcat(cache_data_t->projname,pidbuf); -    strcat(cache_data_t->projname,"/"); -    //image data -    cache_data_t->imgdata=malloc(strlen(cache_data_t->projname)+11); -    strcpy(cache_data_t->imgdata,cache_data_t->projname); -    strcat(cache_data_t->imgdata,"img.out.gz"); -    //audio data -    cache_data_t->audiodata=malloc(strlen(cache_data_t->projname)+10); -    strcpy(cache_data_t->audiodata,cache_data_t->projname); -    strcat(cache_data_t->audiodata,"audio.pcm"); - -    //now that've got out buffers and our filenames we start -    //creating the needed files - -    if(mkdir(cache_data_t->projname,0777)){ -        fprintf(stderr,"Could not create temporary directory %s !!!\n",cache_data_t->projname); -        exit(13); -    } -    cache_data_t->ifp=gzopen(cache_data_t->imgdata,"wb0f"); -    if(cache_data_t->ifp==NULL){ -        fprintf(stderr,"Could not create temporary file %s !!!\n",cache_data_t->imgdata); -        exit(13); -    } -    if(!pdata->args.nosound){ -        cache_data_t->afp=fopen(cache_data_t->audiodata,"wb"); -        if(cache_data_t->afp==NULL){ -           fprintf(stderr,"Could not create temporary file %s !!!\n",cache_data_t->audiodata); -           exit(13); -        } -    } - -} - - diff --git a/rMD-exp/src/setbrwindow.c b/rMD-exp/src/setbrwindow.c deleted file mode 100644 index 58dc34c..0000000 --- a/rMD-exp/src/setbrwindow.c +++ /dev/null @@ -1,176 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> -void SizePack2_8_16(int *start,int *size,int limit){ -    int octoffset,hexoffset; - -    //align in two -    //an odd x can always go down and still be in recording area. -    //Resolutions come in even numbers -    //so if x is an odd numer, width max is an odd number, too -    //thus since x will go down one then width can go up one too and still -    //be inbounds -    (*size)+=((*size)%2)|((*start)%2); -    //but if x goes down 1 and width is already even,it becomes odd so: -    (*size)+=((*size)%2); -    (*start)-=(*start)%2; - - -    //32 bit pack align -    //we already have disible by two width,so  -    //it's 2, 4 or 6 -    octoffset=((*size)%8); -    if(octoffset==2){ -        (*size)-=2; - -    } -    else if(octoffset==6){ -        if((*size)+(*start)+2<=limit) -            (*size)+=2; -        else if((*start)>=2){ -            (*start)-=2; -            (*size)+=2; -        } -        else{ -            (*start)+=2; -            (*size)-=4; -        } -    } -     -    else if(octoffset==4){ -        if(((*size)+(*start)+2<=limit)&&((*start)>=2)){ -            (*start)-=2; -            (*size)+=4; -        } -        else if((*size)+(*start)+4<=limit){ -            (*size)+=4; -        } -        else if((*start)>=4){ -            (*start)-=4; -            (*size)+=4; -        } -        else{ -            (*start)+=2; -            (*size)-=4; -        } -    } - -    //16 divisble width(needed for shared memory only,but applied anyway since theora wants it, too) -    //we already have divisibility by 8 so module -    //by 16 is euther 8 or 0 -    hexoffset=((*size)%16); -    if(hexoffset){ -        if(((*size)+(*start)+4<=limit)&&((*start)>=4)){ -            (*start)-=4; -            (*size)+=8; -        } -        else if((*size)+(*start)+8<=limit){ -            (*size)+=8; -        } -        else if((*start)>=8){ -            (*start)-=8; -            (*size)+=8; -        } -        else{ -            (*start)+=4; -            (*size)-=8; -        } -    } - -} - - - -int SetBRWindow(Display *dpy,BRWindow *brwin,DisplaySpecs *specs,ProgArgs *args){ -    //before we start recording we have to make sure the ranges are valid -    if(args->windowid==0){//root window -        //first set it up -        brwin->windowid=specs->root; -        brwin->geom.x=brwin->geom.y=0; -        brwin->geom.width=specs->width; -        brwin->geom.height=specs->height; -        brwin->rgeom.x=args->x; -        brwin->rgeom.y=args->y; -        brwin->rgeom.width=((args->width)?args->width:specs->width-brwin->rgeom.x); -        brwin->rgeom.height=((args->height)?args->height:specs->height-brwin->rgeom.y); -        //and then check validity -        if((brwin->rgeom.x+brwin->rgeom.width>specs->width)|| -            (brwin->rgeom.y+brwin->rgeom.height>specs->height)){ -            fprintf(stderr,"Window size specification out of bounds!(current resolution:%dx%d)\n",specs->width,specs->height); -            return 1; -        } -    } -    else{ -        Window wchid; -        int transl_x,transl_y; - -        XWindowAttributes attribs; -        XGetWindowAttributes(dpy,args->windowid,&attribs); -        if((attribs.map_state==IsUnviewable)||(attribs.map_state==IsUnmapped)){ -            fprintf(stderr,"Window must be mapped and visible!\n"); -            return 1; -        } -        XTranslateCoordinates(dpy,specs->root,args->windowid,attribs.x,attribs.y,&transl_x,&transl_y,&wchid); -        brwin->windowid=specs->root; -        brwin->geom.x=attribs.x-transl_x; -        brwin->geom.y=attribs.y-transl_y; -        brwin->geom.width=attribs.width; -        brwin->geom.height=attribs.height; -        if((brwin->geom.x+brwin->geom.width>specs->width)|| -            (brwin->geom.y+brwin->geom.height>specs->height)){ -            fprintf(stderr,"Window must be on visible screen area!\n"); -            return 1; -        } - -        brwin->rgeom.x=brwin->geom.x+args->x; -        brwin->rgeom.y=brwin->geom.y+args->y; -        brwin->rgeom.width=((args->width)?args->width:brwin->geom.width-args->x); -        brwin->rgeom.height=((args->height)?args->height:brwin->geom.height-args->y); -        if((args->x+brwin->rgeom.width>brwin->geom.width)|| -            (args->y+brwin->rgeom.height>brwin->geom.height)){ -            fprintf(stderr,"Specified Area is larger than window!\n"); -            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); -    SizePack2_8_16(&brwin->rgeom.x,&brwin->rgeom.width,specs->width); -    SizePack2_8_16(&brwin->rgeom.y,&brwin->rgeom.height,specs->height); - -    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/rMD-exp/src/update_image.c b/rMD-exp/src/update_image.c deleted file mode 100644 index 2725011..0000000 --- a/rMD-exp/src/update_image.c +++ /dev/null @@ -1,86 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - -void UpdateImage(Display * dpy, -                yuv_buffer *yuv, -                pthread_mutex_t *yuv_mutex, -                DisplaySpecs *specs, -                RectArea **root, -                BRWindow *brwin, -                EncData *enc, -                char *datatemp, -                int noshmem, -                int no_quick_subsample){ -    RectArea *temp; -    unsigned char *dtap=(unsigned char*)datatemp; -    temp=*root; -     -    if(temp!=NULL){ -        do{ -            if(noshmem){ -                GetZPixmap( dpy, -                            specs->root, -                            datatemp, -                            temp->geom.x, -                            temp->geom.y, -                            temp->geom.width, -                            temp->geom.height); -     -                pthread_mutex_lock(yuv_mutex); -                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; -        }while(temp!=NULL); -    } -} - diff --git a/rMD-exp/src/wm_check.c b/rMD-exp/src/wm_check.c deleted file mode 100644 index ee6b0ba..0000000 --- a/rMD-exp/src/wm_check.c +++ /dev/null @@ -1,68 +0,0 @@ -/********************************************************************************* -*                             recordMyDesktop                                    * -********************************************************************************** -*                                                                                * -*             Copyright (C) 2006  John Varouhakis                                * -*                                                                                * -*                                                                                * -*    This program is free software; you can redistribute it and/or modify        * -*    it under the terms of the GNU General Public License as published by        * -*    the Free Software Foundation; either version 2 of the License, or           * -*    (at your option) any later version.                                         * -*                                                                                * -*    This program is distributed in the hope that it will be useful,             * -*    but WITHOUT ANY WARRANTY; without even the implied warranty of              * -*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               * -*    GNU General Public License for more details.                                * -*                                                                                * -*    You should have received a copy of the GNU General Public License           * -*    along with this program; if not, write to the Free Software                 * -*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   * -*                                                                                * -*                                                                                * -*                                                                                * -*    For further information contact me at johnvarouhakis@gmail.com              * -**********************************************************************************/ - - -#include <recordmydesktop.h> - -char *rmdWMCheck(Display *dpy,Window root){ - -    Window  *wm_child; -    Atom    nwm_atom, -            utf8_string, -            wm_name_atom, -            rt; -    unsigned long   nbytes, -                    nitems; - -    char *wm_name_str=NULL; -    int fmt; - -    utf8_string = XInternAtom(dpy, "UTF8_STRING", False); - -    nwm_atom =XInternAtom(dpy,"_NET_SUPPORTING_WM_CHECK",True); -    wm_name_atom =XInternAtom(dpy,"_NET_WM_NAME",True); - -    if(nwm_atom!=None && wm_name_atom!=None){ -        if(!((XGetWindowProperty(  dpy,root,nwm_atom,0,100, -                                False,XA_WINDOW, -                                &rt,&fmt,&nitems, &nbytes, -                                (unsigned char **)((void*)&wm_child)) -                                ==Success ) && -        (XGetWindowProperty( dpy,*wm_child,wm_name_atom,0,100, -                                False,utf8_string,&rt, -                                &fmt,&nitems, &nbytes, -                                (unsigned char **)((void*)&wm_name_str)) -                                ==Success ))){ -            fprintf(stderr,"Warning!!!\nYour window manager appears to be non-compliant!\n"); -        } -    } -    fprintf(stderr,"Your window manager appears to be %s\n\n", -                    ((wm_name_str!=NULL)?wm_name_str:"Uknown")); - - -    return wm_name_str; -} - | 
