Using LZSS Compression Functions

Using LZSS Compression Functions

I'm using the example code from Intel® Integrated Performance Primitives Reference Manual, Volume 1: Signal Processing on LZSS Compression. This document indicates that some of the functions have been Deprecated.  Two of the function used in the example are part of these deprecated function.  The first one is

IppStatus ippsEncodeLZSSInitAlloc_8u (IppLZSSState_8u** ppLZSSState);
and the second one is  
void ippsLZSSFree_8u (IppLZSSState_8u* pLZSSState);
 The warning when I use ippsEncodeLZSSInitAlloc() indicates that I should use the GetSize and Init pair to replace this functionality.  But there is no corresponding functions indicated in place of LZSSFree.  My research indicate the reason for these function being deprecated is that Internal memory allocation will not be supported at some point. This indicates to me that I will need to do the memory allocation, but I don't understand how to do this. The above document indicates that function ippsEncodeLZSSInit_8u(),  initializes the LZSS state structure pLZSSState in the external buffer. But I don't see were or how the external buffer is allocated. But when I call ippsLZSSGetSize() it returns a size indicating that the buffer has been allocated.  If it has been allocated, how do I de-allocate it? Or is that being done automatically?  Is there some way to change the size of this buffer?

10 posts / 0 new
Last post
For more complete information about compiler optimizations, see our Optimization Notice.

One more thing, when I try to use

IppStatus ippsEncodeLZSSInit_8u (IppLZSSState_8u* pLZSSState);
using variable
 IppLZSSState_8u *pLZSSState;
I get the following error: Run-Time Check Failure #3 - The variable 'pLZSSState' is being used without being initialized. How do I initialize pLZSSState?

Hi Yolanda,

Regarding your first topic, you are right, IPP is deprecating internal memory allocation. Internal mallocs are not effective, often contradict with application's usage models and so on. So, you need to allocate and free dynamic memory by yourself. If majority of cases, the usage model is the following:
1) call ippGetSise(&size) function to determine the minimum amount of memory IPP functions will need
2) allocate the requested memory using any of OS functions for dynamic memory (malloc, VirtualAlloc, whatever), assigning the obtained address to ippState pointer
3) use other ipp functions providing the above pointer
4) free dynamic memory using proper OS function (free, VirtualFree and so on).

Regarding your second topic, did you assign any obtained dynamic address to pLZSSState variable?

Regards,
Sergey

Regards,
Sergey

Hello Sergey,
Thank you for your response. Just to clarify, I can use any dynamic memory allocation method (ie new) or does it need to be one specific to Intel?
In regards to the second question, no.
Thank you for your help.
Yolanda

Hello again Sergey,

Next question, on the buffer. What is the data type? Char or Ipp8u or ?? Do you have any examples using and external buffer? It would really help I had some simple examples that didn't use the deprecated functions. Not just for LZSS Compression, but also for the other methods of data compression supported.

Yolanda

Quote:

Yolanda Maxwell wrote:

I can use any dynamic memory allocation method (ie new) or does it need to be one specific to Intel?


Hi Yolanda,

You can use any method. There is no Intel-specific memory allocation procedures, only recommendations to use aligned addresses, which come from Intel architecture specifics. IPP's memory management functions are just wrappers around OS' functions (with 32-byte address alignment for better performance). "new" and "delete" operators are also ok.

Regards,
Sergey

Regards,
Sergey

Quote:

Yolanda Maxwell wrote:

What is the data type? Char or Ipp8u or ?? Do you have any examples using and external buffer? It would really help I had some simple examples that didn't use the deprecated functions. Not just for LZSS Compression, but also for the other methods of data compression supported.

Ipp8u is typedef for "unsigned char". So, they are interchangeable.

Regarding deprecated functions, we are working on cleaning the sample source files from deprecated functions for new release.

Below is an example of how to initialize LZSS structure for encoding (decoding is the same) without extra status checking and failure returns for simplicity. I am not sure how it will look in this new forum engine, though ))


    IppLZSSState_8u * pLZSSState = NULL;

    int iLZSSStateSize;
    st = ippsLZSSGetSize_8u(&iLZSSStateSize);

    pLZSSState = (IppLZSSState_8u*)ippsMalloc_8u(iLZSSStateSize);

    st = ippsEncodeLZSSInit_8u(pLZSSState);

/* LZSS Encoding, buffer flushing ... */

    ippsFree(pLZSSState);

On C++ it will be like


         pLZSSState = (IppLZSSState_8u*) new Ipp8u[iLZSSStateSize];


and

        delete [] (Ipp8u*)pLZSSState;

Regards,
Sergey

Regards,
Sergey

Hello again Sergey,
Thank you for your example code.

I'm having problems with the decompression.

ippsDecodeLZSS_8u( &pSrc, &srcLen, &pDst, &dstLen, pLZSSState);
the dstLen is not returning any value other then zero and the srcLen is a very large negative number. The status value returned it
 ippStsSizeErr

My code is as follows:

  FILE            *inFile;

  FILE            *outFile;
  char            * pInFileName

  char            * pOutFileName
  Ipp8u           *pSrc = NULL;

  Ipp8u           *pDst = NULL;

  Ipp8u           *startpSrc;

  Ipp8u           *startpDst;

  Ipp8u           *buffer ;
  int                srcLen;

  int                dstLen = 0;

  int                pLZSSSize;
  IppStatus       status;

  IppLZSSState_8u *pLZSSState; 
  startpSrc = ippsMalloc_8u( OUTBLOCKSIZE * sizeof(Ipp8u) );

  startpDst = ippsMalloc_8u( INBLOCKSIZE * sizeof(Ipp8u) );
  status = ippsLZSSGetSize_8u(&pLZSSSize);
  buffer  = ippsMalloc_8u(pLZSSSize);

  pLZSSState = (IppLZSSState_8u*)buffer;
  status = ippsDecodeLZSSInit_8u(pLZSSState);
   errno_t junk = fopen_s( &inFile, pInFileName,"rb" ) ;

   junk = fopen_s( &outFile, pOutFileName,"wb" ) ;
  srcLen = fread( startpSrc, sizeof(Ipp8u), OUTBLOCKSIZE, inFile );
  pSrc = startpSrc;

  pDst = startpDst;

for( ; ; )

  {

    status = ippsDecodeLZSS_8u( &pSrc, &srcLen, &pDst, &dstLen, pLZSSState);

    if( status == ippStsNoErr )

    {

      fwrite(startpDst, sizeof(Ipp8u), (INBLOCKSIZE - dstLen), outFile);

      pDst = startpDst;

      dstLen = INBLOCKSIZE;

      srcLen = fread( startpSrc, sizeof(Ipp8u), OUTBLOCKSIZE, inFile );

      pSrc = startpSrc;

      if(srcLen == 0)

        break;

    }

    else if( status == ippStsDstSizeLessExpected )

    {

      fwrite(startpDst, sizeof(Ipp8u), (INBLOCKSIZE - dstLen), outFile);

      pDst = startpDst;

      dstLen = INBLOCKSIZE;

    }

    else if(status == ippStsNullPtrErr)

    {

      printf("null pointern");

      break;

    }

    else if( status == ippStsSizeErr)

    {

      printf("size errorn");

      break;

    }

  } /* for */

  ippsFree(buffer);

  ippsFree( startpSrc );

  ippsFree( startpDst );

  fclose(outFile);

  fclose(inFile);

Thank you for you help. Yolanda

Yolanda,

Your code must be ok if between lines 38 and 40 you will set "dstLen=INBLOCKSIZE;". This length variable must be initially set up. Or, set it at line 18: int dstLen = INBLOCKSIZE;

Regards,
Sergey

Regards,
Sergey

Thank you Sergey.

Leave a Comment

Please sign in to add a comment. Not a member? Join today