void CCoder::SetProps(const CEncProps *props2) { CEncProps props = *props2; props.Normalize(); m_MatchFinderCycles = props.mc; { unsigned fb = props.fb; if (fb < kMatchMinLen) fb = kMatchMinLen; if (fb > m_MatchMaxLen) fb = m_MatchMaxLen; m_NumFastBytes = fb; } _fastMode = (props.algo == 0); _btMode = (props.btMode != 0); m_NumDivPasses = props.numPasses; if (m_NumDivPasses == 0) m_NumDivPasses = 1; if (m_NumDivPasses == 1) m_NumPasses = 1; else if (m_NumDivPasses <= kNumDivPassesMax) m_NumPasses = 2; else { m_NumPasses = 2 + (m_NumDivPasses - kNumDivPassesMax); m_NumDivPasses = kNumDivPassesMax; } }
STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *coderProps, UInt32 numProps) { int level = -1; CEncProps props; for (UInt32 i = 0; i < numProps; i++) { const PROPVARIANT &prop = coderProps[i]; PROPID propID = propIDs[i]; if (propID > NCoderPropID::kReduceSize) continue; if (propID == NCoderPropID::kReduceSize) { if (prop.vt == VT_UI8 && prop.uhVal.QuadPart < (UInt32)(Int32)-1) props.ReduceSize = (UInt32)prop.uhVal.QuadPart; continue; } if (prop.vt != VT_UI4) return E_INVALIDARG; UInt32 v = (UInt32)prop.ulVal; switch (propID) { case NCoderPropID::kUsedMemorySize: if (v < (1 << 16) || v > PPMD7_MAX_MEM_SIZE || (v & 3) != 0) return E_INVALIDARG; props.MemSize = v; break; case NCoderPropID::kOrder: if (v < 2 || v > 32) return E_INVALIDARG; props.Order = (Byte)v; break; case NCoderPropID::kNumThreads: break; case NCoderPropID::kLevel: level = (int)v; break; default: return E_INVALIDARG; } } props.Normalize(level); _props = props; return S_OK; }