• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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