| OLD | NEW |
| (Empty) |
| 1 // MethodProps.cpp | |
| 2 | |
| 3 #include "StdAfx.h" | |
| 4 | |
| 5 #include "../../Common/MyCom.h" | |
| 6 | |
| 7 #include "../ICoder.h" | |
| 8 | |
| 9 #include "MethodProps.h" | |
| 10 | |
| 11 static UInt64 k_LZMA = 0x030101; | |
| 12 // static UInt64 k_LZMA2 = 0x030102; | |
| 13 | |
| 14 HRESULT SetMethodProperties(const CMethod &method, const UInt64 *inSizeForReduce
, IUnknown *coder) | |
| 15 { | |
| 16 bool tryReduce = false; | |
| 17 UInt32 reducedDictionarySize = 1 << 10; | |
| 18 if (inSizeForReduce != 0 && (method.Id == k_LZMA /* || methodFull.MethodID ==
k_LZMA2 */)) | |
| 19 { | |
| 20 for (;;) | |
| 21 { | |
| 22 const UInt32 step = (reducedDictionarySize >> 1); | |
| 23 if (reducedDictionarySize >= *inSizeForReduce) | |
| 24 { | |
| 25 tryReduce = true; | |
| 26 break; | |
| 27 } | |
| 28 reducedDictionarySize += step; | |
| 29 if (reducedDictionarySize >= *inSizeForReduce) | |
| 30 { | |
| 31 tryReduce = true; | |
| 32 break; | |
| 33 } | |
| 34 if (reducedDictionarySize >= ((UInt32)3 << 30)) | |
| 35 break; | |
| 36 reducedDictionarySize += step; | |
| 37 } | |
| 38 } | |
| 39 | |
| 40 { | |
| 41 int numProps = method.Props.Size(); | |
| 42 CMyComPtr<ICompressSetCoderProperties> setCoderProperties; | |
| 43 coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderPro
perties); | |
| 44 if (setCoderProperties == NULL) | |
| 45 { | |
| 46 if (numProps != 0) | |
| 47 return E_INVALIDARG; | |
| 48 } | |
| 49 else | |
| 50 { | |
| 51 CRecordVector<PROPID> propIDs; | |
| 52 NWindows::NCOM::CPropVariant *values = new NWindows::NCOM::CPropVariant[nu
mProps]; | |
| 53 HRESULT res = S_OK; | |
| 54 try | |
| 55 { | |
| 56 for (int i = 0; i < numProps; i++) | |
| 57 { | |
| 58 const CProp &prop = method.Props[i]; | |
| 59 propIDs.Add(prop.Id); | |
| 60 NWindows::NCOM::CPropVariant &value = values[i]; | |
| 61 value = prop.Value; | |
| 62 // if (tryReduce && prop.Id == NCoderPropID::kDictionarySize && value.
vt == VT_UI4 && reducedDictionarySize < value.ulVal) | |
| 63 if (tryReduce) | |
| 64 if (prop.Id == NCoderPropID::kDictionarySize) | |
| 65 if (value.vt == VT_UI4) | |
| 66 if (reducedDictionarySize < value.ulVal) | |
| 67 value.ulVal = reducedDictionarySize; | |
| 68 } | |
| 69 CMyComPtr<ICompressSetCoderProperties> setCoderProperties; | |
| 70 coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCode
rProperties); | |
| 71 res = setCoderProperties->SetCoderProperties(&propIDs.Front(), values, n
umProps); | |
| 72 } | |
| 73 catch(...) | |
| 74 { | |
| 75 delete []values; | |
| 76 throw; | |
| 77 } | |
| 78 delete []values; | |
| 79 RINOK(res); | |
| 80 } | |
| 81 } | |
| 82 | |
| 83 /* | |
| 84 CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties; | |
| 85 coder->QueryInterface(IID_ICompressWriteCoderProperties, (void **)&writeCoderP
roperties); | |
| 86 if (writeCoderProperties != NULL) | |
| 87 { | |
| 88 CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp; | |
| 89 CMyComPtr<ISequentialOutStream> outStream(outStreamSpec); | |
| 90 outStreamSpec->Init(); | |
| 91 RINOK(writeCoderProperties->WriteCoderProperties(outStream)); | |
| 92 size_t size = outStreamSpec->GetSize(); | |
| 93 filterProps.SetCapacity(size); | |
| 94 memmove(filterProps, outStreamSpec->GetBuffer(), size); | |
| 95 } | |
| 96 */ | |
| 97 return S_OK; | |
| 98 } | |
| 99 | |
| OLD | NEW |