Nvidia NvEnc с HVEC вызывает Div на ноль

Я пытаюсь создать аппаратный кодировщик, используя Nvidias NvEnc API. Этот API обеспечивает использование двух кодеков для кодирования любых заданных данных: H264 и HEVC. Так что сначала нужно выбрать один из двух кодов, а уже потом настроить сеанс кодирования или использовать один из варио пресетов. Я делаю это, как описано в .

У меня есть следующий фрагмент кода, вызывающий проблему при использовании кодека HVEC:

//Create Init Params
InitParams* ip = new InitParams();

ip->encodeGUID = m_encoderGuid; //encoder GUID is either H264 or HEVC
ip->encodeWidth = width;
ip->encodeHeight = height;
ip->version = NV_ENC_INITIALIZE_PARAMS_VER;
ip->presetGUID = m_presetGuid; //One of the presets
ip->encodeConfig = NULL; //If using preset, further config should be set to NULL

//Async Encode
ip->enableEncodeAsync = 1;

//Send the InputBuffer in Display Order
ip->enablePTD = 1;

//Causing Div by Zero error if used with HEVC GUID:
CheckApiError(m_apiFunctions.nvEncInitializeEncoder(m_Encoder, ip));

Итак, дело в том, что я использую H264 GUID, и все проходит. Если я использую HEVC, я получаю Div by Zero... Я не получаю какой-либо код ошибки при вызове API, просто простая ошибка div by zero. Итак, мой вопрос: нужна ли HEVC дополнительная информация, которую я не предоставляю с помощью пресета? Если да, то какая информация?

Большое спасибо!

Изменить: Решил это. В Руководстве по программированию не указано, что эти поля должны быть установлены, но NV_ENC_INITIALIZE_PARAMS состоит из frameRateNum и frameRateDen, из-за чего div равен нулю. .. Не знаю, почему этого не происходит при использовании H264. Может кто закроет..


person Christoph    schedule 16.07.2016    source источник
comment
Пожалуйста, добавьте свое решение в виде краткого ответа. Совершенно нормально отвечать на свои вопросы. Это гарантирует, что этот вопрос не будет удален, а ваше решение будет отображаться в результатах поиска.   -  person talonmies    schedule 27.07.2016


Ответы (1)


Итак, это конфигурация, которую я сделал, согласно руководству по программированию NVidia. Как указывалось выше, отсутствие значений для frameRateNum и frameRateDen приводило к ошибке Div by Zero, особенно после начального memset.

//Create Init Params
InitParams* ip = new InitParams();
m_initParams = ip;
memset(ip, 0, sizeof(InitParams));

//Set Struct Version
ip->version = NV_ENC_INITIALIZE_PARAMS_VER;

//Used Codec
ip->encodeGUID = m_encoderGuid;

//Size of the frames
ip->encodeWidth = width;
ip->encodeHeight = height;

//Set to 0, no dynamic resolution changes!
ip->maxEncodeWidth = 0;
ip->maxEncodeHeight = 0;

//Aspect Ratio
ip->darWidth = width;
ip->darHeight = height;

// Frame rate
ip->frameRateNum = 60;
ip->frameRateDen = 1;

//Misc
ip->reportSliceOffsets = 0;
ip->enableSubFrameWrite = 0;

//Preset GUID
ip->presetGUID = m_presetGuid;

//Apply Preset
NV_ENC_PRESET_CONFIG presetCfg;
memset(&presetCfg, 0, sizeof(NV_ENC_PRESET_CONFIG));
presetCfg.version = NV_ENC_PRESET_CONFIG_VER;
presetCfg.presetCfg.version = NV_ENC_CONFIG_VER;
CheckApiError(m_apiFunctions.nvEncGetEncodePresetConfig(m_Encoder,
    m_encoderGuid, m_presetGuid, &presetCfg));
// Copy the Preset Config to member var
memcpy(&m_encodingConfig, &presetCfg.presetCfg, sizeof(NV_ENC_CONFIG));
/************************************************************************/
/* Room for Config Adjustments                                          */
/************************************************************************/

//Set Init configs encoding config
ip->encodeConfig = &m_encodingConfig;

//Async Encode!
ip->enableEncodeAsync = 1;

//Send the InputBuffer in Display Order
ip->enablePTD = 1;


CheckApiError(m_apiFunctions.nvEncInitializeEncoder(m_Encoder, ip));
person Christoph    schedule 27.07.2016