Exemplo n.º 1
0
/* top level function for decompression */
int Decompress1( Ipp8u **ppSrc, int SrcLen, Ipp8u **ppDst, int *pDstLen, bwtState *pState ) {

    int st;
    IppHuffState_8u * pHuffState    = (IppHuffState_8u *)(pState->pHuffState);
    IppMTFState_8u  * pMTFState     = (IppMTFState_8u  *)(pState->pMTFState);
    Ipp8u           * pBwtAddBuffer = pState->pBwtAddBuffer;
    Ipp8u           * pSrc          = *ppSrc;
    Ipp8u           * pDst          = *ppDst;
    int               rleLen        = *pDstLen,
                      rleLenZ       = *pDstLen,
                      mtfLen        = *pDstLen,
                      hufLen        = *pDstLen;

    /* does the Huffman Decoding (see file huffman.c for implementation details) */
    if( ippStsNoErr != ( st = DecodeHuffman( pSrc, SrcLen, pDst, &hufLen, pHuffState ) ) ) {
        fprintf(stderr, "Error <%d> while trying to decode Huffman. Exiting.\n", st );
        return st;
    }

    /* swaps two pointers */
    EXCHANGEBUFFERS( pSrc, pDst );

    /* does the Run-Length Decoding (see file rle.c for implementation details) */
    if( ippStsNoErr != ( st = DecodeRLE( pSrc, hufLen, pDst, &rleLen ) ) ) {
        fprintf(stderr, "Error <%d> while trying to decode RLE. Exiting.\n", st );
        return st;
    }

    /* swaps two pointers */
    EXCHANGEBUFFERS( pSrc, pDst );

    /* does backward Move-To-Front transform (see file mtf.c for implementation details) */
    if( ippStsNoErr != ( st = InverseMTF( pSrc, rleLen, pDst, &mtfLen, pMTFState ) ) ) {
        fprintf(stderr, "Error <%d> while trying backward MTF Transformation. Exiting.\n", st );
        return st;
    }

    /* swaps two pointers */
    EXCHANGEBUFFERS( pSrc, pDst );

    /* does backward Burrows-Wheller transform (see file bwt.c for implementation details) */
    if( ippStsNoErr != ( st = InverseBWT( pSrc, mtfLen, pDst, &rleLenZ, pBwtAddBuffer ) ) ) {
        fprintf(stderr, "Error <%d> while trying backward BWT Transformation. Exiting.\n", st );
        return st;
    }

    /* swaps two pointers */
    EXCHANGEBUFFERS( pSrc, pDst );

    /* does the Run-Length Decoding (see file rle.c for implementation details) */
    if( ippStsNoErr != ( st = DecodeRLE( pSrc, rleLenZ, pDst, pDstLen ) ) ) {
        fprintf(stderr, "Error <%d> while trying to decode RLE. Exiting.\n", st );
        return st;
    }

    *ppSrc = pSrc;
    *ppDst = pDst;

    return st;
} /* Decompress1() */ 
Exemplo n.º 2
0
//************************************************************************
PDIB CDib::GetDib(BOOL fDecodeRLE)
//************************************************************************
{
	if ((GetCompression() == BI_RLE8) && fDecodeRLE)
	{	
		DWORD dwSize = (long)GetWidthBytes() * (long)abs(GetHeight());
		LPTR lp = AllocX(dwSize, GMEM_ZEROINIT );
		if (!lp)
			return(NULL);
		PDIB pDib = new CDib(this, lp, FALSE);
		if (!pDib)
		{
			FreeUp(lp);
			return(NULL);
		}
		DecodeRLE(lp);
		pDib->SetCompression(BI_RGB);
		pDib->SetSizeImage(dwSize);
		return(pDib);
	}
	else
	{
		AddRef();
		return(this);
	}
}
Exemplo n.º 3
0
static int PostDecodeSubpicture(SPHandler *H, unsigned char *buf, int len)
{
    // TODO: handle regions better to optimize...
    memset(H->subpicbuffer, 0, 720*576);
    if(H->subpicenabled)
    {
        if(H->offsetfield1!=-1)
        {
            DecodeRLE(H, H->subpicbuffer, H->rect[0], H->rect[2], 
                H->rect[1], H->rect[3], buf,
                H->offsetfield1, len);
        }
        if(H->offsetfield2!=-1)
        {
            DecodeRLE(H, H->subpicbuffer, H->rect[0], H->rect[2]+1, 
                H->rect[1], H->rect[3], buf,                      
                H->offsetfield2, len);
        }
    }
    GFX_flipBuffer();    
}
Exemplo n.º 4
0
 void OnSector(const Formats::CHS& loc, const uint8_t* rawData, std::size_t rawSize, SectorDataType type, std::size_t targetSize) override
 {
   Dump result;
   switch (type)
   {
   case RAW_SECTOR:
     result.assign(rawData, rawData + rawSize);
     break;
   case R2P_SECTOR:
     DecodeR2P(rawData, rawSize, result);
     break;
   case RLE_SECTOR:
     DecodeRLE(rawData, rawSize, result);
     break;
   }
   Require(result.size() == targetSize);
   Builder->SetSector(loc, result);
 }