1*f6dc9357SAndroid Build Coastguard Worker // CoderMixer2.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_CODER_MIXER2_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_CODER_MIXER2_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h" 7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyVector.h" 8*f6dc9357SAndroid Build Coastguard Worker 9*f6dc9357SAndroid Build Coastguard Worker #include "../../ICoder.h" 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/CreateCoder.h" 12*f6dc9357SAndroid Build Coastguard Worker 13*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_ST 14*f6dc9357SAndroid Build Coastguard Worker #define USE_MIXER_ST 15*f6dc9357SAndroid Build Coastguard Worker #else 16*f6dc9357SAndroid Build Coastguard Worker #define USE_MIXER_MT 17*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 18*f6dc9357SAndroid Build Coastguard Worker #define USE_MIXER_ST 19*f6dc9357SAndroid Build Coastguard Worker #endif 20*f6dc9357SAndroid Build Coastguard Worker #endif 21*f6dc9357SAndroid Build Coastguard Worker 22*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_MIXER_MT 23*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/StreamBinder.h" 24*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/VirtThread.h" 25*f6dc9357SAndroid Build Coastguard Worker #endif 26*f6dc9357SAndroid Build Coastguard Worker 27*f6dc9357SAndroid Build Coastguard Worker 28*f6dc9357SAndroid Build Coastguard Worker 29*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_MIXER_ST 30*f6dc9357SAndroid Build Coastguard Worker 31*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1( 32*f6dc9357SAndroid Build Coastguard Worker CSequentialInStreamCalcSize 33*f6dc9357SAndroid Build Coastguard Worker , ISequentialInStream 34*f6dc9357SAndroid Build Coastguard Worker ) 35*f6dc9357SAndroid Build Coastguard Worker bool _wasFinished; 36*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> _stream; 37*f6dc9357SAndroid Build Coastguard Worker UInt64 _size; 38*f6dc9357SAndroid Build Coastguard Worker public: SetStream(ISequentialInStream * stream)39*f6dc9357SAndroid Build Coastguard Worker void SetStream(ISequentialInStream *stream) { _stream = stream; } Init()40*f6dc9357SAndroid Build Coastguard Worker void Init() 41*f6dc9357SAndroid Build Coastguard Worker { 42*f6dc9357SAndroid Build Coastguard Worker _size = 0; 43*f6dc9357SAndroid Build Coastguard Worker _wasFinished = false; 44*f6dc9357SAndroid Build Coastguard Worker } ReleaseStream()45*f6dc9357SAndroid Build Coastguard Worker void ReleaseStream() { _stream.Release(); } GetSize()46*f6dc9357SAndroid Build Coastguard Worker UInt64 GetSize() const { return _size; } WasFinished()47*f6dc9357SAndroid Build Coastguard Worker bool WasFinished() const { return _wasFinished; } 48*f6dc9357SAndroid Build Coastguard Worker }; 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Worker 51*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_2( 52*f6dc9357SAndroid Build Coastguard Worker COutStreamCalcSize 53*f6dc9357SAndroid Build Coastguard Worker , ISequentialOutStream 54*f6dc9357SAndroid Build Coastguard Worker , IOutStreamFinish 55*f6dc9357SAndroid Build Coastguard Worker ) 56*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialOutStream> _stream; 57*f6dc9357SAndroid Build Coastguard Worker UInt64 _size; 58*f6dc9357SAndroid Build Coastguard Worker public: 59*f6dc9357SAndroid Build Coastguard Worker void SetStream(ISequentialOutStream *stream) { _stream = stream; } 60*f6dc9357SAndroid Build Coastguard Worker void ReleaseStream() { _stream.Release(); } 61*f6dc9357SAndroid Build Coastguard Worker void Init() { _size = 0; } 62*f6dc9357SAndroid Build Coastguard Worker UInt64 GetSize() const { return _size; } 63*f6dc9357SAndroid Build Coastguard Worker }; 64*f6dc9357SAndroid Build Coastguard Worker 65*f6dc9357SAndroid Build Coastguard Worker #endif 66*f6dc9357SAndroid Build Coastguard Worker 67*f6dc9357SAndroid Build Coastguard Worker 68*f6dc9357SAndroid Build Coastguard Worker 69*f6dc9357SAndroid Build Coastguard Worker namespace NCoderMixer2 { 70*f6dc9357SAndroid Build Coastguard Worker 71*f6dc9357SAndroid Build Coastguard Worker struct CBond 72*f6dc9357SAndroid Build Coastguard Worker { 73*f6dc9357SAndroid Build Coastguard Worker UInt32 PackIndex; 74*f6dc9357SAndroid Build Coastguard Worker UInt32 UnpackIndex; 75*f6dc9357SAndroid Build Coastguard Worker 76*f6dc9357SAndroid Build Coastguard Worker UInt32 Get_InIndex(bool encodeMode) const { return encodeMode ? UnpackIndex : PackIndex; } 77*f6dc9357SAndroid Build Coastguard Worker UInt32 Get_OutIndex(bool encodeMode) const { return encodeMode ? PackIndex : UnpackIndex; } 78*f6dc9357SAndroid Build Coastguard Worker }; 79*f6dc9357SAndroid Build Coastguard Worker 80*f6dc9357SAndroid Build Coastguard Worker 81*f6dc9357SAndroid Build Coastguard Worker struct CCoderStreamsInfo 82*f6dc9357SAndroid Build Coastguard Worker { 83*f6dc9357SAndroid Build Coastguard Worker UInt32 NumStreams; 84*f6dc9357SAndroid Build Coastguard Worker }; 85*f6dc9357SAndroid Build Coastguard Worker 86*f6dc9357SAndroid Build Coastguard Worker 87*f6dc9357SAndroid Build Coastguard Worker struct CBindInfo 88*f6dc9357SAndroid Build Coastguard Worker { 89*f6dc9357SAndroid Build Coastguard Worker CRecordVector<CCoderStreamsInfo> Coders; 90*f6dc9357SAndroid Build Coastguard Worker CRecordVector<CBond> Bonds; 91*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> PackStreams; 92*f6dc9357SAndroid Build Coastguard Worker unsigned UnpackCoder; 93*f6dc9357SAndroid Build Coastguard Worker 94*f6dc9357SAndroid Build Coastguard Worker unsigned GetNum_Bonds_and_PackStreams() const { return Bonds.Size() + PackStreams.Size(); } 95*f6dc9357SAndroid Build Coastguard Worker 96*f6dc9357SAndroid Build Coastguard Worker int FindBond_for_PackStream(UInt32 packStream) const 97*f6dc9357SAndroid Build Coastguard Worker { 98*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, Bonds) 99*f6dc9357SAndroid Build Coastguard Worker if (Bonds[i].PackIndex == packStream) 100*f6dc9357SAndroid Build Coastguard Worker return (int)i; 101*f6dc9357SAndroid Build Coastguard Worker return -1; 102*f6dc9357SAndroid Build Coastguard Worker } 103*f6dc9357SAndroid Build Coastguard Worker 104*f6dc9357SAndroid Build Coastguard Worker int FindBond_for_UnpackStream(UInt32 unpackStream) const 105*f6dc9357SAndroid Build Coastguard Worker { 106*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, Bonds) 107*f6dc9357SAndroid Build Coastguard Worker if (Bonds[i].UnpackIndex == unpackStream) 108*f6dc9357SAndroid Build Coastguard Worker return (int)i; 109*f6dc9357SAndroid Build Coastguard Worker return -1; 110*f6dc9357SAndroid Build Coastguard Worker } 111*f6dc9357SAndroid Build Coastguard Worker 112*f6dc9357SAndroid Build Coastguard Worker bool SetUnpackCoder() 113*f6dc9357SAndroid Build Coastguard Worker { 114*f6dc9357SAndroid Build Coastguard Worker bool isOk = false; 115*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, Coders) 116*f6dc9357SAndroid Build Coastguard Worker { 117*f6dc9357SAndroid Build Coastguard Worker if (FindBond_for_UnpackStream(i) < 0) 118*f6dc9357SAndroid Build Coastguard Worker { 119*f6dc9357SAndroid Build Coastguard Worker if (isOk) 120*f6dc9357SAndroid Build Coastguard Worker return false; 121*f6dc9357SAndroid Build Coastguard Worker UnpackCoder = i; 122*f6dc9357SAndroid Build Coastguard Worker isOk = true; 123*f6dc9357SAndroid Build Coastguard Worker } 124*f6dc9357SAndroid Build Coastguard Worker } 125*f6dc9357SAndroid Build Coastguard Worker return isOk; 126*f6dc9357SAndroid Build Coastguard Worker } 127*f6dc9357SAndroid Build Coastguard Worker 128*f6dc9357SAndroid Build Coastguard Worker bool IsStream_in_PackStreams(UInt32 streamIndex) const 129*f6dc9357SAndroid Build Coastguard Worker { 130*f6dc9357SAndroid Build Coastguard Worker return FindStream_in_PackStreams(streamIndex) >= 0; 131*f6dc9357SAndroid Build Coastguard Worker } 132*f6dc9357SAndroid Build Coastguard Worker 133*f6dc9357SAndroid Build Coastguard Worker int FindStream_in_PackStreams(UInt32 streamIndex) const 134*f6dc9357SAndroid Build Coastguard Worker { 135*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, PackStreams) 136*f6dc9357SAndroid Build Coastguard Worker if (PackStreams[i] == streamIndex) 137*f6dc9357SAndroid Build Coastguard Worker return (int)i; 138*f6dc9357SAndroid Build Coastguard Worker return -1; 139*f6dc9357SAndroid Build Coastguard Worker } 140*f6dc9357SAndroid Build Coastguard Worker 141*f6dc9357SAndroid Build Coastguard Worker 142*f6dc9357SAndroid Build Coastguard Worker // that function is used before Maps is calculated 143*f6dc9357SAndroid Build Coastguard Worker 144*f6dc9357SAndroid Build Coastguard Worker UInt32 GetStream_for_Coder(UInt32 coderIndex) const 145*f6dc9357SAndroid Build Coastguard Worker { 146*f6dc9357SAndroid Build Coastguard Worker UInt32 streamIndex = 0; 147*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < coderIndex; i++) 148*f6dc9357SAndroid Build Coastguard Worker streamIndex += Coders[i].NumStreams; 149*f6dc9357SAndroid Build Coastguard Worker return streamIndex; 150*f6dc9357SAndroid Build Coastguard Worker } 151*f6dc9357SAndroid Build Coastguard Worker 152*f6dc9357SAndroid Build Coastguard Worker // ---------- Maps Section ---------- 153*f6dc9357SAndroid Build Coastguard Worker 154*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> Coder_to_Stream; 155*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> Stream_to_Coder; 156*f6dc9357SAndroid Build Coastguard Worker 157*f6dc9357SAndroid Build Coastguard Worker void ClearMaps(); 158*f6dc9357SAndroid Build Coastguard Worker bool CalcMapsAndCheck(); 159*f6dc9357SAndroid Build Coastguard Worker 160*f6dc9357SAndroid Build Coastguard Worker // ---------- End of Maps Section ---------- 161*f6dc9357SAndroid Build Coastguard Worker 162*f6dc9357SAndroid Build Coastguard Worker void Clear() 163*f6dc9357SAndroid Build Coastguard Worker { 164*f6dc9357SAndroid Build Coastguard Worker Coders.Clear(); 165*f6dc9357SAndroid Build Coastguard Worker Bonds.Clear(); 166*f6dc9357SAndroid Build Coastguard Worker PackStreams.Clear(); 167*f6dc9357SAndroid Build Coastguard Worker 168*f6dc9357SAndroid Build Coastguard Worker ClearMaps(); 169*f6dc9357SAndroid Build Coastguard Worker } 170*f6dc9357SAndroid Build Coastguard Worker 171*f6dc9357SAndroid Build Coastguard Worker void GetCoder_for_Stream(UInt32 streamIndex, UInt32 &coderIndex, UInt32 &coderStreamIndex) const 172*f6dc9357SAndroid Build Coastguard Worker { 173*f6dc9357SAndroid Build Coastguard Worker coderIndex = Stream_to_Coder[streamIndex]; 174*f6dc9357SAndroid Build Coastguard Worker coderStreamIndex = streamIndex - Coder_to_Stream[coderIndex]; 175*f6dc9357SAndroid Build Coastguard Worker } 176*f6dc9357SAndroid Build Coastguard Worker }; 177*f6dc9357SAndroid Build Coastguard Worker 178*f6dc9357SAndroid Build Coastguard Worker 179*f6dc9357SAndroid Build Coastguard Worker 180*f6dc9357SAndroid Build Coastguard Worker class CCoder 181*f6dc9357SAndroid Build Coastguard Worker { 182*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_NO_COPY(CCoder) 183*f6dc9357SAndroid Build Coastguard Worker public: 184*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressCoder> Coder; 185*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressCoder2> Coder2; 186*f6dc9357SAndroid Build Coastguard Worker UInt32 NumStreams; 187*f6dc9357SAndroid Build Coastguard Worker bool Finish; 188*f6dc9357SAndroid Build Coastguard Worker 189*f6dc9357SAndroid Build Coastguard Worker UInt64 UnpackSize; 190*f6dc9357SAndroid Build Coastguard Worker const UInt64 *UnpackSizePointer; 191*f6dc9357SAndroid Build Coastguard Worker 192*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt64> PackSizes; 193*f6dc9357SAndroid Build Coastguard Worker CRecordVector<const UInt64 *> PackSizePointers; 194*f6dc9357SAndroid Build Coastguard Worker 195*f6dc9357SAndroid Build Coastguard Worker CCoder(): Finish(false) {} 196*f6dc9357SAndroid Build Coastguard Worker 197*f6dc9357SAndroid Build Coastguard Worker void SetCoderInfo(const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish); 198*f6dc9357SAndroid Build Coastguard Worker 199*f6dc9357SAndroid Build Coastguard Worker HRESULT CheckDataAfterEnd(bool &dataAfterEnd_Error /* , bool &InternalPackSizeError */) const; 200*f6dc9357SAndroid Build Coastguard Worker 201*f6dc9357SAndroid Build Coastguard Worker IUnknown *GetUnknown() const 202*f6dc9357SAndroid Build Coastguard Worker { 203*f6dc9357SAndroid Build Coastguard Worker return Coder ? (IUnknown *)Coder : (IUnknown *)Coder2; 204*f6dc9357SAndroid Build Coastguard Worker } 205*f6dc9357SAndroid Build Coastguard Worker 206*f6dc9357SAndroid Build Coastguard Worker HRESULT QueryInterface(REFGUID iid, void** pp) const 207*f6dc9357SAndroid Build Coastguard Worker { 208*f6dc9357SAndroid Build Coastguard Worker return GetUnknown()->QueryInterface(iid, pp); 209*f6dc9357SAndroid Build Coastguard Worker } 210*f6dc9357SAndroid Build Coastguard Worker }; 211*f6dc9357SAndroid Build Coastguard Worker 212*f6dc9357SAndroid Build Coastguard Worker 213*f6dc9357SAndroid Build Coastguard Worker 214*f6dc9357SAndroid Build Coastguard Worker class CMixer 215*f6dc9357SAndroid Build Coastguard Worker { 216*f6dc9357SAndroid Build Coastguard Worker bool Is_PackSize_Correct_for_Stream(UInt32 streamIndex); 217*f6dc9357SAndroid Build Coastguard Worker 218*f6dc9357SAndroid Build Coastguard Worker protected: 219*f6dc9357SAndroid Build Coastguard Worker CBindInfo _bi; 220*f6dc9357SAndroid Build Coastguard Worker 221*f6dc9357SAndroid Build Coastguard Worker int FindBond_for_Stream(bool forInputStream, UInt32 streamIndex) const 222*f6dc9357SAndroid Build Coastguard Worker { 223*f6dc9357SAndroid Build Coastguard Worker if (EncodeMode == forInputStream) 224*f6dc9357SAndroid Build Coastguard Worker return _bi.FindBond_for_UnpackStream(streamIndex); 225*f6dc9357SAndroid Build Coastguard Worker else 226*f6dc9357SAndroid Build Coastguard Worker return _bi.FindBond_for_PackStream(streamIndex); 227*f6dc9357SAndroid Build Coastguard Worker } 228*f6dc9357SAndroid Build Coastguard Worker 229*f6dc9357SAndroid Build Coastguard Worker CBoolVector IsFilter_Vector; 230*f6dc9357SAndroid Build Coastguard Worker CBoolVector IsExternal_Vector; 231*f6dc9357SAndroid Build Coastguard Worker bool EncodeMode; 232*f6dc9357SAndroid Build Coastguard Worker public: 233*f6dc9357SAndroid Build Coastguard Worker unsigned MainCoderIndex; 234*f6dc9357SAndroid Build Coastguard Worker 235*f6dc9357SAndroid Build Coastguard Worker // bool InternalPackSizeError; 236*f6dc9357SAndroid Build Coastguard Worker 237*f6dc9357SAndroid Build Coastguard Worker CMixer(bool encodeMode): 238*f6dc9357SAndroid Build Coastguard Worker EncodeMode(encodeMode), 239*f6dc9357SAndroid Build Coastguard Worker MainCoderIndex(0) 240*f6dc9357SAndroid Build Coastguard Worker // , InternalPackSizeError(false) 241*f6dc9357SAndroid Build Coastguard Worker {} 242*f6dc9357SAndroid Build Coastguard Worker 243*f6dc9357SAndroid Build Coastguard Worker virtual ~CMixer() {} 244*f6dc9357SAndroid Build Coastguard Worker /* 245*f6dc9357SAndroid Build Coastguard Worker Sequence of calling: 246*f6dc9357SAndroid Build Coastguard Worker 247*f6dc9357SAndroid Build Coastguard Worker SetBindInfo(); 248*f6dc9357SAndroid Build Coastguard Worker for each coder 249*f6dc9357SAndroid Build Coastguard Worker AddCoder(); 250*f6dc9357SAndroid Build Coastguard Worker SelectMainCoder(); 251*f6dc9357SAndroid Build Coastguard Worker 252*f6dc9357SAndroid Build Coastguard Worker for each file 253*f6dc9357SAndroid Build Coastguard Worker { 254*f6dc9357SAndroid Build Coastguard Worker ReInit() 255*f6dc9357SAndroid Build Coastguard Worker for each coder 256*f6dc9357SAndroid Build Coastguard Worker SetCoderInfo(); 257*f6dc9357SAndroid Build Coastguard Worker Code(); 258*f6dc9357SAndroid Build Coastguard Worker } 259*f6dc9357SAndroid Build Coastguard Worker */ 260*f6dc9357SAndroid Build Coastguard Worker 261*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) 262*f6dc9357SAndroid Build Coastguard Worker { 263*f6dc9357SAndroid Build Coastguard Worker _bi = bindInfo; 264*f6dc9357SAndroid Build Coastguard Worker IsFilter_Vector.Clear(); 265*f6dc9357SAndroid Build Coastguard Worker MainCoderIndex = 0; 266*f6dc9357SAndroid Build Coastguard Worker return S_OK; 267*f6dc9357SAndroid Build Coastguard Worker } 268*f6dc9357SAndroid Build Coastguard Worker 269*f6dc9357SAndroid Build Coastguard Worker virtual void AddCoder(const CCreatedCoder &cod) = 0; 270*f6dc9357SAndroid Build Coastguard Worker virtual CCoder &GetCoder(unsigned index) = 0; 271*f6dc9357SAndroid Build Coastguard Worker virtual void SelectMainCoder(bool useFirst) = 0; 272*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT ReInit2() = 0; 273*f6dc9357SAndroid Build Coastguard Worker virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish) = 0; 274*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT Code( 275*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream * const *inStreams, 276*f6dc9357SAndroid Build Coastguard Worker ISequentialOutStream * const *outStreams, 277*f6dc9357SAndroid Build Coastguard Worker ICompressProgressInfo *progress, 278*f6dc9357SAndroid Build Coastguard Worker bool &dataAfterEnd_Error) = 0; 279*f6dc9357SAndroid Build Coastguard Worker virtual UInt64 GetBondStreamSize(unsigned bondIndex) const = 0; 280*f6dc9357SAndroid Build Coastguard Worker 281*f6dc9357SAndroid Build Coastguard Worker bool Is_UnpackSize_Correct_for_Coder(UInt32 coderIndex); 282*f6dc9357SAndroid Build Coastguard Worker bool Is_PackSize_Correct_for_Coder(UInt32 coderIndex); 283*f6dc9357SAndroid Build Coastguard Worker bool IsThere_ExternalCoder_in_PackTree(UInt32 coderIndex); 284*f6dc9357SAndroid Build Coastguard Worker }; 285*f6dc9357SAndroid Build Coastguard Worker 286*f6dc9357SAndroid Build Coastguard Worker 287*f6dc9357SAndroid Build Coastguard Worker 288*f6dc9357SAndroid Build Coastguard Worker 289*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_MIXER_ST 290*f6dc9357SAndroid Build Coastguard Worker 291*f6dc9357SAndroid Build Coastguard Worker struct CCoderST: public CCoder 292*f6dc9357SAndroid Build Coastguard Worker { 293*f6dc9357SAndroid Build Coastguard Worker bool CanRead; 294*f6dc9357SAndroid Build Coastguard Worker bool CanWrite; 295*f6dc9357SAndroid Build Coastguard Worker 296*f6dc9357SAndroid Build Coastguard Worker CCoderST(): CanRead(false), CanWrite(false) {} 297*f6dc9357SAndroid Build Coastguard Worker }; 298*f6dc9357SAndroid Build Coastguard Worker 299*f6dc9357SAndroid Build Coastguard Worker 300*f6dc9357SAndroid Build Coastguard Worker struct CStBinderStream 301*f6dc9357SAndroid Build Coastguard Worker { 302*f6dc9357SAndroid Build Coastguard Worker CSequentialInStreamCalcSize *InStreamSpec; 303*f6dc9357SAndroid Build Coastguard Worker COutStreamCalcSize *OutStreamSpec; 304*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IUnknown> StreamRef; 305*f6dc9357SAndroid Build Coastguard Worker 306*f6dc9357SAndroid Build Coastguard Worker CStBinderStream(): InStreamSpec(NULL), OutStreamSpec(NULL) {} 307*f6dc9357SAndroid Build Coastguard Worker }; 308*f6dc9357SAndroid Build Coastguard Worker 309*f6dc9357SAndroid Build Coastguard Worker 310*f6dc9357SAndroid Build Coastguard Worker class CMixerST: 311*f6dc9357SAndroid Build Coastguard Worker public IUnknown, 312*f6dc9357SAndroid Build Coastguard Worker public CMixer, 313*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp 314*f6dc9357SAndroid Build Coastguard Worker { 315*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_0 316*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_NO_COPY(CMixerST) 317*f6dc9357SAndroid Build Coastguard Worker 318*f6dc9357SAndroid Build Coastguard Worker HRESULT GetInStream2(ISequentialInStream * const *inStreams, /* const UInt64 * const *inSizes, */ 319*f6dc9357SAndroid Build Coastguard Worker UInt32 outStreamIndex, ISequentialInStream **inStreamRes); 320*f6dc9357SAndroid Build Coastguard Worker HRESULT GetInStream(ISequentialInStream * const *inStreams, /* const UInt64 * const *inSizes, */ 321*f6dc9357SAndroid Build Coastguard Worker UInt32 inStreamIndex, ISequentialInStream **inStreamRes); 322*f6dc9357SAndroid Build Coastguard Worker HRESULT GetOutStream(ISequentialOutStream * const *outStreams, /* const UInt64 * const *outSizes, */ 323*f6dc9357SAndroid Build Coastguard Worker UInt32 outStreamIndex, ISequentialOutStream **outStreamRes); 324*f6dc9357SAndroid Build Coastguard Worker 325*f6dc9357SAndroid Build Coastguard Worker HRESULT FinishStream(UInt32 streamIndex); 326*f6dc9357SAndroid Build Coastguard Worker HRESULT FinishCoder(UInt32 coderIndex); 327*f6dc9357SAndroid Build Coastguard Worker 328*f6dc9357SAndroid Build Coastguard Worker public: 329*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CCoderST> _coders; 330*f6dc9357SAndroid Build Coastguard Worker 331*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CStBinderStream> _binderStreams; 332*f6dc9357SAndroid Build Coastguard Worker 333*f6dc9357SAndroid Build Coastguard Worker CMixerST(bool encodeMode); 334*f6dc9357SAndroid Build Coastguard Worker ~CMixerST() Z7_DESTRUCTOR_override; 335*f6dc9357SAndroid Build Coastguard Worker 336*f6dc9357SAndroid Build Coastguard Worker virtual void AddCoder(const CCreatedCoder &cod) Z7_override; 337*f6dc9357SAndroid Build Coastguard Worker virtual CCoder &GetCoder(unsigned index) Z7_override; 338*f6dc9357SAndroid Build Coastguard Worker virtual void SelectMainCoder(bool useFirst) Z7_override; 339*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT ReInit2() Z7_override; 340*f6dc9357SAndroid Build Coastguard Worker virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish) Z7_override 341*f6dc9357SAndroid Build Coastguard Worker { _coders[coderIndex].SetCoderInfo(unpackSize, packSizes, finish); } 342*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT Code( 343*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream * const *inStreams, 344*f6dc9357SAndroid Build Coastguard Worker ISequentialOutStream * const *outStreams, 345*f6dc9357SAndroid Build Coastguard Worker ICompressProgressInfo *progress, 346*f6dc9357SAndroid Build Coastguard Worker bool &dataAfterEnd_Error) Z7_override; 347*f6dc9357SAndroid Build Coastguard Worker virtual UInt64 GetBondStreamSize(unsigned bondIndex) const Z7_override; 348*f6dc9357SAndroid Build Coastguard Worker 349*f6dc9357SAndroid Build Coastguard Worker HRESULT GetMainUnpackStream( 350*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream * const *inStreams, 351*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream **inStreamRes); 352*f6dc9357SAndroid Build Coastguard Worker }; 353*f6dc9357SAndroid Build Coastguard Worker 354*f6dc9357SAndroid Build Coastguard Worker #endif 355*f6dc9357SAndroid Build Coastguard Worker 356*f6dc9357SAndroid Build Coastguard Worker 357*f6dc9357SAndroid Build Coastguard Worker 358*f6dc9357SAndroid Build Coastguard Worker 359*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_MIXER_MT 360*f6dc9357SAndroid Build Coastguard Worker 361*f6dc9357SAndroid Build Coastguard Worker class CCoderMT: public CCoder, public CVirtThread 362*f6dc9357SAndroid Build Coastguard Worker { 363*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_NO_COPY(CCoderMT) 364*f6dc9357SAndroid Build Coastguard Worker CRecordVector<ISequentialInStream*> InStreamPointers; 365*f6dc9357SAndroid Build Coastguard Worker CRecordVector<ISequentialOutStream*> OutStreamPointers; 366*f6dc9357SAndroid Build Coastguard Worker 367*f6dc9357SAndroid Build Coastguard Worker private: 368*f6dc9357SAndroid Build Coastguard Worker virtual void Execute() Z7_override; 369*f6dc9357SAndroid Build Coastguard Worker public: 370*f6dc9357SAndroid Build Coastguard Worker bool EncodeMode; 371*f6dc9357SAndroid Build Coastguard Worker HRESULT Result; 372*f6dc9357SAndroid Build Coastguard Worker CObjectVector< CMyComPtr<ISequentialInStream> > InStreams; 373*f6dc9357SAndroid Build Coastguard Worker CObjectVector< CMyComPtr<ISequentialOutStream> > OutStreams; 374*f6dc9357SAndroid Build Coastguard Worker 375*f6dc9357SAndroid Build Coastguard Worker void Release() 376*f6dc9357SAndroid Build Coastguard Worker { 377*f6dc9357SAndroid Build Coastguard Worker InStreamPointers.Clear(); 378*f6dc9357SAndroid Build Coastguard Worker OutStreamPointers.Clear(); 379*f6dc9357SAndroid Build Coastguard Worker unsigned i; 380*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < InStreams.Size(); i++) 381*f6dc9357SAndroid Build Coastguard Worker InStreams[i].Release(); 382*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < OutStreams.Size(); i++) 383*f6dc9357SAndroid Build Coastguard Worker OutStreams[i].Release(); 384*f6dc9357SAndroid Build Coastguard Worker } 385*f6dc9357SAndroid Build Coastguard Worker 386*f6dc9357SAndroid Build Coastguard Worker class CReleaser 387*f6dc9357SAndroid Build Coastguard Worker { 388*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_NO_COPY(CReleaser) 389*f6dc9357SAndroid Build Coastguard Worker CCoderMT &_c; 390*f6dc9357SAndroid Build Coastguard Worker public: 391*f6dc9357SAndroid Build Coastguard Worker CReleaser(CCoderMT &c): _c(c) {} 392*f6dc9357SAndroid Build Coastguard Worker ~CReleaser() { _c.Release(); } 393*f6dc9357SAndroid Build Coastguard Worker }; 394*f6dc9357SAndroid Build Coastguard Worker 395*f6dc9357SAndroid Build Coastguard Worker CCoderMT(): EncodeMode(false) {} 396*f6dc9357SAndroid Build Coastguard Worker ~CCoderMT() Z7_DESTRUCTOR_override 397*f6dc9357SAndroid Build Coastguard Worker { 398*f6dc9357SAndroid Build Coastguard Worker /* WaitThreadFinish() will be called in ~CVirtThread(). 399*f6dc9357SAndroid Build Coastguard Worker But we need WaitThreadFinish() call before CCoder destructor, 400*f6dc9357SAndroid Build Coastguard Worker and before destructors of this class members. 401*f6dc9357SAndroid Build Coastguard Worker */ 402*f6dc9357SAndroid Build Coastguard Worker CVirtThread::WaitThreadFinish(); 403*f6dc9357SAndroid Build Coastguard Worker } 404*f6dc9357SAndroid Build Coastguard Worker 405*f6dc9357SAndroid Build Coastguard Worker void Code(ICompressProgressInfo *progress); 406*f6dc9357SAndroid Build Coastguard Worker }; 407*f6dc9357SAndroid Build Coastguard Worker 408*f6dc9357SAndroid Build Coastguard Worker 409*f6dc9357SAndroid Build Coastguard Worker class CMixerMT: 410*f6dc9357SAndroid Build Coastguard Worker public IUnknown, 411*f6dc9357SAndroid Build Coastguard Worker public CMixer, 412*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp 413*f6dc9357SAndroid Build Coastguard Worker { 414*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_0 415*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_NO_COPY(CMixerMT) 416*f6dc9357SAndroid Build Coastguard Worker 417*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CStreamBinder> _streamBinders; 418*f6dc9357SAndroid Build Coastguard Worker 419*f6dc9357SAndroid Build Coastguard Worker HRESULT Init(ISequentialInStream * const *inStreams, ISequentialOutStream * const *outStreams); 420*f6dc9357SAndroid Build Coastguard Worker HRESULT ReturnIfError(HRESULT code); 421*f6dc9357SAndroid Build Coastguard Worker 422*f6dc9357SAndroid Build Coastguard Worker // virtual ~CMixerMT() {} 423*f6dc9357SAndroid Build Coastguard Worker public: 424*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CCoderMT> _coders; 425*f6dc9357SAndroid Build Coastguard Worker 426*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) Z7_override; 427*f6dc9357SAndroid Build Coastguard Worker virtual void AddCoder(const CCreatedCoder &cod) Z7_override; 428*f6dc9357SAndroid Build Coastguard Worker virtual CCoder &GetCoder(unsigned index) Z7_override; 429*f6dc9357SAndroid Build Coastguard Worker virtual void SelectMainCoder(bool useFirst) Z7_override; 430*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT ReInit2() Z7_override; 431*f6dc9357SAndroid Build Coastguard Worker virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes, bool finish) Z7_override 432*f6dc9357SAndroid Build Coastguard Worker { _coders[coderIndex].SetCoderInfo(unpackSize, packSizes, finish); } 433*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT Code( 434*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream * const *inStreams, 435*f6dc9357SAndroid Build Coastguard Worker ISequentialOutStream * const *outStreams, 436*f6dc9357SAndroid Build Coastguard Worker ICompressProgressInfo *progress, 437*f6dc9357SAndroid Build Coastguard Worker bool &dataAfterEnd_Error) Z7_override; 438*f6dc9357SAndroid Build Coastguard Worker virtual UInt64 GetBondStreamSize(unsigned bondIndex) const Z7_override; 439*f6dc9357SAndroid Build Coastguard Worker 440*f6dc9357SAndroid Build Coastguard Worker CMixerMT(bool encodeMode): CMixer(encodeMode) {} 441*f6dc9357SAndroid Build Coastguard Worker }; 442*f6dc9357SAndroid Build Coastguard Worker 443*f6dc9357SAndroid Build Coastguard Worker #endif 444*f6dc9357SAndroid Build Coastguard Worker 445*f6dc9357SAndroid Build Coastguard Worker } 446*f6dc9357SAndroid Build Coastguard Worker 447*f6dc9357SAndroid Build Coastguard Worker #endif 448