1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
/* (C) 1998 Justin Schoeman */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#ifdef NTSC
#define SPF (double)((double)44100/(double)60) /* NTSC */
#else
#define SPF (double)((double)44100/(double)50) /* PAL */
#endif
int main(int argc, char** argv)
{
int in, out;
char fname[255];
unsigned char audiobuf[65536];
char *a_name, *v_name;
int rd, padding, cnt;
unsigned int vidfirst, vidlast, audiofirst=0xffffffffUL, audiolast, audiobytes=0;
double fpsi, fpso, fin,fout;
if((argc<2)|(argc>3))
{
fprintf(stderr, "Usage:\n\n");
fprintf(stderr, " audioconv <audio stream> <first video stream file>\n\n");
exit(0);
}
v_name=argv[2];
a_name=argv[1];
fprintf(stderr, "Scanning video file:\n");
in=open(v_name, O_RDONLY);
read(in, &rd, sizeof(rd)); /*width*/
read(in, &rd, sizeof(rd)); /*height*/
read(in, &vidlast, sizeof(vidlast));
read(in, &vidfirst, sizeof(vidfirst));
close(in);
fprintf(stderr, "First videoframe: %u Last videoframe: %u\n", vidfirst, vidlast);
in=open(a_name,O_RDONLY);
sprintf(fname,"%s.out", a_name);
out=open(fname, O_RDWR|O_TRUNC|O_CREAT, S_IRUSR|S_IWUSR);
fprintf(stderr, "Scanning audio file:\n");
while(read(in, &rd, sizeof(rd))==sizeof(rd))
{
audiobytes+=rd;
read(in, &audiolast, sizeof(audiolast));
fprintf(stderr, ".");
if (audiofirst==0xffffffffUL)audiofirst=audiolast;
if (audiolast<vidfirst)
{
audiofirst=0xffffffffUL;
audiobytes=0;
}
read(in, &audiobuf, rd);
}
fpsi=(double)(audiolast-audiofirst)/(double)(audiobytes>>1);
fpso=1/SPF;
if(audiolast>vidlast)audiolast=vidlast;
fprintf(stderr, "\nFirst audioframe: %u Last audioframe: %u Audio bytes: %d\n", audiofirst, audiolast, audiobytes);
padding=(int)((audiofirst-vidfirst)*SPF);
fprintf(stderr, "Padding required: %d frames = %d samples\n", audiofirst-vidfirst, padding);
fprintf(stderr, "Writing padding:\n");
rd=0;
for(cnt=0; cnt<padding; cnt++)write(out, &rd, 2);
padding=(int)((vidlast-audiolast)*SPF);
fprintf(stderr, "Converting data:\n");
lseek(in, 0, SEEK_SET);
fin=0;
fout=0;
while(read(in, &rd, sizeof(rd))==sizeof(rd))
{
read(in, &vidlast, sizeof(vidlast));
read(in, &audiobuf, rd);
fprintf(stderr, ".");
if (vidlast>=audiofirst) /* found start of data */
{
for(cnt=0; cnt<(rd>>1); cnt++)
{
write(out, &audiobuf[cnt*2], 2);
fout=fout+fpso;
fin=fin+fpsi;
if(fin>fout)
{
while(fin>(fout+fpso))
{
write(out, &audiobuf[cnt*2], 2);
fout=fout+fpso;
}
} else if(fin<fout)
{
while((fin+fpsi)<fout)
{
cnt++;
fin=fin+fpsi;
}
}
}
}
}
rd=0;
for(cnt=0; cnt<padding; cnt++)write(out, &rd, 2);
fprintf(stderr, "\nDone.\n");
close(in);
close(out);
return 0;
}
|