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