1 // CoderMixer2.cpp 2 3 #include "StdAfx.h" 4 5 #include "CoderMixer2.h" 6 7 namespace NCoderMixer { 8 9 CBindReverseConverter::CBindReverseConverter(const CBindInfo &srcBindInfo): 10 _srcBindInfo(srcBindInfo) 11 { 12 srcBindInfo.GetNumStreams(NumSrcInStreams, _numSrcOutStreams); 13 14 UInt32 j; 15 _srcInToDestOutMap.ClearAndSetSize(NumSrcInStreams); 16 DestOutToSrcInMap.ClearAndSetSize(NumSrcInStreams); 17 18 for (j = 0; j < NumSrcInStreams; j++) 19 { 20 _srcInToDestOutMap[j] = 0; 21 DestOutToSrcInMap[j] = 0; 22 } 23 24 _srcOutToDestInMap.ClearAndSetSize(_numSrcOutStreams); 25 _destInToSrcOutMap.ClearAndSetSize(_numSrcOutStreams); 26 27 for (j = 0; j < _numSrcOutStreams; j++) 28 { 29 _srcOutToDestInMap[j] = 0; 30 _destInToSrcOutMap[j] = 0; 31 } 32 33 UInt32 destInOffset = 0; 34 UInt32 destOutOffset = 0; 35 UInt32 srcInOffset = NumSrcInStreams; 36 UInt32 srcOutOffset = _numSrcOutStreams; 37 38 for (int i = srcBindInfo.Coders.Size() - 1; i >= 0; i--) 39 { 40 const CCoderStreamsInfo &srcCoderInfo = srcBindInfo.Coders[i]; 41 42 srcInOffset -= srcCoderInfo.NumInStreams; 43 srcOutOffset -= srcCoderInfo.NumOutStreams; 44 45 UInt32 j; 46 for (j = 0; j < srcCoderInfo.NumInStreams; j++, destOutOffset++) 47 { 48 UInt32 index = srcInOffset + j; 49 _srcInToDestOutMap[index] = destOutOffset; 50 DestOutToSrcInMap[destOutOffset] = index; 51 } 52 for (j = 0; j < srcCoderInfo.NumOutStreams; j++, destInOffset++) 53 { 54 UInt32 index = srcOutOffset + j; 55 _srcOutToDestInMap[index] = destInOffset; 56 _destInToSrcOutMap[destInOffset] = index; 57 } 58 } 59 } 60 61 void CBindReverseConverter::CreateReverseBindInfo(CBindInfo &destBindInfo) 62 { 63 destBindInfo.Coders.ClearAndReserve(_srcBindInfo.Coders.Size()); 64 destBindInfo.BindPairs.ClearAndReserve(_srcBindInfo.BindPairs.Size()); 65 destBindInfo.InStreams.ClearAndReserve(_srcBindInfo.OutStreams.Size()); 66 destBindInfo.OutStreams.ClearAndReserve(_srcBindInfo.InStreams.Size()); 67 68 unsigned i; 69 for (i = _srcBindInfo.Coders.Size(); i != 0;) 70 { 71 i--; 72 const CCoderStreamsInfo &srcCoderInfo = _srcBindInfo.Coders[i]; 73 CCoderStreamsInfo destCoderInfo; 74 destCoderInfo.NumInStreams = srcCoderInfo.NumOutStreams; 75 destCoderInfo.NumOutStreams = srcCoderInfo.NumInStreams; 76 destBindInfo.Coders.AddInReserved(destCoderInfo); 77 } 78 for (i = _srcBindInfo.BindPairs.Size(); i != 0;) 79 { 80 i--; 81 const CBindPair &srcBindPair = _srcBindInfo.BindPairs[i]; 82 CBindPair destBindPair; 83 destBindPair.InIndex = _srcOutToDestInMap[srcBindPair.OutIndex]; 84 destBindPair.OutIndex = _srcInToDestOutMap[srcBindPair.InIndex]; 85 destBindInfo.BindPairs.AddInReserved(destBindPair); 86 } 87 for (i = 0; i < _srcBindInfo.InStreams.Size(); i++) 88 destBindInfo.OutStreams.AddInReserved(_srcInToDestOutMap[_srcBindInfo.InStreams[i]]); 89 for (i = 0; i < _srcBindInfo.OutStreams.Size(); i++) 90 destBindInfo.InStreams.AddInReserved(_srcOutToDestInMap[_srcBindInfo.OutStreams[i]]); 91 } 92 93 void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes, 94 CRecordVector<const UInt64 *> &sizePointers, UInt32 numItems) 95 { 96 sizes.ClearAndSetSize(numItems); 97 sizePointers.ClearAndSetSize(numItems); 98 for(UInt32 i = 0; i < numItems; i++) 99 { 100 if (!srcSizes || !srcSizes[i]) 101 { 102 sizes[i] = 0; 103 sizePointers[i] = NULL; 104 } 105 else 106 { 107 sizes[i] = *(srcSizes[i]); 108 sizePointers[i] = &sizes[i]; 109 } 110 } 111 } 112 113 void CCoderInfo2::SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes) 114 { 115 SetSizes(inSizes, InSizes, InSizePointers, NumInStreams); 116 SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams); 117 } 118 119 } 120