xref: /aosp_15_r20/frameworks/native/libs/gui/IGraphicBufferProducerFlattenables.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2021 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #include <inttypes.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <gui/IGraphicBufferProducer.h>
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker namespace android {
21*38e8c45fSAndroid Build Coastguard Worker 
minFlattenedSize()22*38e8c45fSAndroid Build Coastguard Worker constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() {
23*38e8c45fSAndroid Build Coastguard Worker     return sizeof(timestamp) + sizeof(isAutoTimestamp) + sizeof(dataSpace) + sizeof(crop) +
24*38e8c45fSAndroid Build Coastguard Worker             sizeof(scalingMode) + sizeof(transform) + sizeof(stickyTransform) +
25*38e8c45fSAndroid Build Coastguard Worker             sizeof(getFrameTimestamps) + sizeof(slot) +
26*38e8c45fSAndroid Build Coastguard Worker #if COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES
27*38e8c45fSAndroid Build Coastguard Worker             sizeof(decltype(pictureProfileHandle.has_value())) +
28*38e8c45fSAndroid Build Coastguard Worker             sizeof(decltype(pictureProfileHandle.getId()));
29*38e8c45fSAndroid Build Coastguard Worker #else
30*38e8c45fSAndroid Build Coastguard Worker             0;
31*38e8c45fSAndroid Build Coastguard Worker #endif // COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES
32*38e8c45fSAndroid Build Coastguard Worker }
33*38e8c45fSAndroid Build Coastguard Worker 
getFlattenedSize() const34*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
35*38e8c45fSAndroid Build Coastguard Worker     return minFlattenedSize() + fence->getFlattenedSize() + surfaceDamage.getFlattenedSize() +
36*38e8c45fSAndroid Build Coastguard Worker             hdrMetadata.getFlattenedSize();
37*38e8c45fSAndroid Build Coastguard Worker }
38*38e8c45fSAndroid Build Coastguard Worker 
getFdCount() const39*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
40*38e8c45fSAndroid Build Coastguard Worker     return fence->getFdCount();
41*38e8c45fSAndroid Build Coastguard Worker }
42*38e8c45fSAndroid Build Coastguard Worker 
flatten(void * & buffer,size_t & size,int * & fds,size_t & count) const43*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::QueueBufferInput::flatten(
44*38e8c45fSAndroid Build Coastguard Worker         void*& buffer, size_t& size, int*& fds, size_t& count) const
45*38e8c45fSAndroid Build Coastguard Worker {
46*38e8c45fSAndroid Build Coastguard Worker     if (size < getFlattenedSize()) {
47*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
48*38e8c45fSAndroid Build Coastguard Worker     }
49*38e8c45fSAndroid Build Coastguard Worker 
50*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, timestamp);
51*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, isAutoTimestamp);
52*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, dataSpace);
53*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, crop);
54*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, scalingMode);
55*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, transform);
56*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, stickyTransform);
57*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, getFrameTimestamps);
58*38e8c45fSAndroid Build Coastguard Worker #if COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES
59*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, pictureProfileHandle.has_value());
60*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size,
61*38e8c45fSAndroid Build Coastguard Worker                             pictureProfileHandle.has_value() ? pictureProfileHandle->getId()
62*38e8c45fSAndroid Build Coastguard Worker                                                              : PictureProfileHandle::NONE.getId());
63*38e8c45fSAndroid Build Coastguard Worker #endif // COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES
64*38e8c45fSAndroid Build Coastguard Worker 
65*38e8c45fSAndroid Build Coastguard Worker     status_t result = fence->flatten(buffer, size, fds, count);
66*38e8c45fSAndroid Build Coastguard Worker     if (result != NO_ERROR) {
67*38e8c45fSAndroid Build Coastguard Worker         return result;
68*38e8c45fSAndroid Build Coastguard Worker     }
69*38e8c45fSAndroid Build Coastguard Worker     result = surfaceDamage.flatten(buffer, size);
70*38e8c45fSAndroid Build Coastguard Worker     if (result != NO_ERROR) {
71*38e8c45fSAndroid Build Coastguard Worker         return result;
72*38e8c45fSAndroid Build Coastguard Worker     }
73*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
74*38e8c45fSAndroid Build Coastguard Worker     result = hdrMetadata.flatten(buffer, size);
75*38e8c45fSAndroid Build Coastguard Worker     if (result != NO_ERROR) {
76*38e8c45fSAndroid Build Coastguard Worker         return result;
77*38e8c45fSAndroid Build Coastguard Worker     }
78*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::advance(buffer, size, hdrMetadata.getFlattenedSize());
79*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, slot);
80*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
81*38e8c45fSAndroid Build Coastguard Worker }
82*38e8c45fSAndroid Build Coastguard Worker 
unflatten(void const * & buffer,size_t & size,int const * & fds,size_t & count)83*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
84*38e8c45fSAndroid Build Coastguard Worker         void const*& buffer, size_t& size, int const*& fds, size_t& count)
85*38e8c45fSAndroid Build Coastguard Worker {
86*38e8c45fSAndroid Build Coastguard Worker     if (size < minFlattenedSize()) {
87*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
88*38e8c45fSAndroid Build Coastguard Worker     }
89*38e8c45fSAndroid Build Coastguard Worker 
90*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, timestamp);
91*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, isAutoTimestamp);
92*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, dataSpace);
93*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, crop);
94*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, scalingMode);
95*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, transform);
96*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, stickyTransform);
97*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, getFrameTimestamps);
98*38e8c45fSAndroid Build Coastguard Worker #if COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES
99*38e8c45fSAndroid Build Coastguard Worker     bool hasPictureProfileHandle;
100*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, hasPictureProfileHandle);
101*38e8c45fSAndroid Build Coastguard Worker     PictureProfileId pictureProfileId;
102*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, pictureProfileId);
103*38e8c45fSAndroid Build Coastguard Worker     pictureProfileHandle = hasPictureProfileHandle
104*38e8c45fSAndroid Build Coastguard Worker             ? std::optional(PictureProfileHandle(pictureProfileId))
105*38e8c45fSAndroid Build Coastguard Worker             : std::nullopt;
106*38e8c45fSAndroid Build Coastguard Worker #endif // COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES
107*38e8c45fSAndroid Build Coastguard Worker 
108*38e8c45fSAndroid Build Coastguard Worker     fence = new Fence();
109*38e8c45fSAndroid Build Coastguard Worker     status_t result = fence->unflatten(buffer, size, fds, count);
110*38e8c45fSAndroid Build Coastguard Worker     if (result != NO_ERROR) {
111*38e8c45fSAndroid Build Coastguard Worker         return result;
112*38e8c45fSAndroid Build Coastguard Worker     }
113*38e8c45fSAndroid Build Coastguard Worker     result = surfaceDamage.unflatten(buffer, size);
114*38e8c45fSAndroid Build Coastguard Worker     if (result != NO_ERROR) {
115*38e8c45fSAndroid Build Coastguard Worker         return result;
116*38e8c45fSAndroid Build Coastguard Worker     }
117*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
118*38e8c45fSAndroid Build Coastguard Worker     result =  hdrMetadata.unflatten(buffer, size);
119*38e8c45fSAndroid Build Coastguard Worker     if (result != NO_ERROR) {
120*38e8c45fSAndroid Build Coastguard Worker         return result;
121*38e8c45fSAndroid Build Coastguard Worker     }
122*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::advance(buffer, size, hdrMetadata.getFlattenedSize());
123*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, slot);
124*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
125*38e8c45fSAndroid Build Coastguard Worker }
126*38e8c45fSAndroid Build Coastguard Worker 
127*38e8c45fSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////
minFlattenedSize()128*38e8c45fSAndroid Build Coastguard Worker constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() {
129*38e8c45fSAndroid Build Coastguard Worker     return sizeof(width) + sizeof(height) + sizeof(transformHint) + sizeof(numPendingBuffers) +
130*38e8c45fSAndroid Build Coastguard Worker             sizeof(nextFrameNumber) + sizeof(bufferReplaced) + sizeof(maxBufferCount) +
131*38e8c45fSAndroid Build Coastguard Worker             sizeof(result);
132*38e8c45fSAndroid Build Coastguard Worker }
getFlattenedSize() const133*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const {
134*38e8c45fSAndroid Build Coastguard Worker     return minFlattenedSize() + frameTimestamps.getFlattenedSize();
135*38e8c45fSAndroid Build Coastguard Worker }
136*38e8c45fSAndroid Build Coastguard Worker 
getFdCount() const137*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const {
138*38e8c45fSAndroid Build Coastguard Worker     return frameTimestamps.getFdCount();
139*38e8c45fSAndroid Build Coastguard Worker }
140*38e8c45fSAndroid Build Coastguard Worker 
flatten(void * & buffer,size_t & size,int * & fds,size_t & count) const141*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::QueueBufferOutput::flatten(
142*38e8c45fSAndroid Build Coastguard Worker         void*& buffer, size_t& size, int*& fds, size_t& count) const
143*38e8c45fSAndroid Build Coastguard Worker {
144*38e8c45fSAndroid Build Coastguard Worker     if (size < getFlattenedSize()) {
145*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
146*38e8c45fSAndroid Build Coastguard Worker     }
147*38e8c45fSAndroid Build Coastguard Worker 
148*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, width);
149*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, height);
150*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, transformHint);
151*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, numPendingBuffers);
152*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, nextFrameNumber);
153*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, bufferReplaced);
154*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, maxBufferCount);
155*38e8c45fSAndroid Build Coastguard Worker 
156*38e8c45fSAndroid Build Coastguard Worker     status_t result = frameTimestamps.flatten(buffer, size, fds, count);
157*38e8c45fSAndroid Build Coastguard Worker     if (result != NO_ERROR) {
158*38e8c45fSAndroid Build Coastguard Worker         return result;
159*38e8c45fSAndroid Build Coastguard Worker     }
160*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, result);
161*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
162*38e8c45fSAndroid Build Coastguard Worker }
163*38e8c45fSAndroid Build Coastguard Worker 
unflatten(void const * & buffer,size_t & size,int const * & fds,size_t & count)164*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::QueueBufferOutput::unflatten(
165*38e8c45fSAndroid Build Coastguard Worker         void const*& buffer, size_t& size, int const*& fds, size_t& count)
166*38e8c45fSAndroid Build Coastguard Worker {
167*38e8c45fSAndroid Build Coastguard Worker     if (size < minFlattenedSize()) {
168*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
169*38e8c45fSAndroid Build Coastguard Worker     }
170*38e8c45fSAndroid Build Coastguard Worker 
171*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, width);
172*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, height);
173*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, transformHint);
174*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, numPendingBuffers);
175*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, nextFrameNumber);
176*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, bufferReplaced);
177*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, maxBufferCount);
178*38e8c45fSAndroid Build Coastguard Worker 
179*38e8c45fSAndroid Build Coastguard Worker     status_t result = frameTimestamps.unflatten(buffer, size, fds, count);
180*38e8c45fSAndroid Build Coastguard Worker     if (result != NO_ERROR) {
181*38e8c45fSAndroid Build Coastguard Worker         return result;
182*38e8c45fSAndroid Build Coastguard Worker     }
183*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, result);
184*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
185*38e8c45fSAndroid Build Coastguard Worker }
186*38e8c45fSAndroid Build Coastguard Worker 
187*38e8c45fSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////
minFlattenedSize()188*38e8c45fSAndroid Build Coastguard Worker constexpr size_t IGraphicBufferProducer::RequestBufferOutput::minFlattenedSize() {
189*38e8c45fSAndroid Build Coastguard Worker     return sizeof(result) +
190*38e8c45fSAndroid Build Coastguard Worker             sizeof(int32_t); // IsBufferNull
191*38e8c45fSAndroid Build Coastguard Worker }
192*38e8c45fSAndroid Build Coastguard Worker 
getFlattenedSize() const193*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::RequestBufferOutput::getFlattenedSize() const {
194*38e8c45fSAndroid Build Coastguard Worker     return minFlattenedSize() + (buffer == nullptr ? 0 : buffer->getFlattenedSize());
195*38e8c45fSAndroid Build Coastguard Worker }
196*38e8c45fSAndroid Build Coastguard Worker 
getFdCount() const197*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::RequestBufferOutput::getFdCount() const {
198*38e8c45fSAndroid Build Coastguard Worker     return (buffer == nullptr ? 0 : buffer->getFdCount());
199*38e8c45fSAndroid Build Coastguard Worker }
200*38e8c45fSAndroid Build Coastguard Worker 
flatten(void * & fBuffer,size_t & size,int * & fds,size_t & count) const201*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::RequestBufferOutput::flatten(
202*38e8c45fSAndroid Build Coastguard Worker         void*& fBuffer, size_t& size, int*& fds, size_t& count) const {
203*38e8c45fSAndroid Build Coastguard Worker     if (size < getFlattenedSize()) {
204*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
205*38e8c45fSAndroid Build Coastguard Worker     }
206*38e8c45fSAndroid Build Coastguard Worker 
207*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(fBuffer, size, result);
208*38e8c45fSAndroid Build Coastguard Worker     const int32_t isBufferNull = (buffer == nullptr ? 1 : 0);
209*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(fBuffer, size, isBufferNull);
210*38e8c45fSAndroid Build Coastguard Worker 
211*38e8c45fSAndroid Build Coastguard Worker     if (!isBufferNull) {
212*38e8c45fSAndroid Build Coastguard Worker         status_t status = buffer->flatten(fBuffer, size, fds, count);
213*38e8c45fSAndroid Build Coastguard Worker         if (status != NO_ERROR) {
214*38e8c45fSAndroid Build Coastguard Worker             return status;
215*38e8c45fSAndroid Build Coastguard Worker         }
216*38e8c45fSAndroid Build Coastguard Worker     }
217*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
218*38e8c45fSAndroid Build Coastguard Worker }
219*38e8c45fSAndroid Build Coastguard Worker 
unflatten(void const * & fBuffer,size_t & size,int const * & fds,size_t & count)220*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::RequestBufferOutput::unflatten(
221*38e8c45fSAndroid Build Coastguard Worker         void const*& fBuffer, size_t& size, int const*& fds, size_t& count) {
222*38e8c45fSAndroid Build Coastguard Worker     if (size < minFlattenedSize()) {
223*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
224*38e8c45fSAndroid Build Coastguard Worker     }
225*38e8c45fSAndroid Build Coastguard Worker 
226*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(fBuffer, size, result);
227*38e8c45fSAndroid Build Coastguard Worker     int32_t isBufferNull = 0;
228*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(fBuffer, size, isBufferNull);
229*38e8c45fSAndroid Build Coastguard Worker     buffer = new GraphicBuffer();
230*38e8c45fSAndroid Build Coastguard Worker     if (!isBufferNull) {
231*38e8c45fSAndroid Build Coastguard Worker         status_t status = buffer->unflatten(fBuffer, size, fds, count);
232*38e8c45fSAndroid Build Coastguard Worker         if (status != NO_ERROR) {
233*38e8c45fSAndroid Build Coastguard Worker             return status;
234*38e8c45fSAndroid Build Coastguard Worker         }
235*38e8c45fSAndroid Build Coastguard Worker     }
236*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
237*38e8c45fSAndroid Build Coastguard Worker }
238*38e8c45fSAndroid Build Coastguard Worker 
239*38e8c45fSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////
240*38e8c45fSAndroid Build Coastguard Worker 
getFlattenedSize() const241*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::DequeueBufferInput::getFlattenedSize() const {
242*38e8c45fSAndroid Build Coastguard Worker     return sizeof(width) + sizeof(height) + sizeof(format) + sizeof(usage) +
243*38e8c45fSAndroid Build Coastguard Worker             sizeof(int32_t/*getTimestamps*/);
244*38e8c45fSAndroid Build Coastguard Worker }
245*38e8c45fSAndroid Build Coastguard Worker 
flatten(void * buffer,size_t size) const246*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::DequeueBufferInput::flatten(void* buffer, size_t size) const {
247*38e8c45fSAndroid Build Coastguard Worker     if (size < getFlattenedSize()) {
248*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
249*38e8c45fSAndroid Build Coastguard Worker     }
250*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, width);
251*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, height);
252*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, format);
253*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, usage);
254*38e8c45fSAndroid Build Coastguard Worker     const int32_t getTimestampsInt = (getTimestamps ? 1 : 0);
255*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, getTimestampsInt);
256*38e8c45fSAndroid Build Coastguard Worker 
257*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
258*38e8c45fSAndroid Build Coastguard Worker }
259*38e8c45fSAndroid Build Coastguard Worker 
unflatten(void const * buffer,size_t size)260*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::DequeueBufferInput::unflatten(void const* buffer, size_t size) {
261*38e8c45fSAndroid Build Coastguard Worker     if (size < getFlattenedSize()) {
262*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
263*38e8c45fSAndroid Build Coastguard Worker     }
264*38e8c45fSAndroid Build Coastguard Worker 
265*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, width);
266*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, height);
267*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, format);
268*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, usage);
269*38e8c45fSAndroid Build Coastguard Worker     int32_t getTimestampsInt = 0;
270*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, getTimestampsInt);
271*38e8c45fSAndroid Build Coastguard Worker     getTimestamps = (getTimestampsInt == 1);
272*38e8c45fSAndroid Build Coastguard Worker 
273*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
274*38e8c45fSAndroid Build Coastguard Worker }
275*38e8c45fSAndroid Build Coastguard Worker 
276*38e8c45fSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////
277*38e8c45fSAndroid Build Coastguard Worker 
minFlattenedSize()278*38e8c45fSAndroid Build Coastguard Worker constexpr size_t IGraphicBufferProducer::DequeueBufferOutput::minFlattenedSize() {
279*38e8c45fSAndroid Build Coastguard Worker     return sizeof(result) + sizeof(slot) + sizeof(bufferAge) + sizeof(int32_t/*hasTimestamps*/);
280*38e8c45fSAndroid Build Coastguard Worker }
281*38e8c45fSAndroid Build Coastguard Worker 
getFlattenedSize() const282*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::DequeueBufferOutput::getFlattenedSize() const {
283*38e8c45fSAndroid Build Coastguard Worker     return minFlattenedSize() +
284*38e8c45fSAndroid Build Coastguard Worker             fence->getFlattenedSize() +
285*38e8c45fSAndroid Build Coastguard Worker             (timestamps.has_value() ? timestamps->getFlattenedSize() : 0);
286*38e8c45fSAndroid Build Coastguard Worker }
287*38e8c45fSAndroid Build Coastguard Worker 
getFdCount() const288*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::DequeueBufferOutput::getFdCount() const {
289*38e8c45fSAndroid Build Coastguard Worker     return fence->getFdCount() +
290*38e8c45fSAndroid Build Coastguard Worker             (timestamps.has_value() ? timestamps->getFdCount() : 0);
291*38e8c45fSAndroid Build Coastguard Worker }
292*38e8c45fSAndroid Build Coastguard Worker 
flatten(void * & buffer,size_t & size,int * & fds,size_t & count) const293*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::DequeueBufferOutput::flatten(
294*38e8c45fSAndroid Build Coastguard Worker         void*& buffer, size_t& size, int*& fds, size_t& count) const {
295*38e8c45fSAndroid Build Coastguard Worker     if (size < getFlattenedSize()) {
296*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
297*38e8c45fSAndroid Build Coastguard Worker     }
298*38e8c45fSAndroid Build Coastguard Worker 
299*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, result);
300*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, slot);
301*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, bufferAge);
302*38e8c45fSAndroid Build Coastguard Worker     status_t status = fence->flatten(buffer, size, fds, count);
303*38e8c45fSAndroid Build Coastguard Worker     if (status != NO_ERROR) {
304*38e8c45fSAndroid Build Coastguard Worker         return result;
305*38e8c45fSAndroid Build Coastguard Worker     }
306*38e8c45fSAndroid Build Coastguard Worker     const int32_t hasTimestamps = timestamps.has_value() ? 1 : 0;
307*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, hasTimestamps);
308*38e8c45fSAndroid Build Coastguard Worker     if (timestamps.has_value()) {
309*38e8c45fSAndroid Build Coastguard Worker         status = timestamps->flatten(buffer, size, fds, count);
310*38e8c45fSAndroid Build Coastguard Worker     }
311*38e8c45fSAndroid Build Coastguard Worker     return status;
312*38e8c45fSAndroid Build Coastguard Worker }
313*38e8c45fSAndroid Build Coastguard Worker 
unflatten(void const * & buffer,size_t & size,int const * & fds,size_t & count)314*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::DequeueBufferOutput::unflatten(
315*38e8c45fSAndroid Build Coastguard Worker         void const*& buffer, size_t& size, int const*& fds, size_t& count) {
316*38e8c45fSAndroid Build Coastguard Worker     if (size < minFlattenedSize()) {
317*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
318*38e8c45fSAndroid Build Coastguard Worker     }
319*38e8c45fSAndroid Build Coastguard Worker 
320*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, result);
321*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, slot);
322*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, bufferAge);
323*38e8c45fSAndroid Build Coastguard Worker 
324*38e8c45fSAndroid Build Coastguard Worker     fence = new Fence();
325*38e8c45fSAndroid Build Coastguard Worker     status_t status = fence->unflatten(buffer, size, fds, count);
326*38e8c45fSAndroid Build Coastguard Worker     if (status != NO_ERROR) {
327*38e8c45fSAndroid Build Coastguard Worker         return status;
328*38e8c45fSAndroid Build Coastguard Worker     }
329*38e8c45fSAndroid Build Coastguard Worker     int32_t hasTimestamps = 0;
330*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, hasTimestamps);
331*38e8c45fSAndroid Build Coastguard Worker     if (hasTimestamps) {
332*38e8c45fSAndroid Build Coastguard Worker         timestamps.emplace();
333*38e8c45fSAndroid Build Coastguard Worker         status = timestamps->unflatten(buffer, size, fds, count);
334*38e8c45fSAndroid Build Coastguard Worker     }
335*38e8c45fSAndroid Build Coastguard Worker     return status;
336*38e8c45fSAndroid Build Coastguard Worker }
337*38e8c45fSAndroid Build Coastguard Worker 
338*38e8c45fSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////
339*38e8c45fSAndroid Build Coastguard Worker 
getFlattenedSize() const340*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::AttachBufferOutput::getFlattenedSize() const {
341*38e8c45fSAndroid Build Coastguard Worker     return sizeof(result) + sizeof(slot);
342*38e8c45fSAndroid Build Coastguard Worker }
343*38e8c45fSAndroid Build Coastguard Worker 
flatten(void * buffer,size_t size) const344*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::AttachBufferOutput::flatten(void* buffer, size_t size) const {
345*38e8c45fSAndroid Build Coastguard Worker     if (size < getFlattenedSize()) {
346*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
347*38e8c45fSAndroid Build Coastguard Worker     }
348*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, result);
349*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, slot);
350*38e8c45fSAndroid Build Coastguard Worker 
351*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
352*38e8c45fSAndroid Build Coastguard Worker }
353*38e8c45fSAndroid Build Coastguard Worker 
unflatten(void const * buffer,size_t size)354*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::AttachBufferOutput::unflatten(void const* buffer, size_t size) {
355*38e8c45fSAndroid Build Coastguard Worker     if (size < getFlattenedSize()) {
356*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
357*38e8c45fSAndroid Build Coastguard Worker     }
358*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, result);
359*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, slot);
360*38e8c45fSAndroid Build Coastguard Worker 
361*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
362*38e8c45fSAndroid Build Coastguard Worker }
363*38e8c45fSAndroid Build Coastguard Worker 
364*38e8c45fSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////
365*38e8c45fSAndroid Build Coastguard Worker 
minFlattenedSize()366*38e8c45fSAndroid Build Coastguard Worker constexpr size_t IGraphicBufferProducer::CancelBufferInput::minFlattenedSize() {
367*38e8c45fSAndroid Build Coastguard Worker     return sizeof(slot);
368*38e8c45fSAndroid Build Coastguard Worker }
369*38e8c45fSAndroid Build Coastguard Worker 
getFlattenedSize() const370*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::CancelBufferInput::getFlattenedSize() const {
371*38e8c45fSAndroid Build Coastguard Worker     return minFlattenedSize() + fence->getFlattenedSize();
372*38e8c45fSAndroid Build Coastguard Worker }
373*38e8c45fSAndroid Build Coastguard Worker 
getFdCount() const374*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::CancelBufferInput::getFdCount() const {
375*38e8c45fSAndroid Build Coastguard Worker     return fence->getFdCount();
376*38e8c45fSAndroid Build Coastguard Worker }
377*38e8c45fSAndroid Build Coastguard Worker 
flatten(void * & buffer,size_t & size,int * & fds,size_t & count) const378*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::CancelBufferInput::flatten(
379*38e8c45fSAndroid Build Coastguard Worker         void*& buffer, size_t& size, int*& fds, size_t& count) const {
380*38e8c45fSAndroid Build Coastguard Worker     if (size < getFlattenedSize()) {
381*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
382*38e8c45fSAndroid Build Coastguard Worker     }
383*38e8c45fSAndroid Build Coastguard Worker 
384*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, slot);
385*38e8c45fSAndroid Build Coastguard Worker     return fence->flatten(buffer, size, fds, count);
386*38e8c45fSAndroid Build Coastguard Worker }
387*38e8c45fSAndroid Build Coastguard Worker 
unflatten(void const * & buffer,size_t & size,int const * & fds,size_t & count)388*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::CancelBufferInput::unflatten(
389*38e8c45fSAndroid Build Coastguard Worker         void const*& buffer, size_t& size, int const*& fds, size_t& count) {
390*38e8c45fSAndroid Build Coastguard Worker     if (size < minFlattenedSize()) {
391*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
392*38e8c45fSAndroid Build Coastguard Worker     }
393*38e8c45fSAndroid Build Coastguard Worker 
394*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, slot);
395*38e8c45fSAndroid Build Coastguard Worker 
396*38e8c45fSAndroid Build Coastguard Worker     fence = new Fence();
397*38e8c45fSAndroid Build Coastguard Worker     return fence->unflatten(buffer, size, fds, count);
398*38e8c45fSAndroid Build Coastguard Worker }
399*38e8c45fSAndroid Build Coastguard Worker 
400*38e8c45fSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////
401*38e8c45fSAndroid Build Coastguard Worker 
getFlattenedSize() const402*38e8c45fSAndroid Build Coastguard Worker size_t IGraphicBufferProducer::QueryOutput::getFlattenedSize() const {
403*38e8c45fSAndroid Build Coastguard Worker     return sizeof(result) + sizeof(value);
404*38e8c45fSAndroid Build Coastguard Worker }
405*38e8c45fSAndroid Build Coastguard Worker 
flatten(void * buffer,size_t size) const406*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::QueryOutput::flatten(void* buffer, size_t size) const {
407*38e8c45fSAndroid Build Coastguard Worker     if (size < getFlattenedSize()) {
408*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
409*38e8c45fSAndroid Build Coastguard Worker     }
410*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, result);
411*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, value);
412*38e8c45fSAndroid Build Coastguard Worker 
413*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
414*38e8c45fSAndroid Build Coastguard Worker }
415*38e8c45fSAndroid Build Coastguard Worker 
unflatten(void const * buffer,size_t size)416*38e8c45fSAndroid Build Coastguard Worker status_t IGraphicBufferProducer::QueryOutput::unflatten(void const* buffer, size_t size) {
417*38e8c45fSAndroid Build Coastguard Worker     if (size < getFlattenedSize()) {
418*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
419*38e8c45fSAndroid Build Coastguard Worker     }
420*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, result);
421*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, value);
422*38e8c45fSAndroid Build Coastguard Worker 
423*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
424*38e8c45fSAndroid Build Coastguard Worker }
425*38e8c45fSAndroid Build Coastguard Worker 
426*38e8c45fSAndroid Build Coastguard Worker } // namespace android
427