1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*******************************************************************************
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	File:		AAC_E_SAMPLES.h
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Content:	sample code for AAC encoder
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*******************************************************************************/
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include		<dlfcn.h>
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include		<stdio.h>
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include		<stdlib.h>
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include		<string.h>
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include		<time.h>
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include		"voAAC.h"
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include		"cmnMemory.h"
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define  VO_AAC_E_OUTPUT	  1
32b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard#define READ_SIZE	(1024*8)
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardunsigned char outBuf[1024*8];
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardunsigned char inBuf[READ_SIZE];
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
36b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgardconst char* HelpString =
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard"VisualOn AAC encoder Usage:\n"
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard"voAACEncTest -if <inputfile.pcm> -of <outputfile.aac> -sr <samplerate> -ch <channel> -br <bitrate> -adts <adts> \n"
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard"-if input file name \n"
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard"-of output file name \n"
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard"-sr input pcm samplerate, default 44100 \n"
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard"-ch input pcm channel, default 2 channel \n"
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard"-br encoded aac bitrate, default 64000 * (samplerate/100)*channel/441(480)\n"
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard"-adts add or no adts header, default add adts header\n"
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard"For example: \n"
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard"./voAACEncTest -if raw.pcm -of raw.aac -sr 44100 -ch 2 -br 128000\n";
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic int parsecmdline(int argc, char **argv,char  **input_filename, char  **output_filename, AACENC_PARAM *param)
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	// notice that:
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	// bitRate/nChannels > 8000
52b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	// bitRate/nChannels < 160000
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	// bitRate/nChannels < sampleRate*6
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	param->adtsUsed = 1;
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	param->bitRate = 0;
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	param->nChannels = 2;
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	param->sampleRate = 44100;
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(argc < 5 || argc > 13)
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return -1;
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	argc--;
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	argv++;
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	while (argc > 0)
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (!strcmp(*argv, "-if"))
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			argv++;
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			argc--;
72b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			*input_filename = *argv;
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		else if (!strcmp(*argv, "-of"))
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			argv++;
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			argc--;
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*output_filename = *argv;
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		else if (!strcmp(*argv, "-sr"))
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			argv++;
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			argc--;
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			param->sampleRate = atoi(*argv);
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		else if (!strcmp(*argv, "-ch"))
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			argv++;
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			argc--;
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			param->nChannels = atoi(*argv);
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		else if (!strcmp(*argv, "-br"))
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			argv++;
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			argc--;
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			param->bitRate = atoi(*argv);
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		else if(!strcmp(*argv, "-adts"))
99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			argv++;
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			argc--;
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			param->adtsUsed = atoi(*argv);
103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		else
105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return -1;
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		argv++;
110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		argc--;
111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(param->bitRate == 0)
114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		int scale = 441;
116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(param->sampleRate%8000 == 0)
117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			scale = 480;
118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		param->bitRate = 640*param->nChannels*param->sampleRate/scale;
119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return 0;
122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardint ReadFile2Buf(FILE* infile,unsigned char* dest,int readSize)
125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int readBytes = 0;
127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	readBytes = fread(dest, 1, readSize, infile);
128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return readBytes;
129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardtypedef int (VO_API * VOGETAUDIODECAPI) (VO_AUDIO_CODECAPI * pDecHandle);
132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardint main(int argc, char **argv)
134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	FILE						*infile, *outfile;
136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int							t1, t2;
137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_AUDIO_CODECAPI			AudioAPI;
138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_MEM_OPERATOR				moper;
139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_CODEC_INIT_USERDATA		useData;
140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_HANDLE					hCodec;
141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_CODECBUFFER				inData;
142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_CODECBUFFER				outData;
143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_AUDIO_OUTPUTINFO			outInfo;
144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    int							firstWrite = 1;
145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int							eofFile = 0;
146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int							*info=(int*)inBuf;
147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int							bytesLeft, nRead;
148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int							EncoderdFrame = 0;
149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int							total = 0;
150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int							isOutput = 1;
151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int							returnCode;
152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	AACENC_PARAM				aacpara;
153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	void						*handle;
154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	void						*pfunc;
155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VOGETAUDIODECAPI			pGetAPI;
156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	const char					*infileName = NULL;
157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    const char					*outfileName = NULL;
158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	returnCode = parsecmdline(argc,argv, &infileName, &outfileName, &aacpara);
160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(returnCode)
161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		printf("%s", HelpString);
163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return 0;
164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* open input file */
167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	infile = fopen(infileName, "rb");
168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (!infile) {
169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		printf("Open input file fail...");
170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return -1;
171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* open output file */
174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(isOutput)
175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		outfile = fopen(outfileName, "wb");
177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (!outfile) {
178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			printf("Open output file fail...");
179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return -1;
180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	// set memory operators;
183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	moper.Alloc = cmnMemAlloc;
184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	moper.Copy = cmnMemCopy;
185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	moper.Free = cmnMemFree;
186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	moper.Set = cmnMemSet;
187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	moper.Check = cmnMemCheck;
188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	useData.memflag = VO_IMF_USERMEMOPERATOR;
189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	useData.memData = (VO_PTR)(&moper);
190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	// open encoder dll;
191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	handle = dlopen("libstagefright.so", RTLD_NOW);
192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(handle == 0)
193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		printf("open dll error......");
195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return -1;
196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	// Get API;
198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pfunc = dlsym(handle, "voGetAACEncAPI");
199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(pfunc == 0)
200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		printf("open function error......");
202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return -1;
203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pGetAPI = (VOGETAUDIODECAPI)pfunc;
205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	returnCode  = pGetAPI(&AudioAPI);
206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(returnCode)
207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return -1;
208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//#######################################   Init Encoding Section   #########################################
211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	returnCode = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAAC, &useData);
212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(returnCode < 0)
213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		printf("#### VOI_Error2:fail to initialize the Encoderr###\n");
215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return -1;
216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara);
219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	inData.Buffer = inBuf;
221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	bytesLeft = ReadFile2Buf(infile,inData.Buffer,READ_SIZE);
222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//#######################################    Encoding Section   #########################################
224e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	do {
226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		inData.Length    = bytesLeft;
228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		outData.Buffer   = outBuf;
229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		outData.Length = 1024*8;
230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t1 = clock();
232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		returnCode = AudioAPI.SetInputData(hCodec,&inData);
234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		do {
236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			outData.Buffer   = outBuf;
237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			outData.Length = 1024*8;
238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outInfo);
240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if(returnCode == 0)
242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				EncoderdFrame++;
243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if(returnCode == VO_ERR_LICENSE_ERROR)
244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				break;
245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if VO_AAC_E_OUTPUT
247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (isOutput && returnCode == 0)
248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				fwrite(outData.Buffer, 1, outData.Length, outfile);
250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} while(returnCode != (VO_ERR_INPUT_BUFFER_SMALL));
253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(returnCode == VO_ERR_LICENSE_ERROR)
255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			break;
256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t2 = clock();
258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		total += t2 - t1;
259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (!eofFile) {
261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			nRead = ReadFile2Buf(infile, inBuf,READ_SIZE);
262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			bytesLeft = nRead;
263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			inData.Buffer = inBuf;
264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (feof(infile))
265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				eofFile = 1;
266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} while (!eofFile && returnCode);
269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
271e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//################################################  End Encoding Section  #######################################################
272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	returnCode = AudioAPI.Uninit(hCodec);
273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
274e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	fclose(infile);
275e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (outfile)
276e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        fclose(outfile);
278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	dlclose(handle);
280e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return 0;
281e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
284