Compress-Zstd

 view release on metacpan or  search on metacpan

ext/zstd/contrib/linux-kernel/lib/zstd/huf_decompress.c  view on Meta::CPAN

				return errorCode;
		}
		{
			size_t const errorCode = BIT_initDStream(&bitD2, istart2, length2);
			if (HUF_isError(errorCode))
				return errorCode;
		}
		{
			size_t const errorCode = BIT_initDStream(&bitD3, istart3, length3);
			if (HUF_isError(errorCode))
				return errorCode;
		}
		{
			size_t const errorCode = BIT_initDStream(&bitD4, istart4, length4);
			if (HUF_isError(errorCode))
				return errorCode;
		}

		/* 16-32 symbols per loop (4-8 symbols per stream) */
		endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
		for (; (endSignal == BIT_DStream_unfinished) && (op4 < (oend - 7));) {
			HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
			HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
			HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
			HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
			HUF_DECODE_SYMBOLX2_1(op1, &bitD1);
			HUF_DECODE_SYMBOLX2_1(op2, &bitD2);
			HUF_DECODE_SYMBOLX2_1(op3, &bitD3);
			HUF_DECODE_SYMBOLX2_1(op4, &bitD4);
			HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
			HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
			HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
			HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
			HUF_DECODE_SYMBOLX2_0(op1, &bitD1);
			HUF_DECODE_SYMBOLX2_0(op2, &bitD2);
			HUF_DECODE_SYMBOLX2_0(op3, &bitD3);
			HUF_DECODE_SYMBOLX2_0(op4, &bitD4);
			endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
		}

		/* check corruption */
		if (op1 > opStart2)
			return ERROR(corruption_detected);
		if (op2 > opStart3)
			return ERROR(corruption_detected);
		if (op3 > opStart4)
			return ERROR(corruption_detected);
		/* note : op4 supposed already verified within main loop */

		/* finish bitStreams one by one */
		HUF_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog);
		HUF_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog);
		HUF_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog);
		HUF_decodeStreamX2(op4, &bitD4, oend, dt, dtLog);

		/* check */
		endSignal = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
		if (!endSignal)
			return ERROR(corruption_detected);

		/* decoded size */
		return dstSize;
	}
}

size_t HUF_decompress4X2_usingDTable(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
{
	DTableDesc dtd = HUF_getDTableDesc(DTable);
	if (dtd.tableType != 0)
		return ERROR(GENERIC);
	return HUF_decompress4X2_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable);
}

size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace, size_t workspaceSize)
{
	const BYTE *ip = (const BYTE *)cSrc;

	size_t const hSize = HUF_readDTableX2_wksp(dctx, cSrc, cSrcSize, workspace, workspaceSize);
	if (HUF_isError(hSize))
		return hSize;
	if (hSize >= cSrcSize)
		return ERROR(srcSize_wrong);
	ip += hSize;
	cSrcSize -= hSize;

	return HUF_decompress4X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx);
}

/* *************************/
/* double-symbols decoding */
/* *************************/
typedef struct {
	U16 sequence;
	BYTE nbBits;
	BYTE length;
} HUF_DEltX4; /* double-symbols decoding */

typedef struct {
	BYTE symbol;
	BYTE weight;
} sortedSymbol_t;

/* HUF_fillDTableX4Level2() :
 * `rankValOrigin` must be a table of at least (HUF_TABLELOG_MAX + 1) U32 */
static void HUF_fillDTableX4Level2(HUF_DEltX4 *DTable, U32 sizeLog, const U32 consumed, const U32 *rankValOrigin, const int minWeight,
				   const sortedSymbol_t *sortedSymbols, const U32 sortedListSize, U32 nbBitsBaseline, U16 baseSeq)
{
	HUF_DEltX4 DElt;
	U32 rankVal[HUF_TABLELOG_MAX + 1];

	/* get pre-calculated rankVal */
	memcpy(rankVal, rankValOrigin, sizeof(rankVal));

	/* fill skipped values */
	if (minWeight > 1) {
		U32 i, skipSize = rankVal[minWeight];
		ZSTD_writeLE16(&(DElt.sequence), baseSeq);
		DElt.nbBits = (BYTE)(consumed);
		DElt.length = 1;
		for (i = 0; i < skipSize; i++)
			DTable[i] = DElt;

ext/zstd/contrib/linux-kernel/lib/zstd/huf_decompress.c  view on Meta::CPAN

#define HUF_DECODE_SYMBOLX4_0(ptr, DStreamPtr) ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)

#define HUF_DECODE_SYMBOLX4_1(ptr, DStreamPtr)         \
	if (ZSTD_64bits() || (HUF_TABLELOG_MAX <= 12)) \
	ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)

#define HUF_DECODE_SYMBOLX4_2(ptr, DStreamPtr) \
	if (ZSTD_64bits())                     \
	ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)

FORCE_INLINE size_t HUF_decodeStreamX4(BYTE *p, BIT_DStream_t *bitDPtr, BYTE *const pEnd, const HUF_DEltX4 *const dt, const U32 dtLog)
{
	BYTE *const pStart = p;

	/* up to 8 symbols at a time */
	while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd - (sizeof(bitDPtr->bitContainer) - 1))) {
		HUF_DECODE_SYMBOLX4_2(p, bitDPtr);
		HUF_DECODE_SYMBOLX4_1(p, bitDPtr);
		HUF_DECODE_SYMBOLX4_2(p, bitDPtr);
		HUF_DECODE_SYMBOLX4_0(p, bitDPtr);
	}

	/* closer to end : up to 2 symbols at a time */
	while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p <= pEnd - 2))
		HUF_DECODE_SYMBOLX4_0(p, bitDPtr);

	while (p <= pEnd - 2)
		HUF_DECODE_SYMBOLX4_0(p, bitDPtr); /* no need to reload : reached the end of DStream */

	if (p < pEnd)
		p += HUF_decodeLastSymbolX4(p, bitDPtr, dt, dtLog);

	return p - pStart;
}

static size_t HUF_decompress1X4_usingDTable_internal(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
{
	BIT_DStream_t bitD;

	/* Init */
	{
		size_t const errorCode = BIT_initDStream(&bitD, cSrc, cSrcSize);
		if (HUF_isError(errorCode))
			return errorCode;
	}

	/* decode */
	{
		BYTE *const ostart = (BYTE *)dst;
		BYTE *const oend = ostart + dstSize;
		const void *const dtPtr = DTable + 1; /* force compiler to not use strict-aliasing */
		const HUF_DEltX4 *const dt = (const HUF_DEltX4 *)dtPtr;
		DTableDesc const dtd = HUF_getDTableDesc(DTable);
		HUF_decodeStreamX4(ostart, &bitD, oend, dt, dtd.tableLog);
	}

	/* check */
	if (!BIT_endOfDStream(&bitD))
		return ERROR(corruption_detected);

	/* decoded size */
	return dstSize;
}

size_t HUF_decompress1X4_usingDTable(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
{
	DTableDesc dtd = HUF_getDTableDesc(DTable);
	if (dtd.tableType != 1)
		return ERROR(GENERIC);
	return HUF_decompress1X4_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable);
}

size_t HUF_decompress1X4_DCtx_wksp(HUF_DTable *DCtx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace, size_t workspaceSize)
{
	const BYTE *ip = (const BYTE *)cSrc;

	size_t const hSize = HUF_readDTableX4_wksp(DCtx, cSrc, cSrcSize, workspace, workspaceSize);
	if (HUF_isError(hSize))
		return hSize;
	if (hSize >= cSrcSize)
		return ERROR(srcSize_wrong);
	ip += hSize;
	cSrcSize -= hSize;

	return HUF_decompress1X4_usingDTable_internal(dst, dstSize, ip, cSrcSize, DCtx);
}

static size_t HUF_decompress4X4_usingDTable_internal(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
{
	if (cSrcSize < 10)
		return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */

	{
		const BYTE *const istart = (const BYTE *)cSrc;
		BYTE *const ostart = (BYTE *)dst;
		BYTE *const oend = ostart + dstSize;
		const void *const dtPtr = DTable + 1;
		const HUF_DEltX4 *const dt = (const HUF_DEltX4 *)dtPtr;

		/* Init */
		BIT_DStream_t bitD1;
		BIT_DStream_t bitD2;
		BIT_DStream_t bitD3;
		BIT_DStream_t bitD4;
		size_t const length1 = ZSTD_readLE16(istart);
		size_t const length2 = ZSTD_readLE16(istart + 2);
		size_t const length3 = ZSTD_readLE16(istart + 4);
		size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6);
		const BYTE *const istart1 = istart + 6; /* jumpTable */
		const BYTE *const istart2 = istart1 + length1;
		const BYTE *const istart3 = istart2 + length2;
		const BYTE *const istart4 = istart3 + length3;
		size_t const segmentSize = (dstSize + 3) / 4;
		BYTE *const opStart2 = ostart + segmentSize;
		BYTE *const opStart3 = opStart2 + segmentSize;
		BYTE *const opStart4 = opStart3 + segmentSize;
		BYTE *op1 = ostart;
		BYTE *op2 = opStart2;
		BYTE *op3 = opStart3;
		BYTE *op4 = opStart4;
		U32 endSignal;

ext/zstd/contrib/linux-kernel/lib/zstd/huf_decompress.c  view on Meta::CPAN

			size_t const errorCode = BIT_initDStream(&bitD2, istart2, length2);
			if (HUF_isError(errorCode))
				return errorCode;
		}
		{
			size_t const errorCode = BIT_initDStream(&bitD3, istart3, length3);
			if (HUF_isError(errorCode))
				return errorCode;
		}
		{
			size_t const errorCode = BIT_initDStream(&bitD4, istart4, length4);
			if (HUF_isError(errorCode))
				return errorCode;
		}

		/* 16-32 symbols per loop (4-8 symbols per stream) */
		endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
		for (; (endSignal == BIT_DStream_unfinished) & (op4 < (oend - (sizeof(bitD4.bitContainer) - 1)));) {
			HUF_DECODE_SYMBOLX4_2(op1, &bitD1);
			HUF_DECODE_SYMBOLX4_2(op2, &bitD2);
			HUF_DECODE_SYMBOLX4_2(op3, &bitD3);
			HUF_DECODE_SYMBOLX4_2(op4, &bitD4);
			HUF_DECODE_SYMBOLX4_1(op1, &bitD1);
			HUF_DECODE_SYMBOLX4_1(op2, &bitD2);
			HUF_DECODE_SYMBOLX4_1(op3, &bitD3);
			HUF_DECODE_SYMBOLX4_1(op4, &bitD4);
			HUF_DECODE_SYMBOLX4_2(op1, &bitD1);
			HUF_DECODE_SYMBOLX4_2(op2, &bitD2);
			HUF_DECODE_SYMBOLX4_2(op3, &bitD3);
			HUF_DECODE_SYMBOLX4_2(op4, &bitD4);
			HUF_DECODE_SYMBOLX4_0(op1, &bitD1);
			HUF_DECODE_SYMBOLX4_0(op2, &bitD2);
			HUF_DECODE_SYMBOLX4_0(op3, &bitD3);
			HUF_DECODE_SYMBOLX4_0(op4, &bitD4);

			endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
		}

		/* check corruption */
		if (op1 > opStart2)
			return ERROR(corruption_detected);
		if (op2 > opStart3)
			return ERROR(corruption_detected);
		if (op3 > opStart4)
			return ERROR(corruption_detected);
		/* note : op4 already verified within main loop */

		/* finish bitStreams one by one */
		HUF_decodeStreamX4(op1, &bitD1, opStart2, dt, dtLog);
		HUF_decodeStreamX4(op2, &bitD2, opStart3, dt, dtLog);
		HUF_decodeStreamX4(op3, &bitD3, opStart4, dt, dtLog);
		HUF_decodeStreamX4(op4, &bitD4, oend, dt, dtLog);

		/* check */
		{
			U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
			if (!endCheck)
				return ERROR(corruption_detected);
		}

		/* decoded size */
		return dstSize;
	}
}

size_t HUF_decompress4X4_usingDTable(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
{
	DTableDesc dtd = HUF_getDTableDesc(DTable);
	if (dtd.tableType != 1)
		return ERROR(GENERIC);
	return HUF_decompress4X4_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable);
}

size_t HUF_decompress4X4_DCtx_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace, size_t workspaceSize)
{
	const BYTE *ip = (const BYTE *)cSrc;

	size_t hSize = HUF_readDTableX4_wksp(dctx, cSrc, cSrcSize, workspace, workspaceSize);
	if (HUF_isError(hSize))
		return hSize;
	if (hSize >= cSrcSize)
		return ERROR(srcSize_wrong);
	ip += hSize;
	cSrcSize -= hSize;

	return HUF_decompress4X4_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx);
}

/* ********************************/
/* Generic decompression selector */
/* ********************************/

size_t HUF_decompress1X_usingDTable(void *dst, size_t maxDstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
{
	DTableDesc const dtd = HUF_getDTableDesc(DTable);
	return dtd.tableType ? HUF_decompress1X4_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable)
			     : HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable);
}

size_t HUF_decompress4X_usingDTable(void *dst, size_t maxDstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
{
	DTableDesc const dtd = HUF_getDTableDesc(DTable);
	return dtd.tableType ? HUF_decompress4X4_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable)
			     : HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable);
}

typedef struct {
	U32 tableTime;
	U32 decode256Time;
} algo_time_t;
static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, quad */] = {
    /* single, double, quad */
    {{0, 0}, {1, 1}, {2, 2}},		     /* Q==0 : impossible */
    {{0, 0}, {1, 1}, {2, 2}},		     /* Q==1 : impossible */
    {{38, 130}, {1313, 74}, {2151, 38}},     /* Q == 2 : 12-18% */
    {{448, 128}, {1353, 74}, {2238, 41}},    /* Q == 3 : 18-25% */
    {{556, 128}, {1353, 74}, {2238, 47}},    /* Q == 4 : 25-32% */
    {{714, 128}, {1418, 74}, {2436, 53}},    /* Q == 5 : 32-38% */
    {{883, 128}, {1437, 74}, {2464, 61}},    /* Q == 6 : 38-44% */
    {{897, 128}, {1515, 75}, {2622, 68}},    /* Q == 7 : 44-50% */
    {{926, 128}, {1613, 75}, {2730, 75}},    /* Q == 8 : 50-56% */



( run in 1.648 second using v1.01-cache-2.11-cpan-437f7b0c052 )