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