status_t AMRWBEncoder::initCheck() { CHECK(mApiHandle == NULL && mEncoderHandle == NULL); CHECK(mMeta->findInt32(kKeyBitRate, &mBitRate)); mApiHandle = new VO_AUDIO_CODECAPI; CHECK(mApiHandle); if (VO_ERR_NONE != voGetAMRWBEncAPI(mApiHandle)) { LOGE("Failed to get api handle"); return UNKNOWN_ERROR; } mMemOperator = new VO_MEM_OPERATOR; CHECK(mMemOperator != NULL); mMemOperator->Alloc = cmnMemAlloc; mMemOperator->Copy = cmnMemCopy; mMemOperator->Free = cmnMemFree; mMemOperator->Set = cmnMemSet; mMemOperator->Check = cmnMemCheck; VO_CODEC_INIT_USERDATA userData; memset(&userData, 0, sizeof(userData)); userData.memflag = VO_IMF_USERMEMOPERATOR; userData.memData = (VO_PTR) mMemOperator; if (VO_ERR_NONE != mApiHandle->Init(&mEncoderHandle, VO_AUDIO_CodingAMRWB, &userData)) { LOGE("Failed to init AMRWB encoder"); return UNKNOWN_ERROR; } // Configure AMRWB encoder$ VOAMRWBMODE mode = pickModeFromBitRate(mBitRate); if (VO_ERR_NONE != mApiHandle->SetParam(mEncoderHandle, VO_PID_AMRWB_MODE, &mode)) { LOGE("Failed to set AMRWB encoder mode to %d", mode); return UNKNOWN_ERROR; } VOAMRWBFRAMETYPE type = VOAMRWB_RFC3267; if (VO_ERR_NONE != mApiHandle->SetParam(mEncoderHandle, VO_PID_AMRWB_FRAMETYPE, &type)) { LOGE("Failed to set AMRWB encoder frame type to %d", type); return UNKNOWN_ERROR; } return OK; }
int encode( int mode, short allow_dtx, VOAMRWBFRAMETYPE frameType, const char* srcfile, const char* dstfile ) { int ret = 0; int returnCode; FILE *fsrc = NULL; FILE *fdst = NULL; int framenum = 0; int eofFile = 0; int size1 = 0; int Relens; 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 outFormat; unsigned char *inBuf = InputBuf; unsigned char *outBuf = OutputBuf; #ifdef LINUX void *handle = NULL; void *pfunc; VOGETAUDIOENCAPI pGetAPI; #endif clock_t start, finish; double duration = 0.0; if ((fsrc = fopen (srcfile, "rb")) == NULL) { ret = -1; goto safe_exit; } if ((fdst = fopen (dstfile, "wb")) == NULL) { ret = -1; goto safe_exit; } 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); #ifdef LINUX handle = dlopen("/data/local/tmp/voAMRWBEnc.so", RTLD_NOW); if(handle == 0) { printf("open dll error......"); return -1; } pfunc = dlsym(handle, "voGetAMRWBEncAPI"); if(pfunc == 0) { printf("open function error......"); return -1; } pGetAPI = (VOGETAUDIOENCAPI)pfunc; returnCode = pGetAPI(&AudioAPI); if(returnCode) { printf("get APIs error......"); return -1; } #else ret = voGetAMRWBEncAPI(&AudioAPI); if(ret) { ret = -1; printf("get APIs error......"); goto safe_exit; } #endif //####################################### Init Encoding Section ######################################### ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData); if(ret) { ret = -1; printf("APIs init error......"); goto safe_exit; } Relens = GetNextBuf(fsrc,InputBuf,INPUT_SIZE); if(Relens!=INPUT_SIZE && !feof(fsrc)) { ret = -1; //Invalid magic number printf("get next buffer error......"); goto safe_exit; } //###################################### set encode Mode ################################################## ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_FRAMETYPE, &frameType); ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_MODE, &mode); ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_DTX, &allow_dtx); if(frameType == VOAMRWB_RFC3267) { /* write RFC3267 Header info to indicate single channel AMR file storage format */ size1 = (int)strlen(VOAMRWB_RFC3267_HEADER_INFO); memcpy(outBuf, VOAMRWB_RFC3267_HEADER_INFO, size1); outBuf += size1; } //####################################### Encoding Section ######################################### printf(" \n ---------------- Running -------------------------\n "); do{ inData.Buffer = (unsigned char *)inBuf; inData.Length = Relens; outData.Buffer = outBuf; start = clock(); /* decode one amr block */ returnCode = AudioAPI.SetInputData(hCodec,&inData); do { returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outFormat); if(returnCode == 0) { framenum++; printf(" Frames processed: %hd\r", framenum); if(framenum == 1) { fwrite(OutputBuf, 1, outData.Length + size1, fdst); fflush(fdst); } else { fwrite(outData.Buffer, 1, outData.Length, fdst); fflush(fdst); } } else if(returnCode == VO_ERR_LICENSE_ERROR) { printf("Encoder time reach upper limit......"); goto safe_exit; } } while(returnCode != VO_ERR_INPUT_BUFFER_SMALL); finish = clock(); duration += finish - start; if (!eofFile) { Relens = GetNextBuf(fsrc, InputBuf, INPUT_SIZE); inBuf = InputBuf; if (feof(fsrc) && Relens == 0) eofFile = 1; } } while (!eofFile && returnCode); //####################################### End Encoding Section ######################################### safe_exit: returnCode = AudioAPI.Uninit(hCodec); printf( "\n%2.5f seconds\n", (double)duration/CLOCKS_PER_SEC); if (fsrc) fclose(fsrc); if (fdst) fclose(fdst); #ifdef LINUX dlclose(handle); #endif return ret; }