**************
CIRCULAR_BUFFER
**************
#include
#include
#include
/* Buffer Size */
#define VIDEO_BUFFER_SIZE 10
#define AUDIO_BUFFER_SIZE 5
#define video_stream_id 1
#define audio_stream_id 2
FILE *fpv=NULL,*fpa=NULL;
#pragma pack(1)
typedef struct
{
unsigned int *video[VIDEO_BUFFER_SIZE]; /**< Element of ciruclar buffer */ unsigned int *audio[AUDIO_BUFFER_SIZE]; /**< Element of ciruclar buffer */ unsigned int vwritePointer; /**< write pointer */ unsigned int vreadPointer; /**< read pointer */ unsigned int *vsize; /** size of circular buffer */ unsigned int awritePointer; /** write pointer */ unsigned int areadPointer; /** read pointer */ unsigned int *asize; /** size of circular buffer */ } CircularBuffer; static int total_vsize = 0; /** Init Ciruclar Buffer **/ CircularBuffer* CircularBufferInit(CircularBuffer** pQue) { unsigned int sz = sizeof(CircularBuffer); *pQue = (CircularBuffer*) malloc(sz); //unsigned int *(*(*pQue)->keys)) = (unsigned int **)calloc(size,sizeof(unsigned int *));
if(*pQue)
{
printf("\n Init CircularBuffer: CB SIZE = %d \n",sizeof(CircularBuffer));
(*pQue)->vsize = (unsigned int *)calloc(VIDEO_BUFFER_SIZE,sizeof(unsigned int));//VIDEO_BUFFER_SIZE;
(*pQue)->vwritePointer = 0;
(*pQue)->vreadPointer = 0;
(*pQue)->asize = (unsigned int *)calloc(AUDIO_BUFFER_SIZE,sizeof(unsigned int));//AUDIO_BUFFER_SIZE;
(*pQue)->awritePointer = 0;
(*pQue)->areadPointer = 0;
}
return *pQue;
}
inline int CircularBufferIsFull(CircularBuffer* que,unsigned int stream_id)
{
int isFULL;
if(video_stream_id == stream_id)
{
isFULL = ((que->vwritePointer + 1) % VIDEO_BUFFER_SIZE == que->vreadPointer);
}
else if(audio_stream_id == stream_id)
{
isFULL = ((que->awritePointer + 1) % AUDIO_BUFFER_SIZE == que->areadPointer);
}
//else{}
return isFULL;
}
inline int CircularBufferIsEmpty(CircularBuffer* que,unsigned int stream_id)
{
int isEMPTY;
if(video_stream_id == stream_id)
{
isEMPTY = ((que->vreadPointer + 1) % VIDEO_BUFFER_SIZE == que->vwritePointer);
}
else if(audio_stream_id == stream_id)
{
isEMPTY = ((que->areadPointer + 1) % AUDIO_BUFFER_SIZE == que->awritePointer);
}
// else{}
return isEMPTY;
}
inline int CircularBufferWrite(CircularBuffer* que, void* k,unsigned int stream_id,unsigned int size)
{
int isFull = 0;
//printf("\n DATA = %d\n",(unsigned int)k);
isFull = CircularBufferIsFull(que,stream_id);
if(video_stream_id == stream_id)
{
que->video[que->vwritePointer] = (unsigned int *)calloc(size,sizeof(char));
que->vsize[que->vwritePointer] = size;
//*que->video[que->vwritePointer] = k;
//printf("\n ##### TOTAL SIZE = %d\n",que->vsize[que->vwritePointer]);
memcpy(que->video[que->vwritePointer],k,size);
que->vwritePointer++;
que->vwritePointer %= VIDEO_BUFFER_SIZE;
}
else if(audio_stream_id == stream_id)
{
que->audio[que->awritePointer] = (unsigned int *)calloc(size,sizeof(char));
que->asize[que->awritePointer] = size;
//*que->audio[que->awritePointer] = k;
memcpy(que->audio[que->awritePointer],k,size);
que->awritePointer++;
que->awritePointer %= AUDIO_BUFFER_SIZE;
}
//else{}
//que->vwritePointer++;
//que->vwritePointer %= que->size;
return isFull;
}
inline int CircularBufferRead(CircularBuffer* que, void* pK,unsigned int stream_id,unsigned int size)
{
int isEmpty = 0;
isEmpty = CircularBufferIsEmpty(que,stream_id);
//printf("\n ## DATA = %d\n",(unsigned int)*que->video[que->readPointer]);
//*pK = (unsigned int)*que->video[que->readPointer];
if(video_stream_id == stream_id)
{
memcpy(pK,que->video[que->vreadPointer],size);
que->vreadPointer++;
que->vreadPointer %= VIDEO_BUFFER_SIZE;
}
else if(audio_stream_id == stream_id)
{
memcpy(pK,que->audio[que->areadPointer],size);
que->areadPointer++;
que->areadPointer %= AUDIO_BUFFER_SIZE;
}
//else{}
return(isEmpty);
}
int main(int argc, char *argv[])
{
CircularBuffer* que;
unsigned int a = 0,b = 0,*p=NULL,j=188,k=0,*pk;
int isEmpty,isFull;
unsigned int *readb,bytes;
p = (unsigned int *)calloc(j,sizeof(char));
// pk = (unsigned int *)calloc(j,sizeof(char));
readb = (unsigned int *)calloc(j,sizeof(char));
fpv = fopen("/home/suroy7/video_es.txt","a+");
fpa = fopen("/home/suroy7/audio_es.txt","a+");
if ( NULL == fpv || NULL == fpa)
{
printf("\n File doesn't exist \n");
}
CircularBufferInit(&que);
do{
a += 1;
isFull = CircularBufferWrite(que,(void *)&a,1,j);
}while(!isFull);
if(isFull)
{
for(k=0;k < VIDEO_BUFFER_SIZE ; k++ ) { //memcpy(pk,que->video[k],j);
//printf("\n $$$ DATA = %#x %02d",*que->video[k],*pk);
fwrite(que->video[k],1,que->vsize[k],fpv);
}
}
//fseek(fpv, 0, SEEK_SET);
rewind(fpv);
printf("\n ## VIDEO FILE DATA = ");
do{
bytes = fread(readb,1,j,fpv);
printf(" %02d ",*readb);
}while( bytes > 0 );
#if 1
isFull = 0;
do{
b += 1;
isFull = CircularBufferWrite(que,(void *)&b,2,j);
}while(!isFull);
if(isFull)
{
for(k=0;k < AUDIO_BUFFER_SIZE ; k++ ) { //memcpy(pk,que->video[k],j);
//printf("\n $$$ DATA = %#x %02d",*que->video[k],*pk);
fwrite(que->audio[k],1,que->asize[k],fpa);
}
}
//fseek(fpv, 0, SEEK_SET);
rewind(fpa);
printf("\n ## AUDIO FILE DATA = ");
do{
bytes = fread(readb,1,j,fpa);
printf(" %02d ",*readb);
}while( bytes > 0 );
printf("\n");
printf("\n CircularBuffer AUDIO DATA = ");
do {
isEmpty = CircularBufferRead(que, p,2,j);
printf(" %02d ", *p);
} while (!isEmpty);
//printf("\n");
#endif
printf("\n CircularBuffer VIDEO DATA = ");
do {
isEmpty = CircularBufferRead(que, p,1,j);
printf(" %02d ", *p);
} while (!isEmpty);
printf("\n\n");
fclose(fpv);
fclose(fpa);
//free(pk);
free(readb) ;
free(p);
free(que);
return 0;
}