NVJPEG issues and inconsistencies with transcoding

I have followed the NVJPEG transcoder example from NVIDIA documentation, and I am observing some strange results with CUDA 11.6.

Specifically, the function nvjpegEncoderParamsCopyHuffmanTables doesn’t seem to actually copy Huffman tables to encoded image. I have verified using JPEGSnoop tool that Huffman tables in the encoded image are not only reordered (DC->AC->DC->AC instead of DC->DC, AC->AC), but also different compared to the source image.

Source image I used for testing was created using Photoshop (dimensions 1155 x 1140) and the same image was saved as Baseline Standard, Baseline Optimized, and as Progressive with 3, 4, and 5 scans, all of them with Quality 12.

Where Photoshop produces 107.50 KB baseline standard and 31.61 KB baseline optimized image, NVJPEG transcoding of those images with copied quantization and Huffman tables results in 62.77 KB output image.

Where Photoshop produces 24.38 KB progressive JPEG with 3 scans, NVJPEG transcoding of that image with copied quantization and Huffman tables results in 131.68 KB output image.

Furthermore, I have encountered one image which when transcoded in this way has corruption in the output. If I re-save that image with Photoshop and transcode it, then it is ok just like any other images I tested with.

Moreover, transcoding CMYK JPEG images is not possible using the NVIDIA transcoder sample code, because the NVJPEG library is incorrectly returning NVJPEG_CSS_UNKNOWN subsampling when parsing CMYK JPEG image. Here we get to the NVJPEG API design issue – chroma subsampling enum does not have subsampling values for 4 component streams such as YCCK. I am not sure which subsampling factors are supported for CMYK JPEG (YCCK), but at least 4444 should be supported (which would mean no subsampling on any component).

If you call nvjpegEncoderParamsSetSamplingFactors() passing NVJPEG_CSS_UNKNOWN which you get from nvjpegGetImageInfo() or nvjpegJpegStreamGetChromaSubsampling() it will of course error out, and I am not sure that even copying quantization and Huffman tables would work in that case.

Finally, NVJPEG still does not decode CMYK JPEG correctly (colors are totally wrong) even though I reported it here long time ago.

If someone from NVIDIA team can respond I can send them the CMYK image and the problematic image that gets corrupted on transcoding for testing along with a Visual Studio project in a private message.

It’s probably best to file a bug. The bug handling team will likely want a full, complete example code that demonstrates what you are doing. They will also be able to provide you with a method to send file attachments and whatnot if needed.

@Robert_Crovella Ok, I’ll do that.

@Robert_Crovella I have submitted a bug report with a reproducible test case as you suggested. Behavior I observed has been confirmed. Bug ID is 3632945 in case anyone else hits any of the issues I mentioned here.

Any updates?

They said it should be fixed in the next major CUDA release. I guess that will be when 4000 series is launched.

Is it fixed?

Depends on what part of my complaint do you mean.

For example nvjpegEncoderParamsCopyHuffmanTables has been “fixed” by being deprecated, because it really doesn’t make sense. If you want optimized Huffman tables there is a way to request it from the encoder.

The progressive decoding corruption issue was fixed in 12.0 if I am not mistaken (check release notes to be sure).

CMYK to RGB color conversion will hopefully become public in 12.x release.