I want to use qp delta map in HEVC encoder.
So I Set the qpMapMode. And I add the parameter qpDeltaMap and qpDeltaMapSize in function NvEncoder::DoEncode.
But error is occured in fuction ‘m_nvenc.nvEncEncodePicture’ and ‘NVENC_API_CALL(m_nvenc.nvEncLockBitstream(m_hEncoder, &lockBitstreamData)’.
How can I use qpDeltaMap?
void NvEncoder::DoEncode(NV_ENC_INPUT_PTR inputBuffer, std::vector<std::vector<uint8_t>> &vPacket, NV_ENC_PIC_PARAMS *pPicParams)
{
.
.
.
//qp delta map
uint32_t qpDeltaMapArraySize;
//unsigned int qpDeltaMapArraySize = 0;
int8_t* qpDeltaMapArray;
picParams.version = NV_ENC_PIC_PARAMS_VER;
picParams.pictureStruct = NV_ENC_PIC_STRUCT_FRAME;
picParams.inputBuffer = inputBuffer;
picParams.bufferFmt = GetPixelFormat();
picParams.inputWidth = GetEncodeWidth();
picParams.inputHeight = GetEncodeHeight();
uint32_t widthInMBs = ((picParams.inputWidth + 15) & ~15) >> 4;
uint32_t heightInMBs = ((picParams.inputHeight + 15) & ~15) >> 4;
qpDeltaMapArraySize = widthInMBs*heightInMBs;
//qpDeltaMapArraySize = ((picParams.inputWidth)*(picParams.inputHeight)) / (int)(31.98*31.98);
qpDeltaMapArray = (int8_t*)malloc(qpDeltaMapArraySize * sizeof(int8_t));
memset(qpDeltaMapArray, 0, qpDeltaMapArraySize);
picParams.qpDeltaMapSize = qpDeltaMapArraySize;
picParams.qpDeltaMap = qpDeltaMapArray;
picParams.outputBitstream = m_vBitstreamOutputBuffer[m_iToSend % m_nEncoderBuffer];
//qp delta map
picParams.completionEvent = m_vpCompletionEvent[m_iToSend % m_nEncoderBuffer];
NVENCSTATUS nvStatus = m_nvenc.nvEncEncodePicture(m_hEncoder, &picParams);
if (nvStatus == NV_ENC_SUCCESS || nvStatus == NV_ENC_ERR_NEED_MORE_INPUT)
{
m_iToSend++;
GetEncodedPacket(m_vBitstreamOutputBuffer, vPacket, true);
}
else
{
NVENC_THROW_ERROR("nvEncEncodePicture API failed", nvStatus);
}
}