diff --git a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp index 7240964ecb..4c68219b47 100644 --- a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp @@ -46,47 +46,6 @@ using ::android::sp; #include #include -Return setAudioPortFormat( - sp omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding) { - OMX_U32 index = 0; - OMX_AUDIO_PARAM_PORTFORMATTYPE portFormat; - std::vector arrEncoding; - android::hardware::media::omx::V1_0::Status status; - - while (1) { - portFormat.nIndex = index; - status = getPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, - &portFormat); - if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; - arrEncoding.push_back(portFormat.eEncoding); - index++; - if (index == 512) { - // enumerated way too many formats, highly unusual for this to - // happen. - EXPECT_LE(index, 512U) - << "Expecting OMX_ErrorNoMore but not received"; - break; - } - } - if (!index) return status; - for (index = 0; index < arrEncoding.size(); index++) { - if (arrEncoding[index] == eEncoding) { - portFormat.eEncoding = arrEncoding[index]; - break; - } - } - if (index == arrEncoding.size()) { - ALOGE("setting default Port format %x", (int)arrEncoding[0]); - portFormat.eEncoding = arrEncoding[0]; - } - // In setParam call nIndex shall be ignored as per omx-il specification. - // see how this holds up by corrupting nIndex - portFormat.nIndex = RANDOM_INDEX; - status = setPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, - &portFormat); - return status; -} - void enumerateProfile(sp omxNode, OMX_U32 portIndex, std::vector* arrProfile) { android::hardware::media::omx::V1_0::Status status; diff --git a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.h b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.h index 70142f2b05..08b3d9cd58 100644 --- a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.h @@ -27,9 +27,6 @@ /* * Common audio utils */ -Return setAudioPortFormat( - sp omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding); - void enumerateProfile(sp omxNode, OMX_U32 portIndex, std::vector* arrProfile); diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp index 700d2f31c3..1f67e2b6a5 100755 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp @@ -60,6 +60,132 @@ Return setRole( return setParam(omxNode, OMX_IndexParamStandardComponentRole, ¶ms); } +Return setPortBufferSize( + sp omxNode, OMX_U32 portIndex, OMX_U32 size) { + android::hardware::media::omx::V1_0::Status status; + OMX_PARAM_PORTDEFINITIONTYPE portDef; + + status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, + &portDef); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) + return status; + if (portDef.nBufferSize < size) { + portDef.nBufferSize = size; + status = setPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, + &portDef); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) + return status; + } + return status; +} + +// get/set video component port format +Return setVideoPortFormat( + sp omxNode, OMX_U32 portIndex, + OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat, + OMX_U32 xFramerate) { + OMX_U32 index = 0; + OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; + std::vector arrColorFormat; + std::vector arrCompressionFormat; + android::hardware::media::omx::V1_0::Status status; + + while (1) { + portFormat.nIndex = index; + status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, + &portFormat); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; + if (eCompressionFormat == OMX_VIDEO_CodingUnused) + arrColorFormat.push_back(portFormat.eColorFormat); + else + arrCompressionFormat.push_back(portFormat.eCompressionFormat); + index++; + if (index == 512) { + // enumerated way too many formats, highly unusual for this to + // happen. + EXPECT_LE(index, 512U) + << "Expecting OMX_ErrorNoMore but not received"; + break; + } + } + if (!index) return status; + if (eCompressionFormat == OMX_VIDEO_CodingUnused) { + for (index = 0; index < arrColorFormat.size(); index++) { + if (arrColorFormat[index] == eColorFormat) { + portFormat.eColorFormat = arrColorFormat[index]; + break; + } + } + if (index == arrColorFormat.size()) { + ALOGE("setting default color format %x", (int)arrColorFormat[0]); + portFormat.eColorFormat = arrColorFormat[0]; + } + portFormat.eCompressionFormat = OMX_VIDEO_CodingUnused; + } else { + for (index = 0; index < arrCompressionFormat.size(); index++) { + if (arrCompressionFormat[index] == eCompressionFormat) { + portFormat.eCompressionFormat = arrCompressionFormat[index]; + break; + } + } + if (index == arrCompressionFormat.size()) { + ALOGE("setting default compression format %x", + (int)arrCompressionFormat[0]); + portFormat.eCompressionFormat = arrCompressionFormat[0]; + } + portFormat.eColorFormat = OMX_COLOR_FormatUnused; + } + // In setParam call nIndex shall be ignored as per omx-il specification. + // see how this holds up by corrupting nIndex + portFormat.nIndex = RANDOM_INDEX; + portFormat.xFramerate = xFramerate; + status = setPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, + &portFormat); + return status; +} + +// get/set audio component port format +Return setAudioPortFormat( + sp omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding) { + OMX_U32 index = 0; + OMX_AUDIO_PARAM_PORTFORMATTYPE portFormat; + std::vector arrEncoding; + android::hardware::media::omx::V1_0::Status status; + + while (1) { + portFormat.nIndex = index; + status = getPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, + &portFormat); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; + arrEncoding.push_back(portFormat.eEncoding); + index++; + if (index == 512) { + // enumerated way too many formats, highly unusual for this to + // happen. + EXPECT_LE(index, 512U) + << "Expecting OMX_ErrorNoMore but not received"; + break; + } + } + if (!index) return status; + for (index = 0; index < arrEncoding.size(); index++) { + if (arrEncoding[index] == eEncoding) { + portFormat.eEncoding = arrEncoding[index]; + break; + } + } + if (index == arrEncoding.size()) { + ALOGE("setting default Port format %x", (int)arrEncoding[0]); + portFormat.eEncoding = arrEncoding[0]; + } + // In setParam call nIndex shall be ignored as per omx-il specification. + // see how this holds up by corrupting nIndex + portFormat.nIndex = RANDOM_INDEX; + status = setPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, + &portFormat); + return status; +} + // allocate buffers needed on a component port void allocatePortBuffers(sp omxNode, android::Vector* buffArray, diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index 354b7a7e5e..0adea14e80 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -36,6 +36,14 @@ #define DEFAULT_TIMEOUT 100000 #define TIMEOUT_COUNTER (10000000 / DEFAULT_TIMEOUT) +/* + * Random Index used for monkey testing while get/set parameters + */ +#define RANDOM_INDEX 1729 + +#define ALIGN_POWER_OF_TWO(value, n) \ + (((value) + ((1 << (n)) - 1)) & ~((1 << (n)) - 1)) + enum bufferOwner { client, component, @@ -265,6 +273,17 @@ Return setPortConfig( Return setRole( sp omxNode, const char* role); +Return setPortBufferSize( + sp omxNode, OMX_U32 portIndex, OMX_U32 size); + +Return setVideoPortFormat( + sp omxNode, OMX_U32 portIndex, + OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat, + OMX_U32 xFramerate); + +Return setAudioPortFormat( + sp omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding); + void allocatePortBuffers(sp omxNode, android::Vector* buffArray, OMX_U32 portIndex, diff --git a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp index 357c11e2b0..38860edc60 100644 --- a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp +++ b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp @@ -225,113 +225,6 @@ void initPortMode(PortMode* pm, bool isSecure, return; } -// get/set video component port format -Return setVideoPortFormat( - sp omxNode, OMX_U32 portIndex, - OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat, - OMX_U32 xFramerate) { - OMX_U32 index = 0; - OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; - std::vector arrColorFormat; - std::vector arrCompressionFormat; - android::hardware::media::omx::V1_0::Status status; - - while (1) { - portFormat.nIndex = index; - status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, - &portFormat); - if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; - if (eCompressionFormat == OMX_VIDEO_CodingUnused) - arrColorFormat.push_back(portFormat.eColorFormat); - else - arrCompressionFormat.push_back(portFormat.eCompressionFormat); - index++; - if (index == 512) { - // enumerated way too many formats, highly unusual for this to - // happen. - EXPECT_LE(index, 512U) - << "Expecting OMX_ErrorNoMore but not received"; - break; - } - } - if (!index) return status; - if (eCompressionFormat == OMX_VIDEO_CodingUnused) { - for (index = 0; index < arrColorFormat.size(); index++) { - if (arrColorFormat[index] == eColorFormat) { - portFormat.eColorFormat = arrColorFormat[index]; - break; - } - } - if (index == arrColorFormat.size()) { - ALOGE("setting default color format %x", (int)arrColorFormat[0]); - portFormat.eColorFormat = arrColorFormat[0]; - } - portFormat.eCompressionFormat = OMX_VIDEO_CodingUnused; - } else { - for (index = 0; index < arrCompressionFormat.size(); index++) { - if (arrCompressionFormat[index] == eCompressionFormat) { - portFormat.eCompressionFormat = arrCompressionFormat[index]; - break; - } - } - if (index == arrCompressionFormat.size()) { - ALOGE("setting default compression format %x", - (int)arrCompressionFormat[0]); - portFormat.eCompressionFormat = arrCompressionFormat[0]; - } - portFormat.eColorFormat = OMX_COLOR_FormatUnused; - } - // In setParam call nIndex shall be ignored as per omx-il specification. - // see how this holds up by corrupting nIndex - portFormat.nIndex = RANDOM_INDEX; - portFormat.xFramerate = xFramerate; - status = setPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, - &portFormat); - return status; -} - -// get/set audio component port format -Return setAudioPortFormat( - sp omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding) { - OMX_U32 index = 0; - OMX_AUDIO_PARAM_PORTFORMATTYPE portFormat; - std::vector arrEncoding; - android::hardware::media::omx::V1_0::Status status; - - while (1) { - portFormat.nIndex = index; - status = getPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, - &portFormat); - if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; - arrEncoding.push_back(portFormat.eEncoding); - index++; - if (index == 512) { - // enumerated way too many formats, highly unusual for this to - // happen. - EXPECT_LE(index, 512U) - << "Expecting OMX_ErrorNoMore but not received"; - break; - } - } - if (!index) return status; - for (index = 0; index < arrEncoding.size(); index++) { - if (arrEncoding[index] == eEncoding) { - portFormat.eEncoding = arrEncoding[index]; - break; - } - } - if (index == arrEncoding.size()) { - ALOGE("setting default Port format %x", (int)arrEncoding[0]); - portFormat.eEncoding = arrEncoding[0]; - } - // In setParam call nIndex shall be ignored as per omx-il specification. - // see how this holds up by corrupting nIndex - portFormat.nIndex = RANDOM_INDEX; - status = setPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, - &portFormat); - return status; -} - // test dispatch message API call TEST_F(ComponentHidlTest, dispatchMsg) { description("test dispatch message API call"); diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 9773cb00b9..f13d88c1e8 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -768,7 +768,7 @@ TEST_F(VideoDecHidlTest, DecodeTest) { eleInfo.open(info); ASSERT_EQ(eleInfo.is_open(), true); android::Vector Info; - int bytesCount = 0; + int bytesCount = 0, maxBytesCount = 0; uint32_t flags = 0; uint32_t timestamp = 0; timestampDevTest = true; @@ -779,9 +779,15 @@ TEST_F(VideoDecHidlTest, DecodeTest) { Info.push_back({bytesCount, flags, timestamp}); if (flags != OMX_BUFFERFLAG_CODECCONFIG) timestampUslist.push_back(timestamp); + if (maxBytesCount < bytesCount) maxBytesCount = bytesCount; } eleInfo.close(); + // As the frame sizes are known ahead, use it to configure i/p buffer size + maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10); + status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set port mode portMode[0] = PortMode::PRESET_BYTE_BUFFER; portMode[1] = PortMode::DYNAMIC_ANW_BUFFER; @@ -801,6 +807,8 @@ TEST_F(VideoDecHidlTest, DecodeTest) { &xFramerate); setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); + + // disabling adaptive playback. omxNode->prepareForAdaptivePlayback(kPortIndexOutput, false, 1920, 1080); android::Vector iBuffer, oBuffer; @@ -923,7 +931,7 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) { eleInfo.open(info); ASSERT_EQ(eleInfo.is_open(), true); android::Vector Info; - int bytesCount = 0; + int bytesCount = 0, maxBytesCount = 0; uint32_t flags = 0; uint32_t timestamp = 0; while (1) { @@ -931,9 +939,21 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) { eleInfo >> flags; eleInfo >> timestamp; Info.push_back({bytesCount, flags, timestamp}); + if (maxBytesCount < bytesCount) maxBytesCount = bytesCount; } eleInfo.close(); + // As the frame sizes are known ahead, use it to configure i/p buffer size + maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10); + status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // set port mode + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set Port Params uint32_t nFrameWidth, nFrameHeight, xFramerate; OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; @@ -1024,7 +1044,7 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) { eleInfo.open(info); ASSERT_EQ(eleInfo.is_open(), true); android::Vector Info; - int bytesCount = 0; + int bytesCount = 0, maxBytesCount = 0; uint32_t flags = 0; uint32_t timestamp = 0; while (1) { @@ -1032,9 +1052,21 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) { eleInfo >> flags; eleInfo >> timestamp; Info.push_back({bytesCount, flags, timestamp}); + if (maxBytesCount < bytesCount) maxBytesCount = bytesCount; } eleInfo.close(); + // As the frame sizes are known ahead, use it to configure i/p buffer size + maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10); + status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // set port mode + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set Port Params uint32_t nFrameWidth, nFrameHeight, xFramerate; OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; @@ -1107,7 +1139,7 @@ TEST_F(VideoDecHidlTest, FlushTest) { eleInfo.open(info); ASSERT_EQ(eleInfo.is_open(), true); android::Vector Info; - int bytesCount = 0; + int bytesCount = 0, maxBytesCount = 0; uint32_t flags = 0; uint32_t timestamp = 0; while (1) { @@ -1115,9 +1147,21 @@ TEST_F(VideoDecHidlTest, FlushTest) { eleInfo >> flags; eleInfo >> timestamp; Info.push_back({bytesCount, flags, timestamp}); + if (maxBytesCount < bytesCount) maxBytesCount = bytesCount; } eleInfo.close(); + // As the frame sizes are known ahead, use it to configure i/p buffer size + maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10); + status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // set port mode + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set Port Params uint32_t nFrameWidth, nFrameHeight, xFramerate; OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; diff --git a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp index 77763d172c..91aecf22e6 100644 --- a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp @@ -52,68 +52,6 @@ using ::android::sp; #include #include -Return setVideoPortFormat( - sp omxNode, OMX_U32 portIndex, - OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat, - OMX_U32 xFramerate) { - OMX_U32 index = 0; - OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; - std::vector arrColorFormat; - std::vector arrCompressionFormat; - android::hardware::media::omx::V1_0::Status status; - - while (1) { - portFormat.nIndex = index; - status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, - &portFormat); - if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; - if (eCompressionFormat == OMX_VIDEO_CodingUnused) - arrColorFormat.push_back(portFormat.eColorFormat); - else - arrCompressionFormat.push_back(portFormat.eCompressionFormat); - index++; - if (index == 512) { - // enumerated way too many formats, highly unusual for this to - // happen. - EXPECT_LE(index, 512U) - << "Expecting OMX_ErrorNoMore but not received"; - break; - } - } - if (!index) return status; - if (eCompressionFormat == OMX_VIDEO_CodingUnused) { - for (index = 0; index < arrColorFormat.size(); index++) { - if (arrColorFormat[index] == eColorFormat) { - portFormat.eColorFormat = arrColorFormat[index]; - break; - } - } - if (index == arrColorFormat.size()) { - ALOGE("setting default color format %x", (int)arrColorFormat[0]); - portFormat.eColorFormat = arrColorFormat[0]; - } - portFormat.eCompressionFormat = OMX_VIDEO_CodingUnused; - } else { - for (index = 0; index < arrCompressionFormat.size(); index++) { - if (arrCompressionFormat[index] == eCompressionFormat) { - portFormat.eCompressionFormat = arrCompressionFormat[index]; - break; - } - } - if (index == arrCompressionFormat.size()) { - ALOGE("setting default compression format %x", - (int)arrCompressionFormat[0]); - portFormat.eCompressionFormat = arrCompressionFormat[0]; - } - portFormat.eColorFormat = OMX_COLOR_FormatUnused; - } - portFormat.nIndex = 0; - portFormat.xFramerate = xFramerate; - status = setPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, - &portFormat); - return status; -} - void enumerateProfileAndLevel(sp omxNode, OMX_U32 portIndex, std::vector* arrProfile, std::vector* arrLevel) { diff --git a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h index e4927792e3..c1d7aeae55 100644 --- a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h @@ -26,11 +26,6 @@ * Common video utils */ -Return setVideoPortFormat( - sp omxNode, OMX_U32 portIndex, - OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat, - OMX_U32 xFramerate); - void enumerateProfileAndLevel(sp omxNode, OMX_U32 portIndex, std::vector* arrProfile, std::vector* arrLevel);