⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ippdecompress.c

📁 Intel的IPP库的应用例程
💻 C
字号:
/* //////////////////////////////// "ippdecompress.c" ////////////////////////
//
//                  INTEL CORPORATION PROPRIETARY INFORMATION
//     This software is supplied under the terms of a license agreement or
//     nondisclosure agreement with Intel Corporation and may not be copied
//     or disclosed except in accordance with the terms of that agreement.
//          Copyright(c) 2006 Intel Corporation. All Rights Reserved.
//
//          Sample of IPP DC ( data compression ) domain
*/
#include "bwtscheme.h"
#include "gitscheme.h"
#include "lzssscheme.h"

/* outputs message for users in case of wrong input */
void usage(char *name) {
    char usage_message[] = \
    "\nCopyright(c) 2005-2006 Intel Corporation. All Rights Reserved.\nippdecompress datacompression sample\n"
    "Usage: %s coded_filename restored_filename\n"
    " coded_filename                       File to decode\n"
    " restored_filename                    Restored file\n"
    "\nNote, that order of the arguments is predefined .\n"
    "\nExample: %s file1.compr file1 \n";
    fprintf( stderr, usage_message, name, name );
    exit(1);
}


int main( int argC, char **argV ) {

    /* variables */
    int blocksize       = 0;
    int DstLen          = 0;
    int SrcLen          = 0;
    int filesize        = 0;
    int filesizer       = 0;

    bwtState*        pBWTState  = NULL;
    gitState*        pGITState  = NULL;
    IppHuffState_8u* pHuffState = NULL;

    Ipp8u*  pSrc        = NULL;
    Ipp8u*  pDst        = NULL;

    /* input and output files descriptors */
    /* (including gzip file descriptor when -gzip method flag) */
    FILE*    fi         = NULL;
    FILE*    fo         = NULL;
    gzFile fgzip        = NULL;
    int gzip_out_len    = 0;

    /* predefined variables values */
    IppGITStrategyHint strategyHint = DEFAULTGITSTRATEGY;
    int decodeMethod = 0;

    /* in case, when we deal with a static libraries, *
     * init the best one for the current architecture */
    if( ippStaticInit() < 0 ) {
        fprintf( stderr, "Can't init IPP libraries. Exiting.\n");
        exit(-1);
    }

    /* in case when extra parameters or missing some of prints the usage message and exits */
    if( argC < 2 || argC > 3 ) usage( argV[0] );

    if( NULL == ( fi = fopen( argV[1], "rb" ) ) ) {
        fprintf( stderr, "Error while reading source file!\n" );
        exit(1);
    } else { /* if everething is OK, checks the filesize */
        fseek( fi, 0, SEEK_END );
        filesize = ftell( fi );
        rewind(fi);
    }
    fread( &decodeMethod, sizeof(Ipp8u), 1, fi );
    fclose(fi);

    /* we can start a first byte value more than 5 only in gzip-file case */

    if(decodeMethod > 5) decodeMethod = GZIP;

    if(decodeMethod == GZIP) {
      if( NULL == ( fgzip = gzopen( argV[1], "rb" ) ) ) {
        fprintf( stderr, "Error while reading source file!\n" );
        exit(1);
      }
    } else {
      /* opens input file */
      if( NULL == ( fi = fopen( argV[1], "rb" ) ) ) {
        fprintf( stderr, "Error while reading source file!\n" );
        exit(1);
      }   
    } 

    if( NULL == ( fo = fopen( argV[2], "wb" ) ) ) {
        fprintf(stderr, "Error while writing destination file!\n");
        exit(2);
    }

    if( decodeMethod == GZIP) {
      blocksize = GZIPBLOCKSIZE;
    } else {
      fread( &decodeMethod, sizeof(Ipp8u), 1, fi );
      fread( &blocksize, sizeof(Ipp32u), 1, fi ); 
    }
    
    /* allocates enough memory for input and output buffer */
    pSrc = (Ipp8u *)malloc(sizeof(Ipp8u)*(blocksize<<1));
    pDst = (Ipp8u *)malloc(sizeof(Ipp8u)*(blocksize<<1));

    /* make method-dependable init */
    switch( decodeMethod ) {
        case BWT: Decompress1StateInitAlloc( &pBWTState, blocksize ); break;
        case GIT: Decompress2StateInitAlloc( &pGITState, blocksize, strategyHint ); break;
    }

    switch ( decodeMethod ) {

        case BWT: /* BWT -> MTF -> RLE -> Huffman */
            while( (int)fread( &SrcLen, sizeof(Ipp32u), 1, fi ) > 0 ) {
                DstLen = (blocksize<<1);
                SrcLen = (int)fread( pSrc, sizeof(Ipp8u), SrcLen, fi );
                Decompress1( &pSrc, SrcLen, &pDst, &DstLen, pBWTState );
                fwrite( pDst, sizeof(Ipp8u), DstLen, fo );
            }
        break;

        case GIT: /* BWT -> GIT */
            while( (int)fread( &SrcLen, sizeof(Ipp32u), 1, fi ) > 0 ) {
                /* sets the size of destination buffer equal to size of memory allocated */
                DstLen = (blocksize<<1);
                SrcLen = (int)fread( pSrc, sizeof(Ipp8u), SrcLen, fi );
                Decompress2( &pSrc, SrcLen, &pDst, &DstLen, pGITState );
                fwrite( pDst, sizeof(Ipp8u), DstLen, fo );
            }
        break;

        case LZSS: /* LZSS */
            SrcLen = (int)fread( pSrc, sizeof(Ipp8u), filesize, fi );
            DstLen = filesize << 1;
            DecompressLZSS( pSrc, SrcLen, pDst, &DstLen );
            fwrite( pDst, sizeof(Ipp8u), DstLen, fo );
        break;

        case GZIP:
            for(;;) 
            {
               gzip_out_len = gzread(fgzip, pSrc, blocksize);
    
               if (gzip_out_len < 0)  break;
               if (gzip_out_len == 0) break;
               if ( (int)fwrite( pSrc, 1, (unsigned)gzip_out_len, fo) != gzip_out_len ) return (-1);
            }
        break;

        case HUFFMAN: /* HUFFMAN only */
            while( (int)fread( &SrcLen, sizeof(Ipp32u), 1, fi ) > 0 ) {
                DstLen = (blocksize<<1);
                SrcLen = (int)fread( pSrc, sizeof(Ipp8u), SrcLen, fi );
                if( !DecodeHuffman( pSrc, SrcLen, pDst, &DstLen, pHuffState ) )
                    fwrite( pDst, sizeof(Ipp8u), DstLen, fo );
            }
        break;
    }

    /* does finish tasks: close files, clean buffers */

    if( decodeMethod == GZIP )
      gzclose(fgzip);
    else
      fclose(fi);

    fclose(fo);

    fo = fopen( argV[2], "rb" );
    fseek( fo, 0, SEEK_END );
    filesizer = ftell( fo );
    fclose( fo );

    printf("Decoded file %s (%d bytes) to file %s (%d bytes)\n", argV[1], filesize, argV[2], filesizer);

    if( decodeMethod == BWT ) Free1State(pBWTState);
    if( decodeMethod == GIT ) Free2State(pGITState);

    free(pSrc);
    free(pDst);

    return 0; /* everything is OK */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -