Intel® Integrated Performance Primitives
Community support and discussions relating to developing high-performance vision, signal, security, and storage applications.

JPEG 2000 Decompression performance

I am currently working on JPEG2000 Decoder DLL, based on the Picnic application. For the picnic application i am achieving a decoding performance of 26ms per frame with a Dual core ~3GHz machine. I need to achieve a performance of about 13ms per frame. I am decoding 640*480 color jpeg2000 image files.

Question 1:
How can I optimize the Picnic application for better performance? What if I use precompiled UIC DLLs instead of adding the source files as in the Picnic project. Any suggestions?

Question 2:
I'm having trouble building the UIC dlls myself from the samples download, using build32.bat in \\Intel\\IPP\\\\ia32\\Samples\\en_US\\ipp-samples\\image-codecs\\uic. I am getting these errors.

Start components compile
Building: Only UIC
******* uic_core PASSED
******* uic_io PASSED
******* uic_dss PASSED
******* uic_bmp PASSED
******* uic_pnm PASSED
******* uic_jpeg FAILED {see log file for details}
******* uic_jpeg2000 PASSED
******* ipp_zlib PASSED
******* uic_png FAILED {see log file for details}
******* uic_core_dotnet PASSED
******* uic_io_dotnet PASSED
******* uic_jpeg_dotnet FAILED {see log file for details}
******* uic_transcoder_con FAILED {see log file for details}
There were errors found

For example, in the log file for uic_transcoder_con I get this error " LINK : fatal error LNK1146: no argument specified with option '/LIBPATH:' "

Any ideas what is wrong?
0 Kudos
6 Replies
As for Jpeg2000 performance, there is a parameter that influences it:
param_jpeg2k.precision = J2K_16;
param_jpeg2k.precision = J2K_32;

J2K_16 is faster, and is okey for channels <=8 bit (such as 24 bit RGB).
If >8 bit is used (such as in 16 bit grayscale), J2K_32 must be used.

This is what I have deducted by testing, as Intel has no documentation for this parameter.

As for your building problem, I always make sure IPP_ROOT = the ia32 folder.

Thanks for the reply Thomas,

I will try the J2K_16 setting and see how it goes.

I'm not sure how to set the IPPROOT directory though. The readme says:
Set up your build environment by creating an environment variable named IPPROOT that points to the root directory of your Intel IPP installation.

Problem is I don't know what that means or how to do that.

On most of Windows system you can set up desired environment variable by right click on My Computer icon, choosing Properties from pop-up menu, select Advanced tab and click on Environemnt Variables button

Yes, when I said IPP_ROOT (actually IPPROOT), I meant an environment variable.
Mine is set as follows:
IPPROOT = C:\Programs\Intel\IPP\\ia32
Thanks guys,

Now i'm trying to decode a motion jpeg2000 stream. I get about 70 erronous frames out of 100 frames, which is way too much. Using another decoder its about 1% errors. The JPEG2000Decoder::ReadData returns an the error. I have saved two frames, one that failed and one that succeeded, and i thought someone else could try them and see if they work for them. I've already tried with Picnic and it does the same as my application.

The image looks a bit strange since it is 4:2:2 planar YCbCr shown in interleaved RGB, but that does not matter.

Another thing. What does the AlignStep function in the samples and documentation pdf do?

Seems i was to quick to assume that the file is intact. Using another video, there are not many error frames.

I investigated the error and its when ReadData calls ReadNextTilePartHeader() the second time. Then it reads the second tile-part header.

// search next tile-part header (mostly theoretical protection
// from damage because tile-parts should follow inseparable
// in the current version of JPEG 2000 standard)
JP2Marker marker = ReadMarker(stream);

while (marker != SOT)
if(marker == EOC)
m_isNextTilePartExist = false;
return false;

unsigned int markerSize = ReadMarkerBodySize(stream);

stream.Seek(markerSize); <-----This one throws an exception in OnLackOfData()

marker = ReadMarker(stream);

virtual void OnLackOfData()
throw DiagnDescrCT();

Since the file seems to be corrupt I will not try to look into this more unless someone here actually knows what is causing this.