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
11class CByteSwap2:
12  public ICompressFilter,
13  public CMyUnknownImp
14{
15public:
16  MY_UNKNOWN_IMP
17  STDMETHOD(Init)();
18  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
19};
20
21class CByteSwap4:
22  public ICompressFilter,
23  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