1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "buffer_utils.h"
17
18 #include <fcntl.h>
19 #include <unistd.h>
20
21 #include "buffer_log.h"
22 #include "surface_buffer_impl.h"
23
24 namespace OHOS {
ReadFileDescriptor(MessageParcel & parcel,int32_t & fd)25 void ReadFileDescriptor(MessageParcel &parcel, int32_t &fd)
26 {
27 fd = parcel.ReadInt32();
28 if (fd < 0) {
29 return;
30 }
31
32 fd = parcel.ReadFileDescriptor();
33 }
34
WriteFileDescriptor(MessageParcel & parcel,int32_t fd)35 void WriteFileDescriptor(MessageParcel &parcel, int32_t fd)
36 {
37 if (fd >= 0 && fcntl(fd, F_GETFL) == -1 && errno == EBADF) {
38 fd = -1;
39 }
40
41 parcel.WriteInt32(fd);
42
43 if (fd < 0) {
44 return;
45 }
46
47 parcel.WriteFileDescriptor(fd);
48 close(fd);
49 }
50
ReadRequestConfig(MessageParcel & parcel,BufferRequestConfig & config)51 void ReadRequestConfig(MessageParcel &parcel, BufferRequestConfig &config)
52 {
53 config.width = parcel.ReadInt32();
54 config.height = parcel.ReadInt32();
55 config.strideAlignment = parcel.ReadInt32();
56 config.format = parcel.ReadInt32();
57 config.usage = parcel.ReadUint64();
58 config.timeout = parcel.ReadInt32();
59 config.colorGamut = static_cast<GraphicColorGamut>(parcel.ReadInt32());
60 config.transform = static_cast<GraphicTransformType>(parcel.ReadInt32());
61 }
62
WriteRequestConfig(MessageParcel & parcel,BufferRequestConfig const & config)63 void WriteRequestConfig(MessageParcel &parcel, BufferRequestConfig const & config)
64 {
65 parcel.WriteInt32(config.width);
66 parcel.WriteInt32(config.height);
67 parcel.WriteInt32(config.strideAlignment);
68 parcel.WriteInt32(config.format);
69 parcel.WriteUint64(config.usage);
70 parcel.WriteInt32(config.timeout);
71 parcel.WriteInt32(static_cast<int32_t>(config.colorGamut));
72 parcel.WriteInt32(static_cast<int32_t>(config.transform));
73 }
74
ReadFlushConfig(MessageParcel & parcel,BufferFlushConfig & config)75 void ReadFlushConfig(MessageParcel &parcel, BufferFlushConfig &config)
76 {
77 config.damage.x = parcel.ReadInt32();
78 config.damage.y = parcel.ReadInt32();
79 config.damage.w = parcel.ReadInt32();
80 config.damage.h = parcel.ReadInt32();
81 config.timestamp = parcel.ReadInt64();
82 }
83
WriteFlushConfig(MessageParcel & parcel,BufferFlushConfig const & config)84 void WriteFlushConfig(MessageParcel &parcel, BufferFlushConfig const & config)
85 {
86 parcel.WriteInt32(config.damage.x);
87 parcel.WriteInt32(config.damage.y);
88 parcel.WriteInt32(config.damage.w);
89 parcel.WriteInt32(config.damage.h);
90 parcel.WriteInt64(config.timestamp);
91 }
92
ReadSurfaceBufferImpl(MessageParcel & parcel,uint32_t & sequence,sptr<SurfaceBuffer> & buffer)93 GSError ReadSurfaceBufferImpl(MessageParcel &parcel,
94 uint32_t &sequence, sptr<SurfaceBuffer>& buffer)
95 {
96 GSError ret = GSERROR_OK;
97 sequence = parcel.ReadUint32();
98 if (parcel.ReadBool()) {
99 buffer = new SurfaceBufferImpl(sequence);
100 ret = buffer->ReadFromMessageParcel(parcel);
101 }
102 return ret;
103 }
104
WriteSurfaceBufferImpl(MessageParcel & parcel,uint32_t sequence,const sptr<SurfaceBuffer> & buffer)105 void WriteSurfaceBufferImpl(MessageParcel &parcel,
106 uint32_t sequence, const sptr<SurfaceBuffer> &buffer)
107 {
108 parcel.WriteUint32(sequence);
109 parcel.WriteBool(buffer != nullptr);
110 if (buffer == nullptr) {
111 return;
112 }
113 buffer->WriteToMessageParcel(parcel);
114 }
115
ReadVerifyAllocInfo(MessageParcel & parcel,std::vector<BufferVerifyAllocInfo> & infos)116 void ReadVerifyAllocInfo(MessageParcel &parcel, std::vector<BufferVerifyAllocInfo> &infos)
117 {
118 uint32_t size = parcel.ReadUint32();
119 infos.clear();
120 BufferVerifyAllocInfo info;
121 for (uint32_t index = 0; index < size; index++) {
122 info.width = parcel.ReadUint32();
123 info.height = parcel.ReadUint32();
124 info.usage = parcel.ReadUint64();
125 info.format = static_cast<GraphicPixelFormat>(parcel.ReadInt32());
126 infos.push_back(info);
127 }
128 }
129
WriteVerifyAllocInfo(MessageParcel & parcel,const std::vector<BufferVerifyAllocInfo> & infos)130 void WriteVerifyAllocInfo(MessageParcel &parcel, const std::vector<BufferVerifyAllocInfo> &infos)
131 {
132 parcel.WriteUint32(infos.size());
133 for (const auto &info : infos) {
134 parcel.WriteUint32(info.width);
135 parcel.WriteUint32(info.height);
136 parcel.WriteUint64(info.usage);
137 parcel.WriteInt32(info.format);
138 }
139 }
140
ReadHDRMetaData(MessageParcel & parcel,std::vector<GraphicHDRMetaData> & metaData)141 void ReadHDRMetaData(MessageParcel &parcel, std::vector<GraphicHDRMetaData> &metaData)
142 {
143 uint32_t size = parcel.ReadUint32();
144 metaData.clear();
145 GraphicHDRMetaData data;
146 for (uint32_t index = 0; index < size; index++) {
147 data.key = static_cast<GraphicHDRMetadataKey>(parcel.ReadUint32());
148 data.value = parcel.ReadFloat();
149 metaData.push_back(data);
150 }
151 }
152
WriteHDRMetaData(MessageParcel & parcel,const std::vector<GraphicHDRMetaData> & metaData)153 void WriteHDRMetaData(MessageParcel &parcel, const std::vector<GraphicHDRMetaData> &metaData)
154 {
155 parcel.WriteUint32(metaData.size());
156 for (const auto &data : metaData) {
157 parcel.WriteUint32(static_cast<uint32_t>(data.key));
158 parcel.WriteFloat(data.value);
159 }
160 }
161
ReadHDRMetaDataSet(MessageParcel & parcel,std::vector<uint8_t> & metaData)162 void ReadHDRMetaDataSet(MessageParcel &parcel, std::vector<uint8_t> &metaData)
163 {
164 uint32_t size = parcel.ReadUint32();
165 metaData.clear();
166 for (uint32_t index = 0; index < size; index++) {
167 uint8_t data = parcel.ReadUint8();
168 metaData.push_back(data);
169 }
170 }
171
WriteHDRMetaDataSet(MessageParcel & parcel,const std::vector<uint8_t> & metaData)172 void WriteHDRMetaDataSet(MessageParcel &parcel, const std::vector<uint8_t> &metaData)
173 {
174 parcel.WriteUint32(metaData.size());
175 for (const auto &data : metaData) {
176 parcel.WriteUint8(data);
177 }
178 }
179
ReadExtDataHandle(MessageParcel & parcel,sptr<SurfaceTunnelHandle> & handle)180 void ReadExtDataHandle(MessageParcel &parcel, sptr<SurfaceTunnelHandle> &handle)
181 {
182 if (handle == nullptr) {
183 BLOGE("ReadExtDataHandle failed, handle is null");
184 return;
185 }
186 uint32_t reserveInts = parcel.ReadUint32();
187 GraphicExtDataHandle *tunnelHandle = AllocExtDataHandle(reserveInts);
188 if (tunnelHandle == nullptr) {
189 BLOGE("AllocExtDataHandle failed");
190 return;
191 }
192 ReadFileDescriptor(parcel, tunnelHandle->fd);
193 for (uint32_t index = 0; index < reserveInts; index++) {
194 tunnelHandle->reserve[index] = parcel.ReadInt32();
195 }
196 if (handle->SetHandle(tunnelHandle) != GSERROR_OK) {
197 BLOGE("SetHandle failed");
198 return;
199 }
200 FreeExtDataHandle(tunnelHandle);
201 }
202
WriteExtDataHandle(MessageParcel & parcel,const GraphicExtDataHandle * handle)203 void WriteExtDataHandle(MessageParcel &parcel, const GraphicExtDataHandle *handle)
204 {
205 if (handle == nullptr) {
206 BLOGE("WriteExtDataHandle failed, handle is null");
207 return;
208 }
209 parcel.WriteUint32(handle->reserveInts);
210 WriteFileDescriptor(parcel, handle->fd);
211 for (uint32_t index = 0; index < handle->reserveInts; index++) {
212 parcel.WriteInt32(handle->reserve[index]);
213 }
214 }
215 } // namespace OHOS
216