Hi all,
finally i am almost succeded in the mp3 decoding with buffering concept except in the decoding of last buffer .for last buffer i am dynamically creating memory and appending MAD_BUFFER_GAURD. what i am getting 2-12 more no. of frames extra compared to the memory mapping approch in the minimad.c why is this so ?? can any one tell where the problem is ??
below i am providing our modified input callback function.
thanks in advance.
prafulla chandra. 

FILE *fptr;
FILE *pfOutput;

int function(int length);



void moving_fb_decodeengine(int move_length,int destination);
static char memory[4096];
static char buffer_frame[4096];
static int instant_memory_size = 4096;
static unsigned long framesdecoded;
static int remainmemory_length;
static unsigned long  offset ;
static int flag ;
static int count;

static
enum mad_flow input(void *data, struct mad_stream *stream)
{
 struct buffer *buffer = data ;
 int ltb_shifted,i;
 unsigned char temp;
 unsigned char *finalbuffer;
 int end;
 int destination;
  if(!buffer->length)
 {
  printf("total number of frames decoded %ld are ",framesdecoded);
  return MAD_FLOW_STOP;
 }

    if(flag==0)
 {
  end=function(instant_memory_size);
  if(!end)
  {
   destination=1;
  }
  else
   destination=0;
   moving_fb_decodeengine(instant_memory_size,destination);
 }
 else
 {
  ltb_shifted =stream->next_frame-buffer->start;
  remainmemory_length=instant_memory_size-ltb_shifted;
  for(i=0;i<instant_memory_size;i++)
  {
    if(i==remainmemory_length)
   {
    end = function(ltb_shifted);
    if(!end)
    {
     destination=1;
    }
    else
     destination=0;
    moving_fb_decodeengine(ltb_shifted,destination);
    break ;
   }
   temp=memory[i+ltb_shifted];
   memory[i]=temp;
  }
 }

 if(!end)
 {
  finalbuffer=malloc(count+MAD_BUFFER_GUARD);
  if(finalbuffer==0)
  {
   return MAD_FLOW_BREAK;
  }
  memcpy(finalbuffer,memory,count);
  memset(finalbuffer+count,0,MAD_BUFFER_GUARD);
  buffer->start=finalbuffer;
  buffer->length=count+MAD_BUFFER_GUARD;
  mad_stream_buffer(stream, buffer->start, buffer->length);
  
 }
 else
 {
  buffer->length=instant_memory_size;
  mad_stream_buffer(stream, buffer->start, buffer->length);
 }
 if(!end)
 {
  buffer->length=0;
   }
 flag =1;
return MAD_FLOW_CONTINUE;
}

void moving_fb_decodeengine( int move_length,int destination)
{
  unsigned char temp;
  int j,l;
  if(flag!=0)
  {
   for(j =0;j<4096;j++)
   {
    temp=buffer_frame[j];
    memory[remainmemory_length+j]=temp;
    if(destination)
    {
     if(j==count)
      count=remainmemory_length+j;
    }
   }
  }
  else
  {
   for(l=0;l<instant_memory_size;l++)
   {
    temp=buffer_frame[l];
    memory[l]=temp; 
    if(destination)
    {
     if(l==count)
      count=l;
    }
   }
  }  
}


int function(int movement_length)
{
  unsigned int  controlvar_length_funct=0,i;
  int cVar1_funct,count1=0;
  fptr = fopen("BawreNain_1950-Rajkumari-MereRutheHuyeChanda-KidarSharma_Roshan.mp3","rb");
  fseek(fptr,offset,SEEK_SET);
  for(i=0;i<movement_length;i++)
  {
   cVar1_funct=fgetc(fptr);
   if(cVar1_funct==EOF)
   {
    count=count1;
    fclose(fptr);
    return(0);
   }
   else
   {
    count1++;
    buffer_frame[i]=cVar1_funct;
    offset++;
   }
  }
  fclose(fptr);
  return(1); 
}