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
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef LINUX
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <dlfcn.h>
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include      <stdio.h>
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include      <stdlib.h>
243c6813df08299433a32e56e90e2820b25346d07aAshok Bhat#include      <string.h>
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include      <time.h>
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include      "voAMRWB.h"
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include      "cmnMemory.h"
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define VOAMRWB_RFC3267_HEADER_INFO "#!AMR-WB\n"
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define  INPUT_SIZE   640
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define  OUTPUT_SIZE  1024
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardunsigned char  InputBuf[INPUT_SIZE];
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardunsigned char  OutputBuf[OUTPUT_SIZE];
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid usage (void) {
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("AMR_WB Encoder HELP   Displays this text\n");
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("\n");
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("Usage:\n");
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("AMRWBEnc [options] Input_file output_file \n");
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("\n");
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("Options +M* +F* +DTX \n");
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("Support \n");
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("Options +M* for seting compression bitrate mode, default is 23.85kbps\n");
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf (" +M0 = 6.6kbps \n");
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf (" +M1 = 8.85kbps \n");
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf (" +M2 = 12.65kbps \n");
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf (" +M3 = 14.25kbps \n");
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf (" +M4 = 15.58kbps \n");
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf (" +M5 = 18.25kbps \n");
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf (" +M6 = 19.85kbps \n");
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf (" +M7 = 23.05kbps \n");
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf (" +M8 = 23.85kbps \n");
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("\n");
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("Options +F* for setting output frame Type, default is RFC3267 \n");
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("+F0 for AMR_WB Defualt bit extern short data frame type \n");
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("+F1 for AMR_WB_ITU bit extern short data frame type \n");
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("+F2 for RFC3267\n ");
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("\n");
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("Options +DTX enable DTX mode, default is disable.\n");
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("File names, input raw PCM data, and output is AMR_WB bit-stream file.\n");
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf ("\n");
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardint  GetNextBuf(FILE* inFile,unsigned char* dst,int size)
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int size2 = (int)fread(dst, sizeof(signed char), size,inFile);
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return size2;
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardtypedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle);
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardint encode(
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		   int mode,
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		   short   allow_dtx,
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		   VOAMRWBFRAMETYPE frameType,
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		   const char* srcfile,
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		   const char* dstfile
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		   )
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int			ret = 0;
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int         returnCode;
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	FILE		*fsrc = NULL;
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	FILE		*fdst = NULL;
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int         framenum = 0;
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int         eofFile = 0;
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int         size1 = 0;
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int         Relens;
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_AUDIO_CODECAPI       AudioAPI;
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_MEM_OPERATOR         moper;
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_CODEC_INIT_USERDATA  useData;
9387eef41a5b81391b10a0f4ad874f6f04e261ed84Ting-Yuan Huang	VO_HANDLE               hCodec = NULL;
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_CODECBUFFER          inData;
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_CODECBUFFER          outData;
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_AUDIO_OUTPUTINFO     outFormat;
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	unsigned char *inBuf = InputBuf;
99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	unsigned char *outBuf = OutputBuf;
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef LINUX
103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	void  *handle = NULL;
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	void  *pfunc;
105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VOGETAUDIOENCAPI pGetAPI;
106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	clock_t   start, finish;
109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	double    duration = 0.0;
110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if ((fsrc = fopen (srcfile, "rb")) == NULL)
112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ret = -1;
114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		goto safe_exit;
115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if ((fdst = fopen (dstfile, "wb")) == NULL)
118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ret = -1;
120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		goto safe_exit;
121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	moper.Alloc = cmnMemAlloc;
124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	moper.Copy = cmnMemCopy;
125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	moper.Free = cmnMemFree;
126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	moper.Set = cmnMemSet;
127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	moper.Check = cmnMemCheck;
128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	useData.memflag = VO_IMF_USERMEMOPERATOR;
130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	useData.memData = (VO_PTR)(&moper);
131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef LINUX
133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	handle = dlopen("libstagefright.so", RTLD_NOW);
134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(handle == 0)
135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		printf("open dll error......");
137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return -1;
138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pfunc = dlsym(handle, "voGetAMRWBEncAPI");
141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(pfunc == 0)
142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		printf("open function error......");
144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return -1;
145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pGetAPI = (VOGETAUDIOENCAPI)pfunc;
148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	returnCode  = pGetAPI(&AudioAPI);
150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(returnCode)
151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		printf("get APIs error......");
153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return -1;
154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	ret = voGetAMRWBEncAPI(&AudioAPI);
157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(ret)
158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ret = -1;
160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		printf("get APIs error......");
161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		goto safe_exit;
162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	//#######################################   Init Encoding Section   #########################################
166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData);
167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(ret)
169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ret = -1;
171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		printf("APIs init error......");
172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		goto safe_exit;
173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Relens = GetNextBuf(fsrc,InputBuf,INPUT_SIZE);
176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(Relens!=INPUT_SIZE && !feof(fsrc))
177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ret = -1; //Invalid magic number
179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		printf("get next buffer error......");
180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		goto safe_exit;
181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	//###################################### set encode Mode ##################################################
184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_FRAMETYPE, &frameType);
185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_MODE, &mode);
186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_DTX, &allow_dtx);
187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(frameType == VOAMRWB_RFC3267)
189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* write RFC3267 Header info to indicate single channel AMR file storage format */
191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		size1 = (int)strlen(VOAMRWB_RFC3267_HEADER_INFO);
192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		memcpy(outBuf, VOAMRWB_RFC3267_HEADER_INFO, size1);
193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		outBuf += size1;
194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	//#######################################   Encoding Section   #########################################
197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf(" \n ---------------- Running -------------------------\n ");
198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	do{
200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		inData.Buffer = (unsigned char *)inBuf;
201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		inData.Length = Relens;
202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		outData.Buffer = outBuf;
203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		start = clock();
205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* decode one amr block */
207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		returnCode = AudioAPI.SetInputData(hCodec,&inData);
208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		do {
210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outFormat);
211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if(returnCode == 0)
212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				framenum++;
21487eef41a5b81391b10a0f4ad874f6f04e261ed84Ting-Yuan Huang				printf(" Frames processed: %d\r", framenum);
215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if(framenum == 1)
216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					fwrite(OutputBuf, 1, outData.Length + size1, fdst);
218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					fflush(fdst);
219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				else
221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					fwrite(outData.Buffer, 1, outData.Length, fdst);
223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					fflush(fdst);
224e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
2263c6813df08299433a32e56e90e2820b25346d07aAshok Bhat			else if((unsigned)returnCode == VO_ERR_LICENSE_ERROR)
227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		        printf("Encoder time reach upper limit......");
229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		        goto safe_exit;
230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
2313c6813df08299433a32e56e90e2820b25346d07aAshok Bhat		} while((unsigned)returnCode != VO_ERR_INPUT_BUFFER_SMALL);
232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		finish = clock();
234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		duration += finish - start;
235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (!eofFile) {
237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Relens = GetNextBuf(fsrc, InputBuf, INPUT_SIZE);
238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			inBuf = InputBuf;
239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (feof(fsrc) && Relens == 0)
240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				eofFile = 1;
241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} while (!eofFile && returnCode);
243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	//#######################################   End Encoding Section   #########################################
244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardsafe_exit:
246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	returnCode = AudioAPI.Uninit(hCodec);
247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf( "\n%2.5f seconds\n", (double)duration/CLOCKS_PER_SEC);
249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (fsrc)
251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		fclose(fsrc);
252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (fdst)
253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		fclose(fdst);
254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef LINUX
256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	dlclose(handle);
257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return ret;
260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardint main(int argc, char **argv)  // for gcc compiler;
263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int     mode, r;
265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int     arg, filename=0;
266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	char    *inFileName = NULL;
267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	char    *outFileName = NULL;
268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	short   allow_dtx;
269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VOAMRWBFRAMETYPE frameType;
270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
271e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf("\n");
272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf("************************Adaptive Multi-Rate Wide Band Encoder (AMR-WB)*******************************\n");
273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf("***********************************DEFINITIONS:*******************************************************\n");
274e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf("AMR-WB encoder scheme is based on the principle of Algebraic Code Excited Linear Prediction algorithm\n");
275e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf("The AMR-WB encoder compression MONO liner PCM speech input data at 16kHz sampling rate\n");
276e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf("to one of nine data rate modes-6.60, 8.85, 12.65, 14.25, 15.85, 18.25, 19.25, 23.05 and 23.85kbps.\n");
277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf("The encoder supports output format AMRWB ITU, AMRWB RFC3267.\n");
278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	printf("\n");
279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
280e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*Encoder Default setting */
281e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	mode = VOAMRWB_MD2385;
282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	allow_dtx = 0;
283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	frameType = VOAMRWB_RFC3267;
284e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
285e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(argc < 3){
286e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		usage();
287e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return 0;
288e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}else{
289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (arg = 1; arg < argc; arg++) {
290e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (argv [arg] [0] == '+') {
291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if(argv[arg][1] == 'M')
292e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
293e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					switch(argv[arg][2])
294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					{
295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					case '0': mode = VOAMRWB_MD66;
296e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					case '1': mode = VOAMRWB_MD885;
298e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
299e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					case '2': mode = VOAMRWB_MD1265;
300e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
301e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					case '3': mode = VOAMRWB_MD1425;
302e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
303e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					case '4': mode = VOAMRWB_MD1585;
304e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
305e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					case '5': mode = VOAMRWB_MD1825;
306e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					case '6': mode = VOAMRWB_MD1985;
308e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
309e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					case '7': mode = VOAMRWB_MD2305;
310e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
311e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					case '8': mode = VOAMRWB_MD2385;
312e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
313e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					default:
314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						usage();
315e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						printf ("Invalid parameter '%s'.\n", argv [arg]);
316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					}
318e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}else if(argv[arg][1] == 'F')
319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					switch(argv[arg][2])
321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					{
322e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					case '0': frameType = VOAMRWB_DEFAULT;
323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					case '1': frameType = VOAMRWB_ITU;
325e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
326e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					case '2': frameType = VOAMRWB_RFC3267 ;
327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
328e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					default:
329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						usage();
330e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						printf ("Invalid parameter '%s'.\n", argv [arg]);
331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						break;
332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					}
335e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}else if(strcmp (argv[arg], "+DTX") == 0)
336e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
337e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					allow_dtx = 1;
338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
339e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			} else {
341e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				switch (filename) {
342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						case 0:
343e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard							inFileName  = argv[arg];
344e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard							break;
345e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						case 1:
346e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard							outFileName = argv[arg];
347e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard							break;
348e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						default:
349e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard							usage ();
350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard							fprintf (stderr, "Invalid parameter '%s'.\n", argv [arg]);
351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard							return 0;
352e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				filename++;
354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
357e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	r = encode(mode, allow_dtx, frameType, inFileName, outFileName);
359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(r)
360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
361e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		fprintf(stderr, "error: %d\n", r);
362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return r;
364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
365e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
366