Hi NVIDIA team,
I am running into an unexpected behavior when encoding large images using nvJPEG, and I would appreciate your help in confirming if this might be a bug.
When the image dimensions increase slightly beyond a certain point, nvjpegEncodeGetBufferSize returns an unusually large size_t value. This then seems to cause nvjpegEncodeImage to fail with error code 6 (NVJPEG_STATUS_EXECUTION_FAILED) and destroyed other resource context (like TensorRT).
Based on the returned value, I suspect there might be a 32-bit signed integer overflow happening internally during the buffer size calculation. For example, when encoding an image of 26400 x 13272, the required size calculates as expected (~2.1 GB). However, when the width is slightly increased to 27200 x 13272, the required size jumps to 18446744071580576768.
Interestingly, this massive value corresponds to 0xFFFFFFFF8122C000 in hex, which behaves exactly like a negative 32-bit integer (-2128437248) that has been cast to a 64-bit unsigned size_t.
Request for Confirmation
Could you kindly help confirm if this is indeed a bug caused by integer overflow, or if there is a documented maximum resolution limit for nvjpegEncodeImage that I might have overlooked?
If it is an overflow issue, would it be possible to consider updating the internal calculations to use 64-bit integers in a future release to better support high-resolution images?
Thank you for your time and support!
Minimum reproducible example
#include "nvjpeg.h"
#include "logger.h"
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
bool encode_device_to_jpeg(
NVJPEGBuffer &nv,
const uint8_t *d_image,
int width, int height, int channels,
std::vector<char> &out_file_data,
cudaStream_t stream)
{
nvjpegEncoderState_t encoder_state;
nvjpegEncoderParams_t encoder_params;
nvjpegEncoderStateCreate(nv.nv_handle, &encoder_state, stream);
nvjpegEncoderParamsCreate(nv.nv_handle, &encoder_params, stream);
nvjpegEncoderParamsSetQuality(encoder_params, 100, stream);
nvjpegEncoderParamsSetOptimizedHuffman(encoder_params, 1, stream);
nvjpegEncoderParamsSetSamplingFactors(encoder_params, NVJPEG_CSS_444, stream);
nvjpegImage_t img_desc = {0};
img_desc.channel[0] = (unsigned char *)d_image;
img_desc.pitch[0] = width * channels;
size_t max_stream_length = 0;
nvjpegStatus_t get_size_status = nvjpegEncodeGetBufferSize(
nv.nv_handle, encoder_params, width, height, &max_stream_length);
if (get_size_status == NVJPEG_STATUS_SUCCESS)
{
char buf[128];
snprintf(buf, sizeof(buf), "nvjpegEncodeGetBufferSize required size: %zu bytes for image (%d x %d)", max_stream_length, width, height);
CU_LOG_INFO(buf);
}
nvjpegStatus_t status = nvjpegEncodeImage(
nv.nv_handle, encoder_state, encoder_params,
&img_desc,
NVJPEG_INPUT_BGRI,
width, height,
stream);
if (status != NVJPEG_STATUS_SUCCESS)
{
char buf[128];
snprintf(buf, sizeof(buf), "nvjpegEncodeImage failed with status %d", static_cast<int>(status));
CU_LOG_ERROR(buf);
nvjpegEncoderParamsDestroy(encoder_params);
nvjpegEncoderStateDestroy(encoder_state);
return false;
}
size_t length = 0;
nvjpegEncodeRetrieveBitstream(nv.nv_handle, encoder_state, NULL, &length, stream);
out_file_data.resize(length);
nvjpegEncodeRetrieveBitstream(nv.nv_handle, encoder_state, (unsigned char *)out_file_data.data(), &length, stream);
cudaStreamSynchronize(stream);
nvjpegEncoderParamsDestroy(encoder_params);
nvjpegEncoderStateDestroy(encoder_state);
return true;
}
Relevant log output
Below I post logs of two images demonstrating the sudden jump in the required buffer size and the subsequent failure.
[2026-06-25 15:40:25.613] [info] [testNVJPEG.cpp:34] nvjpegEncodeGetBufferSize required size: 2102286848 bytes for image (26400 x 13272)
[2026-06-25 15:41:20.208] [info] [testNVJPEG.cpp:34] nvjpegEncodeGetBufferSize required size: 18446744071580576768 bytes for image (27200 x 13272)
[2026-06-25 15:41:22.589] [error] [testNVJPEG.cpp:48] nvjpegEncodeImage failed with status 6
Environment
- CUDA Version: [cuda toolkit 12.9]
- GPU Model: [RTX 4060, RTX 4070S, A800 40GB]
- OS: [win11]
- Driver Version: [nvJpeg 12.4.0.16]