1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
// 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);
}
}
|