Files
openvino/src/bindings/c/tests/ie_c_api_test.cpp
T
River Liandruiqi cbbac125f8 [C API] Refine OV 2.0 C APIs for better expansibility and compatibility (#12187)
* [C API 2.0]Redifine partial shape and property wrapper

1. Use dimension object to initialize partial_shape rather than string
2. Use void* to unify property value rather than union
3. rename some C api name to strict align with C++ method.

Change-Id: I64b5c521461264dba2d23543808584632fbd6d4b

* [C API 2.0]Memory check and implement all reshape interface

1. Memory safe create and free
2. Implement all reshape interface align with C++ interface
3. rename some api to align with C++ interface

Change-Id: Ib5e4192bdbd8a11cdd7e30b1dc84881ba3f2d505

* Rename prepostprocess to strict align with C++ name

Change-Id: I7a4d0a6e835b2d6ed01cd218ac81b1b621f600bf

* [C API 2.0]redefine ov_node and ov_model interface

1. redefine ov_node and ov_model interface
2. rename some api to aligne with C++ interface
3. remove some redundant code
4. align CMakeLists.txt with OpenVINO 2.0 convention

Change-Id: I4d5e92157e7891319c9754da8e70b9c6150ae2e3

* Redefine ov_layout to support more than one char

Change-Id: I39e5389246cf3edcc2f4734d13157457773d89b8

* Add interface to get partial_shape from node

Change-Id: I8cef77db581b43d2f0a9ac48cfdc09a86e39b694

* Use unique_ptr prevent memory leaks in case of exception

Change-Id: I150b375108a3eded400bdde087ab5c858958c25f

* Put legacy C API and 2.0 C API into a library

Change-Id: I067a55a00e78b80cdede5ae7adad316ee98cabd1

* Only keep OV 2.0 C sample and move legacy C sample to legacy directory

1. Move legacy C samples to tools/legacy/c directory
2. Keep OV 2.0 C samples in samples/c directory

Change-Id: I05880d17ee7cb7eafc6853ebb5394f3969258592

* Fix format and log issues

Change-Id: I05d909b3d7046d41b807e35808a993bb09672e68

* Restore documents update

Change-Id: I82dd92081c0aa1a2d7dca7f114cf6a35131d6f92

* Change config map data be const

Change-Id: I9043859e8308c01d80794dc8280ae236947f3bbb

* Update api document

Change-Id: I35bc149bad0de17424d95f48c3027030b708e147

* Add clang enable

Change-Id: I335639c05fb5fb38e682dbb72bfaf78380c0adaf

* Fix clang issue after enable clang for ie_c_api.c

Change-Id: Idcb4dda9d66e47a169eb79a9c4fe7a7d4df838db

* split header file and c file into multiple files

Change-Id: I7c3398966809ef70d7fcb799f2d612a33b471e31

* Fix clang format issue

Change-Id: Ibd18b45537c8f3bcbb5b995c90ae28999161d54d

* Add single ov_dimension_create method

Change-Id: Icd06b50e4f4df8f7897c7c4327edb67178162544

* Remove all legacy c samples completely

Change-Id: I098360a0d9002340e8769074181f7997b43bce8f

* Update ov_property_value to replace only ptr

Change-Id: I9f5a11b4cf07e759c1998e78e2624f0a1266d9b0

* Split more header files, add static dimension api

Change-Id: I14e4fb8585fc629480c06b86bd8219e75a9682f7

* Change ov_dimensions_create to be ov_dimensions_create_dynamic

Change-Id: I50c02749cea96f12bcea702b53a89c65b289550e

* rename status and get_out_tensor

Change-Id: I762c1d0c5a069454506fe3c04283c63ddbfacf31

* Split ov_c_api_test.cpp

* Split OV2.0 CAPI tests

* move var into Setup

* Merge legacy and 2.0 C API test

* Merge InferenceEngineCAPITests into openvino_capi_test

1. put InferenceEngineCAPITests into openvino_capi_test
2. resolve some format issues

Change-Id: I47bbba6bd70a871ee063becbd80eb57919fa9fb0

* legacy api test skips clang format

Change-Id: Id54ecdba827cf98c99b92295c0a0772123098b63

* Fix clang format issue

Change-Id: I7ed510d8178971fe04a895e812c261db99d8b9f2

* Restore InferenceEngineCAPITests

Change-Id: I4d641ffb1de9ce4d20ebecf35fc036fa7bd73e55

* rename openvino_capi_test to ov_capi_test

Change-Id: I6b6fe0cdb89aab7210abb17f32dbfdcdce72ba25

* unify list size name and refine ov_core_version_t

Change-Id: I137fc6d990c7b07f597ee94fa3b98d07ae843cb6

* align header file path to be openvino/c/openvino.h

Change-Id: I1a4552e1d558098af704942fe45488b0d6d53a90

* Fix path issue

Change-Id: I84d425d25e3b08c1516cbcc842fb9cb75574bf17

* move ov_color_format and remove opencv depenency

Change-Id: I486145f9e92e8bbf2e937d3572334aa9f0e68841

* Resolve some memory allocation error handling issues and read model with empty weight issue

Change-Id: Icd8e3b6de9741147993fa215a0c7cfd7debd5500

* Add GPU test cases

Change-Id: I13324ef019b5b1af79259ca932a36a0cec792c27

* Fix clang issue

Change-Id: I9bb4c47de301d142b5e2a77a39f667689ad9fe38

* Resolve CI test failure

Change-Id: Ia327d5edab19d8dd44ac369670f190d5c57aca79

* Redefine ov_shape and add default ov_core_create

Change-Id: I3e47d607f8aad65cb99cdddacaecf7bf34b1361b

* Remove some unnecessary api of node

Remove the unnecessary node api:
     ov_node_get_any_name(ov_output_const_node_t* node, char** tensor_name)
     ov_node_get_element_type(ov_output_const_node_t* node, ov_element_type_e* tensor_type)

Change-Id: I80a3243676800263a9e56afa3cfffce7b4bd2ae7

* Rename reshape api

ov_model_reshape should be common case which allow to reshape any models with different number of input.

Change-Id: I26bafeeb8a3dda7cd5164cda15fdb338db8668cb

* Rename ov_node api

Change-Id: I03114ecb6de5c46b6d02c909b6f6fb6c8bfd5cba

* Remove subfolder out of source code

Change-Id: Ib033ae7712cc0460d6fc21a0f89818381ae503c0

* apply absolute path for all header files

Change-Id: I8024c897d424b407025e21460ed4b62829b853d2

* Fix CI issue ov_capi_test failed to find libgna

Change-Id: I166e79a818498c6721fe956f43873f36d9ae1e07

* Resolve build issue to align with PR12214

Change-Id: I9e6094db213b431ee1b46e0d64199131db33bb36

Co-authored-by: ruiqi <ruiqi.yang@intel.com>
2022-08-14 19:51:34 +04:00

2246 lines
77 KiB
C++

// Copyright (C) 2018-2022 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
// clang-format off
#include <gtest/gtest.h>
#include <stdio.h>
#include <stdlib.h>
#include <condition_variable>
#include <mutex>
#include <c_api/ie_c_api.h>
#include <inference_engine.hpp>
#include "test_model_repo.hpp"
#include <fstream>
std::string xml_std = TestDataHelpers::generate_model_path("test_model", "test_model_fp32.xml"),
bin_std = TestDataHelpers::generate_model_path("test_model", "test_model_fp32.bin"),
input_image_nv12_std = TestDataHelpers::generate_image_path("224x224", "dog6.yuv");
const char* xml = xml_std.c_str();
const char* bin = bin_std.c_str();
const char* input_image_nv12 = input_image_nv12_std.c_str();
std::mutex m;
bool ready = false;
std::condition_variable condVar;
#ifdef _WIN32
#ifdef __MINGW32__
std::string plugins_xml_std = TestDataHelpers::generate_ieclass_xml_path("plugins_mingw.xml");
#else
std::string plugins_xml_std = TestDataHelpers::generate_ieclass_xml_path("plugins_win.xml");
#endif
#elif defined __APPLE__
std::string plugins_xml_std = TestDataHelpers::generate_ieclass_xml_path("plugins_apple.xml");
#else
std::string plugins_xml_std = TestDataHelpers::generate_ieclass_xml_path("plugins.xml");
#endif
const char* plugins_xml = plugins_xml_std.c_str();
#define IE_EXPECT_OK(...) EXPECT_EQ(IEStatusCode::OK, __VA_ARGS__)
#define IE_ASSERT_OK(...) ASSERT_EQ(IEStatusCode::OK, __VA_ARGS__)
#define IE_EXPECT_NOT_OK(...) EXPECT_NE(IEStatusCode::OK, __VA_ARGS__)
size_t read_image_from_file(const char* img_path, unsigned char *img_data, size_t size) {
FILE *fp = fopen(img_path, "rb+");
size_t read_size = 0;
if (fp) {
fseek(fp, 0, SEEK_END);
if (ftell(fp) >= size) {
fseek(fp, 0, SEEK_SET);
read_size = fread(img_data, 1, size, fp);
}
fclose(fp);
}
return read_size;
}
size_t find_device(ie_available_devices_t avai_devices, const char *device_name) {
for (size_t i = 0; i < avai_devices.num_devices; ++i) {
if (strstr(avai_devices.devices[i], device_name))
return i;
}
return -1;
}
TEST(ie_c_api_version, apiVersion) {
ie_version_t version = ie_c_api_version();
auto ver = InferenceEngine::GetInferenceEngineVersion();
std::string ver_str = ver->buildNumber;
EXPECT_EQ(strcmp(version.api_version, ver_str.c_str()), 0);
ie_version_free(&version);
}
void completion_callback(void *args) {
ie_infer_request_t *infer_request = (ie_infer_request_t *)args;
ie_blob_t *output_blob = nullptr;
IE_EXPECT_OK(ie_infer_request_get_blob(infer_request, "fc_out", &output_blob));
ie_blob_buffer_t buffer;
IE_EXPECT_OK(ie_blob_get_buffer(output_blob, &buffer));
float *output_data = (float *)(buffer.buffer);
EXPECT_NEAR(output_data[9], 0.f, 1.e-5);
ie_blob_free(&output_blob);
std::lock_guard<std::mutex> lock(m);
ready = true;
condVar.notify_one();
}
TEST(ie_core_create, coreCreatewithConfig) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create(plugins_xml, &core));
ASSERT_NE(nullptr, core);
ie_core_free(&core);
}
TEST(ie_core_create, coreCreateNoConfig) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_core_free(&core);
}
TEST(ie_core_get_available_devices, getAvailableDevices) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ie_available_devices_t avai_devices = {0};
IE_EXPECT_OK(ie_core_get_available_devices(core, &avai_devices));
ie_core_available_devices_free(&avai_devices);
ie_core_free(&core);
}
// TODO: CVS-68982
#ifndef OPENVINO_STATIC_LIBRARY
TEST(ie_core_register_plugin, registerPlugin) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *plugin_name = "openvino_intel_cpu_plugin";
const char *device_name = "BLA";
IE_EXPECT_OK(ie_core_register_plugin(core, plugin_name, device_name));
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_core_register_plugins, registerPlugins) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
IE_EXPECT_OK(ie_core_register_plugins(core, plugins_xml));
ie_config_t config = {nullptr, nullptr, nullptr};
const char *device_name = "CUSTOM";
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_core_unregister_plugin, unregisterPlugin) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create(plugins_xml, &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
ie_config_t config = {nullptr, nullptr, nullptr};
const char *device_name = "CUSTOM";
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
IE_EXPECT_OK(ie_core_unregister_plugin(core, device_name));
ie_core_free(&core);
}
#endif // !OPENVINO_STATIC_LIBRARY
TEST(ie_core_set_config, setConfig) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
const char *device_name = "CPU";
ie_config_t config = {"CPU_THREADS_NUM", "3", nullptr};
IE_EXPECT_OK(ie_core_set_config(core, &config, device_name));
ie_core_free(&core);
}
TEST(ie_core_get_metric, getMetric) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
const char *device_name = "CPU";
const char *metric_name = "SUPPORTED_CONFIG_KEYS";
ie_param_t param;
param.params = nullptr;
IE_EXPECT_OK(ie_core_get_metric(core, device_name, metric_name, &param));
ie_param_free(&param);
ie_core_free(&core);
}
TEST(ie_core_get_config, getConfig) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
const char *device_name = "CPU";
const char *config_name = "CPU_THREADS_NUM";
ie_param_t param;
param.params = nullptr;
IE_EXPECT_OK(ie_core_get_config(core, device_name, config_name, &param));
EXPECT_STREQ(param.params, "0");
ie_param_free(&param);
ie_core_free(&core);
}
TEST(ie_core_get_versions, getVersions) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_core_versions_t versions = {0};
IE_EXPECT_OK(ie_core_get_versions(core, "CPU", &versions));
EXPECT_EQ(versions.num_vers, 1);
ie_core_versions_free(&versions);
ie_core_free(&core);
}
TEST(ie_core_read_network, networkRead) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
ie_network_free(&network);
ie_core_free(&core);
}
static std::vector<uint8_t> content_from_file(const char * filename, bool is_binary) {
std::vector<uint8_t> result;
{
std::ifstream is(filename, is_binary ? std::ifstream::binary | std::ifstream::in : std::ifstream::in);
if (is) {
is.seekg(0, std::ifstream::end);
result.resize(is.tellg());
if (result.size() > 0) {
is.seekg(0, std::ifstream::beg);
is.read(reinterpret_cast<char *>(&result[0]), result.size());
}
}
}
return result;
}
TEST(ie_core_read_network_from_memory, networkReadFromMemory) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
std::vector<uint8_t> weights_content(content_from_file(bin, true));
tensor_desc_t weights_desc { ANY, { 1, { weights_content.size() } }, U8 };
ie_blob_t *weights_blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory_from_preallocated(&weights_desc, weights_content.data(), weights_content.size(), &weights_blob));
EXPECT_NE(nullptr, weights_blob);
if (weights_blob != nullptr) {
std::vector<uint8_t> xml_content(content_from_file(xml, false));
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network_from_memory(core, xml_content.data(), xml_content.size(), weights_blob, &network));
EXPECT_NE(nullptr, network);
if (network != nullptr) {
ie_network_free(&network);
}
ie_blob_free(&weights_blob);
}
ie_core_free(&core);
}
TEST(ie_core_export_network_to_file, exportNetworktoFile) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network_from_file(core, xml, "HETERO:CPU", &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
std::string export_path = TestDataHelpers::generate_model_path("test_model", "exported_model.blob");
IE_EXPECT_OK(ie_core_export_network(exe_network, export_path.c_str()));
std::ifstream file(export_path.c_str());
EXPECT_NE(file.peek(), std::ifstream::traits_type::eof());
EXPECT_NE(nullptr, exe_network);
ie_exec_network_free(&exe_network);
ie_core_free(&core);
}
TEST(ie_core_import_network_from_memory, importNetworkFromMem) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network_from_file(core, xml, "HETERO:CPU", nullptr, &exe_network));
EXPECT_NE(nullptr, exe_network);
std::string export_path = TestDataHelpers::generate_model_path("test_model", "exported_model.blob");
IE_EXPECT_OK(ie_core_export_network(exe_network, export_path.c_str()));
std::vector<uint8_t> buffer(content_from_file(export_path.c_str(), true));
ie_executable_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_import_network_from_memory(core, buffer.data(), buffer.size(), "HETERO:CPU", nullptr, &network));
EXPECT_NE(nullptr, network);
ie_exec_network_free(&network);
ie_exec_network_free(&exe_network);
ie_core_free(&core);
}
TEST(ie_core_import_network_from_file, importNetworkFromFile) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_config_t conf = {nullptr, nullptr, nullptr};
ie_executable_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_load_network_from_file(core, xml, "HETERO:CPU", &conf, &network));
EXPECT_NE(nullptr, network);
std::string exported_model = TestDataHelpers::generate_model_path("test_model", "exported_model.blob");
IE_EXPECT_OK(ie_core_export_network(network, exported_model.c_str()));
std::ifstream file(exported_model);
EXPECT_NE(file.peek(), std::ifstream::traits_type::eof());
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_import_network(core, exported_model.c_str(), "HETERO:CPU", &conf, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_exec_network_free(&network);
ie_exec_network_free(&exe_network);
ie_core_free(&core);
}
TEST(ie_core_import_network_from_file, importNetwork_errorHandling) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_load_network_from_file(core, xml, "HETERO:CPU", &config, &network));
EXPECT_NE(nullptr, network);
std::string exported_model = TestDataHelpers::generate_model_path("test_model", "exported_model.blob");
IE_EXPECT_OK(ie_core_export_network(network, exported_model.c_str()));
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_NOT_OK(ie_core_import_network(core, nullptr, "HETERO:CPU", &config, &exe_network));
EXPECT_EQ(nullptr, exe_network);
IE_EXPECT_NOT_OK(ie_core_import_network(core, exported_model.c_str(), nullptr, &config, &exe_network));
EXPECT_EQ(nullptr, exe_network);
IE_EXPECT_NOT_OK(ie_core_import_network(core, exported_model.c_str(), "HETERO:CPU", &config, nullptr));
EXPECT_EQ(nullptr, exe_network);
IE_EXPECT_NOT_OK(ie_core_import_network(core, exported_model.c_str(), "UnregisteredDevice", &config, &exe_network));
EXPECT_EQ(nullptr, exe_network);
IE_EXPECT_OK(ie_core_import_network(core, exported_model.c_str(), "HETERO:CPU", nullptr, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_exec_network_free(&network);
ie_exec_network_free(&exe_network);
ie_core_free(&core);
}
TEST(ie_core_load_network, loadNetwork) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
IE_EXPECT_OK(ie_network_set_input_layout(network, "data", layout_e::NHWC));
IE_EXPECT_OK(ie_network_set_input_precision(network, "data", precision_e::U8));
ie_config_t config = {"CPU_THREADS_NUM", "3", nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, "CPU", &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_core_load_network, loadNetworkNoConfig) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, "CPU", &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_core_load_network, loadNetworkNullConfig) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, "CPU", nullptr, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_core_load_network_from_file, loadNetworkNoConfig) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network_from_file(core, xml, "CPU", &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_exec_network_free(&exe_network);
ie_core_free(&core);
}
TEST(ie_core_load_network_from_file, loadNetworkNullConfig) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network_from_file(core, xml, "CPU", nullptr, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_exec_network_free(&exe_network);
ie_core_free(&core);
}
TEST(ie_core_load_network_from_file, loadNetwork_errorHandling) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_NOT_OK(ie_core_load_network_from_file(nullptr, xml, "CPU", &config, &exe_network));
EXPECT_EQ(nullptr, exe_network);
IE_EXPECT_NOT_OK(ie_core_load_network_from_file(core, nullptr, "CPU", &config, &exe_network));
EXPECT_EQ(nullptr, exe_network);
IE_EXPECT_NOT_OK(ie_core_load_network_from_file(core, xml, nullptr, &config, &exe_network));
EXPECT_EQ(nullptr, exe_network);
IE_EXPECT_NOT_OK(ie_core_load_network_from_file(core, xml, "CPU", &config, nullptr));
EXPECT_EQ(nullptr, exe_network);
IE_EXPECT_NOT_OK(ie_core_load_network_from_file(core, xml, "UnregisteredDevice", &config, &exe_network));
EXPECT_EQ(nullptr, exe_network);
ie_core_free(&core);
}
TEST(ie_network_get_name, networkName) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
char *network_name = nullptr;
IE_EXPECT_OK(ie_network_get_name(network, &network_name));
EXPECT_STREQ(network_name, "test_model");
ie_network_name_free(&network_name);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_inputs_number, inputNumer) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
size_t size;
IEStatusCode status_result = ie_network_get_inputs_number(network, &size);
EXPECT_EQ(status_result, IEStatusCode::OK);
EXPECT_EQ(size, 1);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_input_name, inputName) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
char *input_name = nullptr;
IE_EXPECT_OK(ie_network_get_input_name(network, 0, &input_name));
EXPECT_STREQ(input_name, "data");
ie_network_name_free(&input_name);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_input_precision, getPrecision) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "data";
precision_e p;
IE_EXPECT_OK(ie_network_get_input_precision(network, name, &p));
EXPECT_EQ(p, precision_e::FP32);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_input_precision, incorrectName) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "model";
precision_e p;
EXPECT_EQ(IEStatusCode::NOT_FOUND, ie_network_get_input_precision(network, name, &p));
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_set_input_precision, setPrecision) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "data";
const precision_e p = precision_e::FP16;
IE_EXPECT_OK(ie_network_set_input_precision(network, name, p));
precision_e p2;
IE_EXPECT_OK(ie_network_get_input_precision(network, name, &p2));
EXPECT_EQ(p, p2);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_input_layout, getLayout) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "data";
layout_e l;
IE_EXPECT_OK(ie_network_get_input_layout(network, name, &l));
EXPECT_EQ(l, layout_e::NCHW);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_set_input_layout, setLayout) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "data";
const layout_e l = layout_e ::NHWC;
IE_EXPECT_OK(ie_network_set_input_layout(network, name, l));
layout_e l2;
IE_EXPECT_OK(ie_network_get_input_layout(network, name, &l2));
EXPECT_EQ(l, l2);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_input_dims, getDims) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "data";
dimensions_t dims_res;
IE_EXPECT_OK(ie_network_get_input_dims(network, name, &dims_res));
EXPECT_EQ(dims_res.dims[0], 1);
EXPECT_EQ(dims_res.dims[1], 3);
EXPECT_EQ(dims_res.dims[2], 32);
EXPECT_EQ(dims_res.dims[3], 32);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_input_resize_algorithm, getResizeAlgo) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "data";
resize_alg_e resizeAlg;
IE_EXPECT_OK(ie_network_get_input_resize_algorithm(network, name, &resizeAlg));
EXPECT_EQ(resizeAlg, resize_alg_e::NO_RESIZE);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_set_input_resize_algorithm, setResizeAlgo) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "data";
resize_alg_e resizeAlg = resize_alg_e::RESIZE_BILINEAR;
IE_EXPECT_OK(ie_network_set_input_resize_algorithm(network, name, resizeAlg));
resize_alg_e resizeAlg2;
IE_EXPECT_OK(ie_network_get_input_resize_algorithm(network, name, &resizeAlg2));
EXPECT_EQ(resizeAlg, resizeAlg2);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_color_format, getColorFormat) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "data";
colorformat_e color;
IE_EXPECT_OK(ie_network_get_color_format(network, name, &color));
EXPECT_EQ(color, colorformat_e::RAW);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_set_color_format, setColorFormat) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "data";
const colorformat_e color = colorformat_e::BGR;
IE_EXPECT_OK(ie_network_set_color_format(network, name, color));
colorformat_e color2;
IE_EXPECT_OK(ie_network_get_color_format(network, name, &color2));
EXPECT_EQ(color2, colorformat_e::BGR);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_input_shapes, getInputShapes) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
input_shapes_t shapes;
IE_EXPECT_OK(ie_network_get_input_shapes(network, &shapes));
EXPECT_EQ(shapes.shape_num, 1);
ie_network_input_shapes_free(&shapes);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_reshape, reshape) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
input_shapes_t inputShapes;
IE_EXPECT_OK(ie_network_get_input_shapes(network, &inputShapes));
inputShapes.shapes[0].shape.dims[0] = 2;
IE_EXPECT_OK(ie_network_reshape(network, inputShapes));
input_shapes_t inputShapes2;
IE_EXPECT_OK(ie_network_get_input_shapes(network, &inputShapes2));
EXPECT_EQ(inputShapes2.shapes[0].shape.dims[0], 2);
ie_network_input_shapes_free(&inputShapes2);
ie_network_input_shapes_free(&inputShapes);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_outputs_number, getNumber) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
size_t size;
IE_EXPECT_OK(ie_network_get_outputs_number(network, &size));
EXPECT_EQ(size, 1);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_output_name, getName) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
char *output_name = nullptr;
IE_EXPECT_OK(ie_network_get_output_name(network, 0, &output_name));
EXPECT_STREQ(output_name, "fc_out");
ie_network_name_free(&output_name);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_output_name, incorrectNumber) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
char *output_name = nullptr;
EXPECT_EQ(IEStatusCode::OUT_OF_BOUNDS, ie_network_get_output_name(network, 3, &output_name));
ie_network_name_free(&output_name);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_output_precision, getPrecision) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "fc_out";
precision_e p;
IE_EXPECT_OK(ie_network_get_output_precision(network, name, &p));
EXPECT_EQ(p, precision_e::FP32);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_set_output_precision, setPrecision) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "fc_out";
precision_e p = precision_e::FP16;
IE_EXPECT_OK(ie_network_set_output_precision(network, name, p));
precision_e precision_res;
IE_EXPECT_OK(ie_network_get_output_precision(network, name, &precision_res));
EXPECT_EQ(p, precision_res);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_output_layout, getLayout) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "fc_out";
layout_e l;
IE_EXPECT_OK(ie_network_get_output_layout(network, name, &l));
EXPECT_EQ(l, layout_e::NC);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_set_output_layout, setLayout) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "fc_out";
layout_e l = layout_e::CN;
IE_EXPECT_OK(ie_network_set_output_layout(network, name, l));
layout_e l_res;
IE_EXPECT_OK(ie_network_get_output_layout(network, name, &l_res));
EXPECT_EQ(l, l_res);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_network_get_output_dims, getDims) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *name = "fc_out";
dimensions_t dims_res;
IE_EXPECT_OK(ie_network_get_output_dims(network, name, &dims_res));
EXPECT_EQ(dims_res.dims[0], 1);
EXPECT_EQ(dims_res.dims[1], 10);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_exec_network_create_infer_request, createInferRquest) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *device_name = "CPU";
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network,device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_infer_request_t *infer_request = nullptr;
IE_EXPECT_OK(ie_exec_network_create_infer_request(exe_network, &infer_request));
EXPECT_NE(nullptr, infer_request);
ie_infer_request_free(&infer_request);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_exec_network_get_config, getConfig) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *device_name = "CPU";
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network,device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_param_t param;
param.params = nullptr;
IE_EXPECT_OK(ie_exec_network_get_config(exe_network, "CPU_THREADS_NUM", &param));
ie_param_free(&param);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_exec_network_set_config, setConfig) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_param_t param;
if (ie_core_get_metric(core, "GPU", "AVAILABLE_DEVICES", &param) != IEStatusCode::OK) {
ie_core_free(&core);
GTEST_SKIP();
}
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *device_name = "MULTI:GPU,CPU";
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_config_t config_param = {"MULTI_DEVICE_PRIORITIES", "GPU,CPU", nullptr};
IE_EXPECT_OK(ie_exec_network_set_config(exe_network, &config_param));
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
ie_param_free(&param);
}
TEST(ie_exec_network_get_metric, getMetric) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
const char *device_name = "CPU";
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_param_t param;
param.params = nullptr;
IE_EXPECT_OK(ie_exec_network_get_metric(exe_network, "SUPPORTED_CONFIG_KEYS", &param));
ie_param_free(&param);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_infer_request_get_blob, getBlob) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
char *input_name = nullptr;
IE_EXPECT_OK(ie_network_get_input_name(network, 0, &input_name));
const char *device_name = "CPU";
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_infer_request_t *infer_request = nullptr;
IE_EXPECT_OK(ie_exec_network_create_infer_request(exe_network, &infer_request));
EXPECT_NE(nullptr, infer_request);
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_infer_request_get_blob(infer_request, input_name, &blob));
ie_blob_free(&blob);
ie_infer_request_free(&infer_request);
ie_exec_network_free(&exe_network);
ie_network_name_free(&input_name);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_infer_request_set_blob, setBlob) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
dimensions_t dim_t;
precision_e p = precision_e::U8;
layout_e l = layout_e::NCHW;
IE_EXPECT_OK(ie_network_get_input_dims(network, "data", &dim_t));
IE_EXPECT_OK(ie_network_set_input_layout(network, "data", l));
IE_EXPECT_OK(ie_network_set_input_precision(network, "data", p));
const char *device_name = "CPU";
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_infer_request_t *infer_request = nullptr;
IE_EXPECT_OK(ie_exec_network_create_infer_request(exe_network, &infer_request));
EXPECT_NE(nullptr, infer_request);
tensor_desc tensor;
tensor.dims = dim_t ;
tensor.precision = p;
tensor.layout = l;
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor, &blob));
IE_EXPECT_OK(ie_infer_request_set_blob(infer_request, "data", blob));
ie_blob_deallocate(&blob);
ie_infer_request_free(&infer_request);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_infer_request_infer, infer) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
IE_EXPECT_OK(ie_network_set_input_precision(network, "data", precision_e::U8));
const char *device_name = "CPU";
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_infer_request_t *infer_request = nullptr;
IE_EXPECT_OK(ie_exec_network_create_infer_request(exe_network, &infer_request));
EXPECT_NE(nullptr, infer_request);
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_infer_request_get_blob(infer_request, "data", &blob));
dimensions_t dims;
IE_EXPECT_OK(ie_blob_get_dims(blob, &dims));
const size_t blob_elems_count = dims.dims[0] * dims.dims[1] * dims.dims[2] * dims.dims[3];
ie_blob_buffer_t buffer;
IE_EXPECT_OK(ie_blob_get_buffer(blob, &buffer));
auto* blob_internal_buffer = (uint8_t*)buffer.buffer;
std::fill(blob_internal_buffer, blob_internal_buffer + blob_elems_count, uint8_t{0});
IE_EXPECT_OK(ie_infer_request_infer(infer_request));
ie_blob_t *output_blob = nullptr;
IE_EXPECT_OK(ie_infer_request_get_blob(infer_request, "fc_out", &output_blob));
dimensions_t dim_res;
IE_EXPECT_OK(ie_blob_get_dims(output_blob, &dim_res));
EXPECT_EQ(dim_res.ranks, 2);
EXPECT_EQ(dim_res.dims[1], 10);
ie_blob_buffer_t out_buffer;
IE_EXPECT_OK(ie_blob_get_buffer(output_blob, &out_buffer));
float *output_data = (float *)(out_buffer.buffer);
EXPECT_NEAR(output_data[9], 0.f, 1.e-5);
ie_blob_free(&output_blob);
ie_blob_free(&blob);
ie_infer_request_free(&infer_request);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_infer_request_infer_async, inferAsyncWaitFinish) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
IE_EXPECT_OK(ie_network_set_input_precision(network, "data", precision_e::U8));
const char *device_name = "CPU";
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_infer_request_t *infer_request = nullptr;
IE_EXPECT_OK(ie_exec_network_create_infer_request(exe_network, &infer_request));
EXPECT_NE(nullptr, infer_request);
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_infer_request_get_blob(infer_request, "data", &blob));
dimensions_t dims;
IE_EXPECT_OK(ie_blob_get_dims(blob, &dims));
const size_t blob_elems_count = dims.dims[0] * dims.dims[1] * dims.dims[2] * dims.dims[3];
ie_blob_buffer_t buffer;
IE_EXPECT_OK(ie_blob_get_buffer(blob, &buffer));
auto* blob_internal_buffer = (uint8_t*)buffer.buffer;
std::fill(blob_internal_buffer, blob_internal_buffer + blob_elems_count, uint8_t{0});
IE_EXPECT_OK(ie_infer_request_infer_async(infer_request));
ie_blob_t *output_blob = nullptr;
if (!HasFatalFailure()) {
IE_EXPECT_OK(ie_infer_request_wait(infer_request, -1));
IE_EXPECT_OK(ie_infer_request_get_blob(infer_request, "fc_out", &output_blob));
EXPECT_NE(nullptr, output_blob);
ie_blob_buffer_t out_buffer;
IE_EXPECT_OK(ie_blob_get_buffer(output_blob, &out_buffer));
float *output_data = (float *)(out_buffer.buffer);
EXPECT_NEAR(output_data[9], 0.f, 1.e-5);
}
ie_blob_free(&output_blob);
ie_blob_free(&blob);
ie_infer_request_free(&infer_request);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_infer_request_infer_async, inferAsyncWaitTime) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
IE_EXPECT_OK(ie_network_set_input_precision(network, "data", precision_e::U8));
const char *device_name = "CPU";
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_infer_request_t *infer_request = nullptr;
IE_EXPECT_OK(ie_exec_network_create_infer_request(exe_network, &infer_request));
EXPECT_NE(nullptr, infer_request);
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_infer_request_get_blob(infer_request, "data", &blob));
EXPECT_NE(nullptr, blob);
dimensions_t dims;
IE_EXPECT_OK(ie_blob_get_dims(blob, &dims));
const size_t blob_elems_count = dims.dims[0] * dims.dims[1] * dims.dims[2] * dims.dims[3];
ie_blob_buffer_t buffer;
IE_EXPECT_OK(ie_blob_get_buffer(blob, &buffer));
auto* blob_internal_buffer = (uint8_t*)buffer.buffer;
std::fill(blob_internal_buffer, blob_internal_buffer + blob_elems_count, uint8_t{0});
IE_EXPECT_OK(ie_infer_request_infer_async(infer_request));
ie_blob_t *output_blob = nullptr;
if (!HasFatalFailure()) {
auto waitStatus = ie_infer_request_wait(infer_request, 10);
EXPECT_TRUE((IEStatusCode::OK == waitStatus) || (IEStatusCode::RESULT_NOT_READY == waitStatus));
if (IEStatusCode::RESULT_NOT_READY == waitStatus) {
IE_EXPECT_OK(ie_infer_request_wait(infer_request, -1));
}
IE_EXPECT_OK(ie_infer_request_get_blob(infer_request, "fc_out", &output_blob));
ie_blob_buffer_t out_buffer;
IE_EXPECT_OK(ie_blob_get_buffer(output_blob, &out_buffer));
float *output_data = (float *)(out_buffer.buffer);
EXPECT_NEAR(output_data[9], 0.f, 1.e-5);
}
ie_blob_free(&output_blob);
ie_blob_free(&blob);
ie_infer_request_free(&infer_request);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_infer_request_set_batch, setBatch) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
const char *device_name = "CPU";
ie_config_t config = {"DYN_BATCH_ENABLED", "YES", nullptr};
IE_EXPECT_OK(ie_core_set_config(core, &config, device_name));
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_infer_request_t *infer_request = nullptr;
IE_EXPECT_OK(ie_exec_network_create_infer_request(exe_network, &infer_request));
EXPECT_NE(nullptr, infer_request);
IE_EXPECT_OK(ie_infer_request_set_batch(infer_request, 1));
ie_infer_request_free(&infer_request);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_infer_request_set_batch, setZeroBatch) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
const char *device_name = "CPU";
ie_config_t config = {"DYN_BATCH_ENABLED", "YES", nullptr};
IE_EXPECT_OK(ie_core_set_config(core, &config, device_name));
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_infer_request_t *infer_request = nullptr;
IE_EXPECT_OK(ie_exec_network_create_infer_request(exe_network, &infer_request));
EXPECT_NE(nullptr, infer_request);
EXPECT_EQ(IEStatusCode::GENERAL_ERROR, ie_infer_request_set_batch(infer_request, 0));
ie_infer_request_free(&infer_request);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_infer_request_set_batch, setNegativeBatch) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
const char *device_name = "CPU";
ie_config_t config = {"DYN_BATCH_ENABLED", "YES", nullptr};
IE_EXPECT_OK(ie_core_set_config(core, &config, device_name));
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_infer_request_t *infer_request = nullptr;
IE_EXPECT_OK(ie_exec_network_create_infer_request(exe_network, &infer_request));
EXPECT_NE(nullptr, infer_request);
EXPECT_EQ(IEStatusCode::GENERAL_ERROR, ie_infer_request_set_batch(infer_request, -1));
ie_infer_request_free(&infer_request);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_blob_make_memory, makeMemory) {
dimensions_t dim_t;
dim_t.ranks = 4 ;
dim_t.dims[0] = 1, dim_t.dims[1] = 3, dim_t.dims[2] = 4, dim_t.dims[3] = 4;
tensor_desc tensor;
tensor.dims = dim_t ;
tensor.precision = precision_e::U8;
tensor.layout = layout_e::NCHW;
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor, &blob));
EXPECT_NE(nullptr, blob);
ie_blob_deallocate(&blob);
}
TEST(ie_blob_make_memory_from_preallocated, makeMemoryfromPreallocated) {
dimensions_t dim_t;
dim_t.ranks = 4 ;
dim_t.dims[0] = 1, dim_t.dims[1] = 3, dim_t.dims[2] = 4, dim_t.dims[3] = 4;
tensor_desc tensor;
tensor.dims = dim_t ;
tensor.precision = precision_e::U8;
tensor.layout = layout_e::NCHW;
uint8_t array[1][3][4][4]= {0};
size_t size = 48;
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory_from_preallocated(&tensor, &array, size, &blob));
EXPECT_NE(nullptr, blob);
ie_blob_free(&blob);
}
TEST(ie_blob_make_memory_with_roi, makeMemorywithROI) {
dimensions_t dim_t;
dim_t.ranks = 4 ;
dim_t.dims[0] = 1, dim_t.dims[1] = 3, dim_t.dims[2] = 4, dim_t.dims[3] = 4;
tensor_desc tensor;
tensor.dims = dim_t ;
tensor.precision = precision_e::U8;
tensor.layout = layout_e::NCHW;
ie_blob_t *input_blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor, &input_blob));
EXPECT_NE(nullptr, input_blob);
roi_t roi = {0, 0, 0, 1, 1};
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory_with_roi(input_blob, &roi, &blob));
EXPECT_NE(nullptr, blob);
ie_blob_deallocate(&blob);
ie_blob_free(&input_blob);
}
TEST(ie_blob_deallocate, blobDeallocate) {
dimensions_t dim_t;
dim_t.ranks = 4 ;
dim_t.dims[0] = 1, dim_t.dims[1] = 3, dim_t.dims[2] = 4, dim_t.dims[3] = 4;
tensor_desc tensor;
tensor.dims = dim_t ;
tensor.precision = precision_e::U8;
tensor.layout = layout_e::NCHW;
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor, &blob));
EXPECT_NE(nullptr, blob);
ie_blob_deallocate(&blob);
}
TEST(ie_blob_get_dims, getDims) {
dimensions_t dim_t;
dim_t.ranks = 4 ;
dim_t.dims[0] = 1, dim_t.dims[1] = 3, dim_t.dims[2] = 4, dim_t.dims[3] = 4;
tensor_desc tensor;
tensor.dims = dim_t ;
tensor.precision = precision_e::U8;
tensor.layout = layout_e::NCHW;
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor, &blob));
EXPECT_NE(nullptr, blob);
dimensions_t dim_res;
IE_EXPECT_OK(ie_blob_get_dims(blob, &dim_res));
EXPECT_EQ(dim_t.ranks, dim_res.ranks);
ie_blob_deallocate(&blob);
}
TEST(ie_blob_get_layout, getLayout) {
dimensions_t dim_t;
dim_t.ranks = 4 ;
dim_t.dims[0] = 1, dim_t.dims[1] = 3, dim_t.dims[2] = 4, dim_t.dims[3] = 4;
tensor_desc tensor;
tensor.dims = dim_t ;
tensor.precision = precision_e::U8;
tensor.layout = layout_e::NCHW;
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor, &blob));
EXPECT_NE(nullptr, blob);
layout_e l;
IE_EXPECT_OK(ie_blob_get_layout(blob, &l));
EXPECT_EQ(tensor.layout, l);
ie_blob_deallocate(&blob);
}
TEST(ie_blob_get_precision, getPrecision) {
dimensions_t dim_t;
dim_t.ranks = 4 ;
dim_t.dims[0] = 1, dim_t.dims[1] = 3, dim_t.dims[2] = 4, dim_t.dims[3] = 4;
tensor_desc tensor;
tensor.dims = dim_t ;
tensor.precision = precision_e::U8;
tensor.layout = layout_e::NCHW;
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor, &blob));
EXPECT_NE(nullptr, blob);
precision_e p;
IEStatusCode status3 = ie_blob_get_precision(blob, &p);
EXPECT_EQ(status3, IEStatusCode::OK);
EXPECT_EQ(tensor.precision, p);
ie_blob_deallocate(&blob);
}
TEST(ie_blob_size, getSize) {
dimensions_t dim_t;
dim_t.ranks = 4 ;
dim_t.dims[0] = 1, dim_t.dims[1] = 3, dim_t.dims[2] = 4, dim_t.dims[3] = 4;
tensor_desc tensor;
tensor.dims = dim_t ;
tensor.precision = precision_e::I16;
tensor.layout = layout_e::NCHW;
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor, &blob));
EXPECT_NE(nullptr, blob);
int size_res;
IE_EXPECT_OK(ie_blob_size(blob, &size_res));
EXPECT_EQ(size_res, 48);
ie_blob_deallocate(&blob);
}
TEST(ie_blob_byte_size, getByteSize) {
dimensions_t dim_t;
dim_t.ranks = 4 ;
dim_t.dims[0] = 1, dim_t.dims[1] = 3, dim_t.dims[2] = 4, dim_t.dims[3] = 4;
tensor_desc tensor;
tensor.dims = dim_t ;
tensor.precision = precision_e::I16;
tensor.layout = layout_e::NCHW;
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor, &blob));
EXPECT_NE(nullptr, blob);
int size_res;
IE_EXPECT_OK(ie_blob_byte_size(blob, &size_res));
EXPECT_EQ(size_res, 96);
ie_blob_deallocate(&blob);
}
TEST(ie_blob_get_buffer, getBuffer) {
dimensions_t dim_t;
dim_t.ranks = 4 ;
dim_t.dims[0] = 1, dim_t.dims[1] = 3, dim_t.dims[2] = 4, dim_t.dims[3] = 4;
tensor_desc tensor;
tensor.dims = dim_t ;
tensor.precision = precision_e::U8;
tensor.layout = layout_e::NCHW;
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor, &blob));
EXPECT_NE(nullptr, blob);
ie_blob_buffer_t blob_buffer;
IE_EXPECT_OK(ie_blob_get_buffer(blob, &blob_buffer));
EXPECT_NE(nullptr, blob_buffer.buffer);
ie_blob_deallocate(&blob);
}
TEST(ie_blob_get_cbuffer, getBuffer) {
dimensions_t dim_t;
dim_t.ranks = 4 ;
dim_t.dims[0] = 1, dim_t.dims[1] = 3, dim_t.dims[2] = 4, dim_t.dims[3] = 4;
tensor_desc tensor;
tensor.dims = dim_t ;
tensor.precision = precision_e::U8;
tensor.layout = layout_e::NCHW;
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor, &blob));
EXPECT_NE(nullptr, blob);
ie_blob_buffer_t blob_cbuffer;
IE_EXPECT_OK(ie_blob_get_buffer(blob, &blob_cbuffer));
EXPECT_NE(nullptr, blob_cbuffer.cbuffer);
ie_blob_deallocate(&blob);
}
TEST(ie_infer_set_completion_callback, setCallback) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
IE_EXPECT_OK(ie_network_set_input_precision(network, "data", precision_e::U8));
const char *device_name = "CPU";
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, device_name, &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_infer_request_t *infer_request = nullptr;
IE_EXPECT_OK(ie_exec_network_create_infer_request(exe_network, &infer_request));
EXPECT_NE(nullptr, infer_request);
ie_blob_t *blob = nullptr;
IE_EXPECT_OK(ie_infer_request_get_blob(infer_request, "data", &blob));
dimensions_t dims;
IE_EXPECT_OK(ie_blob_get_dims(blob, &dims));
const size_t blob_elems_count = dims.dims[0] * dims.dims[1] * dims.dims[2] * dims.dims[3];
ie_blob_buffer_t buffer;
IE_EXPECT_OK(ie_blob_get_buffer(blob, &buffer));
auto* blob_internal_buffer = (uint8_t*)buffer.buffer;
std::fill(blob_internal_buffer, blob_internal_buffer + blob_elems_count, uint8_t{0});
ie_complete_call_back_t callback;
callback.completeCallBackFunc = completion_callback;
callback.args = infer_request;
IE_EXPECT_OK(ie_infer_set_completion_callback(infer_request, &callback));
IE_EXPECT_OK(ie_infer_request_infer_async(infer_request));
if (!HasFatalFailure()) {
std::unique_lock<std::mutex> lock(m);
condVar.wait(lock, []{ return ready; });
}
ie_blob_free(&blob);
ie_infer_request_free(&infer_request);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
}
TEST(ie_blob_make_memory_nv12, makeNV12Blob) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_uv = {4, {1, 2, 4, 6}};
tensor_desc tensor_y, tensor_uv;
tensor_y.dims = dim_y;
tensor_uv.dims = dim_uv;
tensor_y.precision = tensor_uv.precision = precision_e::U8;
tensor_y.layout = tensor_uv.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_uv = nullptr, *blob_nv12 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_uv, &blob_uv));
IE_EXPECT_OK(ie_blob_make_memory_nv12(blob_y, blob_uv, &blob_nv12));
ie_blob_free(&blob_nv12);
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_uv);
}
TEST(ie_blob_make_memory_nv12, cannotMakeNV12BlobFromNullptrBlobs) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_uv = {4, {1, 2, 4, 6}};
tensor_desc tensor_y, tensor_uv;
tensor_y.dims = dim_y;
tensor_uv.dims = dim_uv;
tensor_y.precision = tensor_uv.precision = precision_e::U8;
tensor_y.layout = tensor_uv.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_uv = nullptr, *blob_nv12 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_uv, &blob_uv));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_uv);
IE_EXPECT_NOT_OK(ie_blob_make_memory_nv12(blob_y, blob_uv, &blob_nv12));
}
TEST(ie_blob_make_memory_nv12, cannotMakeNV12BlobFromPlanesWithDifferentElementSize) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_uv = {4, {1, 2, 4, 6}};
tensor_desc tensor_y, tensor_uv;
tensor_y.dims = dim_y;
tensor_uv.dims = dim_uv;
tensor_y.precision = precision_e::U8;
tensor_uv.precision = precision_e::FP32;
tensor_y.layout = tensor_uv.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_uv = nullptr, *blob_nv12 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_uv, &blob_uv));
IE_EXPECT_NOT_OK(ie_blob_make_memory_nv12(blob_y, blob_uv, &blob_nv12));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_uv);
}
TEST(ie_blob_make_memory_nv12, cannotMakeNV12BlobFromPlanesWithNonU8Precision) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_uv = {4, {1, 2, 4, 6}};
tensor_desc tensor_y, tensor_uv;
tensor_y.dims = dim_y;
tensor_uv.dims = dim_uv;
tensor_y.precision = tensor_uv.precision = precision_e::FP32;
tensor_y.layout = tensor_uv.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_uv = nullptr, *blob_nv12 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_uv, &blob_uv));
IE_EXPECT_NOT_OK(ie_blob_make_memory_nv12(blob_y, blob_uv, &blob_nv12));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_uv);
}
TEST(ie_blob_make_memory_nv12, cannotMakeNV12BlobWithInconsistentBatchSize) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_uv = {4, {2, 2, 4, 6}};
tensor_desc tensor_y, tensor_uv;
tensor_y.dims = dim_y;
tensor_uv.dims = dim_uv;
tensor_y.precision = tensor_uv.precision = precision_e::U8;
tensor_y.layout = tensor_uv.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_uv = nullptr, *blob_nv12 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_uv, &blob_uv));
IE_EXPECT_NOT_OK(ie_blob_make_memory_nv12(blob_y, blob_uv, &blob_nv12));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_uv);
}
TEST(ie_blob_make_memory_nv12, cannotMakeNV12BlobWithWrongChannelNumber) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_uv = {4, {1, 2, 4, 6}};
tensor_desc tensor_y, tensor_uv;
tensor_y.dims = dim_y;
tensor_uv.dims = dim_uv;
tensor_y.precision = tensor_uv.precision = precision_e::U8;
tensor_y.layout = tensor_uv.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_uv = nullptr, *blob_nv12 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_uv, &blob_uv));
IE_EXPECT_NOT_OK(ie_blob_make_memory_nv12(blob_y, blob_y, &blob_nv12));
IE_EXPECT_NOT_OK(ie_blob_make_memory_nv12(blob_uv, blob_uv, &blob_nv12));
IE_EXPECT_NOT_OK(ie_blob_make_memory_nv12(blob_uv, blob_y, &blob_nv12));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_uv);
}
TEST(ie_blob_make_memory_nv12, cannotMakeNV12BlobWithWrongHeightRation) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_uv = {4, {1, 2, 2, 6}};
tensor_desc tensor_y, tensor_uv;
tensor_y.dims = dim_y;
tensor_uv.dims = dim_uv;
tensor_y.precision = tensor_uv.precision = precision_e::U8;
tensor_y.layout = tensor_uv.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_uv = nullptr, *blob_nv12 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_uv, &blob_uv));
IE_EXPECT_NOT_OK(ie_blob_make_memory_nv12(blob_y, blob_uv, &blob_nv12));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_uv);
}
TEST(ie_blob_make_memory_nv12, cannotMakeNV12BlobWithWrongWidthRation) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_uv = {4, {1, 2, 4, 4}};
tensor_desc tensor_y, tensor_uv;
tensor_y.dims = dim_y;
tensor_uv.dims = dim_uv;
tensor_y.precision = tensor_uv.precision = precision_e::U8;
tensor_y.layout = tensor_uv.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_uv = nullptr, *blob_nv12 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_uv, &blob_uv));
IE_EXPECT_NOT_OK(ie_blob_make_memory_nv12(blob_y, blob_uv, &blob_nv12));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_uv);
}
TEST(ie_blob_make_memory_nv12, NV12BlobInvalidAfterDeallocateYPlane) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_uv = {4, {1, 2, 4, 6}};
tensor_desc tensor_y, tensor_uv;
tensor_y.dims = dim_y;
tensor_uv.dims = dim_uv;
tensor_y.precision = tensor_uv.precision = precision_e::U8;
tensor_y.layout = tensor_uv.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_uv = nullptr, *blob_nv12 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_uv, &blob_uv));
IE_EXPECT_OK(ie_blob_make_memory_nv12(blob_y, blob_uv, &blob_nv12));
ie_blob_deallocate(&blob_y);
ie_blob_buffer_t buffer;
IE_EXPECT_OK(ie_blob_get_buffer(blob_nv12, &buffer));
EXPECT_EQ(nullptr, buffer.buffer);
ie_blob_deallocate(&blob_uv);
ie_blob_free(&blob_nv12);
}
TEST(ie_blob_make_memory_nv12, NV12BlobInvalidAfterDeallocateUVPlane) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_uv = {4, {1, 2, 4, 6}};
tensor_desc tensor_y, tensor_uv;
tensor_y.dims = dim_y;
tensor_uv.dims = dim_uv;
tensor_y.precision = tensor_uv.precision = precision_e::U8;
tensor_y.layout = tensor_uv.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_uv = nullptr, *blob_nv12 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_uv, &blob_uv));
IE_EXPECT_OK(ie_blob_make_memory_nv12(blob_y, blob_uv, &blob_nv12));
ie_blob_deallocate(&blob_uv);
ie_blob_buffer_t buffer;
IE_EXPECT_OK(ie_blob_get_buffer(blob_nv12, &buffer));
EXPECT_EQ(nullptr, buffer.buffer);
ie_blob_deallocate(&blob_y);
ie_blob_free(&blob_nv12);
}
#ifdef ENABLE_GAPI_PREPROCESSING
TEST(ie_blob_make_memory_nv12, inferRequestWithNV12Blob) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
IE_EXPECT_OK(ie_network_set_input_precision(network, "data", precision_e::U8));
IE_EXPECT_OK(ie_network_set_input_layout(network, "data", layout_e::NCHW));
IE_EXPECT_OK(ie_network_set_input_resize_algorithm(network, "data", resize_alg_e::RESIZE_BILINEAR));
IE_EXPECT_OK(ie_network_set_color_format(network, "data", colorformat_e::NV12));
IE_EXPECT_OK(ie_network_set_output_precision(network, "fc_out", precision_e::FP32));
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, "CPU", &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_infer_request_t *infer_request = nullptr;
IE_EXPECT_OK(ie_exec_network_create_infer_request(exe_network, &infer_request));
EXPECT_NE(nullptr, infer_request);
size_t img_width = 224, img_height = 224;
size_t img_size = img_width * (img_height * 3 / 2);
unsigned char *img_data = (unsigned char *)calloc(img_size, sizeof(unsigned char));
EXPECT_NE(nullptr, img_data);
EXPECT_EQ(img_size, read_image_from_file(input_image_nv12, img_data, img_size));
dimensions_t dim_y = {4, {1, 1, img_height, img_width}};
dimensions_t dim_uv = {4, {1, 2, img_height / 2, img_width / 2}};
tensor_desc_t tensor_y, tensor_uv;
tensor_y.dims = dim_y;
tensor_uv.dims = dim_uv;
tensor_y.precision = tensor_uv.precision = precision_e::U8;
tensor_y.layout = tensor_uv.layout = layout_e::NHWC;
const size_t offset = img_width * img_height;
ie_blob_t *blob_y = nullptr, *blob_uv = nullptr, *blob_nv12 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory_from_preallocated(&tensor_y, img_data, img_width * img_height, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory_from_preallocated(&tensor_uv, img_data + offset, img_width * (img_height / 2), &blob_uv));
IE_EXPECT_OK(ie_blob_make_memory_nv12(blob_y, blob_uv, &blob_nv12));
IE_EXPECT_OK(ie_infer_request_set_blob(infer_request, "data", blob_nv12));
IE_EXPECT_OK(ie_infer_request_infer(infer_request));
ie_blob_t *output_blob = nullptr;
IE_EXPECT_OK(ie_infer_request_get_blob(infer_request, "fc_out", &output_blob));
EXPECT_NE(nullptr, output_blob);
ie_blob_buffer_t buffer;
buffer.buffer = nullptr;
IE_EXPECT_OK(ie_blob_get_buffer(output_blob, &buffer));
EXPECT_NE(buffer.buffer, nullptr);
if (buffer.buffer) {
float *output_data = (float *)(buffer.buffer);
EXPECT_NEAR(output_data[1], 0.f, 1.e-5);
}
ie_blob_free(&output_blob);
ie_blob_free(&blob_nv12);
ie_blob_free(&blob_uv);
ie_blob_free(&blob_y);
ie_infer_request_free(&infer_request);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
free(img_data);
}
#endif // ENABLE_GAPI_PREPROCESSING
TEST(ie_blob_make_memory_i420, makeI420Blob) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_u = {4, {1, 1, 4, 6}}, dim_v = {4, {1, 1, 4, 6}};
tensor_desc tensor_y, tensor_u, tensor_v;
tensor_y.dims = dim_y;
tensor_u.dims = dim_u;
tensor_v.dims = dim_v;
tensor_y.precision = tensor_u.precision = tensor_v.precision = precision_e::U8;
tensor_y.layout = tensor_u.layout = tensor_v.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_u = nullptr, *blob_v = nullptr, *blob_i420 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_u, &blob_u));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_v, &blob_v));
IE_EXPECT_OK(ie_blob_make_memory_i420(blob_y, blob_u, blob_v, &blob_i420));
ie_blob_free(&blob_i420);
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_u);
ie_blob_deallocate(&blob_v);
}
TEST(ie_blob_make_memory_i420, cannotMakeI420BlobFromNullptrBlobs) {
dimensions_t dim = {4, {1, 1, 8, 12}};
tensor_desc tensor;
tensor.dims = dim;
tensor.precision = precision_e::U8;
tensor.layout = layout_e::NHWC;
ie_blob_t *blob = nullptr, *blob_i420 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor, &blob));
IE_EXPECT_NOT_OK(ie_blob_make_memory_i420(blob, nullptr, nullptr, &blob_i420));
IE_EXPECT_NOT_OK(ie_blob_make_memory_i420(nullptr, blob, nullptr, &blob_i420));
ie_blob_deallocate(&blob);
}
TEST(ie_blob_make_memory_i420, cannotMakeI420BlobFromPlanesWithDifferentElementSize) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_u = {4, {1, 1, 4, 6}}, dim_v = {4, {1, 1, 4, 6}};
tensor_desc tensor_y, tensor_u, tensor_v;
tensor_y.dims = dim_y;
tensor_u.dims = dim_u;
tensor_v.dims = dim_v;
tensor_y.precision = precision_e::U8;
tensor_u.precision = tensor_v.precision = precision_e::FP32;
tensor_y.layout = tensor_u.layout = tensor_v.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_u = nullptr, *blob_v = nullptr, *blob_i420 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_u, &blob_u));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_v, &blob_v));
IE_EXPECT_NOT_OK(ie_blob_make_memory_i420(blob_y, blob_u, blob_v, &blob_i420));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_u);
ie_blob_deallocate(&blob_v);
}
TEST(ie_blob_make_memory_i420, cannotMakeI420BlobFromPlanesWithNonU8Precision) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_u = {4, {1, 1, 4, 6}}, dim_v = {4, {1, 1, 4, 6}};
tensor_desc tensor_y, tensor_u, tensor_v;
tensor_y.dims = dim_y;
tensor_u.dims = dim_u;
tensor_v.dims = dim_v;
tensor_y.precision = tensor_u.precision = tensor_v.precision = precision_e::FP32;
tensor_y.layout = tensor_u.layout = tensor_v.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_u = nullptr, *blob_v = nullptr, *blob_i420 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_u, &blob_u));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_v, &blob_v));
IE_EXPECT_NOT_OK(ie_blob_make_memory_i420(blob_y, blob_u, blob_v, &blob_i420));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_u);
ie_blob_deallocate(&blob_v);
}
TEST(ie_blob_make_memory_i420, cannotMakeI420BlobFromPlanesWithInconsistentBatchSize) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_u = {4, {2, 1, 4, 6}}, dim_v = {4, {1, 1, 4, 6}};
tensor_desc tensor_y, tensor_u, tensor_v;
tensor_y.dims = dim_y;
tensor_u.dims = dim_u;
tensor_v.dims = dim_v;
tensor_y.precision = tensor_u.precision = tensor_v.precision = precision_e::U8;
tensor_y.layout = tensor_u.layout = tensor_v.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_u = nullptr, *blob_v = nullptr, *blob_i420 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_u, &blob_u));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_v, &blob_v));
IE_EXPECT_NOT_OK(ie_blob_make_memory_i420(blob_y, blob_u, blob_v, &blob_i420));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_u);
ie_blob_deallocate(&blob_v);
}
TEST(ie_blob_make_memory_i420, cannotMakeI420BlobFromPlanesWithWrongChannelNumber) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_u = {4, {1, 2, 4, 6}}, dim_v = {4, {1, 1, 4, 6}};
tensor_desc tensor_y, tensor_u, tensor_v;
tensor_y.dims = dim_y;
tensor_u.dims = dim_u;
tensor_v.dims = dim_v;
tensor_y.precision = tensor_u.precision = tensor_v.precision = precision_e::U8;
tensor_y.layout = tensor_u.layout = tensor_v.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_u = nullptr, *blob_v = nullptr, *blob_i420 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_u, &blob_u));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_v, &blob_v));
IE_EXPECT_NOT_OK(ie_blob_make_memory_i420(blob_y, blob_u, blob_v, &blob_i420));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_u);
ie_blob_deallocate(&blob_v);
}
TEST(ie_blob_make_memory_i420, cannotMakeI420BlobFromPlanesWithWrongWidthRatio) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_u = {4, {1, 1, 4, 4}}, dim_v = {4, {1, 1, 4, 6}};
tensor_desc tensor_y, tensor_u, tensor_v;
tensor_y.dims = dim_y;
tensor_u.dims = dim_u;
tensor_v.dims = dim_v;
tensor_y.precision = tensor_u.precision = tensor_v.precision = precision_e::U8;
tensor_y.layout = tensor_u.layout = tensor_v.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_u = nullptr, *blob_v = nullptr, *blob_i420 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_u, &blob_u));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_v, &blob_v));
IE_EXPECT_NOT_OK(ie_blob_make_memory_i420(blob_y, blob_u, blob_v, &blob_i420));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_u);
ie_blob_deallocate(&blob_v);
}
TEST(ie_blob_make_memory_i420, cannotMakeI420BlobFromPlanesWithWrongHeightRatio) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_u = {4, {1, 1, 2, 6}}, dim_v = {4, {1, 1, 4, 6}};
tensor_desc tensor_y, tensor_u, tensor_v;
tensor_y.dims = dim_y;
tensor_u.dims = dim_u;
tensor_v.dims = dim_v;
tensor_y.precision = tensor_u.precision = tensor_v.precision = precision_e::U8;
tensor_y.layout = tensor_u.layout = tensor_v.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_u = nullptr, *blob_v = nullptr, *blob_i420 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_u, &blob_u));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_v, &blob_v));
IE_EXPECT_NOT_OK(ie_blob_make_memory_i420(blob_y, blob_u, blob_v, &blob_i420));
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_u);
ie_blob_deallocate(&blob_v);
}
TEST(ie_blob_make_memory_i420, I420BlobInvalidAfterDeallocateYPlane) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_u = {4, {1, 1, 4, 6}}, dim_v = {4, {1, 1, 4, 6}};
tensor_desc tensor_y, tensor_u, tensor_v;
tensor_y.dims = dim_y;
tensor_u.dims = dim_u;
tensor_v.dims = dim_v;
tensor_y.precision = tensor_u.precision = tensor_v.precision = precision_e::U8;
tensor_y.layout = tensor_u.layout = tensor_v.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_u = nullptr, *blob_v = nullptr, *blob_i420 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_u, &blob_u));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_v, &blob_v));
IE_EXPECT_OK(ie_blob_make_memory_i420(blob_y, blob_u, blob_v, &blob_i420));
ie_blob_deallocate(&blob_y);
ie_blob_buffer_t i420_buffer;
IE_EXPECT_OK(ie_blob_get_buffer(blob_i420, &i420_buffer));
EXPECT_EQ(nullptr, i420_buffer.buffer);
ie_blob_deallocate(&blob_u);
ie_blob_deallocate(&blob_v);
ie_blob_free(&blob_i420);
}
TEST(ie_blob_make_memory_i420, I420BlobInvalidAfterDeallocateUPlane) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_u = {4, {1, 1, 4, 6}}, dim_v = {4, {1, 1, 4, 6}};
tensor_desc tensor_y, tensor_u, tensor_v;
tensor_y.dims = dim_y;
tensor_u.dims = dim_u;
tensor_v.dims = dim_v;
tensor_y.precision = tensor_u.precision = tensor_v.precision = precision_e::U8;
tensor_y.layout = tensor_u.layout = tensor_v.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_u = nullptr, *blob_v = nullptr, *blob_i420 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_u, &blob_u));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_v, &blob_v));
IE_EXPECT_OK(ie_blob_make_memory_i420(blob_y, blob_u, blob_v, &blob_i420));
ie_blob_deallocate(&blob_u);
ie_blob_buffer_t i420_buffer;
IE_EXPECT_OK(ie_blob_get_buffer(blob_i420, &i420_buffer));
EXPECT_EQ(nullptr, i420_buffer.buffer);
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_v);
ie_blob_free(&blob_i420);
}
TEST(ie_blob_make_memory_i420, I420BlobInvalidAfterDeallocateVPlane) {
dimensions_t dim_y = {4, {1, 1, 8, 12}}, dim_u = {4, {1, 1, 4, 6}}, dim_v = {4, {1, 1, 4, 6}};
tensor_desc tensor_y, tensor_u, tensor_v;
tensor_y.dims = dim_y;
tensor_u.dims = dim_u;
tensor_v.dims = dim_v;
tensor_y.precision = tensor_u.precision = tensor_v.precision = precision_e::U8;
tensor_y.layout = tensor_u.layout = tensor_v.layout = layout_e::NHWC;
ie_blob_t *blob_y = nullptr, *blob_u = nullptr, *blob_v = nullptr, *blob_i420 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory(&tensor_y, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_u, &blob_u));
IE_EXPECT_OK(ie_blob_make_memory(&tensor_v, &blob_v));
IE_EXPECT_OK(ie_blob_make_memory_i420(blob_y, blob_u, blob_v, &blob_i420));
ie_blob_deallocate(&blob_v);
ie_blob_buffer_t i420_buffer;
IE_EXPECT_OK(ie_blob_get_buffer(blob_i420, &i420_buffer));
EXPECT_EQ(nullptr, i420_buffer.buffer);
ie_blob_deallocate(&blob_y);
ie_blob_deallocate(&blob_u);
ie_blob_free(&blob_i420);
}
#ifdef ENABLE_GAPI_PREPROCESSING
TEST(ie_blob_make_memory_i420, inferRequestWithI420) {
ie_core_t *core = nullptr;
IE_ASSERT_OK(ie_core_create("", &core));
ASSERT_NE(nullptr, core);
ie_network_t *network = nullptr;
IE_EXPECT_OK(ie_core_read_network(core, xml, bin, &network));
EXPECT_NE(nullptr, network);
IE_EXPECT_OK(ie_network_set_input_precision(network, "data", precision_e::U8));
IE_EXPECT_OK(ie_network_set_input_layout(network, "data", layout_e::NCHW));
IE_EXPECT_OK(ie_network_set_input_resize_algorithm(network, "data", resize_alg_e::RESIZE_BILINEAR));
IE_EXPECT_OK(ie_network_set_color_format(network, "data", colorformat_e::I420));
IE_EXPECT_OK(ie_network_set_output_precision(network, "fc_out", precision_e::FP32));
ie_config_t config = {nullptr, nullptr, nullptr};
ie_executable_network_t *exe_network = nullptr;
IE_EXPECT_OK(ie_core_load_network(core, network, "CPU", &config, &exe_network));
EXPECT_NE(nullptr, exe_network);
ie_infer_request_t *infer_request = nullptr;
IE_EXPECT_OK(ie_exec_network_create_infer_request(exe_network, &infer_request));
EXPECT_NE(nullptr, infer_request);
size_t img_width = 224, img_height = 224;
size_t img_size = img_width * (img_height * 3 / 2);
unsigned char *img_data = (unsigned char *)calloc(img_size, sizeof(unsigned char));
EXPECT_NE(nullptr, img_data);
EXPECT_EQ(img_size, read_image_from_file(input_image_nv12, img_data, img_size));
dimensions_t dim_y = {4, {1, 1, img_height, img_width}};
dimensions_t dim_u = {4, {1, 1, img_height / 2, img_width / 2}};
dimensions_t dim_v = {4, {1, 1, img_height / 2, img_width / 2}};
tensor_desc_t tensor_y, tensor_u, tensor_v;
tensor_y.dims = dim_y;
tensor_u.dims = dim_u;
tensor_v.dims = dim_v;
tensor_y.precision = tensor_u.precision = tensor_v.precision = precision_e::U8;
tensor_y.layout = tensor_u.layout = tensor_v.layout = layout_e::NHWC;
const size_t offset = img_width * img_height;
ie_blob_t *blob_y = nullptr, *blob_u = nullptr, *blob_v = nullptr, *blob_i420 = nullptr;
IE_EXPECT_OK(ie_blob_make_memory_from_preallocated(&tensor_y, img_data, img_width * img_height, &blob_y));
IE_EXPECT_OK(ie_blob_make_memory_from_preallocated(&tensor_u, img_data + offset, img_width * (img_height / 4), &blob_u));
IE_EXPECT_OK(ie_blob_make_memory_from_preallocated(&tensor_v, img_data + offset * 5 / 4, img_width * (img_height / 4), &blob_v));
IE_EXPECT_OK(ie_blob_make_memory_i420(blob_y, blob_u, blob_v, &blob_i420));
IE_EXPECT_OK(ie_infer_request_set_blob(infer_request, "data", blob_i420));
IE_EXPECT_OK(ie_infer_request_infer(infer_request));
ie_blob_t *output_blob = nullptr;
IE_EXPECT_OK(ie_infer_request_get_blob(infer_request, "fc_out", &output_blob));
ie_blob_buffer_t buffer;
IE_EXPECT_OK(ie_blob_get_buffer(output_blob, &buffer));
float *output_data = (float *)(buffer.buffer);
EXPECT_NEAR(output_data[1], 0.f, 1.e-5);
ie_blob_free(&output_blob);
ie_blob_free(&blob_i420);
ie_blob_free(&blob_v);
ie_blob_free(&blob_u);
ie_blob_free(&blob_y);
ie_infer_request_free(&infer_request);
ie_exec_network_free(&exe_network);
ie_network_free(&network);
ie_core_free(&core);
free(img_data);
}
#endif // ENABLE_GAPI_PREPROCESSING
// clang-format on