mirror of
https://github.com/soarqin/DSP_Mods.git
synced 2025-12-09 16:13:31 +08:00
WIP: CompressSave 1.2.0
This commit is contained in:
12
CompressSave/ZstdWrapC/CMakeLists.txt
Normal file
12
CompressSave/ZstdWrapC/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
cmake_minimum_required(VERSION 3.2)
|
||||
|
||||
project(zstdwrap)
|
||||
|
||||
add_library(LZ4 SHARED
|
||||
dllmain.c zstdwrap.c zstdwrap.h)
|
||||
|
||||
target_compile_definitions(zstdwrap PRIVATE ZSTDWRAP_EXPORTS ZSTDLIB_STATIC_API)
|
||||
target_link_libraries(zstdwrap PRIVATE zstd)
|
||||
if(WIN32)
|
||||
set_target_properties(zstdwrap PROPERTIES PREFIX "")
|
||||
endif()
|
||||
19
CompressSave/ZstdWrapC/dllmain.c
Normal file
19
CompressSave/ZstdWrapC/dllmain.c
Normal file
@@ -0,0 +1,19 @@
|
||||
// dllmain.cpp : Defines the entry point for the DLL application.
|
||||
#include <windows.h>
|
||||
|
||||
BOOL APIENTRY DllMain( HMODULE hModule,
|
||||
DWORD ul_reason_for_call,
|
||||
LPVOID lpReserved
|
||||
)
|
||||
{
|
||||
switch (ul_reason_for_call)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
case DLL_THREAD_ATTACH:
|
||||
case DLL_THREAD_DETACH:
|
||||
case DLL_PROCESS_DETACH:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
84
CompressSave/ZstdWrapC/zstdwrap.c
Normal file
84
CompressSave/ZstdWrapC/zstdwrap.c
Normal file
@@ -0,0 +1,84 @@
|
||||
#include "zstdwrap.h"
|
||||
|
||||
#include <windows.h>
|
||||
#include <limits.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
|
||||
size_t __stdcall CompressBufferBound(size_t inBufferSize)
|
||||
{
|
||||
return ZSTD_COMPRESSBOUND(inBufferSize);
|
||||
}
|
||||
|
||||
size_t __stdcall CompressBegin(ZSTD_CStream** pctx, int compressionLevel, void* outBuff, size_t outCapacity, void* dict, size_t dictSize)
|
||||
{
|
||||
ZSTD_CStream *ctx = ZSTD_createCStream();
|
||||
if (ctx == NULL) return -1;
|
||||
ZSTD_CCtx_setParameter(ctx, ZSTD_c_compressionLevel, compressionLevel);
|
||||
if (dict)
|
||||
{
|
||||
ZSTD_CCtx_loadDictionary(ctx, dict, dictSize);
|
||||
}
|
||||
*pctx = ctx;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
size_t __stdcall CompressUpdate(ZSTD_CStream* ctx,void* dstBuffer, size_t dstCapacity,const void* srcBuffer, size_t srcSize)
|
||||
{
|
||||
ZSTD_outBuffer obuf = {dstBuffer, dstCapacity, 0};
|
||||
ZSTD_inBuffer ibuf = {srcBuffer, srcSize, 0};
|
||||
do
|
||||
{
|
||||
ZSTD_compressStream2(ctx, &obuf, &ibuf, ZSTD_e_continue);
|
||||
}
|
||||
while (ibuf.pos < ibuf.size);
|
||||
return obuf.pos;
|
||||
}
|
||||
|
||||
size_t __stdcall CompressEnd(ZSTD_CStream* ctx, void* dstBuffer, size_t dstCapacity)
|
||||
{
|
||||
ZSTD_outBuffer obuf = {dstBuffer, dstCapacity, 0};
|
||||
ZSTD_inBuffer ibuf = {NULL, 0, 0};
|
||||
while (ZSTD_compressStream2(ctx, &obuf, &ibuf, ZSTD_e_end) > 0) {}
|
||||
return obuf.pos;
|
||||
}
|
||||
|
||||
void __stdcall CompressContextFree(ZSTD_CStream* ctx)
|
||||
{
|
||||
ZSTD_freeCStream(ctx);
|
||||
}
|
||||
|
||||
size_t __stdcall DecompressBegin(ZSTD_DStream **pdctx,void *inBuffer,size_t *inBufferSize, size_t *blockSize, void* dict, size_t dictSize)
|
||||
{
|
||||
ZSTD_DStream *ctx = ZSTD_createDStream();
|
||||
if (ctx == NULL) return -1;
|
||||
if (dict)
|
||||
{
|
||||
ZSTD_DCtx_loadDictionary(ctx, dict, dictSize);
|
||||
}
|
||||
*pdctx = ctx;
|
||||
*inBufferSize = 0;
|
||||
*blockSize = ZSTD_DStreamOutSize() << 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __stdcall DecompressContextReset(ZSTD_DStream* dctx)
|
||||
{
|
||||
ZSTD_DCtx_reset(dctx, ZSTD_reset_session_only);
|
||||
}
|
||||
|
||||
size_t __stdcall DecompressUpdate(ZSTD_DStream* dctx, void* outBuffer, size_t * outBufferSize, void* inBuffer, size_t * inBufferSize)
|
||||
{
|
||||
ZSTD_outBuffer obuf = {outBuffer, *outBufferSize, 0};
|
||||
ZSTD_inBuffer ibuf = {inBuffer, *inBufferSize, 0};
|
||||
size_t r = ZSTD_decompressStream(dctx, &obuf, &ibuf);
|
||||
*outBufferSize = obuf.pos;
|
||||
*inBufferSize = ibuf.pos;
|
||||
return r;
|
||||
}
|
||||
|
||||
size_t __stdcall DecompressEnd(ZSTD_DStream* ctx)
|
||||
{
|
||||
return ZSTD_freeDStream(ctx);
|
||||
}
|
||||
34
CompressSave/ZstdWrapC/zstdwrap.h
Normal file
34
CompressSave/ZstdWrapC/zstdwrap.h
Normal file
@@ -0,0 +1,34 @@
|
||||
#pragma once
|
||||
|
||||
#include <zstd.h>
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#if defined(__cplusplus)
|
||||
#define API_EXTERN_C extern "C"
|
||||
#else
|
||||
#define API_EXTERN_C
|
||||
#endif
|
||||
#ifdef ZSTDWRAP_EXPORTS
|
||||
#define ZSTDAPI API_EXTERN_C __declspec(dllexport)
|
||||
#else
|
||||
#define ZSTDAPI API_EXTERN_C __declspec(dllimport)
|
||||
#endif
|
||||
|
||||
ZSTDAPI void __stdcall CompressContextFree(ZSTD_CStream* ctx);
|
||||
|
||||
ZSTDAPI size_t __stdcall CompressBufferBound(size_t inBufferSize);
|
||||
|
||||
ZSTDAPI size_t __stdcall CompressBegin(ZSTD_CStream** ctx, int compressionLevel, void* outBuff, size_t outCapacity, void* dict, size_t dictSize);
|
||||
|
||||
ZSTDAPI size_t __stdcall CompressUpdate(ZSTD_CStream* ctx, void* dstBuffer, size_t dstCapacity, const void* srcBuffer, size_t srcSize);
|
||||
|
||||
ZSTDAPI size_t __stdcall CompressEnd(ZSTD_CStream* ctx, void* dstBuffer, size_t dstCapacity);
|
||||
|
||||
ZSTDAPI size_t __stdcall DecompressBegin(ZSTD_DStream** pdctx, void* inBuffer, size_t* inBufferSize, size_t* blockSize, void* dict, size_t dictSize);
|
||||
|
||||
ZSTDAPI void __stdcall DecompressContextReset(ZSTD_DStream* dctx);
|
||||
|
||||
ZSTDAPI size_t __stdcall DecompressUpdate(ZSTD_DStream* dctx, void* outBuffer, size_t* outBufferSize, void* inBuffer, size_t* inBufferSize);
|
||||
|
||||
ZSTDAPI size_t __stdcall DecompressEnd(ZSTD_DStream* dctx);
|
||||
Reference in New Issue
Block a user