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