/* ** Copyright 2003-2010, VisualOn, Inc. ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ /******************************************************************************* File: AAC_E_SAMPLES.h Content: sample code for AAC encoder *******************************************************************************/ #include #include #include #include #include #include "voAAC.h" #include "cmnMemory.h" #define VO_AAC_E_OUTPUT 1 #define READ_SIZE (1024*8) unsigned char outBuf[1024*8]; unsigned char inBuf[READ_SIZE]; const char* HelpString = "VisualOn AAC encoder Usage:\n" "voAACEncTest -if -of -sr -ch -br -adts \n" "-if input file name \n" "-of output file name \n" "-sr input pcm samplerate, default 44100 \n" "-ch input pcm channel, default 2 channel \n" "-br encoded aac bitrate, default 64000 * (samplerate/100)*channel/441(480)\n" "-adts add or no adts header, default add adts header\n" "For example: \n" "./voAACEncTest -if raw.pcm -of raw.aac -sr 44100 -ch 2 -br 128000\n"; static int parsecmdline(int argc, char **argv,char **input_filename, char **output_filename, AACENC_PARAM *param) { // notice that: // bitRate/nChannels > 8000 // bitRate/nChannels < 160000 // bitRate/nChannels < sampleRate*6 param->adtsUsed = 1; param->bitRate = 0; param->nChannels = 2; param->sampleRate = 44100; if(argc < 5 || argc > 13) { return -1; } argc--; argv++; while (argc > 0) { if (!strcmp(*argv, "-if")) { argv++; argc--; *input_filename = *argv; } else if (!strcmp(*argv, "-of")) { argv++; argc--; *output_filename = *argv; } else if (!strcmp(*argv, "-sr")) { argv++; argc--; param->sampleRate = atoi(*argv); } else if (!strcmp(*argv, "-ch")) { argv++; argc--; param->nChannels = atoi(*argv); } else if (!strcmp(*argv, "-br")) { argv++; argc--; param->bitRate = atoi(*argv); } else if(!strcmp(*argv, "-adts")) { argv++; argc--; param->adtsUsed = atoi(*argv); } else { return -1; } argv++; argc--; } if(param->bitRate == 0) { int scale = 441; if(param->sampleRate%8000 == 0) scale = 480; param->bitRate = 640*param->nChannels*param->sampleRate/scale; } return 0; } int ReadFile2Buf(FILE* infile,unsigned char* dest,int readSize) { int readBytes = 0; readBytes = fread(dest, 1, readSize, infile); return readBytes; } typedef int (VO_API * VOGETAUDIODECAPI) (VO_AUDIO_CODECAPI * pDecHandle); int main(int argc, char **argv) { FILE *infile, *outfile; int t1, t2; VO_AUDIO_CODECAPI AudioAPI; VO_MEM_OPERATOR moper; VO_CODEC_INIT_USERDATA useData; VO_HANDLE hCodec; VO_CODECBUFFER inData; VO_CODECBUFFER outData; VO_AUDIO_OUTPUTINFO outInfo; int firstWrite = 1; int eofFile = 0; int *info=(int*)inBuf; int bytesLeft, nRead; int EncoderdFrame = 0; int total = 0; int isOutput = 1; int returnCode; AACENC_PARAM aacpara; void *handle; void *pfunc; VOGETAUDIODECAPI pGetAPI; const char *infileName = NULL; const char *outfileName = NULL; returnCode = parsecmdline(argc,argv, &infileName, &outfileName, &aacpara); if(returnCode) { printf("%s", HelpString); return 0; } /* open input file */ infile = fopen(infileName, "rb"); if (!infile) { printf("Open input file fail..."); return -1; } /* open output file */ if(isOutput) { outfile = fopen(outfileName, "wb"); if (!outfile) { printf("Open output file fail..."); return -1; } } // set memory operators; moper.Alloc = cmnMemAlloc; moper.Copy = cmnMemCopy; moper.Free = cmnMemFree; moper.Set = cmnMemSet; moper.Check = cmnMemCheck; useData.memflag = VO_IMF_USERMEMOPERATOR; useData.memData = (VO_PTR)(&moper); // open encoder dll; handle = dlopen("libstagefright.so", RTLD_NOW); if(handle == 0) { printf("open dll error......"); return -1; } // Get API; pfunc = dlsym(handle, "voGetAACEncAPI"); if(pfunc == 0) { printf("open function error......"); return -1; } pGetAPI = (VOGETAUDIODECAPI)pfunc; returnCode = pGetAPI(&AudioAPI); if(returnCode) return -1; //####################################### Init Encoding Section ######################################### returnCode = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAAC, &useData); if(returnCode < 0) { printf("#### VOI_Error2:fail to initialize the Encoderr###\n"); return -1; } returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara); inData.Buffer = inBuf; bytesLeft = ReadFile2Buf(infile,inData.Buffer,READ_SIZE); //####################################### Encoding Section ######################################### do { inData.Length = bytesLeft; outData.Buffer = outBuf; outData.Length = 1024*8; t1 = clock(); returnCode = AudioAPI.SetInputData(hCodec,&inData); do { outData.Buffer = outBuf; outData.Length = 1024*8; returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outInfo); if(returnCode == 0) EncoderdFrame++; if(returnCode == VO_ERR_LICENSE_ERROR) break; #if VO_AAC_E_OUTPUT if (isOutput && returnCode == 0) { fwrite(outData.Buffer, 1, outData.Length, outfile); } #endif } while(returnCode != (VO_ERR_INPUT_BUFFER_SMALL)); if(returnCode == VO_ERR_LICENSE_ERROR) break; t2 = clock(); total += t2 - t1; if (!eofFile) { nRead = ReadFile2Buf(infile, inBuf,READ_SIZE); bytesLeft = nRead; inData.Buffer = inBuf; if (feof(infile)) eofFile = 1; } } while (!eofFile && returnCode); //################################################ End Encoding Section ####################################################### returnCode = AudioAPI.Uninit(hCodec); fclose(infile); if (outfile) { fclose(outfile); } dlclose(handle); return 0; }