1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// FilterCoder.cpp 2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h" 4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../../C/Alloc.h" 6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 7baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../Common/Defs.h" 8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "FilterCoder.h" 10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StreamUtils.h" 11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 12baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic const UInt32 kBufferSize = 1 << 17; 13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 14baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCFilterCoder::CFilterCoder() 15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _buffer = (Byte *)::MidAlloc(kBufferSize); 17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_buffer == 0) 18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync throw 1; 19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 21baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCFilterCoder::~CFilterCoder() 22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync ::MidFree(_buffer); 24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 26baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT CFilterCoder::WriteWithLimit(ISequentialOutStream *outStream, UInt32 size) 27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 28baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_outSizeIsDefined) 29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 30baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt64 remSize = _outSize - _nowPos64; 31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (size > remSize) 32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size = (UInt32)remSize; 33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync RINOK(WriteStream(outStream, _buffer, size)); 35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _nowPos64 += size; 36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 38baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 39baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, 40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress) 41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync RINOK(Init()); 43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt32 bufferPos = 0; 44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _outSizeIsDefined = (outSize != 0); 45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_outSizeIsDefined) 46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _outSize = *outSize; 47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 48baa3858d3f5d128a5c8466b700098109edcad5f2repo sync while (!_outSizeIsDefined || _nowPos64 < _outSize) 49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size_t processedSize = kBufferSize - bufferPos; 51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync // Change it: It can be optimized using ReadPart 53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync RINOK(ReadStream(inStream, _buffer + bufferPos, &processedSize)); 54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt32 endPos = bufferPos + (UInt32)processedSize; 56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync bufferPos = Filter->Filter(_buffer, endPos); 58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (bufferPos > endPos) 59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (; endPos < bufferPos; endPos++) 61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _buffer[endPos] = 0; 62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync bufferPos = Filter->Filter(_buffer, endPos); 63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (bufferPos == 0) 66baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 67baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (endPos == 0) 68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return WriteWithLimit(outStream, endPos); 70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 71baa3858d3f5d128a5c8466b700098109edcad5f2repo sync RINOK(WriteWithLimit(outStream, bufferPos)); 72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (progress != NULL) 73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync RINOK(progress->SetRatioInfo(&_nowPos64, &_nowPos64)); 75baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt32 i = 0; 77baa3858d3f5d128a5c8466b700098109edcad5f2repo sync while (bufferPos < endPos) 78baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _buffer[i++] = _buffer[bufferPos++]; 79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync bufferPos = i; 80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 82baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 83baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 84baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::SetOutStream(ISequentialOutStream *outStream) 85baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _bufferPos = 0; 87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _outStream = outStream; 88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return Init(); 89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 91baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::ReleaseOutStream() 92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _outStream.Release(); 94baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 95baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 96baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 97baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 98baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::Write(const void *data, UInt32 size, UInt32 *processedSize) 99baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 100baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (processedSize != NULL) 101baa3858d3f5d128a5c8466b700098109edcad5f2repo sync *processedSize = 0; 102baa3858d3f5d128a5c8466b700098109edcad5f2repo sync while (size > 0) 103baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 104baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt32 sizeTemp = MyMin(size, kBufferSize - _bufferPos); 105baa3858d3f5d128a5c8466b700098109edcad5f2repo sync memcpy(_buffer + _bufferPos, data, sizeTemp); 106baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size -= sizeTemp; 107baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (processedSize != NULL) 108baa3858d3f5d128a5c8466b700098109edcad5f2repo sync *processedSize += sizeTemp; 109baa3858d3f5d128a5c8466b700098109edcad5f2repo sync data = (const Byte *)data + sizeTemp; 110baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt32 endPos = _bufferPos + sizeTemp; 111baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _bufferPos = Filter->Filter(_buffer, endPos); 112baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_bufferPos == 0) 113baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 114baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _bufferPos = endPos; 115baa3858d3f5d128a5c8466b700098109edcad5f2repo sync break; 116baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 117baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_bufferPos > endPos) 118baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 119baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (size != 0) 120baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return E_FAIL; 121baa3858d3f5d128a5c8466b700098109edcad5f2repo sync break; 122baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 123baa3858d3f5d128a5c8466b700098109edcad5f2repo sync RINOK(WriteWithLimit(_outStream, _bufferPos)); 124baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt32 i = 0; 125baa3858d3f5d128a5c8466b700098109edcad5f2repo sync while (_bufferPos < endPos) 126baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _buffer[i++] = _buffer[_bufferPos++]; 127baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _bufferPos = i; 128baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 129baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 130baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 131baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 132baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::Flush() 133baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 134baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_bufferPos != 0) 135baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 136baa3858d3f5d128a5c8466b700098109edcad5f2repo sync // _buffer contains only data refused by previous Filter->Filter call. 137baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt32 endPos = Filter->Filter(_buffer, _bufferPos); 138baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (endPos > _bufferPos) 139baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 140baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (; _bufferPos < endPos; _bufferPos++) 141baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _buffer[_bufferPos] = 0; 142baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (Filter->Filter(_buffer, endPos) != endPos) 143baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return E_FAIL; 144baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 145baa3858d3f5d128a5c8466b700098109edcad5f2repo sync RINOK(WriteWithLimit(_outStream, _bufferPos)); 146baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _bufferPos = 0; 147baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 148baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CMyComPtr<IOutStreamFlush> flush; 149baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _outStream.QueryInterface(IID_IOutStreamFlush, &flush); 150baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (flush) 151baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return flush->Flush(); 152baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 153baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 154baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 155baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 156baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::SetInStream(ISequentialInStream *inStream) 157baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 158baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _convertedPosBegin = _convertedPosEnd = _bufferPos = 0; 159baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _inStream = inStream; 160baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return Init(); 161baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 162baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 163baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::ReleaseInStream() 164baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 165baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _inStream.Release(); 166baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 167baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 168baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 169baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::Read(void *data, UInt32 size, UInt32 *processedSize) 170baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 171baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (processedSize != NULL) 172baa3858d3f5d128a5c8466b700098109edcad5f2repo sync *processedSize = 0; 173baa3858d3f5d128a5c8466b700098109edcad5f2repo sync while (size > 0) 174baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 175baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_convertedPosBegin != _convertedPosEnd) 176baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 177baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt32 sizeTemp = MyMin(size, _convertedPosEnd - _convertedPosBegin); 178baa3858d3f5d128a5c8466b700098109edcad5f2repo sync memcpy(data, _buffer + _convertedPosBegin, sizeTemp); 179baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _convertedPosBegin += sizeTemp; 180baa3858d3f5d128a5c8466b700098109edcad5f2repo sync data = (void *)((Byte *)data + sizeTemp); 181baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size -= sizeTemp; 182baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (processedSize != NULL) 183baa3858d3f5d128a5c8466b700098109edcad5f2repo sync *processedSize += sizeTemp; 184baa3858d3f5d128a5c8466b700098109edcad5f2repo sync break; 185baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 186baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt32 i; 187baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (i = 0; _convertedPosEnd + i < _bufferPos; i++) 188baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _buffer[i] = _buffer[_convertedPosEnd + i]; 189baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _bufferPos = i; 190baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _convertedPosBegin = _convertedPosEnd = 0; 191baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size_t processedSizeTemp = kBufferSize - _bufferPos; 192baa3858d3f5d128a5c8466b700098109edcad5f2repo sync RINOK(ReadStream(_inStream, _buffer + _bufferPos, &processedSizeTemp)); 193baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _bufferPos += (UInt32)processedSizeTemp; 194baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _convertedPosEnd = Filter->Filter(_buffer, _bufferPos); 195baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_convertedPosEnd == 0) 196baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 197baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_bufferPos == 0) 198baa3858d3f5d128a5c8466b700098109edcad5f2repo sync break; 199baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _convertedPosEnd = _bufferPos; // check it 200baa3858d3f5d128a5c8466b700098109edcad5f2repo sync continue; 201baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 202baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_convertedPosEnd > _bufferPos) 203baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 204baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (; _bufferPos < _convertedPosEnd; _bufferPos++) 205baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _buffer[_bufferPos] = 0; 206baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _convertedPosEnd = Filter->Filter(_buffer, _bufferPos); 207baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 208baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 209baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 210baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 211baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 212baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifndef _NO_CRYPTO 213baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::CryptoSetPassword(const Byte *data, UInt32 size) 214baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 215baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return _setPassword->CryptoSetPassword(data, size); 216baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 217baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif 218baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 219baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifndef EXTRACT_ONLY 220baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::SetCoderProperties(const PROPID *propIDs, 221baa3858d3f5d128a5c8466b700098109edcad5f2repo sync const PROPVARIANT *properties, UInt32 numProperties) 222baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 223baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return _SetCoderProperties->SetCoderProperties(propIDs, properties, numProperties); 224baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 225baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 226baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::WriteCoderProperties(ISequentialOutStream *outStream) 227baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 228baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return _writeCoderProperties->WriteCoderProperties(outStream); 229baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 230baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 231baa3858d3f5d128a5c8466b700098109edcad5f2repo sync/* 232baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::ResetSalt() 233baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 234baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return _CryptoResetSalt->ResetSalt(); 235baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 236baa3858d3f5d128a5c8466b700098109edcad5f2repo sync*/ 237baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 238baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::ResetInitVector() 239baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 240baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return _CryptoResetInitVector->ResetInitVector(); 241baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 242baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif 243baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 244baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CFilterCoder::SetDecoderProperties2(const Byte *data, UInt32 size) 245baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 246baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return _setDecoderProperties->SetDecoderProperties2(data, size); 247baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 248