📄 huffman.c
字号:
/*//////////////////////////////// "huffman.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) 2005 Intel Corporation. All Rights Reserved.//// higher level functions of IPP DC ( data compression ) domain for// Huffman encoding/decoding usage*/#include "huffman.h"/************************************************************************************************* * Function: * int EncodeHuffman( Ipp8u * pSrc, int SrcLen, Ipp8u *pDst, int *pDstLen, IppHuffState_8u *pHuffState ) * * Function for realization of Huffman Encoding * Gets the pSrc as a source vector of length SrcLen, does Huffman encoding and * writes result to pDst ( and length of pDst in pDstLen ) * * Main Parameters: * pSrc - pointer to Source buffer, * pDst - pointer to Destination buffer, * SrcLen - Length of source buffer, * pDstLen - Length of destination buffer * pHuffState - pointer to State structure for Huffman encoding/decoding * * Returns: * ippStsNullPtrErr If One or several pointer(s) is 0 * ippStsSizeErr Length of the source vector is less or equal zero * ippStsNoErr No errors * ************************************************************************************************/int EncodeHuffman( Ipp8u * pSrc, int SrcLen, Ipp8u *pDst, int *pDstLen, IppHuffState_8u *pHuffState ) { IppStatus st = ippStsNoErr; int freqTable[256]; /* array of characters frequencies */ int codeLenTable[256]; /* array of characters codelengths */ int i = 0; int maxDstLen = *pDstLen; Ipp8u * pDstTmp = pDst; int blockSize = 0; int dstLen = 0; /* checks the pointers is not null */ if( pSrc == 0 || pDst == 0 ) return ippStsNullPtrErr; /* fills the array to reach uniform distribution of characters frequencies */ for( i = 0; i < 256; i++ ) freqTable[i] = 0; /* stores statistics of input characters from pSrc vector */ for( i = 0; i < SrcLen; i++ ) freqTable[(int)(pSrc[i])]++; /* init structure for huffman encoding */ if( ippStsNoErr != ippsEncodeHuffInitAlloc_8u( freqTable, &pHuffState ) ) { fprintf( stderr, "Error while trying to init the frequency table for huffman. Exiting.\n" ); return st; } /* gets the array of characters codelengths to store it in pDst vector */ if( ippStsNoErr != ippsHuffGetLenCodeTable_8u( codeLenTable, pHuffState ) ) { fprintf( stderr, "Error while trying to get the code length 4 huffman. Exiting.\n" ); return st; } dstLen = maxDstLen; /* stores array of characters codelengths in the begining of pDst vector */ if( ippStsNoErr != ippsHuffLenCodeTablePack_8u( codeLenTable, pDstTmp, &dstLen ) ) { fprintf( stderr, "Error <%d> while trying to flush code lengths. Exiting.\n", st ); return st; } /* slides vectors, calculates lengths */ pDstTmp += dstLen; blockSize = dstLen; dstLen = maxDstLen; /* does the huffman encoding of pSrc vector to pDst vector */ if( ippStsNoErr != ippsEncodeHuff_8u( pSrc, SrcLen, pDstTmp, &dstLen, pHuffState ) ) { fprintf( stderr, "Error <%d> while trying to encode huffman. Exiting.\n", st ); return st; } /* slides vectors, calculates lengths */ pDstTmp += dstLen; blockSize += dstLen; dstLen = maxDstLen; /* flushes the reminder of Huffman encoding to the end of pDst vector */ if( ippStsNoErr != ippsEncodeHuffFinal_8u( pDstTmp, &dstLen, pHuffState ) ) { fprintf( stderr, "Error <%d> while trying to finalize ecoding huffman. Exiting.\n", st); return st; } /* calculates length of pDst vector */ blockSize += dstLen; *pDstLen = blockSize; return 0;}/************************************************************************************************ * Function: * int DecodeHuffman( Ipp8u *pSrc, int SrcLen, Ipp8u *pDst, int *pDstLen, IppHuffState_8u *pHuffState ) * * Function for realization of Huffman Decoding * Gets the pSrc as a source vector of length SrcLen, does Huffman decoding and * writes result to pDst ( and length of pDst in pDstLen ) * * Main Parameters: * pSrc - pointer to Source buffer, * pDst - pointer to Destination buffer, * SrcLen - Length of source buffer, * pDstLen - Length of destination buffer * pHuffState - pointer to State structure for Huffman encoding/decoding * * Returns: * ippStsNullPtrErr If One or several pointer(s) is 0 * ippStsSizeErr Length of the source vector is less or equal zero * ippStsNoErr No errors * *************************************************************************************************/int DecodeHuffman( Ipp8u *pSrc, int SrcLen, Ipp8u *pDst, int *pDstLen, IppHuffState_8u *pHuffState ) { IppStatus st; int dstLen = *pDstLen, codeLenTable[256]; /* to store table for code lengths */ Ipp8u * pTSrc = pSrc, /* init additional pointers to preserve pointer pSrc */ * pTDst = pDst; /* init additional pointers to preserve pointer pDst */ /* checks the pointers is not null */ if( pSrc == 0 || pDst == 0) return ippStsNullPtrErr; /* unpacks table stored in the begining of pSrc vector */ if( ippStsNoErr != ( st = ippsHuffLenCodeTableUnpack_8u( pTSrc, &dstLen, codeLenTable ) ) ) { fprintf(stderr, "Error <%d> while decoding Huffman (Unpack Table)\n", st); return st; } /* slide pointer to the begining of encoded data (passes the packed array of codes lengths )*/ pTSrc += dstLen; /* init structure for huffman decoding */ if( ippStsNoErr != ( st = ippsDecodeHuffInitAlloc_8u( codeLenTable, &pHuffState ) ) ) { fprintf(stderr, "Error <%d> while decoding Huffman (Init)\n", st); return st; } /* decodes by huffman using ippdc function */ if( ippStsNoErr != ( st = ippsDecodeHuff_8u( pTSrc, SrcLen - dstLen, pTDst, pDstLen, pHuffState ) ) ) { fprintf(stderr, "Error <%d> while decoding HUFFMAN\n", st); return st; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -