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.cwhy 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);
}