Home | History | Annotate | Download | only in Common
      1 // CoderMixer2.h
      2 
      3 #ifndef __CODER_MIXER2_H
      4 #define __CODER_MIXER2_H
      5 
      6 #include "../../../Common/MyCom.h"
      7 #include "../../../Common/MyVector.h"
      8 
      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_VECTOR (i, Coders)
     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_VECTOR (i, BindPairs)
     66       if (BindPairs[i].InIndex == inStream)
     67         return i;
     68     return -1;
     69   }
     70   int FindBinderForOutStream(UInt32 outStream) const
     71   {
     72     FOR_VECTOR (i, BindPairs)
     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 void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes,
    143     CRecordVector<const UInt64 *> &sizePointers, UInt32 numItems);
    144 
    145 struct CCoderInfo2
    146 {
    147   CMyComPtr<ICompressCoder> Coder;
    148   CMyComPtr<ICompressCoder2> Coder2;
    149   UInt32 NumInStreams;
    150   UInt32 NumOutStreams;
    151 
    152   CRecordVector<UInt64> InSizes;
    153   CRecordVector<UInt64> OutSizes;
    154   CRecordVector<const UInt64 *> InSizePointers;
    155   CRecordVector<const UInt64 *> OutSizePointers;
    156 
    157   CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams):
    158       NumInStreams(numInStreams),
    159       NumOutStreams(numOutStreams) {}
    160   void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes);
    161 
    162   HRESULT QueryInterface(REFGUID iid, void** pp) const
    163   {
    164     IUnknown *p = Coder ? (IUnknown *)Coder : (IUnknown *)Coder2;
    165     return p->QueryInterface(iid, pp);
    166   }
    167 };
    168 
    169 class CCoderMixer2
    170 {
    171 public:
    172   virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) = 0;
    173   virtual void ReInit() = 0;
    174   virtual void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) = 0;
    175 };
    176 
    177 }
    178 
    179 #endif
    180