Структуры переменной длины

OMX предоставляет структуру со следующим определением

/* Parameter specifying the content URI to use. */
typedef struct OMX_PARAM_CONTENTURITYPE
{
OMX_U32 nSize;
/**< size of the structure in bytes */
OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
OMX_U8 contentURI[1];     /**< The URI name*/
}OMX_PARAM_CONTENTURITYPE;
OMX_IndexParamContentURI,
/**< The URI that identifies the target content. Data type is OMX_PARAM_CONTENTURITYPE. */

У меня есть постоянный массив символов для установки.

char* filename = "/test.bmp";

Насколько я понял, мне нужно каким-то образом установить имя файла memcopy в struct.contentURI, а затем соответствующим образом обновить struct.size. Как мне это сделать?

С наилучшими пожеланиями

1

Решение

Во-первых, вам нужно выделить достаточно памяти для хранения частей фиксированного размера и имени файла:

size_t uri_size = strlen(filename) + 1;
size_t param_size = sizeof(OMX_PARAM_CONTENTURITYPE) + uri_size - 1;
OMX_PARAM_CONTENTURITYPE * param = malloc(param_size);

добавление 1 для включения символа завершения и вычитание 1, поскольку структура уже содержит массив из одного байта.

В C ++ вам понадобится приведение, и вы должны использовать умный указатель или вектор для безопасности исключений:

std::vector<char> memory(param_size);
OMX_PARAM_CONTENTURITYPE * param =
reinterpret_cast<OMX_PARAM_CONTENTURITYPE *>(&memory[0]);

Затем вы можете заполнить поля:

param->nSize = param_size;
param->nVersion = whatever;
memcpy(param->contentURI, filename, uri_size);

и не забудьте free(param) как только вы закончили с этим.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]