38#if __linux__ || __APPLE__
53#include <sys/syslimits.h>
67#if __linux__ || __APPLE__
207 const char *l = (
const char *)p_str;
208 const char *r = (
const char *)p_str1;
211 while (!isdigit(*l) && (*l) !=
'\0')
215 while (!isdigit(*r) && (*r) !=
'\0')
249 snprintf(p_name, max_name_len,
"%s/NI_QUADRA_lck_%c%d",
LOCK_DIR, type, guid);
253 snprintf(p_name, max_name_len,
"%s/NI_lck_%c%d",
LOCK_DIR, type, guid);
273 snprintf(p_name, max_name_len,
"NI_QUADRA_shm_%c%d", type, guid);
277 snprintf(p_name, max_name_len,
"NI_shm_%c%d", type, guid);
284 const ni_device_handle_t device_handle,
286 const int fw_ver_compat_warning,
300 memcpy(device_info->
fw_rev,
301 device_capability->
fw_rev,
302 sizeof(device_info->
fw_rev));
338 const int should_match_rev,
339 const int existing_number_of_devices,
342 int i, j, compatible_device_counter;
349 device_queue->
xcoders[i][j] = -1;
353 compatible_device_counter = 0;
354 for (i = 0; i < existing_number_of_devices; i++)
363 compatible_device_counter++;
367 "Maximum number of supported and compatible devices "
368 "reached. Ignoring other supported and compatible "
382 uint32_t guid_mask[4] = {0};
386 temp_guid = device_queue->
xcoders[device_type][i];
389 guid_mask[temp_guid / 32] |= (1u << ((uint32_t)temp_guid % 32));
393 for (i = 0; i < 4; i++)
395 for (j = 0; j < 32; j++)
397 if ((guid_mask[i] & (1u << j)) == 0)
399 *guidn = (i * 32) + j;
409 const bool device_open_should_succeed,
410 const int should_match_rev,
414 int i, j, fw_compat_cmp;
415 char fw_api_ver_str[5];
418 ni_device_handle_t device_handle;
427 if (device_handle == NI_INVALID_DEVICE_HANDLE)
429 if (device_open_should_succeed)
432 "ERROR: %s(): Failed to add %s\n: Failed ni_device_open2()\n",
453 if (should_match_rev && \
458 "Skipping %s init: device FW v%s incompatible with this version of Libxcoder\n",
471 "%s %s disabled...\n",
478 guid = j ? device_queue->
xcoders[i][j-1] + 1 : 0;
482 "initialized devices exceeds %d\n", __FUNCTION__,
487 device_queue->
xcoders[i][j] = guid;
490 fill_device_info(&device_info,
494 (should_match_rev && fw_compat_cmp) ? 1 : 0,
501 if (fw_compat_cmp < 0) {
503 "Libxcoder supported FW API version\n", device_name,
505 }
else if (fw_compat_cmp > 0) {
507 "Libxcoder supported FW API version\n", device_name,
513 ret_ts = system(
"host_ts.sh");
533 for(i = 0; i <
sizeof(XCODERS_RETRY_LCK_NAME) /
sizeof(XCODERS_RETRY_LCK_NAME[0]); ++i)
535 retry_shm_fd = open(XCODERS_RETRY_LCK_NAME[i], O_RDWR | O_CREAT | O_CLOEXEC | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
542 ni_log(
NI_LOG_ERROR,
"Failed to create %s ERROR: %s\n", XCODERS_RETRY_LCK_NAME[i], errmsg);
588 char shm_name[32] = { 0 };
589 char lck_name[32] = { 0 };
592 HANDLE map_file_handle = NULL;
593 ni_lock_handle_t mutex_handle = NULL;
594 SECURITY_DESCRIPTOR security_descriptor = { 0 };
603 ni_log(
NI_LOG_DEBUG,
"%s(): shm_name %s, lck_name %s\n", __func__, shm_name, lck_name);
606 mutex_handle = CreateMutex(NULL,
609 if (NULL == mutex_handle)
615 if (WAIT_ABANDONED == WaitForSingleObject(mutex_handle, INFINITE))
618 "obtain mutex: %p\n", mutex_handle);
622 InitializeSecurityDescriptor(&security_descriptor, SECURITY_DESCRIPTOR_REVISION);
625 map_file_handle = CreateFileMapping(
626 INVALID_HANDLE_VALUE,
634 if (NULL == map_file_handle)
644 if (ERROR_ALREADY_EXISTS == rc)
651 ni_log(
NI_LOG_INFO,
"CreateFileMapping created a new mapFile for %s, handle: %p ..\n", shm_name, map_file_handle);
663 if (NULL == p_coder_info_map)
673 if (p_coder_info_map)
675 UnmapViewOfFile(p_coder_info_map);
679 ReleaseMutex(mutex_handle);
699 if ((!p_device_context) || (!p_session_context))
749 const int existing_number_of_devices,
754 HANDLE map_file_handle = NULL;
756 map_file_handle = CreateFileMapping(
757 INVALID_HANDLE_VALUE,
765 if (NULL == map_file_handle)
774 if(ERROR_ALREADY_EXISTS == rc)
776 ni_log(
NI_LOG_INFO,
"NETINT resources have been initialized already, exiting ..\n");
777 CloseHandle(map_file_handle);
782 ni_log(
NI_LOG_INFO,
"NETINT resources not initialized, starting initialization ..\n");
794 if (NULL == p_device_queue)
798 CloseHandle(map_file_handle);
807 UnmapViewOfFile(p_device_queue);
808 CloseHandle(map_file_handle);
812 if (WAIT_ABANDONED == WaitForSingleObject(lock, INFINITE))
818 UnmapViewOfFile(p_device_queue);
819 CloseHandle(map_file_handle);
823 fill_shared_memory(p_device_queue,
825 existing_number_of_devices,
826 existing_device_names);
828 UnmapViewOfFile(p_device_queue);
834#elif __linux__ || __APPLE__
844static bool check_correctness_count(
const ni_device_queue_t *existing_device_queue,
845 const int should_match_rev,
846 const int existing_number_of_devices,
852 bool device_found_in_queue;
855 ni_device_handle_t device_handle;
867 for (queue_idx = 0; queue_idx < existing_device_queue->
xcoder_cnt[j]; queue_idx++)
869 guid = existing_device_queue->
xcoders[j][queue_idx];
879 ni_log(
NI_LOG_ERROR,
"ERROR: %s(): guid_map_count[%d] exceeds NI_MAX_DEVICE_CNT\n", __func__, j);
883 guid_map[j][guid_map_count[j]].guid = guid;
889 else if (device_context)
897 for (i = 0; i < existing_number_of_devices; i++)
900 if (device_handle == NI_INVALID_DEVICE_HANDLE)
907 (should_match_rev && \
920 device_found_in_queue =
false;
921 for (queue_idx = 0; queue_idx < guid_map_count[j]; queue_idx++)
925 device_found_in_queue =
true;
929 if (!device_found_in_queue)
937 for (queue_idx = 0; queue_idx < guid_map_count[k]; queue_idx++)
942 "ERROR: %s(): Discovered device %s is not in queue for module %s but is in %s\n",
965 "WARNING: %s(): Discovered %u %s, expected %u\n",
976 const int existing_number_of_devices,
984 for (i = 0; i < existing_number_of_devices; i++)
988 module_id = existing_device_queue->
xcoders[j][i];
998 "WARNING: %s(): Missing device context for %s %s\n",
1017static void sigbus_handler(
int signal)
1022static void setup_signal_handler(
struct sigaction *p,
const int signum)
1026 memset(&c, 0,
sizeof(
struct sigaction));
1027 if (sigemptyset(&c.sa_mask) == -1)
1030 "ERROR: %s(): Could not initialize signal set: %d\n",
1035 c.sa_handler = sigbus_handler;
1037 if (sigaction(signum, NULL, p) == -1)
1040 "ERROR: %s(): Could not save previous signal handler: %d\n",
1046 if (sigaction(signum, &c, NULL) == -1)
1049 "ERROR: %s(): Could not register signal handler: %d\n",
1058 const int should_match_rev,
1059 const int existing_number_of_devices,
1062 bool result =
false;
1064 const int signum = SIGBUS;
1067 setup_signal_handler(&p, signum);
1069 if (sigsetjmp(env, 1))
1075 if (!check_correctness_count(existing_device_queue,
1077 existing_number_of_devices,
1083 if (!check_device_queue(existing_device_queue,
1084 existing_number_of_devices,
1095 if (sigaction(signum, &p, NULL) == -1)
1098 "ERROR: %s(): Could not restore previous signal handler: %d\n",
1108 const int existing_number_of_devices,
1112 int return_value = 0;
1115 ni_rsrc_shm_state state = NI_RSRC_SHM_IS_INVALID;
1116 int flags = O_CREAT | O_RDWR | O_CLOEXEC;
1117 mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
1120 if ((ni_rsrc_try_get_shm_lock(
CODERS_LCK_NAME, flags, mode, &lck_fd) < 0) ||
1129 (
void **)&p_device_queue)) < 0) {
1136 if (NI_RSRC_SHM_IS_EXISTED == state) {
1137 if (check_correctness(p_device_queue,
1139 existing_number_of_devices,
1140 existing_device_names))
1148 if (lockf(lck_fd, F_ULOCK, 0) < 0) {
1154#ifndef __OPENHARMONY__
1157 ni_rsrc_remove_all_shm();
1159 if (limit_depth <= 0)
1164 existing_number_of_devices,
1165 existing_device_names,
1169 fill_shared_memory(p_device_queue,
1171 existing_number_of_devices,
1172 existing_device_names);
1175 if (p_device_queue && p_device_queue != MAP_FAILED) {
1177 p_device_queue = NULL;
1182 if (lockf(lck_fd, F_ULOCK, 0) < 0) {
1189#ifndef __OPENHARMONY__
1195 return return_value;
1207 int32_t shm_fd = -1;
1208 ni_rsrc_shm_state state = NI_RSRC_SHM_IS_INVALID;
1210 int flags = O_CREAT | O_RDWR | O_CLOEXEC;
1211 mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
1212 char shm_name[32] = { 0 };
1213 char lck_name[32] = { 0 };
1216 if(! p_device_info) {
1223 ni_log(
NI_LOG_DEBUG,
"%s(): shm_name %s, lck_name %s\n", __func__, shm_name, lck_name);
1225 if (ni_rsrc_try_get_shm_lock(lck_name, flags, mode, (
int *)&lock) < 0) {
1230 if (ni_rsrc_open_shm(shm_name,
1233 (
int *)&shm_fd) < 0) {
1238 if ((ni_rsrc_mmap_shm(shm_name,
1241 (
void **)&p_coder_info_dst)) < 0) {
1248#ifndef __OPENHARMONY__
1249 if (msync((
void*)p_coder_info_dst,
sizeof(
ni_device_info_t), MS_SYNC | MS_INVALIDATE)) {
1260 if (p_coder_info_dst && p_coder_info_dst != MAP_FAILED) {
1262 p_coder_info_dst = NULL;
1266#ifndef __OPENHARMONY__
1272 if (lockf(lock, F_ULOCK, 0) < 0) {
1273 ni_log(
NI_LOG_ERROR,
"Will exit from %s(), but failed to unlock lck_fd for %s\n", __func__, shm_name);
1292 if ((!p_device_context) || (!p_session_context))
1327 "p_device_info: %s\n", __func__, errmsg);
1346 char *domain,
char *slot,
char *dev,
char *func)
1354 char path[PATH_MAX];
1357 if(!device_name || !strstr(device_name,
"/dev/nvme") || !pcie)
1363 char *start = device_name + 5;
1366 snprintf(path,
sizeof(path),
"/sys/block/%s", start);
1370 char target[PATH_MAX];
1372 ssize_t len = readlink(path, target,
sizeof(target) - 1);
1381 char *saveptr = NULL;
1383 pcie[4] = pcie[7] =
':';
1386 while(ptr != NULL) {
1388 if (strlen(ptr) == 12)
1390 ret = sscanf(ptr,
"%4c:%2c:%2c.%1c", pcie, pcie+5,pcie+8,pcie+11);
1403 if (!domain || !slot || !dev || !func)
1407 domain[4] = slot[2] = dev[2] = func[1] =
'\0';
1408 sscanf(pcie,
"%4[^:]:%2[^:]:%2[^.].%1s", domain, slot, dev, func);
1409 ni_log2(NULL,
NI_LOG_DEBUG,
"\t%d: Domain: %s, Slot: %s, Device: %s, Function: %s\n", i, domain, slot, dev, func);
1429ni_retcode_t ni_rsrc_try_get_shm_lock(
const char *lck_name,
1436 if (!lck_name || !lck_fd) {
1443 if (0 != mkdir(
LOCK_DIR, S_IRWXU | S_IRWXG | S_IRWXO)) {
1451 lock = open(lck_name, flags, mode);
1455 __func__, lck_name, errmsg);
1461 while (lockf(lock, F_TLOCK, 0) != 0)
1465 if (retry_cnt >= 900)
1468 ni_log(
NI_LOG_ERROR,
"ERROR %s() lockf() %s fail: %s\n", __func__, lck_name, errmsg);
1469 ni_log(
NI_LOG_ERROR,
"ERROR %s() If persists, stop traffic and run rm /dev/shm/NI_*\n", __func__);
1480#if defined(__OPENHARMONY__)
1481static ni_retcode_t openharmony_open_shm(
const char *shm_name,
1483 ni_rsrc_shm_state *state,
1487 int flag = IPC_CREAT | IPC_EXCL;
1488 char shm_path[PATH_MAX];
1490 if (!shm_name || !shm_fd) {
1495 memset(shm_path, 0, PATH_MAX);
1496 snprintf(shm_path, PATH_MAX,
"%s/%s",
LOCK_DIR, shm_name);
1500 if (0 != access(shm_path, F_OK)) {
1501 int fd = open(shm_path, O_RDWR | O_CREAT | O_CLOEXEC,
1502 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
1505 ni_log(
NI_LOG_ERROR,
"ERROR: %s() open() %s fail: %s\n", __func__, shm_name, errmsg);
1513 key_t key = ftok(shm_path, PROJ_ID);
1520 *state = NI_RSRC_SHM_IS_CREATED;
1523 mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
1524 shm_id = shmget(key, shm_size, mode | flag);
1527 *state = NI_RSRC_SHM_IS_EXISTED;
1529 shm_id = shmget(key, shm_size, mode | flag);
1543static ni_retcode_t openharmony_remove_shm(
const char *shm_name,
1547 char shm_path[PATH_MAX];
1554 memset(shm_path, 0, PATH_MAX);
1555 snprintf(shm_path, PATH_MAX,
"%s/%s",
LOCK_DIR, shm_name);
1558 if (0 != access(shm_path, F_OK)) {
1564 key_t key = ftok(shm_path, PROJ_ID);
1572 mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
1573 shm_id = shmget(key, shm_size, mode);
1580 shmctl(shm_id, IPC_RMID,
nullptr);
1585#elif defined(_ANDROID)
1586static ni_retcode_t android_open_shm(
const char *shm_name,
1588 ni_rsrc_shm_state *state,
1591 int shm_fd_tmp = -1;
1593 if (!shm_name || !shm_fd) {
1604 *state = NI_RSRC_SHM_IS_CREATED;
1606 string param = shm_name;
1607 Return<void> retvalue =
1608 service->GetAppFlag(param, [&](int32_t ret, hidl_handle handle) {
1610 *state = NI_RSRC_SHM_IS_EXISTED;
1611 shm_fd_tmp = dup(handle->data[0]);
1617 if (!retvalue.isOk()) {
1622 if (shm_fd_tmp < 0) {
1623 int fd = ashmem_create_region(shm_name, shm_size);
1625 native_handle_t *native_handle = native_handle_create(1, 0);
1626 if (!native_handle) {
1630 native_handle->data[0] = fd;
1633 handle.setTo(native_handle,
true);
1634 service->SetAppFlag(param, handle);
1635 shm_fd_tmp = dup(fd);
1641 *shm_fd = shm_fd_tmp;
1646static ni_retcode_t android_remove_shm(
const char *shm_name,
1660 string param = shm_name;
1661 Return<void> retvalue =
service->RemoveAppFlag(param);
1662 if (!retvalue.isOk()) {
1678 Return<void> retvalue =
service->RemoveAllAppFlags();
1679 if (!retvalue.isOk()) {
1688static ni_retcode_t linux_open_shm(
const char *shm_name,
1690 ni_rsrc_shm_state *state,
1693 int shm_fd_tmp = -1;
1694 const mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
1695 int flag = O_CREAT | O_EXCL | O_RDWR;
1696 bool skip_ftruncate =
false;
1698 if (!shm_name || !shm_fd) {
1703 *state = NI_RSRC_SHM_IS_CREATED;
1706 shm_fd_tmp = shm_open(shm_name, flag, mode);
1707 if (shm_fd_tmp < 0) {
1709 skip_ftruncate =
true;
1710 *state = NI_RSRC_SHM_IS_EXISTED;
1712 shm_fd_tmp = shm_open(shm_name, flag, mode);
1715 if (shm_fd_tmp < 0) {
1719 __func__, shm_name, errmsg);
1725 if (!skip_ftruncate && ftruncate(shm_fd_tmp, shm_size) < 0) {
1727 shm_unlink(shm_name);
1731 *shm_fd = shm_fd_tmp;
1757 ni_rsrc_shm_state *state,
1760#if defined(__OPENHARMONY__)
1761 return openharmony_open_shm(shm_name, shm_size, state, shm_fd);
1762#elif defined(_ANDROID)
1763 return android_open_shm(shm_name, shm_size, state, shm_fd);
1765 return linux_open_shm(shm_name, shm_size, state, shm_fd);
1788 if (!shm_name || !shm_addr) {
1794#ifdef __OPENHARMONY__
1795 *shm_addr = shmat(shm_fd,
nullptr, 0);
1796 if ((
void *)(-1) == *shm_addr) {
1803 *shm_addr = mmap(0, shm_size, PROT_READ | PROT_WRITE,
1804 MAP_SHARED, shm_fd, 0);
1805 if (MAP_FAILED == *shm_addr) {
1835#ifdef __OPENHARMONY__
1838 munmap(shm_addr, shm_size);
1859#ifdef __OPENHARMONY__
1860 return openharmony_remove_shm(shm_name, shm_size);
1861#elif defined(_ANDROID)
1862 return android_remove_shm(shm_name, shm_size);
1864 shm_unlink(shm_name);
1883 struct dirent *dirent;
1884 char path_to_remove[PATH_MAX];
1897 while ((dirent = readdir(dir)) != NULL) {
1898 if (strncmp(dirent->d_name,
"NI_", 3) != 0) {
1902 snprintf(path_to_remove, PATH_MAX,
"%s/%s",
LOCK_DIR, dirent->d_name);
1905 if (strncasecmp(dirent->d_name,
"NI_SHM", 6) == 0) {
1906#ifdef __OPENHARMONY__
1907 openharmony_remove_shm(dirent->d_name, 1);
1909 shm_unlink(dirent->d_name);
1914 remove(path_to_remove);
1918 android_remove_all_shm();
1921 if (closedir(dir) == -1) {
#define NI_XCODER_REVISION_API_MAJOR_VER_IDX
#define NI_MAX_DEVICE_CNT
#define NI_XCODER_REVISION
#define NI_MAX_DEVICE_NAME_LEN
@ NI_DEVICE_TYPE_XCODER_MAX
#define GET_XCODER_DEVICE_TYPE(t)
#define GET_XCODER_DEVICE_TYPE_STR(t)
@ NI_RETCODE_ERROR_LOCK_DOWN_DEVICE
@ NI_RETCODE_INVALID_PARAM
ni_retcode_t ni_query_fl_fw_versions(ni_device_handle_t device_handle, ni_device_info_t *p_dev_info)
Query firmware loader and firmware versions from the device.
ni_retcode_t ni_device_capability_query2(ni_device_handle_t device_handle, ni_device_capability_t *p_cap, bool device_in_ctxt)
Query device and return device capability structure This function had replaced ni_device_capability_q...
void ni_device_close(ni_device_handle_t device_handle)
Close device and release resources.
ni_device_handle_t ni_device_open2(const char *p_dev, ni_device_mode_t mode)
Open device and return device device_handle if successful.
Public definitions for operating NETINT video processing devices for video processing.
#define NI_PARAM_AV1_MAX_HEIGHT
#define NI_PARAM_AV1_MAX_WIDTH
#define NI_MIN_RESOLUTION_WIDTH_JPEG
#define MAX_CHAR_IN_DEVICE_NAME
#define NI_MIN_RESOLUTION_HEIGHT_JPEG
void ni_log2(const void *p_context, ni_log_level_t level, const char *fmt,...)
print log message and additional information using ni_log_callback,
void ni_log(ni_log_level_t level, const char *fmt,...)
print log message using ni_log_callback
Private definitions for interfacing with NETINT video processing devices over NVMe.
int ni_nvme_enumerate_devices(char ni_devices[][NI_MAX_DEVICE_NAME_LEN], int max_handles)
void ni_rsrc_free_device_context(ni_device_context_t *p_device_context)
Free previously allocated device context.
Public definitions for managing NETINT video processing devices.
#define NI_LEVELS_SUPP_STR_LEN
#define NI_PROFILES_SUPP_STR_LEN
#define NI_ADDITIONAL_INFO_STR_LEN
LIB_API ni_device_context_t * ni_rsrc_get_device_context(ni_device_type_t type, int guid)
Allocates and returns a pointer to ni_device_context_t struct based on provided device_type and guid....
Public definitions for managing NETINT video processing devices on Android.
android::sp< INidec > service
int ni_rsrc_android_init()
Init android net.int.SharedBuffer service for binder using.
uint32_t g_xcoder_stop_process
void ni_rsrc_get_shm_name(ni_device_type_t device_type, int32_t guid, char *p_name, size_t max_name_len)
ni_retcode_t ni_rsrc_fill_device_info(ni_device_info_t *p_device_info, ni_codec_t fmt, ni_device_type_t type, ni_hw_capability_t *p_hw_cap)
ni_retcode_t ni_rsrc_create_retry_lck()
void ni_rsrc_get_lock_name(ni_device_type_t device_type, int32_t guid, char *p_name, size_t max_name_len)
bool add_to_shared_memory(const char device_name[NI_MAX_DEVICE_NAME_LEN], const bool device_open_should_succeed, const int should_match_rev, ni_device_queue_t *device_queue)
int ni_rsrc_strcmp(const void *p_str, const void *p_str1)
bool find_available_guid(ni_device_queue_t *device_queue, int device_type, int *guidn)
Private definitions used by ni_rsrc_api.cpp for management of NETINT video processing devices.
void ni_rsrc_update_record(ni_device_context_t *p_device_context, ni_session_context_t *p_session_ctx)
void ni_rsrc_get_one_device_info(ni_device_info_t *p_device_info)
int ni_rsrc_enumerate_devices(char ni_devices[][NI_MAX_DEVICE_NAME_LEN], int max_handles)
int ni_rsrc_init_priv(const int should_match_rev, const int existing_number_of_devices, const char device_names[NI_MAX_DEVICE_CNT][NI_MAX_DEVICE_NAME_LEN], int limit_depth)
void get_dev_pcie_addr(char *device_name, char *pcie, char *domain, char *slot, char *dev, char *func)
ni_retcode_t ni_strncpy(char *dest, size_t dmax, const char *src, size_t slen)
void ni_fmt_fw_api_ver_str(const char ver_str[], char fmt_str[])
Get formatted FW API version string from unformatted FW API version string.
ni_retcode_t ni_strerror(char *dest, size_t dmax, int errnum)
char * ni_strtok(char *s, const char *delim, char **saveptr)
void ni_usleep(int64_t usec)
int ni_cmp_fw_api_ver(const char ver1[], const char ver2[])
Compare two 3 character strings containing a FW API version. Handle comparision when FW API version f...
uint8_t xcoder_cnt[NI_DEVICE_TYPE_XCODER_MAX]
uint8_t fw_commit_time[26]
uint8_t serial_number[20]
uint8_t fw_commit_hash[41]
ni_hw_capability_t xcoder_devices[NI_MAX_DEVICES_PER_HW_INSTANCE]
uint8_t fw_branch_name[256]
uint8_t fw_build_time[26]
ni_device_info_t * p_device_info
uint8_t fw_commit_time[26]
uint8_t serial_number[20]
char dev_name[NI_MAX_DEVICE_NAME_LEN]
uint8_t fw_commit_hash[41]
char blk_name[NI_MAX_DEVICE_NAME_LEN]
ni_sw_instance_info_t sw_instance[NI_MAX_CONTEXTS_PER_HW_INSTANCE]
int fw_ver_compat_warning
ni_device_type_t device_type
uint8_t fw_branch_name[256]
uint8_t fw_build_time[26]
ni_device_video_capability_t dev_cap[EN_CODEC_MAX]
int32_t xcoders[NI_DEVICE_TYPE_XCODER_MAX][NI_MAX_DEVICE_CNT]
uint32_t xcoder_cnt[NI_DEVICE_TYPE_XCODER_MAX]
char level[NI_LEVELS_SUPP_STR_LEN]
char profiles_supported[NI_PROFILES_SUPP_STR_LEN]
char additional_info[NI_ADDITIONAL_INFO_STR_LEN]
uint16_t min_video_height
uint16_t max_video_height
uint8_t max_number_of_contexts
ni_context_query_t context_status[NI_MAX_CONTEXTS_PER_HW_INSTANCE]
ni_load_query_t load_query
ni_sw_instance_status_t status