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