blob: 2f31de4aed728f910f0569e95cf00fa8b876f898 [file] [log] [blame]
/*
** 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 <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#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 <inputfile.pcm> -of <outputfile.aac> -sr <samplerate> -ch <channel> -br <bitrate> -adts <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;
}