rsStream.cpp revision fb6b614bcea88a587a7ea4530be45ff0ffa0210e
14f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout 24f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout/* 34f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * Copyright (C) 2009 The Android Open Source Project 44f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * 54f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * Licensed under the Apache License, Version 2.0 (the "License"); 64f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * you may not use this file except in compliance with the License. 74f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * You may obtain a copy of the License at 84f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * 94f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * http://www.apache.org/licenses/LICENSE-2.0 104f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * 114f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * Unless required by applicable law or agreed to in writing, software 124f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * distributed under the License is distributed on an "AS IS" BASIS, 134f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 144f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * See the License for the specific language governing permissions and 154f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * limitations under the License. 164f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout */ 174f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout 184f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout#ifndef ANDROID_RS_BUILD_FOR_HOST 194f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout#include "rsContext.h" 204f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout#else 214f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout#include "rsContextHostStub.h" 224f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout#endif 234f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout 244f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout#include "rsStream.h" 254f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout 264f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stoutusing namespace android; 274f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stoutusing namespace android::renderscript; 284f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout 294f34a05cdf73b68c3b2eb8678f740ab15225126aCraig StoutIStream::IStream(const uint8_t *buf, bool use64) 304f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout{ 314f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout mData = buf; 324f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout mPos = 0; 334f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout mUse64 = use64; 344f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout} 354f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout 364f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stoutvoid IStream::loadByteArray(void *dest, size_t numBytes) 37be6b6282397861a044efd596bf5db501fa0b3a66Craig Stout{ 38be6b6282397861a044efd596bf5db501fa0b3a66Craig Stout memcpy(dest, mData + mPos, numBytes); 39be6b6282397861a044efd596bf5db501fa0b3a66Craig Stout mPos += numBytes; 40be6b6282397861a044efd596bf5db501fa0b3a66Craig Stout} 41be6b6282397861a044efd596bf5db501fa0b3a66Craig Stout 42be6b6282397861a044efd596bf5db501fa0b3a66Craig Stoutuint64_t IStream::loadOffset() 434f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout{ 44be6b6282397861a044efd596bf5db501fa0b3a66Craig Stout uint64_t tmp; 454f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout if (mUse64) { 464f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout mPos = (mPos + 7) & (~7); 474f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout tmp = reinterpret_cast<const uint64_t *>(&mData[mPos])[0]; 484f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout mPos += sizeof(uint64_t); 494f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout return tmp; 504f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout } 514f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout return loadU32(); 52be6b6282397861a044efd596bf5db501fa0b3a66Craig Stout} 53be6b6282397861a044efd596bf5db501fa0b3a66Craig Stout 54be6b6282397861a044efd596bf5db501fa0b3a66Craig Stoutvoid IStream::loadString(String8 *s) 554f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout{ 564f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout LOGE("loadString"); 574f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout uint32_t len = loadU32(); 584f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout LOGE("loadString len %i", len); 594f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout s->setTo((const char *)&mData[mPos], len); 604f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout mPos += len; 614f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout} 62be6b6282397861a044efd596bf5db501fa0b3a66Craig Stout 63be6b6282397861a044efd596bf5db501fa0b3a66Craig Stout 64be6b6282397861a044efd596bf5db501fa0b3a66Craig Stout// Output stream implementation 654f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout 664f34a05cdf73b68c3b2eb8678f740ab15225126aCraig StoutOStream::OStream(uint64_t len, bool use64) 674f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout{ 68a52784195525cdb1f2bb4d8dde1b8b314f480957Chet Haase mData = (uint8_t*)malloc(len); 694f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout mLength = len; 704f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout mPos = 0; 714f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout mUse64 = use64; 724f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout} 734f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout 744f34a05cdf73b68c3b2eb8678f740ab15225126aCraig StoutOStream::~OStream() 75{ 76 free(mData); 77} 78 79void OStream::addByteArray(const void *src, size_t numBytes) 80{ 81 // We need to potentially grow more than once if the number of byes we write is substantial 82 while(mPos + numBytes >= mLength) { 83 growSize(); 84 } 85 memcpy(mData + mPos, src, numBytes); 86 mPos += numBytes; 87} 88 89void OStream::addOffset(uint64_t v) 90{ 91 if (mUse64) { 92 mPos = (mPos + 7) & (~7); 93 if(mPos + sizeof(v) >= mLength) { 94 growSize(); 95 } 96 mData[mPos++] = (uint8_t)(v & 0xff); 97 mData[mPos++] = (uint8_t)((v >> 8) & 0xff); 98 mData[mPos++] = (uint8_t)((v >> 16) & 0xff); 99 mData[mPos++] = (uint8_t)((v >> 24) & 0xff); 100 mData[mPos++] = (uint8_t)((v >> 32) & 0xff); 101 mData[mPos++] = (uint8_t)((v >> 40) & 0xff); 102 mData[mPos++] = (uint8_t)((v >> 48) & 0xff); 103 mData[mPos++] = (uint8_t)((v >> 56) & 0xff); 104 } 105 else { 106 addU32(v); 107 } 108} 109 110void OStream::addString(String8 *s) 111{ 112 uint32_t len = s->size(); 113 addU32(len); 114 if(mPos + len*sizeof(char) >= mLength) { 115 growSize(); 116 } 117 char *stringData = reinterpret_cast<char *>(&mData[mPos]); 118 for(uint32_t i = 0; i < len; i ++) { 119 stringData[i] = s->string()[i]; 120 } 121 mPos += len*sizeof(char); 122} 123 124void OStream::growSize() 125{ 126 uint8_t *newData = (uint8_t*)malloc(mLength*2); 127 memcpy(newData, mData, mLength*sizeof(uint8_t)); 128 mLength = mLength * 2; 129 free(mData); 130 mData = newData; 131} 132 133 134