NVEN C Режим только для ME Сбой OpenEncodeSessionEx () с ошибкой «неверная версия структуры» - PullRequest
0 голосов
/ 27 мая 2020

Я застрял со странным поведением, пытаясь инициализировать NVEN C в режиме ME-only. OpenEncodeSessionEx() всегда терпит неудачу с # 15 - "This indicates that an invalid struct version was used by the client."

Структура параметров выглядит следующим образом:

  NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS session_params = {
    .version = NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER, 
    .deviceType = NV_ENC_DEVICE_TYPE_CUDA,
    .device = ctx,
    .reserved = 0,
    .apiVersion = NVENCAPI_VERSION,
    .reserved1 = 0,
    .reserved2 = NULL
  };
  int ret = encOpenEncodeSessionEx(&session_params, &encoder->enc);

Я пытался вызвать его из разных сред C и Golang, но что бы я ни делал, я получаю эту ошибку. Кодер из образцов NVEN C просто вылетел (segfault). Декодер работает безупречно, а кодировщик - нет.

Кто-нибудь знает, какие именно условия могут вызвать ошибку # 15 - NV_ENC_ERR_INVALID_VERSION?

Я обновил Cuda до 10.2 с драйвером 440.82 - нет удача. Пытался перейти на Cuda 10.0 - все то же самое. Я использую 1060ti GPU.

Кто-нибудь, помогите пожалуйста))

1 Ответ

0 голосов
/ 30 мая 2020

Хорошо, наконец-то разобрался.

Это было так глупо с моей стороны, но проблема была в ключевом слове static (C -язык). Я написал простую оболочку для вызова функции NVEN C, например:

static NVENCSTATUS encOpenEncodeSessionEx(NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS *params, void **encoder) {
  return nvenc_api.nvEncOpenEncodeSessionEx(params, encoder);
}

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

Понятия не имею, ожидаемое это поведение или нет, но оно работает. Всем спасибо.

...