• 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 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