nvjpegEncodeImage() in nvJPEG Error#2

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

it seems that nvjpegEncoderParamsCreate() cannot set default value for nvjpegChromaSubsampling_t. Make it work by setting parameters using:
nvjpegEncoderParamsSetSamplingFactors(nv_enc_params, NVJPEG_CSS_444, stream);

1 Like

Thank you, I had the same error that gave me incorrect stream size with

nvjpegEncodeRetrieveBitstream

function.

Passing the subsampling manually with

nvjpegEncoderParamsSetSamplingFactors(encoderParameters, NVJPEG_CSS_444, stream)

solved the issue.