1
0
mirror of https://github.com/soarqin/DSP_Mods.git synced 2025-12-09 04:13:32 +08:00

WIP: CompressSave 1.2.0

This commit is contained in:
2022-11-20 16:36:02 +08:00
parent f4457c5fd2
commit aec98cda34
33 changed files with 714 additions and 334 deletions

View File

@@ -14,7 +14,7 @@ static CContext* CreateCompressContext()
return (CContext*)malloc(sizeof(CContext));
}
void FreeCompressContext(CContext* ctx)
void __stdcall CompressContextFree(CContext* ctx)
{
if (ctx != NULL)
{
@@ -24,24 +24,24 @@ void FreeCompressContext(CContext* ctx)
}
}
const LZ4F_preferences_t kPrefs = {
static LZ4F_preferences_t kPrefs = {
{ LZ4F_max4MB, LZ4F_blockLinked, LZ4F_contentChecksumEnabled, LZ4F_frame,
0 /* unknown content size */, 0/* no dictID */ , LZ4F_blockChecksumEnabled },
0 /* unknown content size */, 0/* no dictID */ , LZ4F_blockChecksumEnabled },
0, /* compression level; 0 == default */
0, /* autoflush */
0, /* favor decompression speed */
{ 0, 0, 0 }, /* reserved, must be set to 0 */
};
size_t CalCompressOutBufferSize(size_t inBufferSize)
size_t __stdcall CompressBufferBound(size_t inBufferSize)
{
return LZ4F_compressBound(inBufferSize, &kPrefs) + LZ4F_HEADER_SIZE_MAX;
}
CContext* CreateCompressContextFromBuffer(void* dictBuffer, size_t dictSize) {
CContext* CreateCompressContextFromBuffer(void* dict, size_t dictSize) {
CContext* ctx = CreateCompressContext();
if (dictBuffer)
ctx->dict = LZ4F_createCDict(dictBuffer, dictSize);
if (dict)
ctx->dict = LZ4F_createCDict(dict, dictSize);
else
ctx->dict = NULL;
if (ctx == NULL) return NULL;
@@ -51,7 +51,7 @@ CContext* CreateCompressContextFromBuffer(void* dictBuffer, size_t dictSize) {
if (LZ4F_isError(ctxCreation))
{
LZ4F_freeCompressionContext(innerctx);
FreeCompressContext(ctx);
CompressContextFree(ctx);
return NULL;
}
ctx->cctx = innerctx;
@@ -59,14 +59,14 @@ CContext* CreateCompressContextFromBuffer(void* dictBuffer, size_t dictSize) {
return ctx;
}
size_t CompressBegin(CContext** pctx, void* outBuff , size_t outCapacity, void* dictBuffer, size_t dictSize)
size_t __stdcall CompressBegin(CContext** pctx, int compressionLevel, void* outBuff , size_t outCapacity, void* dict, size_t dictSize)
{
CContext* ctx = CreateCompressContextFromBuffer(dictBuffer, dictSize);
CContext* ctx = CreateCompressContextFromBuffer(dict, dictSize);
if (ctx == NULL) return -1;
if (outCapacity < LZ4F_HEADER_SIZE_MAX || outCapacity < LZ4F_compressBound(0, &kPrefs)) return LZ4F_ERROR_dstMaxSize_tooSmall;
kPrefs.compressionLevel = compressionLevel;
/* write frame header */
size_t const headerSize = ctx->dict == NULL
? LZ4F_compressBegin(ctx->cctx, outBuff, outCapacity, &kPrefs)
@@ -81,7 +81,7 @@ size_t CompressBegin(CContext** pctx, void* outBuff , size_t outCapacity, void*
}
size_t CompressUpdate(CContext* ctx,void* dstBuffer, size_t dstCapacity,const void* srcBuffer, size_t srcSize)
size_t __stdcall CompressUpdate(CContext* ctx,void* dstBuffer, size_t dstCapacity,const void* srcBuffer, size_t srcSize)
{
size_t result = ctx->dict == NULL
? LZ4F_compressUpdate(ctx->cctx, dstBuffer, dstCapacity, srcBuffer, srcSize, NULL)
@@ -94,7 +94,7 @@ size_t CompressUpdate(CContext* ctx,void* dstBuffer, size_t dstCapacity,const vo
return result;
}
size_t CompressEnd(CContext* ctx, void* dstBuffer, size_t dstCapacity)
size_t __stdcall CompressEnd(CContext* ctx, void* dstBuffer, size_t dstCapacity)
{
size_t writeSize = LZ4F_compressEnd(ctx->cctx, dstBuffer, dstCapacity, NULL);
return writeSize;
@@ -112,39 +112,43 @@ static size_t get_block_size(const LZ4F_frameInfo_t* info) {
}
}
//return: input bytes expects for next call
size_t DecompressBegin(LZ4F_dctx **pdctx,void *inBuffer,size_t *inBufferSize, size_t *blockSize)
size_t __stdcall DecompressBegin(DContext **pdctx,void *inBuffer,size_t *inBufferSize, size_t *blockSize, void* dict, size_t dictSize)
{
LZ4F_dctx* dctx;
LZ4F_dctx** _pdctx = &dctx;
size_t const dctxStatus = LZ4F_createDecompressionContext(_pdctx, LZ4F_VERSION);
DContext* dctx = (DContext*)malloc(sizeof(DContext));
size_t const dctxStatus = LZ4F_createDecompressionContext(&dctx->dctx, LZ4F_VERSION);
Check(!LZ4F_isError(dctxStatus), dctxStatus);
Check(*inBufferSize >= LZ4F_HEADER_SIZE_MAX, LZ4F_ERROR_dstMaxSize_tooSmall);
LZ4F_frameInfo_t info;
size_t const fires = LZ4F_getFrameInfo(*_pdctx, &info, inBuffer, inBufferSize);
size_t const fires = LZ4F_getFrameInfo(dctx->dctx, &info, inBuffer, inBufferSize);
Check(!LZ4F_isError(fires), fires);
*blockSize = get_block_size(&info);
*pdctx = *_pdctx;
dctx->dict = dict;
dctx->dictSize = dictSize;
*pdctx = dctx;
return fires;
}
void ResetDecompresssCTX(LZ4F_dctx* dctx)
void __stdcall DecompressContextReset(DContext* dctx)
{
LZ4F_resetDecompressionContext(dctx);
LZ4F_resetDecompressionContext(dctx->dctx);
}
size_t DecompressUpdate(LZ4F_dctx* dctx, void* outBuffer, size_t * outBufferSize, void* inBuffer, size_t * inBufferSize,void* dict,size_t dictSize)
size_t __stdcall DecompressUpdate(DContext* dctx, void* outBuffer, size_t * outBufferSize, void* inBuffer, size_t * inBufferSize)
{
size_t ret = dict == NULL
? LZ4F_decompress(dctx, outBuffer, outBufferSize, inBuffer, inBufferSize, NULL)
: LZ4F_decompress_usingDict(dctx, outBuffer, outBufferSize, inBuffer, inBufferSize, dict, dictSize,NULL);
size_t ret = dctx->dict == NULL
? LZ4F_decompress(dctx->dctx, outBuffer, outBufferSize, inBuffer, inBufferSize, NULL)
: LZ4F_decompress_usingDict(dctx->dctx, outBuffer, outBufferSize, inBuffer, inBufferSize, dctx->dict, dctx->dictSize, NULL);
Check(!LZ4F_isError(ret), ret);
return ret;
}
size_t DecompressEnd(LZ4F_dctx* ctx)
size_t __stdcall DecompressEnd(DContext* dctx)
{
return LZ4F_freeDecompressionContext(ctx);
}
if (!dctx) return 0;
size_t r = LZ4F_freeDecompressionContext(dctx->dctx);
free(dctx);
return r;
}