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