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