• 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 "utils_data_stub.h"
17 
18 namespace OHOS::Camera {
WriteMetadataDataToVec(const camera_metadata_item_t & entry,std::vector<uint8_t> & cameraAbility)19 bool UtilsDataStub::WriteMetadataDataToVec(const camera_metadata_item_t &entry, std::vector<uint8_t>& cameraAbility)
20 {
21     if (entry.data_type == META_TYPE_BYTE) {
22         for (size_t i = 0; i < entry.count; i++) {
23             WriteData<int8_t>(*(entry.data.u8 + i), cameraAbility);
24         }
25     } else if (entry.data_type == META_TYPE_INT32) {
26         for (size_t i = 0; i < entry.count; i++) {
27             WriteData<int32_t>(*(entry.data.i32 + i), cameraAbility);
28         }
29     } else if (entry.data_type == META_TYPE_FLOAT) {
30         for (size_t i = 0; i < entry.count; i++) {
31             WriteData<float>(*(entry.data.f + i), cameraAbility);
32         }
33     } else if (entry.data_type == META_TYPE_INT64) {
34         for (size_t i = 0; i < entry.count; i++) {
35             WriteData<int64_t>(*(entry.data.i64 + i), cameraAbility);
36         }
37     } else if (entry.data_type == META_TYPE_DOUBLE) {
38         for (size_t i = 0; i < entry.count; i++) {
39             WriteData<double>(*(entry.data.d + i), cameraAbility);
40         }
41     } else if (entry.data_type == META_TYPE_RATIONAL) {
42         for (size_t i = 0; i < entry.count; i++) {
43             WriteData<int32_t>((*(entry.data.r + i)).numerator, cameraAbility);
44             WriteData<int32_t>((*(entry.data.r + i)).denominator, cameraAbility);
45         }
46     }
47 
48     return true;
49 }
50 
ConvertMetadataToVec(const std::shared_ptr<CameraMetadata> & metadata,std::vector<uint8_t> & cameraAbility)51 bool UtilsDataStub::ConvertMetadataToVec(const std::shared_ptr<CameraMetadata> &metadata,
52     std::vector<uint8_t>& cameraAbility)
53 {
54     if (metadata == nullptr) {
55         return false;
56     }
57 
58     bool bRet = true;
59     uint32_t tagCount = 0;
60     common_metadata_header_t *meta = metadata->get();
61     if (meta != nullptr) {
62         tagCount = GetCameraMetadataItemCount(meta);
63         WriteData<uint32_t>(tagCount, cameraAbility);
64         WriteData<uint32_t>(GetCameraMetadataItemCapacity(meta), cameraAbility);
65         WriteData<uint32_t>(GetCameraMetadataDataSize(meta), cameraAbility);
66         for (uint32_t i = 0; i < tagCount; i++) {
67             camera_metadata_item_t item;
68             int ret = GetCameraMetadataItem(meta, i, &item);
69             if (ret != CAM_META_SUCCESS) {
70                 return false;
71             }
72 
73             WriteData<uint32_t>(item.index, cameraAbility);
74             WriteData<uint32_t>(item.item, cameraAbility);
75             WriteData<uint32_t>(item.data_type, cameraAbility);
76             WriteData<uint32_t>(item.count, cameraAbility);
77 
78             bRet = WriteMetadataDataToVec(item, cameraAbility);
79         }
80     } else {
81         cameraAbility.push_back(tagCount);
82     }
83 
84     return bRet;
85 }
86 
EncodeCameraMetadata(const std::shared_ptr<CameraMetadata> & metadata,MessageParcel & data)87 bool UtilsDataStub::EncodeCameraMetadata(const std::shared_ptr<CameraMetadata> &metadata,
88     MessageParcel &data)
89 {
90     if (metadata == nullptr) {
91         return false;
92     }
93 
94     bool bRet = true;
95     uint32_t tagCount = 0;
96     common_metadata_header_t *meta = metadata->get();
97     if (meta != nullptr) {
98         tagCount = Camera::GetCameraMetadataItemCount(meta);
99         bRet = (bRet && data.WriteInt32(static_cast<int32_t>(tagCount)));
100         camera_metadata_item_entry_t *item = Camera::GetMetadataItems(meta);
101         for (uint32_t i = 0; i < tagCount; i++, item++) {
102             camera_metadata_item_t entry;
103             int ret = FindCameraMetadataItem(meta, item->item, &entry);
104             if (ret == -ENOENT) {
105                 return false;
106             }
107 
108             bRet = (bRet && data.WriteUint32(static_cast<uint32_t>(entry.index)));
109             bRet = (bRet && data.WriteUint32(entry.item));
110             bRet = (bRet && data.WriteUint8(static_cast<uint8_t>(entry.data_type)));
111             bRet = (bRet && data.WriteUint32(static_cast<uint32_t>(entry.count)));
112             bRet = (bRet && UtilsDataStub::WriteMetadata(entry, data));
113         }
114     } else {
115         bRet = data.WriteInt32(tagCount);
116     }
117     return bRet;
118 }
119 
ReadMetadataDataFromVec(int32_t & index,camera_metadata_item_t & entry,const std::vector<uint8_t> & cameraAbility)120 bool UtilsDataStub::ReadMetadataDataFromVec(int32_t &index, camera_metadata_item_t &entry,
121     const std::vector<uint8_t>& cameraAbility)
122 {
123     if (entry.data_type == META_TYPE_BYTE) {
124         entry.data.u8 = new(std::nothrow) uint8_t[entry.count];
125         if (entry.data.u8 != nullptr) {
126             for (size_t i = 0; i < entry.count; i++) {
127                 ReadData<uint8_t>(entry.data.u8[i], index, cameraAbility);
128             }
129         }
130     } else if (entry.data_type == META_TYPE_INT32) {
131         entry.data.i32 = new(std::nothrow) int32_t[entry.count];
132         if (entry.data.i32 != nullptr) {
133             for (size_t i = 0; i < entry.count; i++) {
134                 ReadData<int32_t>(entry.data.i32[i], index, cameraAbility);
135             }
136         }
137     } else if (entry.data_type == META_TYPE_FLOAT) {
138         entry.data.f = new(std::nothrow) float[entry.count];
139         if (entry.data.f != nullptr) {
140             for (size_t i = 0; i < entry.count; i++) {
141                 ReadData<float>(entry.data.f[i], index, cameraAbility);
142             }
143         }
144     } else if (entry.data_type == META_TYPE_INT64) {
145         entry.data.i64 = new(std::nothrow) int64_t[entry.count];
146         if (entry.data.i64 != nullptr) {
147             for (size_t i = 0; i < entry.count; i++) {
148                 ReadData<int64_t>(entry.data.i64[i], index, cameraAbility);
149             }
150         }
151     } else if (entry.data_type == META_TYPE_DOUBLE) {
152         entry.data.d = new(std::nothrow) double[entry.count];
153         if (entry.data.d != nullptr) {
154             for (size_t i = 0; i < entry.count; i++) {
155                 ReadData<double>(entry.data.d[i], index, cameraAbility);
156             }
157         }
158     } else if (entry.data_type == META_TYPE_RATIONAL) {
159         entry.data.r = new(std::nothrow) camera_rational_t[entry.count];
160         if (entry.data.r != nullptr) {
161             for (size_t i = 0; i < entry.count; i++) {
162                 ReadData<int32_t>(entry.data.r[i].numerator, index, cameraAbility);
163                 ReadData<int32_t>(entry.data.r[i].denominator, index, cameraAbility);
164             }
165         }
166     }
167 
168     return true;
169 }
170 
ConvertVecToMetadata(const std::vector<uint8_t> & cameraAbility,std::shared_ptr<CameraMetadata> & metadata)171 void UtilsDataStub::ConvertVecToMetadata(const std::vector<uint8_t>& cameraAbility,
172     std::shared_ptr<CameraMetadata> &metadata)
173 {
174     int32_t index = 0;
175     uint32_t tagCount = 0;
176     uint32_t itemCapacity = 0;
177     uint32_t dataCapacity = 0;
178     constexpr uint32_t MAX_SUPPORTED_TAGS = 1000;
179     constexpr uint32_t MAX_SUPPORTED_ITEMS = 1000;
180     constexpr uint32_t MAX_ITEM_CAPACITY = (1000 * 10);
181     constexpr uint32_t MAX_DATA_CAPACITY = (1000 * 10 * 10);
182 
183     ReadData<uint32_t>(tagCount, index, cameraAbility);
184     if (tagCount > MAX_SUPPORTED_TAGS) {
185         tagCount = MAX_SUPPORTED_TAGS;
186         METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata tagCount is more than supported value");
187     }
188     ReadData<uint32_t>(itemCapacity, index, cameraAbility);
189     if (itemCapacity > MAX_ITEM_CAPACITY) {
190         itemCapacity = MAX_ITEM_CAPACITY;
191         METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata itemCapacity is more than supported value");
192     }
193     ReadData<uint32_t>(dataCapacity, index, cameraAbility);
194     if (dataCapacity > MAX_DATA_CAPACITY) {
195         dataCapacity = MAX_DATA_CAPACITY;
196         METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata dataCapacity is more than supported value");
197     }
198 
199     std::vector<camera_metadata_item_t> items;
200     for (int32_t i = 0; i < tagCount; i++) {
201         camera_metadata_item_t item;
202         ReadData<uint32_t>(item.index, index, cameraAbility);
203         ReadData<uint32_t>(item.item, index, cameraAbility);
204         ReadData<uint32_t>(item.data_type, index, cameraAbility);
205         ReadData<uint32_t>(item.count, index, cameraAbility);
206         if (item.count > MAX_SUPPORTED_ITEMS) {
207             item.count = MAX_SUPPORTED_ITEMS;
208             METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata item.count is more than supported value");
209         }
210         ReadMetadataDataFromVec(index, item, cameraAbility);
211         items.push_back(item);
212     }
213 
214     metadata = std::make_shared<CameraMetadata>(itemCapacity, dataCapacity);
215     common_metadata_header_t *meta = metadata->get();
216     for (auto &item_ : items) {
217         void *buffer = nullptr;
218         MetadataUtils::ItemDataToBuffer(item_, &buffer);
219         (void)AddCameraMetadataItem(meta, item_.item, buffer, item_.count);
220         MetadataUtils::FreeMetadataBuffer(item_);
221     }
222 }
223 
DecodeCameraMetadata(MessageParcel & data,std::shared_ptr<CameraMetadata> & metadata)224 void UtilsDataStub::DecodeCameraMetadata(MessageParcel &data, std::shared_ptr<CameraMetadata> &metadata)
225 {
226     int32_t tagCount = data.ReadInt32();
227     if (tagCount <= 0) {
228         return;
229     }
230 
231     int32_t metadataSize = 0;
232     std::vector<camera_metadata_item_t> entrys;
233     for (int32_t i = 0; i < tagCount; i++) {
234         camera_metadata_item_t entry;
235         entry.index = static_cast<size_t>(data.ReadUint32());
236         entry.item = static_cast<uint32_t>(data.ReadUint32());
237         entry.data_type = static_cast<uint8_t>(data.ReadUint8());
238         entry.count = static_cast<size_t>(data.ReadUint32());
239         ReadMetadata(entry, data);
240         metadataSize++;
241 
242         entrys.push_back(entry);
243     }
244 
245     metadata = std::make_shared<CameraMetadata>(tagCount, metadataSize);
246     common_metadata_header_t *meta = metadata->get();
247     for (auto &entry : entrys) {
248         void *buffer = nullptr;
249         UtilsDataStub::EntryDataToBuffer(entry, &buffer);
250         if (buffer != nullptr) {
251             (void)Camera::AddCameraMetadataItem(meta, entry.item, buffer, entry.count);
252         }
253         MetadataUtils::FreeMetadataBuffer(item_);
254     }
255 }
256 
EncodeStreamInfo(const std::shared_ptr<StreamInfo> & pInfo,MessageParcel & parcel)257 bool UtilsDataStub::EncodeStreamInfo(const std::shared_ptr<StreamInfo> &pInfo, MessageParcel &parcel)
258 {
259     bool bRet = true;
260     bRet = (bRet && parcel.WriteInt32(static_cast<int32_t>(pInfo->streamId_)));
261     bRet = (bRet && parcel.WriteInt32(static_cast<int32_t>(pInfo->width_)));
262     bRet = (bRet && parcel.WriteInt32(static_cast<int32_t>(pInfo->height_)));
263     bRet = (bRet && parcel.WriteInt32(static_cast<int32_t>(pInfo->format_)));
264     bRet = (bRet && parcel.WriteInt32(pInfo->intent_));
265     bRet = (bRet && parcel.WriteBool(pInfo->tunneledMode_));
266     bool bufferQueueFlag = (pInfo->bufferQueue_->producer_ != nullptr) ? true : false;
267     bRet = (bRet && parcel.WriteBool(bufferQueueFlag));
268     if (bufferQueueFlag) {
269         bRet = (bRet && parcel.WriteRemoteObject(pInfo->bufferQueue_->producer_->AsObject()));
270     }
271     bRet = (bRet && parcel.WriteInt32(static_cast<int32_t>(pInfo->minFrameDuration_)));
272     bRet = (bRet && parcel.WriteInt32(pInfo->encodeType_));
273     return bRet;
274 }
275 
DecodeStreamInfo(MessageParcel & parcel,std::shared_ptr<StreamInfo> & pInfo)276 void UtilsDataStub::DecodeStreamInfo(MessageParcel &parcel, std::shared_ptr<StreamInfo> &pInfo)
277 {
278     pInfo->streamId_ = static_cast<int>(parcel.ReadInt32());
279     pInfo->width_ = static_cast<int>(parcel.ReadInt32());
280     pInfo->height_ = static_cast<int>(parcel.ReadInt32());
281     pInfo->format_ = static_cast<int>(parcel.ReadInt32());
282     pInfo->intent_ = static_cast<StreamIntent>(parcel.ReadInt32());
283     pInfo->tunneledMode_ = parcel.ReadBool();
284     bool bufferQueueFlag = parcel.ReadBool();
285     if (bufferQueueFlag) {
286         sptr<IRemoteObject> remoteBufferProducer = parcel.ReadRemoteObject();
287         pInfo->bufferQueue_->producer_ = OHOS::iface_cast<OHOS::IBufferProducer>(remoteBufferProducer);
288     }
289     pInfo->minFrameDuration_ = static_cast<int>(parcel.ReadInt32());
290     pInfo->encodeType_ = static_cast<EncodeType>(parcel.ReadInt32());
291 }
292 
GetDataSize(uint8_t type)293 int32_t UtilsDataStub::GetDataSize(uint8_t type)
294 {
295     int32_t size = 0;
296     if (type == META_TYPE_BYTE) {
297         size = sizeof(uint8_t);
298     } else if (type == META_TYPE_INT32) {
299         size = sizeof(int32_t);
300     } else if (type == META_TYPE_FLOAT) {
301         size = sizeof(float);
302     } else if (type == META_TYPE_INT64) {
303         size = sizeof(int64_t);
304     } else if (type == META_TYPE_DOUBLE) {
305         size = sizeof(double);
306     } else if (type == META_TYPE_RATIONAL) {
307         size = sizeof(camera_rational_t);
308     } else {
309         size = 0;
310     }
311     return size;
312 }
313 
WriteMetadata(const camera_metadata_item_t & entry,MessageParcel & data)314 bool UtilsDataStub::WriteMetadata(const camera_metadata_item_t &entry, MessageParcel &data)
315 {
316     if (entry.data_type == META_TYPE_BYTE) {
317         std::vector<uint8_t> buffers;
318         for (size_t i = 0; i < entry.count; i++) {
319             buffers.push_back(*(entry.data.u8 + i));
320         }
321         data.WriteUInt8Vector(buffers);
322     } else if (entry.data_type == META_TYPE_INT32) {
323         std::vector<int32_t> buffers;
324         for (size_t i = 0; i < entry.count; i++) {
325             buffers.push_back(*(entry.data.i32 + i));
326         }
327         data.WriteInt32Vector(buffers);
328     } else if (entry.data_type == META_TYPE_FLOAT) {
329         std::vector<float> buffers;
330         for (size_t i = 0; i < entry.count; i++) {
331             buffers.push_back(*(entry.data.f + i));
332         }
333         data.WriteFloatVector(buffers);
334     } else if (entry.data_type == META_TYPE_INT64) {
335         std::vector<int64_t> buffers;
336         for (size_t i = 0; i < entry.count; i++) {
337             buffers.push_back(*(entry.data.i64 + i));
338         }
339         data.WriteInt64Vector(buffers);
340     } else if (entry.data_type == META_TYPE_DOUBLE) {
341         std::vector<double> buffers;
342         for (size_t i = 0; i < entry.count; i++) {
343             buffers.push_back(*(entry.data.d + i));
344         }
345         data.WriteDoubleVector(buffers);
346     } else if (entry.data_type == META_TYPE_RATIONAL) {
347         std::vector<int32_t> buffers;
348         for (size_t i = 0; i < entry.count; i++) {
349             buffers.push_back((*(entry.data.r + i)).numerator);
350             buffers.push_back((*(entry.data.r + i)).denominator);
351         }
352         data.WriteInt32Vector(buffers);
353     }
354 
355     return true;
356 }
357 
ReadMetadata(camera_metadata_item_t & entry,MessageParcel & data)358 bool UtilsDataStub::ReadMetadata(camera_metadata_item_t &entry, MessageParcel &data)
359 {
360     if (entry.data_type == META_TYPE_BYTE) {
361         std::vector<uint8_t> buffers;
362         data.ReadUInt8Vector(&buffers);
363         entry.data.u8 = new(std::nothrow) uint8_t[entry.count];
364         if (entry.data.u8 != nullptr) {
365             for (size_t i = 0; i < entry.count; i++) {
366                 entry.data.u8[i] = buffers.at(i);
367             }
368         }
369     } else if (entry.data_type == META_TYPE_INT32) {
370         std::vector<int32_t> buffers;
371         data.ReadInt32Vector(&buffers);
372         entry.data.i32 = new(std::nothrow) int32_t[entry.count];
373         if (entry.data.i32 != nullptr) {
374             for (size_t i = 0; i < entry.count; i++) {
375                 entry.data.i32[i] = buffers.at(i);
376             }
377         }
378     } else if (entry.data_type == META_TYPE_FLOAT) {
379         std::vector<float> buffers;
380         data.ReadFloatVector(&buffers);
381         entry.data.f = new(std::nothrow) float[entry.count];
382         if (entry.data.f != nullptr) {
383             for (size_t i = 0; i < entry.count; i++) {
384                 entry.data.f[i] = buffers.at(i);
385             }
386         }
387     } else if (entry.data_type == META_TYPE_INT64) {
388         std::vector<int64_t> buffers;
389         data.ReadInt64Vector(&buffers);
390         entry.data.i64 = new(std::nothrow) int64_t[entry.count];
391         if (entry.data.i64 != nullptr) {
392             for (size_t i = 0; i < entry.count; i++) {
393                 entry.data.i64[i] = buffers.at(i);
394             }
395         }
396     } else if (entry.data_type == META_TYPE_DOUBLE) {
397         std::vector<double> buffers;
398         data.ReadDoubleVector(&buffers);
399         entry.data.d = new(std::nothrow) double[entry.count];
400         if (entry.data.d != nullptr) {
401             for (size_t i = 0; i < entry.count; i++) {
402                 entry.data.d[i] = buffers.at(i);
403             }
404         }
405     } else if (entry.data_type == META_TYPE_RATIONAL) {
406         std::vector<int32_t> buffers;
407         data.ReadInt32Vector(&buffers);
408         entry.data.r = new(std::nothrow) camera_rational_t[entry.count];
409         if (entry.data.r != nullptr) {
410             for (size_t i = 0, j = 0;
411                 i < entry.count && j < static_cast<size_t>(buffers.size());
412                 i++, j += 2) { // 2:Take two elements from the buffer vector container
413                 entry.data.r[i].numerator = buffers.at(j);
414                 entry.data.r[i].denominator = buffers.at(j + 1);
415             }
416         }
417     }
418     return true;
419 }
420 
EntryDataToBuffer(const camera_metadata_item_t & entry,void ** buffer)421 void UtilsDataStub::EntryDataToBuffer(const camera_metadata_item_t &entry, void **buffer)
422 {
423     if (entry.data_type == META_TYPE_BYTE) {
424         *buffer = static_cast<void*>(entry.data.u8);
425     } else if (entry.data_type == META_TYPE_INT32) {
426         *buffer = static_cast<void*>(entry.data.i32);
427     } else if (entry.data_type == META_TYPE_FLOAT) {
428         *buffer = static_cast<void*>(entry.data.f);
429     } else if (entry.data_type == META_TYPE_INT64) {
430         *buffer = static_cast<void*>(entry.data.i64);
431     } else if (entry.data_type == META_TYPE_DOUBLE) {
432         *buffer = static_cast<void*>(entry.data.d);
433     } else if (entry.data_type == META_TYPE_RATIONAL) {
434         *buffer = static_cast<void*>(entry.data.r);
435     }
436 }
437 }
438