1fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk/* 3fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * Copyright (C) 2009 The Android Open Source Project 4fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * 5fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 6fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * you may not use this file except in compliance with the License. 7fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * You may obtain a copy of the License at 8fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * 9fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 10fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * 11fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 12fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 13fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * See the License for the specific language governing permissions and 15fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * limitations under the License. 16fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk */ 17fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContext.h" 19fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsStream.h" 20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android; 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android::renderscript; 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 24afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukIStream::IStream(const uint8_t *buf, bool use64) { 25fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData = buf; 26fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos = 0; 27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mUse64 = use64; 28fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 29fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 30afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid IStream::loadByteArray(void *dest, size_t numBytes) { 31fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk memcpy(dest, mData + mPos, numBytes); 32fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos += numBytes; 33fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 34fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 35afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukuint64_t IStream::loadOffset() { 36fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t tmp; 37fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (mUse64) { 38fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos = (mPos + 7) & (~7); 39fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk tmp = reinterpret_cast<const uint64_t *>(&mData[mPos])[0]; 40fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos += sizeof(uint64_t); 41fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return tmp; 42fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 43fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return loadU32(); 44fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 45fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 4648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Samsconst char * IStream::loadString() { 47fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t len = loadU32(); 4848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams const char *s = rsuCopyString((const char *)&mData[mPos], len); 49fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos += len; 5048ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams return s; 51fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 52fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 53fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk// Output stream implementation 54afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukOStream::OStream(uint64_t len, bool use64) { 55fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData = (uint8_t*)malloc(len); 56fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mLength = len; 57fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos = 0; 58fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mUse64 = use64; 59fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 60fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 61afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukOStream::~OStream() { 62fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk free(mData); 63fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 64fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 65afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid OStream::addByteArray(const void *src, size_t numBytes) { 66fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // We need to potentially grow more than once if the number of byes we write is substantial 67afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk while (mPos + numBytes >= mLength) { 68fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk growSize(); 69fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 70fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk memcpy(mData + mPos, src, numBytes); 71fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos += numBytes; 72fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 73fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 74afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid OStream::addOffset(uint64_t v) { 75fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (mUse64) { 76fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos = (mPos + 7) & (~7); 77afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mPos + sizeof(v) >= mLength) { 78fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk growSize(); 79fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 80fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)(v & 0xff); 81fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 8) & 0xff); 82fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 16) & 0xff); 83fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 24) & 0xff); 84fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 32) & 0xff); 85fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 40) & 0xff); 86fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 48) & 0xff); 87fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 56) & 0xff); 88afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 89fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk addU32(v); 90fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 91fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 92fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 9348ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Samsvoid OStream::addString(const char *s, size_t len) { 94fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk addU32(len); 95afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mPos + len*sizeof(char) >= mLength) { 96fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk growSize(); 97fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 98fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk char *stringData = reinterpret_cast<char *>(&mData[mPos]); 9948ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams memcpy(stringData, s, len); 100fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos += len*sizeof(char); 101fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 102fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 10348ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Samsvoid OStream::addString(const char *s) { 10448ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams addString(s, strlen(s)); 10548ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams} 10648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams 107afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid OStream::growSize() { 108fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint8_t *newData = (uint8_t*)malloc(mLength*2); 109fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk memcpy(newData, mData, mLength*sizeof(uint8_t)); 110fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mLength = mLength * 2; 111fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk free(mData); 112fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData = newData; 113fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 114fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 115fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 116