1e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk/*
2e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Copyright 2014 The Android Open Source Project
3e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk *
4e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License");
5e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * you may not use this file except in compliance with the License.
6e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * You may obtain a copy of the License at
7e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk *
8e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk *      http://www.apache.org/licenses/LICENSE-2.0
9e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk *
10e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Unless required by applicable law or agreed to in writing, software
11e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS,
12e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * See the License for the specific language governing permissions and
14e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * limitations under the License.
15e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */
16e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
17e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#ifndef IMG_UTILS_ENDIAN_UTILS
18e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#define IMG_UTILS_ENDIAN_UTILS
19e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
20e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <img_utils/Output.h>
21e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
22e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <cutils/compiler.h>
23e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <utils/Errors.h>
24e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <stdint.h>
25e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <endian.h>
26e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <assert.h>
27e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
28e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunknamespace android {
29e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunknamespace img_utils {
30e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
31e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk/**
32e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Endianness types supported.
33e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */
34e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkenum ANDROID_API Endianness {
35e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    UNDEFINED_ENDIAN, // Default endianness will be used.
36e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    BIG,
37e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    LITTLE
38e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk};
39e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
40e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk/**
41e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Convert from the native device endianness to big endian.
42e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */
43e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<typename T>
44e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben BrunkT convertToBigEndian(T in);
45e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
46e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk/**
47e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Convert from the native device endianness to little endian.
48e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */
49e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<typename T>
50e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben BrunkT convertToLittleEndian(T in);
51e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
52e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk/**
53e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * A utility class for writing to an Output with the given endianness.
54e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */
55e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkclass ANDROID_API EndianOutput : public Output {
56e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    public:
57e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        /**
58e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         * Wrap the given Output.  Calling write methods will result in
59e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         * writes to this output.
60e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         */
61a0b40ae71d251a40161881780bc317c025d7678fChih-Hung Hsieh        explicit EndianOutput(Output* out, Endianness end=LITTLE);
62e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
63e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual ~EndianOutput();
64e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
65e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        /**
66e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         * Call open on the wrapped output.
67e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         */
68e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual status_t open();
69e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
70e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        /**
71e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         * Call close on the wrapped output.
72e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         */
73e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual status_t close();
74e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
75e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        /**
76e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         * Set the endianness to use when writing.
77e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         */
78e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual void setEndianness(Endianness end);
79e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
80e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        /**
81e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         * Get the currently configured endianness.
82e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         */
83e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual Endianness getEndianness() const;
84e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
85e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        /**
86e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         * Get the current number of bytes written by this EndianOutput.
87e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         */
88e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual uint32_t getCurrentOffset() const;
89e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
90e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
91e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        // TODO: switch write methods to uint32_t instead of size_t,
92e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        // the max size of a TIFF files is bounded
93e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
94e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        /**
95e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         * The following methods will write elements from given input buffer to the output.
96e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         * Count elements in the buffer will be written with the endianness set for this
97e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         * EndianOutput.  If the given offset is greater than zero, that many elements will
98e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         * be skipped in the buffer before writing.
99e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         *
100e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         * Returns OK on success, or a negative error code.
101e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk         */
102e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual status_t write(const uint8_t* buf, size_t offset, size_t count);
103e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
104e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual status_t write(const int8_t* buf, size_t offset, size_t count);
105e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
106e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual status_t write(const uint16_t* buf, size_t offset, size_t count);
107e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
108e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual status_t write(const int16_t* buf, size_t offset, size_t count);
109e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
110e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual status_t write(const uint32_t* buf, size_t offset, size_t count);
111e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
112e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual status_t write(const int32_t* buf, size_t offset, size_t count);
113e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
114e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual status_t write(const uint64_t* buf, size_t offset, size_t count);
115e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
116e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual status_t write(const int64_t* buf, size_t offset, size_t count);
117e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
118e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual status_t write(const float* buf, size_t offset, size_t count);
119e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
120e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        virtual status_t write(const double* buf, size_t offset, size_t count);
121e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
122e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    protected:
123e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        template<typename T>
124e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        inline status_t writeHelper(const T* buf, size_t offset, size_t count);
125e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
126e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        uint32_t mOffset;
127e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        Output* mOutput;
128e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        Endianness mEndian;
129e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk};
130e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
131e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<typename T>
132e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline status_t EndianOutput::writeHelper(const T* buf, size_t offset, size_t count) {
133e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    assert(offset <= count);
134e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    status_t res = OK;
135e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    size_t size = sizeof(T);
136e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    switch(mEndian) {
137e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case BIG: {
138e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = offset; i < count; ++i) {
139e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                T tmp = convertToBigEndian<T>(buf[offset + i]);
140e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                if ((res = mOutput->write(reinterpret_cast<uint8_t*>(&tmp), 0, size))
141e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                        != OK) {
142e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                    return res;
143e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                }
144e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                mOffset += size;
145e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
146e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
147e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
148e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case LITTLE: {
149e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = offset; i < count; ++i) {
150e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                T tmp = convertToLittleEndian<T>(buf[offset + i]);
151e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                if ((res = mOutput->write(reinterpret_cast<uint8_t*>(&tmp), 0, size))
152e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                        != OK) {
153e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                    return res;
154e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                }
155e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                mOffset += size;
156e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
157e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
158e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
159e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        default: {
160e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            return BAD_VALUE;
161e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
162e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
163e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return res;
164e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
165e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
166e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
167e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline uint8_t convertToBigEndian(uint8_t in) {
168e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return in;
169e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
170e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
171e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
172e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline int8_t convertToBigEndian(int8_t in) {
173e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return in;
174e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
175e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
176e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
177e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline uint16_t convertToBigEndian(uint16_t in) {
178e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return htobe16(in);
179e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
180e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
181e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
182e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline int16_t convertToBigEndian(int16_t in) {
183e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return htobe16(in);
184e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
185e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
186e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
187e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline uint32_t convertToBigEndian(uint32_t in) {
188e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return htobe32(in);
189e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
190e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
191e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
192e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline int32_t convertToBigEndian(int32_t in) {
193e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return htobe32(in);
194e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
195e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
196e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
197e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline uint64_t convertToBigEndian(uint64_t in) {
198e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return htobe64(in);
199e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
200e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
201e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
202e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline int64_t convertToBigEndian(int64_t in) {
203e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return htobe64(in);
204e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
205e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
206e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
207e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline uint8_t convertToLittleEndian(uint8_t in) {
208e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return in;
209e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
210e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
211e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
212e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline int8_t convertToLittleEndian(int8_t in) {
213e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return in;
214e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
215e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
216e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
217e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline uint16_t convertToLittleEndian(uint16_t in) {
218e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return htole16(in);
219e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
220e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
221e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
222e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline int16_t convertToLittleEndian(int16_t in) {
223e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return htole16(in);
224e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
225e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
226e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
227e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline uint32_t convertToLittleEndian(uint32_t in) {
228e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return htole32(in);
229e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
230e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
231e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
232e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline int32_t convertToLittleEndian(int32_t in) {
233e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return htole32(in);
234e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
235e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
236e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
237e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline uint64_t convertToLittleEndian(uint64_t in) {
238e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return htole64(in);
239e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
240e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
241e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
242e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkinline int64_t convertToLittleEndian(int64_t in) {
243e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return htole64(in);
244e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
245e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
246e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk} /*namespace img_utils*/
247e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk} /*namespace android*/
248e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
249e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#endif /*IMG_UTILS_ENDIAN_UTILS*/
250e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
251