xref: /aosp_15_r20/frameworks/rs/rsStream.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker 
2*e1eccf28SAndroid Build Coastguard Worker /*
3*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2009 The Android Open Source Project
4*e1eccf28SAndroid Build Coastguard Worker  *
5*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*e1eccf28SAndroid Build Coastguard Worker  *
9*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
10*e1eccf28SAndroid Build Coastguard Worker  *
11*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
16*e1eccf28SAndroid Build Coastguard Worker  */
17*e1eccf28SAndroid Build Coastguard Worker 
18*e1eccf28SAndroid Build Coastguard Worker #include "rsContext.h"
19*e1eccf28SAndroid Build Coastguard Worker #include "rsStream.h"
20*e1eccf28SAndroid Build Coastguard Worker 
21*e1eccf28SAndroid Build Coastguard Worker namespace android {
22*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
23*e1eccf28SAndroid Build Coastguard Worker 
IStream(const uint8_t * buf,bool use64)24*e1eccf28SAndroid Build Coastguard Worker IStream::IStream(const uint8_t *buf, bool use64) {
25*e1eccf28SAndroid Build Coastguard Worker     mData = buf;
26*e1eccf28SAndroid Build Coastguard Worker     mPos = 0;
27*e1eccf28SAndroid Build Coastguard Worker     mUse64 = use64;
28*e1eccf28SAndroid Build Coastguard Worker }
29*e1eccf28SAndroid Build Coastguard Worker 
loadByteArray(void * dest,size_t numBytes)30*e1eccf28SAndroid Build Coastguard Worker void IStream::loadByteArray(void *dest, size_t numBytes) {
31*e1eccf28SAndroid Build Coastguard Worker     memcpy(dest, mData + mPos, numBytes);
32*e1eccf28SAndroid Build Coastguard Worker     mPos += numBytes;
33*e1eccf28SAndroid Build Coastguard Worker }
34*e1eccf28SAndroid Build Coastguard Worker 
loadOffset()35*e1eccf28SAndroid Build Coastguard Worker uint64_t IStream::loadOffset() {
36*e1eccf28SAndroid Build Coastguard Worker     uint64_t tmp;
37*e1eccf28SAndroid Build Coastguard Worker     if (mUse64) {
38*e1eccf28SAndroid Build Coastguard Worker         mPos = (mPos + 7) & (~7);
39*e1eccf28SAndroid Build Coastguard Worker         tmp = reinterpret_cast<const uint64_t *>(&mData[mPos])[0];
40*e1eccf28SAndroid Build Coastguard Worker         mPos += sizeof(uint64_t);
41*e1eccf28SAndroid Build Coastguard Worker         return tmp;
42*e1eccf28SAndroid Build Coastguard Worker     }
43*e1eccf28SAndroid Build Coastguard Worker     return loadU32();
44*e1eccf28SAndroid Build Coastguard Worker }
45*e1eccf28SAndroid Build Coastguard Worker 
loadString()46*e1eccf28SAndroid Build Coastguard Worker const char * IStream::loadString() {
47*e1eccf28SAndroid Build Coastguard Worker     uint32_t len = loadU32();
48*e1eccf28SAndroid Build Coastguard Worker     const char *s = rsuCopyString((const char *)&mData[mPos], len);
49*e1eccf28SAndroid Build Coastguard Worker     mPos += len;
50*e1eccf28SAndroid Build Coastguard Worker     return s;
51*e1eccf28SAndroid Build Coastguard Worker }
52*e1eccf28SAndroid Build Coastguard Worker 
53*e1eccf28SAndroid Build Coastguard Worker // Output stream implementation
OStream(uint64_t len,bool use64)54*e1eccf28SAndroid Build Coastguard Worker OStream::OStream(uint64_t len, bool use64) {
55*e1eccf28SAndroid Build Coastguard Worker     mData = (uint8_t*)malloc(len);
56*e1eccf28SAndroid Build Coastguard Worker     mLength = len;
57*e1eccf28SAndroid Build Coastguard Worker     mPos = 0;
58*e1eccf28SAndroid Build Coastguard Worker     mUse64 = use64;
59*e1eccf28SAndroid Build Coastguard Worker }
60*e1eccf28SAndroid Build Coastguard Worker 
~OStream()61*e1eccf28SAndroid Build Coastguard Worker OStream::~OStream() {
62*e1eccf28SAndroid Build Coastguard Worker     free(mData);
63*e1eccf28SAndroid Build Coastguard Worker }
64*e1eccf28SAndroid Build Coastguard Worker 
addByteArray(const void * src,size_t numBytes)65*e1eccf28SAndroid Build Coastguard Worker void OStream::addByteArray(const void *src, size_t numBytes) {
66*e1eccf28SAndroid Build Coastguard Worker     // We need to potentially grow more than once if the number of byes we write is substantial
67*e1eccf28SAndroid Build Coastguard Worker     while (mPos + numBytes >= mLength) {
68*e1eccf28SAndroid Build Coastguard Worker         growSize();
69*e1eccf28SAndroid Build Coastguard Worker     }
70*e1eccf28SAndroid Build Coastguard Worker     memcpy(mData + mPos, src, numBytes);
71*e1eccf28SAndroid Build Coastguard Worker     mPos += numBytes;
72*e1eccf28SAndroid Build Coastguard Worker }
73*e1eccf28SAndroid Build Coastguard Worker 
addOffset(uint64_t v)74*e1eccf28SAndroid Build Coastguard Worker void OStream::addOffset(uint64_t v) {
75*e1eccf28SAndroid Build Coastguard Worker     if (mUse64) {
76*e1eccf28SAndroid Build Coastguard Worker         mPos = (mPos + 7) & (~7);
77*e1eccf28SAndroid Build Coastguard Worker         if (mPos + sizeof(v) >= mLength) {
78*e1eccf28SAndroid Build Coastguard Worker             growSize();
79*e1eccf28SAndroid Build Coastguard Worker         }
80*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)(v & 0xff);
81*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 8) & 0xff);
82*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 16) & 0xff);
83*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 24) & 0xff);
84*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 32) & 0xff);
85*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 40) & 0xff);
86*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 48) & 0xff);
87*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 56) & 0xff);
88*e1eccf28SAndroid Build Coastguard Worker     } else {
89*e1eccf28SAndroid Build Coastguard Worker         addU32(v);
90*e1eccf28SAndroid Build Coastguard Worker     }
91*e1eccf28SAndroid Build Coastguard Worker }
92*e1eccf28SAndroid Build Coastguard Worker 
addString(const char * s,size_t len)93*e1eccf28SAndroid Build Coastguard Worker void OStream::addString(const char *s, size_t len) {
94*e1eccf28SAndroid Build Coastguard Worker     addU32(len);
95*e1eccf28SAndroid Build Coastguard Worker     if (mPos + len*sizeof(char) >= mLength) {
96*e1eccf28SAndroid Build Coastguard Worker         growSize();
97*e1eccf28SAndroid Build Coastguard Worker     }
98*e1eccf28SAndroid Build Coastguard Worker     char *stringData = reinterpret_cast<char *>(&mData[mPos]);
99*e1eccf28SAndroid Build Coastguard Worker     memcpy(stringData, s, len);
100*e1eccf28SAndroid Build Coastguard Worker     mPos += len*sizeof(char);
101*e1eccf28SAndroid Build Coastguard Worker }
102*e1eccf28SAndroid Build Coastguard Worker 
addString(const char * s)103*e1eccf28SAndroid Build Coastguard Worker void OStream::addString(const char *s) {
104*e1eccf28SAndroid Build Coastguard Worker     addString(s, strlen(s));
105*e1eccf28SAndroid Build Coastguard Worker }
106*e1eccf28SAndroid Build Coastguard Worker 
growSize()107*e1eccf28SAndroid Build Coastguard Worker void OStream::growSize() {
108*e1eccf28SAndroid Build Coastguard Worker     uint8_t *newData = (uint8_t*)malloc(mLength*2);
109*e1eccf28SAndroid Build Coastguard Worker     memcpy(newData, mData, mLength*sizeof(uint8_t));
110*e1eccf28SAndroid Build Coastguard Worker     mLength = mLength * 2;
111*e1eccf28SAndroid Build Coastguard Worker     free(mData);
112*e1eccf28SAndroid Build Coastguard Worker     mData = newData;
113*e1eccf28SAndroid Build Coastguard Worker }
114*e1eccf28SAndroid Build Coastguard Worker 
115*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
116*e1eccf28SAndroid Build Coastguard Worker } // namespace android
117