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