Intel® Integrated Performance Primitives
Deliberate problems developing high-performance vision, signal, security, and storage applications.

JPEG 2000 Decompression performance

Bj__246_rn_Andersson
340 Views
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\\6.1.2.041\\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
Thomas_Jensen1
Beginner
340 Views
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.

0 Kudos
Bj__246_rn_Andersson
340 Views
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.

Thanks
0 Kudos
Vladimir_Dudnik
Employee
340 Views
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

Vladimir
0 Kudos
Thomas_Jensen1
Beginner
340 Views
Yes, when I said IPP_ROOT (actually IPPROOT), I meant an environment variable.
Mine is set as follows:
IPPROOT = C:\Programs\Intel\IPP\6.1.5.054\ia32
0 Kudos
Bj__246_rn_Andersson
340 Views
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?

0 Kudos
Bj__246_rn_Andersson
340 Views
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);

m_diagnOutputPtr->Warning(DiagnDescrCT());
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.
0 Kudos
Reply