199 lines
8.3 KiB
C++
199 lines
8.3 KiB
C++
/*
|
|
* Copyright (C) 2019 The Android Open Source Project
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
//#define LOG_NDEBUG 0
|
|
#define LOG_TAG "AmrwbEncoderTest"
|
|
|
|
#include <utils/Log.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "cmnMemory.h"
|
|
#include "voAMRWB.h"
|
|
|
|
#include "AmrwbEncTestEnvironment.h"
|
|
|
|
#define OUTPUT_FILE "/data/local/tmp/amrwbEncode.out"
|
|
#define VOAMRWB_RFC3267_HEADER_INFO "#!AMR-WB\n"
|
|
|
|
constexpr int32_t kInputBufferSize = 640;
|
|
constexpr int32_t kOutputBufferSize = 1024;
|
|
|
|
static AmrwbEncTestEnvironment *gEnv = nullptr;
|
|
|
|
class AmrwbEncoderTest : public ::testing::TestWithParam<tuple<string, int32_t, VOAMRWBFRAMETYPE>> {
|
|
public:
|
|
AmrwbEncoderTest() : mEncoderHandle(nullptr) {
|
|
tuple<string, int32_t, VOAMRWBFRAMETYPE> params = GetParam();
|
|
mInputFile = gEnv->getRes() + get<0>(params);
|
|
mMode = get<1>(params);
|
|
mFrameType = get<2>(params);
|
|
mMemOperator.Alloc = cmnMemAlloc;
|
|
mMemOperator.Copy = cmnMemCopy;
|
|
mMemOperator.Free = cmnMemFree;
|
|
mMemOperator.Set = cmnMemSet;
|
|
mMemOperator.Check = cmnMemCheck;
|
|
|
|
mUserData.memflag = VO_IMF_USERMEMOPERATOR;
|
|
mUserData.memData = (VO_PTR)(&mMemOperator);
|
|
}
|
|
|
|
~AmrwbEncoderTest() {
|
|
if (mEncoderHandle) {
|
|
mEncoderHandle = nullptr;
|
|
}
|
|
}
|
|
|
|
string mInputFile;
|
|
unsigned char mOutputBuf[kOutputBufferSize];
|
|
unsigned char mInputBuf[kInputBufferSize];
|
|
VOAMRWBFRAMETYPE mFrameType;
|
|
VO_AUDIO_CODECAPI mApiHandle;
|
|
VO_MEM_OPERATOR mMemOperator;
|
|
VO_CODEC_INIT_USERDATA mUserData;
|
|
VO_HANDLE mEncoderHandle;
|
|
int32_t mMode;
|
|
};
|
|
|
|
TEST_P(AmrwbEncoderTest, CreateAmrwbEncoderTest) {
|
|
int32_t status = voGetAMRWBEncAPI(&mApiHandle);
|
|
ASSERT_EQ(status, VO_ERR_NONE) << "Failed to get api handle";
|
|
|
|
status = mApiHandle.Init(&mEncoderHandle, VO_AUDIO_CodingAMRWB, &mUserData);
|
|
ASSERT_EQ(status, VO_ERR_NONE) << "Failed to init AMRWB encoder";
|
|
|
|
status = mApiHandle.SetParam(mEncoderHandle, VO_PID_AMRWB_FRAMETYPE, &mFrameType);
|
|
ASSERT_EQ(status, VO_ERR_NONE) << "Failed to set AMRWB encoder frame type to " << mFrameType;
|
|
|
|
status = mApiHandle.SetParam(mEncoderHandle, VO_PID_AMRWB_MODE, &mMode);
|
|
ASSERT_EQ(status, VO_ERR_NONE) << "Failed to set AMRWB encoder mode to %d" << mMode;
|
|
ALOGV("AMR-WB encoder created successfully");
|
|
|
|
status = mApiHandle.Uninit(mEncoderHandle);
|
|
ASSERT_EQ(status, VO_ERR_NONE) << "Failed to delete AMRWB encoder";
|
|
ALOGV("AMR-WB encoder deleted successfully");
|
|
}
|
|
|
|
TEST_P(AmrwbEncoderTest, AmrwbEncodeTest) {
|
|
VO_CODECBUFFER inData;
|
|
VO_CODECBUFFER outData;
|
|
VO_AUDIO_OUTPUTINFO outFormat;
|
|
|
|
FILE *fpInput = fopen(mInputFile.c_str(), "rb");
|
|
ASSERT_NE(fpInput, nullptr) << "Error opening input file " << mInputFile;
|
|
|
|
FILE *fpOutput = fopen(OUTPUT_FILE, "wb");
|
|
ASSERT_NE(fpOutput, nullptr) << "Error opening output file " << OUTPUT_FILE;
|
|
|
|
uint32_t status = voGetAMRWBEncAPI(&mApiHandle);
|
|
ASSERT_EQ(status, VO_ERR_NONE) << "Failed to get api handle";
|
|
|
|
status = mApiHandle.Init(&mEncoderHandle, VO_AUDIO_CodingAMRWB, &mUserData);
|
|
ASSERT_EQ(status, VO_ERR_NONE) << "Failed to init AMRWB encoder";
|
|
|
|
status = mApiHandle.SetParam(mEncoderHandle, VO_PID_AMRWB_FRAMETYPE, &mFrameType);
|
|
ASSERT_EQ(status, VO_ERR_NONE) << "Failed to set AMRWB encoder frame type to " << mFrameType;
|
|
|
|
status = mApiHandle.SetParam(mEncoderHandle, VO_PID_AMRWB_MODE, &mMode);
|
|
ASSERT_EQ(status, VO_ERR_NONE) << "Failed to set AMRWB encoder mode to " << mMode;
|
|
|
|
if (mFrameType == VOAMRWB_RFC3267) {
|
|
/* write RFC3267 Header info to indicate single channel AMR file storage format */
|
|
int32_t size = strlen(VOAMRWB_RFC3267_HEADER_INFO);
|
|
memcpy(mOutputBuf, VOAMRWB_RFC3267_HEADER_INFO, size);
|
|
fwrite(mOutputBuf, 1, size, fpOutput);
|
|
}
|
|
|
|
int32_t frameNum = 0;
|
|
while (1) {
|
|
int32_t buffLength =
|
|
(int32_t)fread(mInputBuf, sizeof(signed char), kInputBufferSize, fpInput);
|
|
|
|
if (buffLength == 0 || feof(fpInput)) break;
|
|
ASSERT_EQ(buffLength, kInputBufferSize) << "Error in reading input file";
|
|
|
|
inData.Buffer = (unsigned char *)mInputBuf;
|
|
inData.Length = buffLength;
|
|
outData.Buffer = mOutputBuf;
|
|
status = mApiHandle.SetInputData(mEncoderHandle, &inData);
|
|
ASSERT_EQ(status, VO_ERR_NONE) << "Failed to setup Input data";
|
|
|
|
do {
|
|
status = mApiHandle.GetOutputData(mEncoderHandle, &outData, &outFormat);
|
|
ASSERT_NE(status, VO_ERR_LICENSE_ERROR) << "Failed to encode the file";
|
|
if (status == 0) {
|
|
frameNum++;
|
|
fwrite(outData.Buffer, 1, outData.Length, fpOutput);
|
|
fflush(fpOutput);
|
|
}
|
|
} while (status != VO_ERR_INPUT_BUFFER_SMALL);
|
|
}
|
|
|
|
ALOGV("Number of frames processed: %d", frameNum);
|
|
status = mApiHandle.Uninit(mEncoderHandle);
|
|
ASSERT_EQ(status, VO_ERR_NONE) << "Failed to delete AMRWB encoder";
|
|
|
|
if (fpInput) {
|
|
fclose(fpInput);
|
|
}
|
|
if (fpOutput) {
|
|
fclose(fpOutput);
|
|
}
|
|
}
|
|
|
|
INSTANTIATE_TEST_SUITE_P(
|
|
AmrwbEncoderTestAll, AmrwbEncoderTest,
|
|
::testing::Values(
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD66, VOAMRWB_DEFAULT),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD885, VOAMRWB_DEFAULT),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1265, VOAMRWB_DEFAULT),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1425, VOAMRWB_DEFAULT),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1585, VOAMRWB_DEFAULT),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1825, VOAMRWB_DEFAULT),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1985, VOAMRWB_DEFAULT),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD2305, VOAMRWB_DEFAULT),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD2385, VOAMRWB_DEFAULT),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD66, VOAMRWB_ITU),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD885, VOAMRWB_ITU),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1265, VOAMRWB_ITU),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1425, VOAMRWB_ITU),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1585, VOAMRWB_ITU),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1825, VOAMRWB_ITU),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1985, VOAMRWB_ITU),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD2305, VOAMRWB_ITU),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD2385, VOAMRWB_ITU),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD66, VOAMRWB_RFC3267),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD885, VOAMRWB_RFC3267),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1265, VOAMRWB_RFC3267),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1425, VOAMRWB_RFC3267),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1585, VOAMRWB_RFC3267),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1825, VOAMRWB_RFC3267),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD1985, VOAMRWB_RFC3267),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD2305, VOAMRWB_RFC3267),
|
|
make_tuple("bbb_raw_1ch_16khz_s16le.raw", VOAMRWB_MD2385, VOAMRWB_RFC3267)));
|
|
|
|
int main(int argc, char **argv) {
|
|
gEnv = new AmrwbEncTestEnvironment();
|
|
::testing::AddGlobalTestEnvironment(gEnv);
|
|
::testing::InitGoogleTest(&argc, argv);
|
|
int status = gEnv->initFromOptions(argc, argv);
|
|
if (status == 0) {
|
|
status = RUN_ALL_TESTS();
|
|
ALOGV("Test result = %d\n", status);
|
|
}
|
|
return status;
|
|
}
|