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