Home | History | Annotate | Download | only in Compress
      1 // ByteSwap.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #include "../../Common/MyCom.h"
      6 
      7 #include "../ICoder.h"
      8 
      9 #include "../Common/RegisterCodec.h"
     10 
     11 class CByteSwap2:
     12   public ICompressFilter,
     13   public CMyUnknownImp
     14 {
     15 public:
     16   MY_UNKNOWN_IMP
     17   STDMETHOD(Init)();
     18   STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
     19 };
     20 
     21 class CByteSwap4:
     22   public ICompressFilter,
     23   public CMyUnknownImp
     24 {
     25 public:
     26   MY_UNKNOWN_IMP
     27   STDMETHOD(Init)();
     28   STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
     29 };
     30 
     31 STDMETHODIMP CByteSwap2::Init() { return S_OK; }
     32 
     33 STDMETHODIMP_(UInt32) CByteSwap2::Filter(Byte *data, UInt32 size)
     34 {
     35   const UInt32 kStep = 2;
     36   UInt32 i;
     37   for (i = 0; i + kStep <= size; i += kStep)
     38   {
     39     Byte b = data[i];
     40     data[i] = data[i + 1];
     41     data[i + 1] = b;
     42   }
     43   return i;
     44 }
     45 
     46 STDMETHODIMP CByteSwap4::Init() { return S_OK; }
     47 
     48 STDMETHODIMP_(UInt32) CByteSwap4::Filter(Byte *data, UInt32 size)
     49 {
     50   const UInt32 kStep = 4;
     51   UInt32 i;
     52   for (i = 0; i + kStep <= size; i += kStep)
     53   {
     54     Byte b0 = data[i];
     55     Byte b1 = data[i + 1];
     56     data[i] = data[i + 3];
     57     data[i + 1] = data[i + 2];
     58     data[i + 2] = b1;
     59     data[i + 3] = b0;
     60   }
     61   return i;
     62 }
     63 
     64 static void *CreateCodec2() { return (void *)(ICompressFilter *)(new CByteSwap2); }
     65 static void *CreateCodec4() { return (void *)(ICompressFilter *)(new CByteSwap4); }
     66 
     67 static CCodecInfo g_CodecsInfo[] =
     68 {
     69   { CreateCodec2, CreateCodec2, 0x020302, L"Swap2", 1, true },
     70   { CreateCodec4, CreateCodec4, 0x020304, L"Swap4", 1, true }
     71 };
     72 
     73 REGISTER_CODECS(ByteSwap)
     74