I followed instructions from the documents to use nvjpegEncodeImage(). However, it always shows Error 2: NVJPEG_STATUS_INVALID_PARAMETER. Is there any requirement for the passed in parameters? Is there any sample code for this function?
Thanks.
Here is my sample code with Error 2.
nvjpegImage_t out;
cudaStream_t stream;
cudaStreamCreate(&stream);
// prepare buffer
// data hold the RGB pixel in CPU and image size is 1920*1080
for(int i=0; i<3; i++){
cudaMalloc((void **)&(out.channel[i]), 1920 * 1080);
out.pitch[i] = 1920;
cudaMemcpy(out.channel[i], data+1920*1080*i, 1920 * 1080, cudaMemcpyHostToDevice);
}
nvjpegHandle_t nv_handle;
nvjpegCheckError(nvjpegCreateSimple(&nv_handle));
//nvjpegCheckError(nvjpegCreate(NVJPEG_BACKEND_DEFAULT, NULL, &nv_handle));
nvjpegEncoderState_t nv_enc_state;
nvjpegEncoderParams_t nv_enc_params;
nvjpegCheckError(nvjpegEncoderStateCreate(nv_handle, &nv_enc_state, stream));
nvjpegCheckError(nvjpegEncoderParamsCreate(nv_handle, &nv_enc_params, stream));
err = nvjpegEncodeImage(nv_handle, nv_enc_state, nv_enc_params, &out, NVJPEG_INPUT_RGB, 1920, 1080, stream);
if (err){
std::cout << "Error in nvJPEG encoding. Error#:" << err << std::endl;
return;
}
cudaStreamSynchronize(stream);
// get compressed stream size
size_t length;
err = NVJPEG_STATUS_SUCCESS;
err = nvjpegEncodeRetrieveBitstream(nv_handle, nv_enc_state, NULL, &length, stream);
if(err){
std::cout << "Error in get length. Error#:" << err << std::endl;
return;
}
cudaStreamSynchronize(stream);
// get stream itself
std::vector<unsigned char> jpeg(length);
nvjpegEncodeRetrieveBitstream(nv_handle, nv_enc_state, jpeg.data(), &length, stream);
cudaStreamSynchronize(stream);
free(data);
cudaFree(out.channel[0]);
cudaFree(out.channel[1]);
cudaFree(out.channel[2]);
nvjpegDestroy(nv_handle);
nvjpegEncoderStateDestroy(nv_enc_state);
nvjpegEncoderParamsDestroy(nv_enc_params);