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