diff --git a/CPP/7zip/Archive/ZstdHandler.cpp b/CPP/7zip/Archive/ZstdHandler.cpp index b93e3f3a..dcdef408 100644 --- a/CPP/7zip/Archive/ZstdHandler.cpp +++ b/CPP/7zip/Archive/ZstdHandler.cpp @@ -286,6 +286,9 @@ static HRESULT UpdateArchive( CMyComPtr localProgress = localProgressSpec; localProgressSpec->Init(updateCallback, true); NCompress::NZSTD::CEncoder *encoderSpec = new NCompress::NZSTD::CEncoder; + // by zstd archive type store dictID and checksum (similar to zstd client) + encoderSpec->dictIDFlag = 1; + encoderSpec->checksumFlag = 1; encoderSpec->unpackSize = unpackSize; CMyComPtr encoder = encoderSpec; RINOK(props.SetCoderProps(encoderSpec, NULL)); diff --git a/CPP/7zip/Compress/ZstdEncoder.cpp b/CPP/7zip/Compress/ZstdEncoder.cpp index b7c6543e..fcfaaf77 100644 --- a/CPP/7zip/Compress/ZstdEncoder.cpp +++ b/CPP/7zip/Compress/ZstdEncoder.cpp @@ -31,6 +31,8 @@ CEncoder::CEncoder(): _LdmMinMatch(-1), _LdmBucketSizeLog(-1), _LdmHashRateLog(-1), + dictIDFlag(-1), + checksumFlag(-1), unpackSize(0) { _props.clear(); @@ -252,6 +254,15 @@ STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, err = ZSTD_CCtx_setParameter(_ctx, ZSTD_c_contentSizeFlag, 1); if (ZSTD_isError(err)) return E_INVALIDARG; + if (dictIDFlag != -1) { + err = ZSTD_CCtx_setParameter(_ctx, ZSTD_c_dictIDFlag, dictIDFlag); + if (ZSTD_isError(err)) return E_INVALIDARG; + } + if (checksumFlag != -1) { + err = ZSTD_CCtx_setParameter(_ctx, ZSTD_c_checksumFlag, checksumFlag); + if (ZSTD_isError(err)) return E_INVALIDARG; + } + if (unpackSize) { err = ZSTD_CCtx_setParameter(_ctx, ZSTD_c_srcSizeHint, (int)(unpackSize <= INT_MAX ? unpackSize : INT_MAX)); if (ZSTD_isError(err)) return E_INVALIDARG; @@ -326,6 +337,12 @@ STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, err = ZSTD_CCtx_setParameter(_ctx, ZSTD_c_ldmHashRateLog, _LdmHashRateLog); if (ZSTD_isError(err)) return E_INVALIDARG; } + + //err = ZSTD_CCtx_setParameter(_ctx, ZSTD_c_literalCompressionMode, (int)ZSTD_ps_auto); + //if (ZSTD_isError(err)) return E_INVALIDARG; + + //err = ZSTD_CCtx_setParameter(_ctx, ZSTD_c_enableDedicatedDictSearch, 1); + //if (ZSTD_isError(err)) return E_INVALIDARG; } for (;;) { diff --git a/CPP/7zip/Compress/ZstdEncoder.h b/CPP/7zip/Compress/ZstdEncoder.h index 814bdad0..1b3a61a0 100644 --- a/CPP/7zip/Compress/ZstdEncoder.h +++ b/CPP/7zip/Compress/ZstdEncoder.h @@ -68,6 +68,8 @@ class CEncoder: public: + int dictIDFlag; + int checksumFlag; UInt64 unpackSize; MY_QUERYINTERFACE_BEGIN2(ICompressCoder)