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 void ReadSurfaceBufferImpl(MessageParcel &parcel,
94 uint32_t &sequence, sptr<SurfaceBuffer>& buffer)
95 {
96 sequence = parcel.ReadUint32();
97 if (parcel.ReadBool()) {
98 buffer = new SurfaceBufferImpl(sequence);
99 buffer->ReadFromMessageParcel(parcel);
100 }
101 }
102
WriteSurfaceBufferImpl(MessageParcel & parcel,uint32_t sequence,const sptr<SurfaceBuffer> & buffer)103 void WriteSurfaceBufferImpl(MessageParcel &parcel,
104 uint32_t sequence, const sptr<SurfaceBuffer> &buffer)
105 {
106 parcel.WriteUint32(sequence);
107 parcel.WriteBool(buffer != nullptr);
108 if (buffer == nullptr) {
109 return;
110 }
111 buffer->WriteToMessageParcel(parcel);
112 }
113
ReadVerifyAllocInfo(MessageParcel & parcel,std::vector<BufferVerifyAllocInfo> & infos)114 void ReadVerifyAllocInfo(MessageParcel &parcel, std::vector<BufferVerifyAllocInfo> &infos)
115 {
116 uint32_t size = parcel.ReadUint32();
117 infos.clear();
118 BufferVerifyAllocInfo info;
119 for (uint32_t index = 0; index < size; index++) {
120 info.width = parcel.ReadUint32();
121 info.height = parcel.ReadUint32();
122 info.usage = parcel.ReadUint64();
123 info.format = static_cast<GraphicPixelFormat>(parcel.ReadInt32());
124 infos.push_back(info);
125 }
126 }
127
WriteVerifyAllocInfo(MessageParcel & parcel,const std::vector<BufferVerifyAllocInfo> & infos)128 void WriteVerifyAllocInfo(MessageParcel &parcel, const std::vector<BufferVerifyAllocInfo> &infos)
129 {
130 parcel.WriteUint32(infos.size());
131 for (const auto &info : infos) {
132 parcel.WriteUint32(info.width);
133 parcel.WriteUint32(info.height);
134 parcel.WriteUint64(info.usage);
135 parcel.WriteInt32(info.format);
136 }
137 }
138
ReadHDRMetaData(MessageParcel & parcel,std::vector<GraphicHDRMetaData> & metaData)139 void ReadHDRMetaData(MessageParcel &parcel, std::vector<GraphicHDRMetaData> &metaData)
140 {
141 uint32_t size = parcel.ReadUint32();
142 metaData.clear();
143 GraphicHDRMetaData data;
144 for (uint32_t index = 0; index < size; index++) {
145 data.key = static_cast<GraphicHDRMetadataKey>(parcel.ReadUint32());
146 data.value = parcel.ReadFloat();
147 metaData.push_back(data);
148 }
149 }
150
WriteHDRMetaData(MessageParcel & parcel,const std::vector<GraphicHDRMetaData> & metaData)151 void WriteHDRMetaData(MessageParcel &parcel, const std::vector<GraphicHDRMetaData> &metaData)
152 {
153 parcel.WriteUint32(metaData.size());
154 for (const auto &data : metaData) {
155 parcel.WriteUint32(static_cast<uint32_t>(data.key));
156 parcel.WriteFloat(data.value);
157 }
158 }
159
ReadHDRMetaDataSet(MessageParcel & parcel,std::vector<uint8_t> & metaData)160 void ReadHDRMetaDataSet(MessageParcel &parcel, std::vector<uint8_t> &metaData)
161 {
162 uint32_t size = parcel.ReadUint32();
163 metaData.clear();
164 for (uint32_t index = 0; index < size; index++) {
165 uint8_t data = parcel.ReadUint8();
166 metaData.push_back(data);
167 }
168 }
169
WriteHDRMetaDataSet(MessageParcel & parcel,const std::vector<uint8_t> & metaData)170 void WriteHDRMetaDataSet(MessageParcel &parcel, const std::vector<uint8_t> &metaData)
171 {
172 parcel.WriteUint32(metaData.size());
173 for (const auto &data : metaData) {
174 parcel.WriteUint8(data);
175 }
176 }
177
ReadExtDataHandle(MessageParcel & parcel,sptr<SurfaceTunnelHandle> & handle)178 void ReadExtDataHandle(MessageParcel &parcel, sptr<SurfaceTunnelHandle> &handle)
179 {
180 if (handle == nullptr) {
181 BLOGE("ReadExtDataHandle failed, handle is null");
182 return;
183 }
184 uint32_t reserveInts = parcel.ReadUint32();
185 GraphicExtDataHandle *tunnelHandle = AllocExtDataHandle(reserveInts);
186 if (tunnelHandle == nullptr) {
187 BLOGE("AllocExtDataHandle failed");
188 return;
189 }
190 ReadFileDescriptor(parcel, tunnelHandle->fd);
191 for (uint32_t index = 0; index < reserveInts; index++) {
192 tunnelHandle->reserve[index] = parcel.ReadInt32();
193 }
194 if (handle->SetHandle(tunnelHandle) != GSERROR_OK) {
195 BLOGE("SetHandle failed");
196 return;
197 }
198 FreeExtDataHandle(tunnelHandle);
199 }
200
WriteExtDataHandle(MessageParcel & parcel,const GraphicExtDataHandle * handle)201 void WriteExtDataHandle(MessageParcel &parcel, const GraphicExtDataHandle *handle)
202 {
203 if (handle == nullptr) {
204 BLOGE("WriteExtDataHandle failed, handle is null");
205 return;
206 }
207 parcel.WriteUint32(handle->reserveInts);
208 WriteFileDescriptor(parcel, handle->fd);
209 for (uint32_t index = 0; index < handle->reserveInts; index++) {
210 parcel.WriteInt32(handle->reserve[index]);
211 }
212 }
213 } // namespace OHOS
214