xref: /aosp_15_r20/frameworks/rs/rsStream.h (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2009 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker  *
4*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker  *
8*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker  *
10*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker  */
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RS_STREAM_H
18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RS_STREAM_H
19*e1eccf28SAndroid Build Coastguard Worker 
20*e1eccf28SAndroid Build Coastguard Worker #include <stdio.h>
21*e1eccf28SAndroid Build Coastguard Worker #include "rsUtils.h"
22*e1eccf28SAndroid Build Coastguard Worker 
23*e1eccf28SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
24*e1eccf28SAndroid Build Coastguard Worker namespace android {
25*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
26*e1eccf28SAndroid Build Coastguard Worker 
27*e1eccf28SAndroid Build Coastguard Worker class IStream {
28*e1eccf28SAndroid Build Coastguard Worker public:
29*e1eccf28SAndroid Build Coastguard Worker     IStream(const uint8_t *, bool use64);
30*e1eccf28SAndroid Build Coastguard Worker 
loadF()31*e1eccf28SAndroid Build Coastguard Worker     float loadF() {
32*e1eccf28SAndroid Build Coastguard Worker         mPos = (mPos + 3) & (~3);
33*e1eccf28SAndroid Build Coastguard Worker         float tmp = reinterpret_cast<const float *>(&mData[mPos])[0];
34*e1eccf28SAndroid Build Coastguard Worker         mPos += sizeof(float);
35*e1eccf28SAndroid Build Coastguard Worker         return tmp;
36*e1eccf28SAndroid Build Coastguard Worker     }
loadI32()37*e1eccf28SAndroid Build Coastguard Worker     int32_t loadI32() {
38*e1eccf28SAndroid Build Coastguard Worker         mPos = (mPos + 3) & (~3);
39*e1eccf28SAndroid Build Coastguard Worker         int32_t tmp = reinterpret_cast<const int32_t *>(&mData[mPos])[0];
40*e1eccf28SAndroid Build Coastguard Worker         mPos += sizeof(int32_t);
41*e1eccf28SAndroid Build Coastguard Worker         return tmp;
42*e1eccf28SAndroid Build Coastguard Worker     }
loadU32()43*e1eccf28SAndroid Build Coastguard Worker     uint32_t loadU32() {
44*e1eccf28SAndroid Build Coastguard Worker         mPos = (mPos + 3) & (~3);
45*e1eccf28SAndroid Build Coastguard Worker         uint32_t tmp = reinterpret_cast<const uint32_t *>(&mData[mPos])[0];
46*e1eccf28SAndroid Build Coastguard Worker         mPos += sizeof(uint32_t);
47*e1eccf28SAndroid Build Coastguard Worker         return tmp;
48*e1eccf28SAndroid Build Coastguard Worker     }
loadU16()49*e1eccf28SAndroid Build Coastguard Worker     uint16_t loadU16() {
50*e1eccf28SAndroid Build Coastguard Worker         mPos = (mPos + 1) & (~1);
51*e1eccf28SAndroid Build Coastguard Worker         uint16_t tmp = reinterpret_cast<const uint16_t *>(&mData[mPos])[0];
52*e1eccf28SAndroid Build Coastguard Worker         mPos += sizeof(uint16_t);
53*e1eccf28SAndroid Build Coastguard Worker         return tmp;
54*e1eccf28SAndroid Build Coastguard Worker     }
loadU8()55*e1eccf28SAndroid Build Coastguard Worker     inline uint8_t loadU8() {
56*e1eccf28SAndroid Build Coastguard Worker         uint8_t tmp = reinterpret_cast<const uint8_t *>(&mData[mPos])[0];
57*e1eccf28SAndroid Build Coastguard Worker         mPos += sizeof(uint8_t);
58*e1eccf28SAndroid Build Coastguard Worker         return tmp;
59*e1eccf28SAndroid Build Coastguard Worker     }
60*e1eccf28SAndroid Build Coastguard Worker     void loadByteArray(void *dest, size_t numBytes);
61*e1eccf28SAndroid Build Coastguard Worker     uint64_t loadOffset();
62*e1eccf28SAndroid Build Coastguard Worker     const char * loadString();
getPos()63*e1eccf28SAndroid Build Coastguard Worker     uint64_t getPos() const {
64*e1eccf28SAndroid Build Coastguard Worker         return mPos;
65*e1eccf28SAndroid Build Coastguard Worker     }
reset(uint64_t pos)66*e1eccf28SAndroid Build Coastguard Worker     void reset(uint64_t pos) {
67*e1eccf28SAndroid Build Coastguard Worker         mPos = pos;
68*e1eccf28SAndroid Build Coastguard Worker     }
reset()69*e1eccf28SAndroid Build Coastguard Worker     void reset() {
70*e1eccf28SAndroid Build Coastguard Worker         mPos = 0;
71*e1eccf28SAndroid Build Coastguard Worker     }
72*e1eccf28SAndroid Build Coastguard Worker 
getPtr()73*e1eccf28SAndroid Build Coastguard Worker     const uint8_t * getPtr() const {
74*e1eccf28SAndroid Build Coastguard Worker         return mData;
75*e1eccf28SAndroid Build Coastguard Worker     }
76*e1eccf28SAndroid Build Coastguard Worker protected:
77*e1eccf28SAndroid Build Coastguard Worker     const uint8_t * mData;
78*e1eccf28SAndroid Build Coastguard Worker     uint64_t mPos;
79*e1eccf28SAndroid Build Coastguard Worker     bool mUse64;
80*e1eccf28SAndroid Build Coastguard Worker };
81*e1eccf28SAndroid Build Coastguard Worker 
82*e1eccf28SAndroid Build Coastguard Worker class OStream {
83*e1eccf28SAndroid Build Coastguard Worker public:
84*e1eccf28SAndroid Build Coastguard Worker     OStream(uint64_t length, bool use64);
85*e1eccf28SAndroid Build Coastguard Worker     ~OStream();
86*e1eccf28SAndroid Build Coastguard Worker 
align(uint32_t bytes)87*e1eccf28SAndroid Build Coastguard Worker     void align(uint32_t bytes) {
88*e1eccf28SAndroid Build Coastguard Worker         mPos = (mPos + (bytes - 1)) & (~(bytes - 1));
89*e1eccf28SAndroid Build Coastguard Worker         if (mPos >= mLength) {
90*e1eccf28SAndroid Build Coastguard Worker             growSize();
91*e1eccf28SAndroid Build Coastguard Worker         }
92*e1eccf28SAndroid Build Coastguard Worker     }
93*e1eccf28SAndroid Build Coastguard Worker 
addF(float v)94*e1eccf28SAndroid Build Coastguard Worker     void addF(float v) {
95*e1eccf28SAndroid Build Coastguard Worker         uint32_t uintV = *reinterpret_cast<uint32_t*> (&v);
96*e1eccf28SAndroid Build Coastguard Worker         addU32(uintV);
97*e1eccf28SAndroid Build Coastguard Worker     }
addI32(int32_t v)98*e1eccf28SAndroid Build Coastguard Worker     void addI32(int32_t v) {
99*e1eccf28SAndroid Build Coastguard Worker         mPos = (mPos + 3) & (~3);
100*e1eccf28SAndroid Build Coastguard Worker         if (mPos + sizeof(v) >= mLength) {
101*e1eccf28SAndroid Build Coastguard Worker             growSize();
102*e1eccf28SAndroid Build Coastguard Worker         }
103*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)(v & 0xff);
104*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 8) & 0xff);
105*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 16) & 0xff);
106*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 24) & 0xff);
107*e1eccf28SAndroid Build Coastguard Worker     }
addU32(uint32_t v)108*e1eccf28SAndroid Build Coastguard Worker     void addU32(uint32_t v) {
109*e1eccf28SAndroid Build Coastguard Worker         mPos = (mPos + 3) & (~3);
110*e1eccf28SAndroid Build Coastguard Worker         if (mPos + sizeof(v) >= mLength) {
111*e1eccf28SAndroid Build Coastguard Worker             growSize();
112*e1eccf28SAndroid Build Coastguard Worker         }
113*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)(v & 0xff);
114*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 8) & 0xff);
115*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 16) & 0xff);
116*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)((v >> 24) & 0xff);
117*e1eccf28SAndroid Build Coastguard Worker     }
addU16(uint16_t v)118*e1eccf28SAndroid Build Coastguard Worker     void addU16(uint16_t v) {
119*e1eccf28SAndroid Build Coastguard Worker         mPos = (mPos + 1) & (~1);
120*e1eccf28SAndroid Build Coastguard Worker         if (mPos + sizeof(v) >= mLength) {
121*e1eccf28SAndroid Build Coastguard Worker             growSize();
122*e1eccf28SAndroid Build Coastguard Worker         }
123*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)(v & 0xff);
124*e1eccf28SAndroid Build Coastguard Worker         mData[mPos++] = (uint8_t)(v >> 8);
125*e1eccf28SAndroid Build Coastguard Worker     }
addU8(uint8_t v)126*e1eccf28SAndroid Build Coastguard Worker     inline void addU8(uint8_t v) {
127*e1eccf28SAndroid Build Coastguard Worker         if (mPos + 1 >= mLength) {
128*e1eccf28SAndroid Build Coastguard Worker             growSize();
129*e1eccf28SAndroid Build Coastguard Worker         }
130*e1eccf28SAndroid Build Coastguard Worker         reinterpret_cast<uint8_t *>(&mData[mPos])[0] = v;
131*e1eccf28SAndroid Build Coastguard Worker         mPos ++;
132*e1eccf28SAndroid Build Coastguard Worker     }
133*e1eccf28SAndroid Build Coastguard Worker     void addByteArray(const void *src, size_t numBytes);
134*e1eccf28SAndroid Build Coastguard Worker     void addOffset(uint64_t v);
135*e1eccf28SAndroid Build Coastguard Worker     void addString(const char *name);
136*e1eccf28SAndroid Build Coastguard Worker     void addString(const char *name, size_t len);
getPos()137*e1eccf28SAndroid Build Coastguard Worker     uint64_t getPos() const {
138*e1eccf28SAndroid Build Coastguard Worker         return mPos;
139*e1eccf28SAndroid Build Coastguard Worker     }
reset(uint64_t pos)140*e1eccf28SAndroid Build Coastguard Worker     void reset(uint64_t pos) {
141*e1eccf28SAndroid Build Coastguard Worker         mPos = pos;
142*e1eccf28SAndroid Build Coastguard Worker     }
reset()143*e1eccf28SAndroid Build Coastguard Worker     void reset() {
144*e1eccf28SAndroid Build Coastguard Worker         mPos = 0;
145*e1eccf28SAndroid Build Coastguard Worker     }
getPtr()146*e1eccf28SAndroid Build Coastguard Worker     const uint8_t * getPtr() const {
147*e1eccf28SAndroid Build Coastguard Worker         return mData;
148*e1eccf28SAndroid Build Coastguard Worker     }
149*e1eccf28SAndroid Build Coastguard Worker protected:
150*e1eccf28SAndroid Build Coastguard Worker     void growSize();
151*e1eccf28SAndroid Build Coastguard Worker     uint8_t * mData;
152*e1eccf28SAndroid Build Coastguard Worker     uint64_t mLength;
153*e1eccf28SAndroid Build Coastguard Worker     uint64_t mPos;
154*e1eccf28SAndroid Build Coastguard Worker     bool mUse64;
155*e1eccf28SAndroid Build Coastguard Worker };
156*e1eccf28SAndroid Build Coastguard Worker 
157*e1eccf28SAndroid Build Coastguard Worker 
158*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
159*e1eccf28SAndroid Build Coastguard Worker } // namespace android
160*e1eccf28SAndroid Build Coastguard Worker #endif //ANDROID_RS_STREAM_H
161*e1eccf28SAndroid Build Coastguard Worker 
162*e1eccf28SAndroid Build Coastguard Worker 
163