rlm@1: // CoderMixer2.h rlm@1: rlm@1: #ifndef __CODER_MIXER2_H rlm@1: #define __CODER_MIXER2_H rlm@1: rlm@1: #include "../../../Common/MyVector.h" rlm@1: #include "../../../Common/Types.h" rlm@1: #include "../../../Common/MyCom.h" rlm@1: #include "../../ICoder.h" rlm@1: rlm@1: namespace NCoderMixer { rlm@1: rlm@1: struct CBindPair rlm@1: { rlm@1: UInt32 InIndex; rlm@1: UInt32 OutIndex; rlm@1: }; rlm@1: rlm@1: struct CCoderStreamsInfo rlm@1: { rlm@1: UInt32 NumInStreams; rlm@1: UInt32 NumOutStreams; rlm@1: }; rlm@1: rlm@1: struct CBindInfo rlm@1: { rlm@1: CRecordVector Coders; rlm@1: CRecordVector BindPairs; rlm@1: CRecordVector InStreams; rlm@1: CRecordVector OutStreams; rlm@1: rlm@1: void Clear() rlm@1: { rlm@1: Coders.Clear(); rlm@1: BindPairs.Clear(); rlm@1: InStreams.Clear(); rlm@1: OutStreams.Clear(); rlm@1: } rlm@1: rlm@1: /* rlm@1: UInt32 GetCoderStartOutStream(UInt32 coderIndex) const rlm@1: { rlm@1: UInt32 numOutStreams = 0; rlm@1: for (UInt32 i = 0; i < coderIndex; i++) rlm@1: numOutStreams += Coders[i].NumOutStreams; rlm@1: return numOutStreams; rlm@1: } rlm@1: */ rlm@1: rlm@1: rlm@1: void GetNumStreams(UInt32 &numInStreams, UInt32 &numOutStreams) const rlm@1: { rlm@1: numInStreams = 0; rlm@1: numOutStreams = 0; rlm@1: for (int i = 0; i < Coders.Size(); i++) rlm@1: { rlm@1: const CCoderStreamsInfo &coderStreamsInfo = Coders[i]; rlm@1: numInStreams += coderStreamsInfo.NumInStreams; rlm@1: numOutStreams += coderStreamsInfo.NumOutStreams; rlm@1: } rlm@1: } rlm@1: rlm@1: int FindBinderForInStream(UInt32 inStream) const rlm@1: { rlm@1: for (int i = 0; i < BindPairs.Size(); i++) rlm@1: if (BindPairs[i].InIndex == inStream) rlm@1: return i; rlm@1: return -1; rlm@1: } rlm@1: int FindBinderForOutStream(UInt32 outStream) const rlm@1: { rlm@1: for (int i = 0; i < BindPairs.Size(); i++) rlm@1: if (BindPairs[i].OutIndex == outStream) rlm@1: return i; rlm@1: return -1; rlm@1: } rlm@1: rlm@1: UInt32 GetCoderInStreamIndex(UInt32 coderIndex) const rlm@1: { rlm@1: UInt32 streamIndex = 0; rlm@1: for (UInt32 i = 0; i < coderIndex; i++) rlm@1: streamIndex += Coders[i].NumInStreams; rlm@1: return streamIndex; rlm@1: } rlm@1: rlm@1: UInt32 GetCoderOutStreamIndex(UInt32 coderIndex) const rlm@1: { rlm@1: UInt32 streamIndex = 0; rlm@1: for (UInt32 i = 0; i < coderIndex; i++) rlm@1: streamIndex += Coders[i].NumOutStreams; rlm@1: return streamIndex; rlm@1: } rlm@1: rlm@1: rlm@1: void FindInStream(UInt32 streamIndex, UInt32 &coderIndex, rlm@1: UInt32 &coderStreamIndex) const rlm@1: { rlm@1: for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++) rlm@1: { rlm@1: UInt32 curSize = Coders[coderIndex].NumInStreams; rlm@1: if (streamIndex < curSize) rlm@1: { rlm@1: coderStreamIndex = streamIndex; rlm@1: return; rlm@1: } rlm@1: streamIndex -= curSize; rlm@1: } rlm@1: throw 1; rlm@1: } rlm@1: void FindOutStream(UInt32 streamIndex, UInt32 &coderIndex, rlm@1: UInt32 &coderStreamIndex) const rlm@1: { rlm@1: for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++) rlm@1: { rlm@1: UInt32 curSize = Coders[coderIndex].NumOutStreams; rlm@1: if (streamIndex < curSize) rlm@1: { rlm@1: coderStreamIndex = streamIndex; rlm@1: return; rlm@1: } rlm@1: streamIndex -= curSize; rlm@1: } rlm@1: throw 1; rlm@1: } rlm@1: }; rlm@1: rlm@1: class CBindReverseConverter rlm@1: { rlm@1: UInt32 _numSrcOutStreams; rlm@1: NCoderMixer::CBindInfo _srcBindInfo; rlm@1: CRecordVector _srcInToDestOutMap; rlm@1: CRecordVector _srcOutToDestInMap; rlm@1: CRecordVector _destInToSrcOutMap; rlm@1: public: rlm@1: UInt32 NumSrcInStreams; rlm@1: CRecordVector DestOutToSrcInMap; rlm@1: rlm@1: CBindReverseConverter(const NCoderMixer::CBindInfo &srcBindInfo); rlm@1: void CreateReverseBindInfo(NCoderMixer::CBindInfo &destBindInfo); rlm@1: }; rlm@1: rlm@1: struct CCoderInfo2 rlm@1: { rlm@1: CMyComPtr Coder; rlm@1: CMyComPtr Coder2; rlm@1: UInt32 NumInStreams; rlm@1: UInt32 NumOutStreams; rlm@1: rlm@1: CRecordVector InSizes; rlm@1: CRecordVector OutSizes; rlm@1: CRecordVector InSizePointers; rlm@1: CRecordVector OutSizePointers; rlm@1: rlm@1: CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams); rlm@1: void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes); rlm@1: rlm@1: HRESULT QueryInterface(REFGUID iid, void** pp) const rlm@1: { rlm@1: IUnknown *p = Coder ? (IUnknown *)Coder : (IUnknown *)Coder2; rlm@1: return p->QueryInterface(iid, pp); rlm@1: } rlm@1: }; rlm@1: rlm@1: class CCoderMixer2 rlm@1: { rlm@1: public: rlm@1: virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) = 0; rlm@1: virtual void ReInit() = 0; rlm@1: virtual void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) = 0; rlm@1: }; rlm@1: rlm@1: } rlm@1: #endif rlm@1: