2016-07-16 34 views
0

Ich versuche, einen Hardware-Encoder mit Nvidias NvEnc API zu bauen. Diese API bietet die Verwendung von zwei Codecs zur Codierung beliebiger Daten: H264 und HEVC. Zuerst muss man also einen der beiden Codes auswählen und anschließend die Encoding-Session konfigurieren oder eines der verschiedenen Presets verwenden. Ich mache es wie in Nvidias NvEnc Programming Guide beschrieben.Nvidia NvEnc mit HVEC verursacht Div durch Null

Ich habe das folgende Stück Code das Problem verursacht, wenn HVEC Codec:

//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)); 

So ist die Sache noch einmal: Ich bin mit dem H264 GUID und alles läuft. Wenn ich HEVC verwende, bekomme ich einen Div by Zero ... Ich bekomme keinen Fehlercode vom api-Aufruf, nur einen einfachen Div durch Null Fehler. Also meine Frage ist: Braucht HEVC mehr Informationen, die ich nicht mit einer Voreinstellung bereitstellen? Wenn ja, welche Art von Informationen?

Vielen Dank!

Bearbeiten: Gelöst es. Die Programmieranleitung nicht feststellen, dass diese Felder festgelegt werden müssen, aber NV_ENC_INITIALIZE_PARAMS bestehen aus frameRateNum und frameRateDen die die div von Null verursacht ... Keine Ahnung, warum dies nicht der Fall, wenn H264 verwenden. Jemand könnte das schließen ..

+0

Bitte fügen Sie Ihre Lösung als kurze Antwort hinzu. Es ist vollkommen in Ordnung, Ihre eigenen Fragen zu beantworten. Dadurch wird sichergestellt, dass diese Frage nicht gelöscht wird und Ihre Lösung in den Suchergebnissen angezeigt wird. – talonmies

Antwort

0

Also das ist die Konfiguration, die ich getan habe, laut NVidias Programmieranleitung. Wie oben erwähnt, führte das Fehlen von Werten für frameRateNum und frameRateDen zu einem Div by Zero-Fehler, insbesondere nach einem anfänglichen 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));