misc/libphysfs/lzma/CPP/7zip/Archive/Common/CoderMixer2.h
changeset 13904 99b265e0d1d0
parent 13903 5f819b90d479
child 13905 b172a5d40eee
equal deleted inserted replaced
13903:5f819b90d479 13904:99b265e0d1d0
     1 // CoderMixer2.h
       
     2 
       
     3 #ifndef __CODER_MIXER2_H
       
     4 #define __CODER_MIXER2_H
       
     5 
       
     6 #include "../../../Common/MyVector.h"
       
     7 #include "../../../Common/Types.h"
       
     8 #include "../../../Common/MyCom.h"
       
     9 #include "../../ICoder.h"
       
    10 
       
    11 namespace NCoderMixer {
       
    12 
       
    13 struct CBindPair
       
    14 {
       
    15   UInt32 InIndex;
       
    16   UInt32 OutIndex;
       
    17 };
       
    18 
       
    19 struct CCoderStreamsInfo
       
    20 {
       
    21   UInt32 NumInStreams;
       
    22   UInt32 NumOutStreams;
       
    23 };
       
    24 
       
    25 struct CBindInfo
       
    26 {
       
    27   CRecordVector<CCoderStreamsInfo> Coders;
       
    28   CRecordVector<CBindPair> BindPairs;
       
    29   CRecordVector<UInt32> InStreams;
       
    30   CRecordVector<UInt32> OutStreams;
       
    31 
       
    32   void Clear()
       
    33   {
       
    34     Coders.Clear();
       
    35     BindPairs.Clear();
       
    36     InStreams.Clear();
       
    37     OutStreams.Clear();
       
    38   }
       
    39 
       
    40   /*
       
    41   UInt32 GetCoderStartOutStream(UInt32 coderIndex) const
       
    42   {
       
    43     UInt32 numOutStreams = 0;
       
    44     for (UInt32 i = 0; i < coderIndex; i++)
       
    45       numOutStreams += Coders[i].NumOutStreams;
       
    46     return numOutStreams;
       
    47   }
       
    48   */
       
    49 
       
    50 
       
    51   void GetNumStreams(UInt32 &numInStreams, UInt32 &numOutStreams) const
       
    52   {
       
    53     numInStreams = 0;
       
    54     numOutStreams = 0;
       
    55     for (int i = 0; i < Coders.Size(); i++)
       
    56     {
       
    57       const CCoderStreamsInfo &coderStreamsInfo = Coders[i];
       
    58       numInStreams += coderStreamsInfo.NumInStreams;
       
    59       numOutStreams += coderStreamsInfo.NumOutStreams;
       
    60     }
       
    61   }
       
    62 
       
    63   int FindBinderForInStream(UInt32 inStream) const
       
    64   {
       
    65     for (int i = 0; i < BindPairs.Size(); i++)
       
    66       if (BindPairs[i].InIndex == inStream)
       
    67         return i;
       
    68     return -1;
       
    69   }
       
    70   int FindBinderForOutStream(UInt32 outStream) const
       
    71   {
       
    72     for (int i = 0; i < BindPairs.Size(); i++)
       
    73       if (BindPairs[i].OutIndex == outStream)
       
    74         return i;
       
    75     return -1;
       
    76   }
       
    77 
       
    78   UInt32 GetCoderInStreamIndex(UInt32 coderIndex) const
       
    79   {
       
    80     UInt32 streamIndex = 0;
       
    81     for (UInt32 i = 0; i < coderIndex; i++)
       
    82       streamIndex += Coders[i].NumInStreams;
       
    83     return streamIndex;
       
    84   }
       
    85 
       
    86   UInt32 GetCoderOutStreamIndex(UInt32 coderIndex) const
       
    87   {
       
    88     UInt32 streamIndex = 0;
       
    89     for (UInt32 i = 0; i < coderIndex; i++)
       
    90       streamIndex += Coders[i].NumOutStreams;
       
    91     return streamIndex;
       
    92   }
       
    93 
       
    94 
       
    95   void FindInStream(UInt32 streamIndex, UInt32 &coderIndex, 
       
    96       UInt32 &coderStreamIndex) const
       
    97   {
       
    98     for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++)
       
    99     {
       
   100       UInt32 curSize = Coders[coderIndex].NumInStreams;
       
   101       if (streamIndex < curSize)
       
   102       {
       
   103         coderStreamIndex = streamIndex;
       
   104         return;
       
   105       }
       
   106       streamIndex -= curSize;
       
   107     }
       
   108     throw 1;
       
   109   }
       
   110   void FindOutStream(UInt32 streamIndex, UInt32 &coderIndex, 
       
   111       UInt32 &coderStreamIndex) const
       
   112   {
       
   113     for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++)
       
   114     {
       
   115       UInt32 curSize = Coders[coderIndex].NumOutStreams;
       
   116       if (streamIndex < curSize)
       
   117       {
       
   118         coderStreamIndex = streamIndex;
       
   119         return;
       
   120       }
       
   121       streamIndex -= curSize;
       
   122     }
       
   123     throw 1;
       
   124   }
       
   125 };
       
   126 
       
   127 class CBindReverseConverter
       
   128 {
       
   129   UInt32 _numSrcOutStreams;
       
   130   NCoderMixer::CBindInfo _srcBindInfo;
       
   131   CRecordVector<UInt32> _srcInToDestOutMap;
       
   132   CRecordVector<UInt32> _srcOutToDestInMap;
       
   133   CRecordVector<UInt32> _destInToSrcOutMap;
       
   134 public:
       
   135   UInt32 NumSrcInStreams;
       
   136   CRecordVector<UInt32> DestOutToSrcInMap;
       
   137 
       
   138   CBindReverseConverter(const NCoderMixer::CBindInfo &srcBindInfo);
       
   139   void CreateReverseBindInfo(NCoderMixer::CBindInfo &destBindInfo);
       
   140 };
       
   141 
       
   142 struct CCoderInfo2
       
   143 {
       
   144   CMyComPtr<ICompressCoder> Coder;
       
   145   CMyComPtr<ICompressCoder2> Coder2;
       
   146   UInt32 NumInStreams;
       
   147   UInt32 NumOutStreams;
       
   148 
       
   149   CRecordVector<UInt64> InSizes;
       
   150   CRecordVector<UInt64> OutSizes;
       
   151   CRecordVector<const UInt64 *> InSizePointers;
       
   152   CRecordVector<const UInt64 *> OutSizePointers;
       
   153 
       
   154   CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams);
       
   155   void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes);
       
   156 
       
   157   HRESULT QueryInterface(REFGUID iid, void** pp) const
       
   158   {
       
   159     IUnknown *p = Coder ? (IUnknown *)Coder : (IUnknown *)Coder2;
       
   160     return p->QueryInterface(iid, pp);
       
   161   }
       
   162 };
       
   163 
       
   164 class CCoderMixer2
       
   165 {
       
   166 public:
       
   167   virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) = 0;
       
   168   virtual void ReInit() = 0;
       
   169   virtual void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) = 0;
       
   170 };
       
   171 
       
   172 }
       
   173 #endif
       
   174