shithub: aacenc

ref: 6553e2398a38fd92ce152dc90d947c925b8075c2
dir: /frontend/main.c/

View raw version
/*
 * FAAC - Freeware Advanced Audio Coder
 * Copyright (C) 2001 Menno Bakker
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * $Id: main.c,v 1.19 2001/05/31 18:03:21 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__
		if (getrusage(RUSAGE_SELF, &usage) == 0) {
			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;
}