Autoadjust ldm option on large windowLog values

This commit is contained in:
Tino Reichardt
2018-11-18 21:42:25 +01:00
parent 67ccdf37ef
commit 4728ce24ef

View File

@@ -140,15 +140,13 @@ STDMETHODIMP CEncoder::SetCoderProperties(const PROPID * propIDs, const PROPVARI
case NCoderPropID::kLong: case NCoderPropID::kLong:
{ {
/* exact like --long in zstd cli program */ /* exact like --long in zstd cli program */
_Long = 1;
if (v == 0) { if (v == 0) {
// m0=zstd:long:tlen=x // m0=zstd:long:tlen=x
_Long = 1;
_WindowLog = 27; _WindowLog = 27;
} else if (v < 10) { } else if (v < 10) {
_Long = 1;
_WindowLog = 10; _WindowLog = 10;
} else if (v > ZSTD_WINDOWLOG_MAX) { } else if (v > ZSTD_WINDOWLOG_MAX) {
_Long = 1;
_WindowLog = ZSTD_WINDOWLOG_MAX; _WindowLog = ZSTD_WINDOWLOG_MAX;
} }
break; break;
@@ -230,6 +228,10 @@ STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream,
err = ZSTD_CCtx_setParameter(_ctx, ZSTD_p_contentSizeFlag, 1); err = ZSTD_CCtx_setParameter(_ctx, ZSTD_p_contentSizeFlag, 1);
if (ZSTD_isError(err)) return E_INVALIDARG; if (ZSTD_isError(err)) return E_INVALIDARG;
/* enable ldm for large windowlog values */
if (_WindowLog > 27 && _Long == 0)
_Long = 1;
/* set ldm */ /* set ldm */
if (_Long == 1) { if (_Long == 1) {
err = ZSTD_CCtx_setParameter(_ctx, ZSTD_p_enableLongDistanceMatching, _Long); err = ZSTD_CCtx_setParameter(_ctx, ZSTD_p_enableLongDistanceMatching, _Long);
@@ -242,8 +244,6 @@ STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream,
} }
if (_WindowLog != -1) { if (_WindowLog != -1) {
if (_WindowLog > 27 && _Long == 0)
return E_INVALIDARG;
err = ZSTD_CCtx_setParameter(_ctx, ZSTD_p_windowLog, _WindowLog); err = ZSTD_CCtx_setParameter(_ctx, ZSTD_p_windowLog, _WindowLog);
if (ZSTD_isError(err)) return E_INVALIDARG; if (ZSTD_isError(err)) return E_INVALIDARG;
} }