rsStream.cpp revision afb743aca56c18beb7ab924e75cb6e070ef3e55a
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#ifndef ANDROID_RS_BUILD_FOR_HOST 19fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContext.h" 20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsStream.h" 25fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 26fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android; 27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android::renderscript; 28fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 29afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukIStream::IStream(const uint8_t *buf, bool use64) { 30fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData = buf; 31fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos = 0; 32fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mUse64 = use64; 33fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 34fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 35afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid IStream::loadByteArray(void *dest, size_t numBytes) { 36fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk memcpy(dest, mData + mPos, numBytes); 37fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos += numBytes; 38fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 39fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 40afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukuint64_t IStream::loadOffset() { 41fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t tmp; 42fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (mUse64) { 43fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos = (mPos + 7) & (~7); 44fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk tmp = reinterpret_cast<const uint64_t *>(&mData[mPos])[0]; 45fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos += sizeof(uint64_t); 46fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return tmp; 47fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 48fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return loadU32(); 49fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 50fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 51afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid IStream::loadString(String8 *s) { 52fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t len = loadU32(); 53fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk s->setTo((const char *)&mData[mPos], len); 54fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos += len; 55fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 56fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 57fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk// Output stream implementation 58afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukOStream::OStream(uint64_t len, bool use64) { 59fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData = (uint8_t*)malloc(len); 60fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mLength = len; 61fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos = 0; 62fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mUse64 = use64; 63fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 64fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 65afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukOStream::~OStream() { 66fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk free(mData); 67fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 68fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 69afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid OStream::addByteArray(const void *src, size_t numBytes) { 70fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // We need to potentially grow more than once if the number of byes we write is substantial 71afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk while (mPos + numBytes >= mLength) { 72fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk growSize(); 73fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 74fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk memcpy(mData + mPos, src, numBytes); 75fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos += numBytes; 76fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 77fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 78afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid OStream::addOffset(uint64_t v) { 79fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (mUse64) { 80fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos = (mPos + 7) & (~7); 81afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mPos + sizeof(v) >= mLength) { 82fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk growSize(); 83fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 84fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)(v & 0xff); 85fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 8) & 0xff); 86fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 16) & 0xff); 87fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 24) & 0xff); 88fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 32) & 0xff); 89fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 40) & 0xff); 90fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 48) & 0xff); 91fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData[mPos++] = (uint8_t)((v >> 56) & 0xff); 92afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 93fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk addU32(v); 94fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 95fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 96fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 97afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid OStream::addString(String8 *s) { 98fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t len = s->size(); 99fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk addU32(len); 100afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mPos + len*sizeof(char) >= mLength) { 101fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk growSize(); 102fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 103fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk char *stringData = reinterpret_cast<char *>(&mData[mPos]); 104afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < len; i ++) { 105fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stringData[i] = s->string()[i]; 106fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 107fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mPos += len*sizeof(char); 108fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 109fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 110afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid OStream::growSize() { 111fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint8_t *newData = (uint8_t*)malloc(mLength*2); 112fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk memcpy(newData, mData, mLength*sizeof(uint8_t)); 113fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mLength = mLength * 2; 114fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk free(mData); 115fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData = newData; 116fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 117fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 118fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 119