1ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// ByteSwap.cpp 2ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 3ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include "StdAfx.h" 4ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 5ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include "../../Common/MyCom.h" 6ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 7ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include "../ICoder.h" 8ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 9ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include "../Common/RegisterCodec.h" 10ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 11ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass CByteSwap2: 12ef8225444452a1486bd721f3285301fe84643b00Stephen Hines public ICompressFilter, 13ef8225444452a1486bd721f3285301fe84643b00Stephen Hines public CMyUnknownImp 14ef8225444452a1486bd721f3285301fe84643b00Stephen Hines{ 15ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic: 16ef8225444452a1486bd721f3285301fe84643b00Stephen Hines MY_UNKNOWN_IMP 17ef8225444452a1486bd721f3285301fe84643b00Stephen Hines STDMETHOD(Init)(); 18ef8225444452a1486bd721f3285301fe84643b00Stephen Hines STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); 19ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}; 20ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 21ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass CByteSwap4: 22ef8225444452a1486bd721f3285301fe84643b00Stephen Hines public ICompressFilter, 23ef8225444452a1486bd721f3285301fe84643b00Stephen Hines public CMyUnknownImp 24{ 25public: 26 MY_UNKNOWN_IMP 27 STDMETHOD(Init)(); 28 STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); 29}; 30 31STDMETHODIMP CByteSwap2::Init() { return S_OK; } 32 33STDMETHODIMP_(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 46STDMETHODIMP CByteSwap4::Init() { return S_OK; } 47 48STDMETHODIMP_(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 64static void *CreateCodec2() { return (void *)(ICompressFilter *)(new CByteSwap2); } 65static void *CreateCodec4() { return (void *)(ICompressFilter *)(new CByteSwap4); } 66 67static CCodecInfo g_CodecsInfo[] = 68{ 69 { CreateCodec2, CreateCodec2, 0x020302, L"Swap2", 1, true }, 70 { CreateCodec4, CreateCodec4, 0x020304, L"Swap4", 1, true } 71}; 72 73REGISTER_CODECS(ByteSwap) 74