michael@0: // CoderMixer2.cpp michael@0: michael@0: #include "StdAfx.h" michael@0: michael@0: #include "CoderMixer2.h" michael@0: michael@0: namespace NCoderMixer2 { michael@0: michael@0: CBindReverseConverter::CBindReverseConverter(const CBindInfo &srcBindInfo): michael@0: _srcBindInfo(srcBindInfo) michael@0: { michael@0: srcBindInfo.GetNumStreams(NumSrcInStreams, _numSrcOutStreams); michael@0: michael@0: UInt32 j; michael@0: for (j = 0; j < NumSrcInStreams; j++) michael@0: { michael@0: _srcInToDestOutMap.Add(0); michael@0: DestOutToSrcInMap.Add(0); michael@0: } michael@0: for (j = 0; j < _numSrcOutStreams; j++) michael@0: { michael@0: _srcOutToDestInMap.Add(0); michael@0: _destInToSrcOutMap.Add(0); michael@0: } michael@0: michael@0: UInt32 destInOffset = 0; michael@0: UInt32 destOutOffset = 0; michael@0: UInt32 srcInOffset = NumSrcInStreams; michael@0: UInt32 srcOutOffset = _numSrcOutStreams; michael@0: michael@0: for (int i = srcBindInfo.Coders.Size() - 1; i >= 0; i--) michael@0: { michael@0: const CCoderStreamsInfo &srcCoderInfo = srcBindInfo.Coders[i]; michael@0: michael@0: srcInOffset -= srcCoderInfo.NumInStreams; michael@0: srcOutOffset -= srcCoderInfo.NumOutStreams; michael@0: michael@0: UInt32 j; michael@0: for (j = 0; j < srcCoderInfo.NumInStreams; j++, destOutOffset++) michael@0: { michael@0: UInt32 index = srcInOffset + j; michael@0: _srcInToDestOutMap[index] = destOutOffset; michael@0: DestOutToSrcInMap[destOutOffset] = index; michael@0: } michael@0: for (j = 0; j < srcCoderInfo.NumOutStreams; j++, destInOffset++) michael@0: { michael@0: UInt32 index = srcOutOffset + j; michael@0: _srcOutToDestInMap[index] = destInOffset; michael@0: _destInToSrcOutMap[destInOffset] = index; michael@0: } michael@0: } michael@0: } michael@0: michael@0: void CBindReverseConverter::CreateReverseBindInfo(CBindInfo &destBindInfo) michael@0: { michael@0: destBindInfo.Coders.Clear(); michael@0: destBindInfo.BindPairs.Clear(); michael@0: destBindInfo.InStreams.Clear(); michael@0: destBindInfo.OutStreams.Clear(); michael@0: michael@0: int i; michael@0: for (i = _srcBindInfo.Coders.Size() - 1; i >= 0; i--) michael@0: { michael@0: const CCoderStreamsInfo &srcCoderInfo = _srcBindInfo.Coders[i]; michael@0: CCoderStreamsInfo destCoderInfo; michael@0: destCoderInfo.NumInStreams = srcCoderInfo.NumOutStreams; michael@0: destCoderInfo.NumOutStreams = srcCoderInfo.NumInStreams; michael@0: destBindInfo.Coders.Add(destCoderInfo); michael@0: } michael@0: for (i = _srcBindInfo.BindPairs.Size() - 1; i >= 0; i--) michael@0: { michael@0: const CBindPair &srcBindPair = _srcBindInfo.BindPairs[i]; michael@0: CBindPair destBindPair; michael@0: destBindPair.InIndex = _srcOutToDestInMap[srcBindPair.OutIndex]; michael@0: destBindPair.OutIndex = _srcInToDestOutMap[srcBindPair.InIndex]; michael@0: destBindInfo.BindPairs.Add(destBindPair); michael@0: } michael@0: for (i = 0; i < _srcBindInfo.InStreams.Size(); i++) michael@0: destBindInfo.OutStreams.Add(_srcInToDestOutMap[_srcBindInfo.InStreams[i]]); michael@0: for (i = 0; i < _srcBindInfo.OutStreams.Size(); i++) michael@0: destBindInfo.InStreams.Add(_srcOutToDestInMap[_srcBindInfo.OutStreams[i]]); michael@0: } michael@0: michael@0: CCoderInfo::CCoderInfo(UInt32 numInStreams, UInt32 numOutStreams): michael@0: NumInStreams(numInStreams), michael@0: NumOutStreams(numOutStreams) michael@0: { michael@0: InSizes.Reserve(NumInStreams); michael@0: InSizePointers.Reserve(NumInStreams); michael@0: OutSizePointers.Reserve(NumOutStreams); michael@0: OutSizePointers.Reserve(NumOutStreams); michael@0: } michael@0: michael@0: static void SetSizes(const UInt64 **srcSizes, CRecordVector &sizes, michael@0: CRecordVector &sizePointers, UInt32 numItems) michael@0: { michael@0: sizes.Clear(); michael@0: sizePointers.Clear(); michael@0: for(UInt32 i = 0; i < numItems; i++) michael@0: { michael@0: if (srcSizes == 0 || srcSizes[i] == NULL) michael@0: { michael@0: sizes.Add(0); michael@0: sizePointers.Add(NULL); michael@0: } michael@0: else michael@0: { michael@0: sizes.Add(*srcSizes[i]); michael@0: sizePointers.Add(&sizes.Back()); michael@0: } michael@0: } michael@0: } michael@0: michael@0: void CCoderInfo::SetCoderInfo(const UInt64 **inSizes, michael@0: const UInt64 **outSizes) michael@0: { michael@0: SetSizes(inSizes, InSizes, InSizePointers, NumInStreams); michael@0: SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams); michael@0: } michael@0: michael@0: }