10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009 The Android Open Source Project
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsContext.h"
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsStream.h"
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android;
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android::renderscript;
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesIStream::IStream(const uint8_t *buf, bool use64) {
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mData = buf;
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mPos = 0;
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mUse64 = use64;
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid IStream::loadByteArray(void *dest, size_t numBytes) {
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    memcpy(dest, mData + mPos, numBytes);
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mPos += numBytes;
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesuint64_t IStream::loadOffset() {
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint64_t tmp;
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (mUse64) {
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = (mPos + 7) & (~7);
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        tmp = reinterpret_cast<const uint64_t *>(&mData[mPos])[0];
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos += sizeof(uint64_t);
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return tmp;
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return loadU32();
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid IStream::loadString(String8 *s) {
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t len = loadU32();
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    s->setTo((const char *)&mData[mPos], len);
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mPos += len;
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// Output stream implementation
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesOStream::OStream(uint64_t len, bool use64) {
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mData = (uint8_t*)malloc(len);
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mLength = len;
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mPos = 0;
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mUse64 = use64;
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesOStream::~OStream() {
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    free(mData);
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid OStream::addByteArray(const void *src, size_t numBytes) {
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // We need to potentially grow more than once if the number of byes we write is substantial
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    while (mPos + numBytes >= mLength) {
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        growSize();
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    memcpy(mData + mPos, src, numBytes);
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mPos += numBytes;
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid OStream::addOffset(uint64_t v) {
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (mUse64) {
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = (mPos + 7) & (~7);
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mPos + sizeof(v) >= mLength) {
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            growSize();
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)(v & 0xff);
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 8) & 0xff);
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 16) & 0xff);
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 24) & 0xff);
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 32) & 0xff);
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 40) & 0xff);
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 48) & 0xff);
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 56) & 0xff);
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } else {
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        addU32(v);
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid OStream::addString(String8 *s) {
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t len = s->size();
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    addU32(len);
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (mPos + len*sizeof(char) >= mLength) {
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        growSize();
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    char *stringData = reinterpret_cast<char *>(&mData[mPos]);
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (uint32_t i = 0; i < len; i ++) {
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        stringData[i] = s->string()[i];
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mPos += len*sizeof(char);
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid OStream::growSize() {
1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint8_t *newData = (uint8_t*)malloc(mLength*2);
1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    memcpy(newData, mData, mLength*sizeof(uint8_t));
1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mLength = mLength * 2;
1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    free(mData);
1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mData = newData;
1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
114