ref: 60fa9e81165a47bf492e0835459e2dedf72df660
dir: /frontend/main.c/
/* * FAAC - Freeware Advanced Audio Coder * Copyright (C) 2001 Menno Bakker * * 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 * * $Id: main.c,v 1.16 2001/05/08 13:19:08 menno Exp $ */ #ifdef _WIN32 #include <windows.h> #endif #ifdef __unix__ #define min(a,b) ( (a) < (b) ? (a) : (b) ) #include <sys/time.h> #include <sys/resource.h> #include <unistd.h> #endif #include <stdio.h> #include <stdlib.h> #include <sndfile.h> #include "faac.h" int main(int argc, char *argv[]) { int i, frames, currentFrame; faacEncHandle hEncoder; SNDFILE *infile; SF_INFO sfinfo; unsigned int sr, chan; unsigned long samplesInput, maxBytesOutput; short *pcmbuf; unsigned char *bitbuf; int bytesInput = 0; FILE *outfile; #ifdef __unix__ struct rusage *usage; #endif #ifdef _WIN32 long begin, end; int nTotSecs, nSecs; int nMins; #else float totalSecs; int mins; #endif printf("FAAC - command line demo of %s\n", __DATE__); printf("Uses FAACLIB version: %.1f %s\n\n", FAACENC_VERSION, (FAACENC_VERSIONB)?"beta":""); if (argc < 3) { printf("USAGE: %s -options infile outfile\n", argv[0]); printf("Options:\n"); printf(" -mX AAC MPEG version, X can be 2 or 4.\n"); printf(" -pX AAC object type, X can be LC, MAIN or LTP.\n"); printf(" -nm Don\'t use mid/side coding.\n"); printf(" -tns Use TNS coding.\n"); printf(" -bwX Set the bandwidth, X in Hz.\n"); printf(" -brX Set the bitrate per channel, X in bps.\n\n"); return 1; } /* open the audio input file */ infile = sf_open_read(argv[argc-2], &sfinfo); if (infile == NULL) { printf("couldn't open input file %s\n", argv [argc-2]); return 1; } /* open the aac output file */ outfile = fopen(argv[argc-1], "wb"); if (!outfile) { printf("couldn't create output file %s\n", argv [argc-1]); return 1; } /* determine input file parameters */ sr = sfinfo.samplerate; chan = sfinfo.channels; /* open the encoder library */ hEncoder = faacEncOpen(sr, chan, &samplesInput, &maxBytesOutput); pcmbuf = (short*)malloc(samplesInput*sizeof(short)); bitbuf = (unsigned char*)malloc(maxBytesOutput*sizeof(unsigned char)); /* set other options */ if (argc > 3) { faacEncConfigurationPtr myFormat; myFormat = faacEncGetCurrentConfiguration(hEncoder); for (i = 1; i < argc-2; i++) { if ((argv[i][0] == '-') || (argv[i][0] == '/')) { switch(argv[i][1]) { case 'p': case 'P': if ((argv[i][2] == 'l') || (argv[i][2] == 'L')) { if ((argv[i][3] == 'c') || (argv[i][2] == 'C')) { myFormat->aacObjectType = LOW; } else if ((argv[i][3] == 't') || (argv[i][2] == 'T')) { myFormat->aacObjectType = LTP; } } else if ((argv[i][2] == 'm') || (argv[i][2] == 'M')) { myFormat->aacObjectType = MAIN; } break; case 'm': case 'M': if (argv[i][2] == '4') { myFormat->mpegVersion = MPEG4; } else { myFormat->mpegVersion = MPEG2; } break; case 't': case 'T': if ((argv[i][2] == 'n') || (argv[i][2] == 'N')) myFormat->useTns = 1; break; case 'n': case 'N': if ((argv[i][2] == 'm') || (argv[i][2] == 'M')) myFormat->allowMidside = 0; break; case 'b': case 'B': if ((argv[i][2] == 'r') || (argv[i][2] == 'R')) { unsigned int bitrate = atol(&argv[i][3]); if (bitrate) { myFormat->bitRate = bitrate; } } else if ((argv[i][2] == 'w') || (argv[i][2] == 'W')) { unsigned int bandwidth = atol(&argv[i][3]); if (bandwidth) { myFormat->bandWidth = bandwidth; } } break; } } } if (!faacEncSetConfiguration(hEncoder, myFormat)) fprintf(stderr, "unsupported output format!\n"); } if (outfile) { #ifdef _WIN32 begin = GetTickCount(); #endif frames = (int)(sfinfo.samples/1024+0.5); currentFrame = 0; /* encoding loop */ for ( ;; ) { int bytesWritten; currentFrame++; bytesInput = sf_read_short(infile, pcmbuf, samplesInput) * sizeof(short); /* call the actual encoding routine */ bytesWritten = faacEncEncode(hEncoder, pcmbuf, bytesInput/2, bitbuf, maxBytesOutput); #ifndef _DEBUG printf("%.2f%%\tBusy encoding %s.\r", min((double)(currentFrame*100)/frames,100), argv[argc-2]); #endif /* all done, bail out */ if (!bytesInput && !bytesWritten) break ; if (bytesWritten < 0) { fprintf(stderr, "faacEncEncode() failed\n"); break ; } /* write bitstream to aac file */ fwrite(bitbuf, 1, bytesWritten, outfile); } /* clean up */ fclose(outfile); #ifdef _WIN32 end = GetTickCount(); nTotSecs = (end-begin)/1000; nMins = nTotSecs / 60; nSecs = nTotSecs - (60*nMins); printf("Encoding %s took:\t%d:%.2d\t\n", argv[argc-2], nMins, nSecs); #else #ifdef __unix__ getrusage(RUSAGE_SELF,usage); if (usage) { totalSecs=usage->ru_utime.tv_sec; mins = totalSecs/60; printf("Encoding %s took: %i min, %.2f sec. of cpu-time\n", argv[argc-2], mins, totalSecs - (60 * mins)); } #else totalSecs = (float)(clock())/(float)CLOCKS_PER_SEC; mins = totalSecs/60; printf("Encoding %s took: %i min, %.2f sec.\n", argv[argc-2], mins, totalSecs - (60 * mins)); #endif #endif } faacEncClose(hEncoder); sf_close(infile); if (pcmbuf) free(pcmbuf); if (bitbuf) free(bitbuf); return 0; }