CoderMixer2.cpp 3.4 KB

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