1 /*
2 * Copyright (c) 2022 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 "metadata_controller.h"
17 #include "camera_dump.h"
18
19 namespace OHOS {
20 namespace Camera {
21 const std::vector<int32_t> DATA_BASE = {
22 OHOS_CAMERA_STREAM_ID,
23 OHOS_SENSOR_COLOR_CORRECTION_GAINS,
24 OHOS_SENSOR_EXPOSURE_TIME,
25 OHOS_CONTROL_EXPOSURE_MODE,
26 OHOS_CONTROL_AE_EXPOSURE_COMPENSATION,
27 OHOS_CONTROL_AE_LOCK,
28 OHOS_CONTROL_FOCUS_MODE,
29 OHOS_CONTROL_METER_MODE,
30 OHOS_CONTROL_FLASH_MODE,
31 OHOS_CONTROL_FPS_RANGES,
32 OHOS_CONTROL_AWB_MODE,
33 OHOS_CONTROL_AWB_LOCK,
34 OHOS_CONTROL_AF_REGIONS,
35 OHOS_CONTROL_METER_POINT,
36 OHOS_CONTROL_VIDEO_STABILIZATION_MODE,
37 OHOS_CONTROL_FOCUS_STATE,
38 OHOS_CONTROL_EXPOSURE_STATE,
39 };
40
MetadataController()41 MetadataController::MetadataController() {}
42
~MetadataController()43 MetadataController::~MetadataController()
44 {
45 {
46 std::unique_lock<std::mutex> lock(queueLock_);
47 if (isRunning_.load()) {
48 isRunning_.store(false);
49 }
50 cv_.notify_all();
51 }
52
53 StopThread();
54 }
55
GetInstance()56 MetadataController &MetadataController::GetInstance()
57 {
58 static MetadataController controller;
59 return controller;
60 }
61
SetUpdateSettingCallback(const MetaDataCb & cb)62 void MetadataController::SetUpdateSettingCallback(const MetaDataCb &cb)
63 {
64 std::unique_lock<std::mutex> lock(dataConfigLock_);
65 if (!isInit_) {
66 CAMERA_LOGE("already set update setting callback.");
67 return;
68 }
69 updateSettingFunc_ = cb;
70 }
71
UnSetUpdateSettingCallback()72 void MetadataController::UnSetUpdateSettingCallback()
73 {
74 std::unique_lock<std::mutex> lock(dataConfigLock_);
75 if (!isInit_) {
76 CAMERA_LOGE("already set update setting callback.");
77 return;
78 }
79 updateSettingFunc_ = nullptr;
80 }
81
AddNodeCallback(const MetaDataCb & cb)82 void MetadataController::AddNodeCallback(const MetaDataCb &cb)
83 {
84 std::unique_lock<std::mutex> lock(queueLock_);
85 if (cb != nullptr) {
86 nodeFunc_.push_back(cb);
87 }
88 }
89
ClearNodeCallback()90 void MetadataController::ClearNodeCallback()
91 {
92 if (nodeFunc_.empty()) {
93 CAMERA_LOGE("nodeFunc_ empty");
94 return;
95 }
96 std::unique_lock<std::mutex> lock(queueLock_);
97 nodeFunc_.clear();
98 }
99
SetPeerFrameFlag(bool flag)100 void MetadataController::SetPeerFrameFlag(bool flag)
101 {
102 std::unique_lock<std::mutex> lock(dataConfigLock_);
103 peerFrame_ = flag;
104 }
105
AddEnabledAbility(const std::vector<int32_t> & abilityMetaDataTag)106 void MetadataController::AddEnabledAbility(const std::vector<int32_t> &abilityMetaDataTag)
107 {
108 std::unique_lock<std::mutex> lock(dataConfigLock_);
109 std::vector<int32_t>().swap(abilityMetaData_);
110 for (auto it = abilityMetaDataTag.cbegin(); it != abilityMetaDataTag.cend(); it++) {
111 switch (*it) {
112 case OHOS_CAMERA_STREAM_ID: // fallthrough
113 case OHOS_SENSOR_COLOR_CORRECTION_GAINS: // fallthrough
114 case OHOS_SENSOR_EXPOSURE_TIME: // fallthrough
115 case OHOS_CONTROL_EXPOSURE_MODE: // fallthrough
116 case OHOS_CONTROL_AE_EXPOSURE_COMPENSATION: // fallthrough
117 case OHOS_CONTROL_AE_LOCK: // fallthrough
118 case OHOS_CONTROL_FOCUS_MODE: // fallthrough
119 case OHOS_CONTROL_METER_MODE: // fallthrough
120 case OHOS_CONTROL_FLASH_MODE: // fallthrough
121 case OHOS_CONTROL_FPS_RANGES: // fallthrough
122 case OHOS_CONTROL_AWB_MODE: // fallthrough
123 case OHOS_CONTROL_AWB_LOCK: // fallthrough
124 case OHOS_CONTROL_AF_REGIONS: // fallthrough
125 case OHOS_CONTROL_METER_POINT: // fallthrough
126 case OHOS_CONTROL_VIDEO_STABILIZATION_MODE: // fallthrough
127 case OHOS_CONTROL_FOCUS_STATE: // fallthrough
128 case OHOS_CONTROL_EXPOSURE_STATE: {
129 abilityMetaData_.push_back((*it));
130 break;
131 }
132 default:
133 break;
134 }
135 }
136 }
137
GetEnabledAbility(std::vector<int32_t> & results)138 int32_t MetadataController::GetEnabledAbility(std::vector<int32_t> &results)
139 {
140 std::unique_lock<std::mutex> lock(dataConfigLock_);
141 results = abilityMetaData_;
142 return RC_OK;
143 }
144
DelEnabledAbility(const std::vector<int32_t> & results)145 int32_t MetadataController::DelEnabledAbility(const std::vector<int32_t> &results)
146 {
147 std::unique_lock<std::mutex> lock(dataConfigLock_);
148 for (auto &metaType : results) {
149 auto itr = std::find(abilityMetaData_.begin(), abilityMetaData_.end(), metaType);
150 if (itr != abilityMetaData_.end()) {
151 abilityMetaData_.erase(itr);
152 } else {
153 CAMERA_LOGW("enabled result is not found. [metaType = %{public}d]", metaType);
154 return RC_ERROR;
155 }
156 }
157 return RC_OK;
158 }
159
UpdateSettingsConfig(const std::shared_ptr<CameraMetadata> & meta)160 bool MetadataController::UpdateSettingsConfig(const std::shared_ptr<CameraMetadata> &meta)
161 {
162 bool result = false;
163 int32_t streamId = GetStreamId(meta);
164 if (streamId < 0) {
165 CAMERA_LOGE("streamId is invalid %{public}d", streamId);
166 return false;
167 }
168 result = FilterUpdateKeys(streamId, meta);
169 if (!result) {
170 CAMERA_LOGE("filter update keys fail and streamId = %{public}d", streamId);
171 return false;
172 }
173 return DealMetadata(streamId, meta);
174 }
175
GetSettingsConfig(std::shared_ptr<CameraMetadata> & meta)176 void MetadataController::GetSettingsConfig(std::shared_ptr<CameraMetadata> &meta)
177 {
178 std::unique_lock<std::mutex> lock(dataConfigLock_);
179 metaDataConfig_->GetMetadata(DEVICE_STREAM_ID, meta);
180 }
181
GetStreamId(const std::shared_ptr<CameraMetadata> & meta)182 int32_t MetadataController::GetStreamId(const std::shared_ptr<CameraMetadata> &meta)
183 {
184 common_metadata_header_t *data = meta->get();
185 if (data == nullptr) {
186 CAMERA_LOGE("data is nullptr");
187 return RC_ERROR;
188 }
189 camera_metadata_item_t entry;
190 int32_t streamId = -1;
191 int rc = FindCameraMetadataItem(data, OHOS_CAMERA_STREAM_ID, &entry);
192 if (rc == 0) {
193 streamId = *entry.data.i32;
194 }
195 return streamId;
196 }
197
FilterUpdateKeys(int32_t streamId,const std::shared_ptr<CameraMetadata> & meta)198 bool MetadataController::FilterUpdateKeys(int32_t streamId, const std::shared_ptr<CameraMetadata> &meta)
199 {
200 common_metadata_header_t *data = meta->get();
201 if (data == nullptr) {
202 CAMERA_LOGE("data is nullptr");
203 return false;
204 }
205
206 std::vector<int32_t> metaKeys;
207 for (auto &metaKey : DATA_BASE) {
208 camera_metadata_item_t entry;
209 int rc = FindCameraMetadataItem(data, metaKey, &entry);
210 if (rc != 0) {
211 continue;
212 }
213 metaKeys.push_back(metaKey);
214 }
215
216 if (metaKeys.size() == 0) {
217 return false;
218 }
219 std::unique_lock<std::mutex> lock(dataConfigLock_);
220 updateMetaDataKeys_[streamId] = metaKeys;
221 return true;
222 }
223
DealMetadata(int32_t streamId,const std::shared_ptr<CameraMetadata> & meta)224 bool MetadataController::DealMetadata(int32_t streamId, const std::shared_ptr<CameraMetadata> &meta)
225 {
226 bool result = false;
227 if (firstNotifyNodes_.count(streamId) == 0 && streamId != DEVICE_STREAM_ID) {
228 {
229 std::unique_lock<std::mutex> lock(dataConfigLock_);
230 changeDataKeys_[streamId] = updateMetaDataKeys_[streamId];
231 result = metaDataConfig_->UpdateSettingsConfig(streamId, true, updateMetaDataKeys_[streamId], meta);
232 if (!result) {
233 CAMERA_LOGE("set metadata config fail and streamId = %{public}d", streamId);
234 return false;
235 }
236 }
237 firstNotifyNodes_.insert(streamId);
238 {
239 std::unique_lock<std::mutex> lock(queueLock_);
240 queue_.push(meta);
241 cv_.notify_all();
242 }
243 return true;
244 }
245 std::shared_ptr<CameraMetadata> metaTemp = nullptr;
246 {
247 std::unique_lock<std::mutex> lock(dataConfigLock_);
248 if (!metaDataConfig_->GetMetadata(streamId, metaTemp)) {
249 CAMERA_LOGE("get metadata fail and streamId = %{public}d", streamId);
250 return false;
251 }
252 }
253
254 std::shared_ptr<CameraMetadata> changeMetadata = std::make_shared<CameraMetadata>(ENTRY_CAPACITY, DATA_CAPACITY);
255 result = CompareMetadata(streamId, metaTemp, meta, changeMetadata);
256 if (!result) {
257 CAMERA_LOGE("compare metadata fail and streamId = %{public}d", streamId);
258 return false;
259 }
260 std::unique_lock<std::mutex> lock(queueLock_);
261 queue_.push(changeMetadata);
262
263 CameraDumper& dumper = CameraDumper::GetInstance();
264 dumper.DumpMetadata("MetadataController", ENABLE_METADATA, changeMetadata);
265
266 cv_.notify_all();
267 return true;
268 }
269
CompareMetadata(int32_t streamId,const std::shared_ptr<CameraMetadata> & oldMeta,const std::shared_ptr<CameraMetadata> & newMeta,std::shared_ptr<CameraMetadata> & outMetadata)270 bool MetadataController::CompareMetadata(int32_t streamId, const std::shared_ptr<CameraMetadata> &oldMeta,
271 const std::shared_ptr<CameraMetadata> &newMeta, std::shared_ptr<CameraMetadata> &outMetadata)
272 {
273 std::vector<int32_t> updateKeys;
274 std::vector<int32_t> newKeys;
275 common_metadata_header_t *metadataOld = oldMeta->get();
276 common_metadata_header_t *metadataNew = newMeta->get();
277 if (metadataOld == nullptr || metadataNew == nullptr) {
278 CAMERA_LOGE("get metadata failed.");
279 return false;
280 }
281 bool result = false;
282 for (auto &metaType : updateMetaDataKeys_[streamId]) {
283 camera_metadata_item_t baseEntry;
284 int ret = FindCameraMetadataItem(metadataOld, metaType, &baseEntry);
285 if (ret != 0) {
286 CAMERA_LOGE("metadata base not found tag.[metaType = %{public}d]", metaType);
287 newKeys.push_back(metaType);
288 continue;
289 }
290 camera_metadata_item_t newEntry;
291 ret = FindCameraMetadataItem(metadataNew, metaType, &newEntry);
292 if (ret != 0) {
293 CAMERA_LOGE("metadata result not found tag.[metaType = %{public}d]", metaType);
294 continue;
295 }
296 bool isChange = IsChangeTagData(metaType, baseEntry, newEntry);
297 if (isChange) {
298 updateKeys.push_back(OHOS_CAMERA_STREAM_ID);
299 updateKeys.push_back(metaType);
300 result = UpdateNewTagData(updateKeys, newMeta, outMetadata);
301 if (!result) {
302 CAMERA_LOGE("compare update change meta failed.");
303 return false;
304 }
305 }
306 }
307
308 if (updateKeys.size() == 0 && newKeys.size() == 0) {
309 CAMERA_LOGW("ignore meta data");
310 return false;
311 }
312 std::unique_lock<std::mutex> lock(dataConfigLock_);
313 if (newKeys.size() > 0) {
314 newKeys.push_back(OHOS_CAMERA_STREAM_ID);
315 }
316
317 if (updateKeys.size() > 0) {
318 updateKeys.push_back(OHOS_CAMERA_STREAM_ID);
319 }
320 return UpdateChangeMetadata(streamId, updateKeys, newKeys, newMeta, outMetadata);
321 }
322
UpdateChangeMetadata(int32_t streamId,const std::vector<int32_t> & updateKeys,const std::vector<int32_t> & newKeys,const std::shared_ptr<CameraMetadata> & newMeta,std::shared_ptr<CameraMetadata> & outMetadata)323 bool MetadataController::UpdateChangeMetadata(int32_t streamId, const std::vector<int32_t> &updateKeys,
324 const std::vector<int32_t> &newKeys, const std::shared_ptr<CameraMetadata> &newMeta,
325 std::shared_ptr<CameraMetadata> &outMetadata)
326 {
327 bool result = false;
328 if (updateKeys.size() == 0 && newKeys.size() > 1) {
329 changeDataKeys_[streamId] = newKeys;
330 result = metaDataConfig_->UpdateSettingsConfig(streamId, true, newKeys, newMeta);
331 if (!result) {
332 CAMERA_LOGE("set meta config new keys failed.");
333 return false;
334 }
335 result = UpdateNewTagData(newKeys, newMeta, outMetadata);
336 } else {
337 changeDataKeys_[streamId] = updateKeys;
338 if (newKeys.size() > 1) {
339 result = UpdateNewTagData(newKeys, newMeta, outMetadata);
340 if (!result) {
341 CAMERA_LOGE("update keys metadata failed.");
342 return false;
343 }
344 changeDataKeys_[streamId].insert(changeDataKeys_[streamId].end(), newKeys.begin(), newKeys.end());
345 result = metaDataConfig_->UpdateSettingsConfig(streamId, true, newKeys, newMeta);
346 if (!result) {
347 CAMERA_LOGE("set metadta config keys failed.");
348 return false;
349 }
350 }
351 result = metaDataConfig_->UpdateSettingsConfig(streamId, false, updateKeys, newMeta);
352 }
353 if (!result) {
354 CAMERA_LOGE("update change metadata failed.");
355 return false;
356 }
357 return true;
358 }
359
IsChangeTagData(int32_t key,const camera_metadata_item_t & baseEntry,const camera_metadata_item_t & newEntry)360 bool MetadataController::IsChangeTagData(
361 int32_t key, const camera_metadata_item_t &baseEntry, const camera_metadata_item_t &newEntry)
362 {
363 bool result = false;
364 switch (key) {
365 case OHOS_CONTROL_AWB_MODE: // fallthrough
366 case OHOS_CONTROL_AWB_LOCK: // fallthrough
367 case OHOS_CONTROL_FOCUS_MODE: // fallthrough
368 case OHOS_CONTROL_FOCUS_STATE: // fallthrough
369 case OHOS_CONTROL_EXPOSURE_MODE: // fallthrough
370 case OHOS_CONTROL_EXPOSURE_STATE: // fallthrough
371 case OHOS_CONTROL_AE_LOCK: // fallthrough
372 case OHOS_CONTROL_FLASH_MODE: // fallthrough
373 case OHOS_CONTROL_METER_MODE: // fallthrough
374 case OHOS_CONTROL_VIDEO_STABILIZATION_MODE: {
375 result = IsChangeU8Metadata(baseEntry, newEntry);
376 break;
377 }
378 case OHOS_CONTROL_AE_EXPOSURE_COMPENSATION: {
379 result = IsChangeI32Metadata(baseEntry, newEntry);
380 break;
381 }
382 case OHOS_SENSOR_EXPOSURE_TIME: {
383 result = IsChangeI64Metadata(baseEntry, newEntry);
384 break;
385 }
386 case OHOS_SENSOR_COLOR_CORRECTION_GAINS: {
387 result = IsChangeFloatMetadata(baseEntry, newEntry);
388 break;
389 }
390 case OHOS_CONTROL_FPS_RANGES: // fallthrough
391 case OHOS_CONTROL_AF_REGIONS: // fallthrough
392 case OHOS_CONTROL_METER_POINT: {
393 result = IsChangeI32ArrayMetadata(baseEntry, newEntry);
394 break;
395 }
396 default: {
397 CAMERA_LOGW("invalid key %{public}d", key);
398 break;
399 }
400 }
401 return result;
402 }
403
IsChangeU8Metadata(const camera_metadata_item_t & baseEntry,const camera_metadata_item_t & newEntry)404 bool MetadataController::IsChangeU8Metadata(
405 const camera_metadata_item_t &baseEntry, const camera_metadata_item_t &newEntry)
406 {
407 if (*(baseEntry.data.u8) == *(newEntry.data.u8)) {
408 return false;
409 }
410 return true;
411 }
412
IsChangeI32Metadata(const camera_metadata_item_t & baseEntry,const camera_metadata_item_t & newEntry)413 bool MetadataController::IsChangeI32Metadata(
414 const camera_metadata_item_t &baseEntry, const camera_metadata_item_t &newEntry)
415 {
416 if (*(baseEntry.data.i32) == *(newEntry.data.i32)) {
417 return false;
418 }
419 return true;
420 }
421
IsChangeI64Metadata(const camera_metadata_item_t & baseEntry,const camera_metadata_item_t & newEntry)422 bool MetadataController::IsChangeI64Metadata(
423 const camera_metadata_item_t &baseEntry, const camera_metadata_item_t &newEntry)
424 {
425 if (*(baseEntry.data.i64) == *(newEntry.data.i64)) {
426 return false;
427 }
428 return true;
429 }
430
IsChangeFloatMetadata(const camera_metadata_item_t & baseEntry,const camera_metadata_item_t & newEntry)431 bool MetadataController::IsChangeFloatMetadata(
432 const camera_metadata_item_t &baseEntry, const camera_metadata_item_t &newEntry)
433 {
434 std::string baseValue = std::to_string(*(baseEntry.data.f));
435 std::string newValue = std::to_string(*(newEntry.data.f));
436 if (strcmp(baseValue.c_str(), newValue.c_str()) == 0) {
437 return false;
438 }
439 return true;
440 }
441
IsChangeI32ArrayMetadata(const camera_metadata_item_t & baseEntry,const camera_metadata_item_t & newEntry)442 bool MetadataController::IsChangeI32ArrayMetadata(
443 const camera_metadata_item_t &baseEntry, const camera_metadata_item_t &newEntry)
444 {
445 uint32_t count = newEntry.count;
446 bool isDiff = false;
447 for (int i = 0; i < count; i++) {
448 if (*(baseEntry.data.i32 + i) != *(newEntry.data.i32 + i)) {
449 isDiff = true;
450 break;
451 }
452 }
453 if (!isDiff) {
454 return false;
455 }
456 return true;
457 }
458
UpdateNewTagData(const std::vector<int32_t> & keys,const std::shared_ptr<CameraMetadata> & inMeta,std::shared_ptr<CameraMetadata> & outMeta)459 bool MetadataController::UpdateNewTagData(const std::vector<int32_t> &keys,
460 const std::shared_ptr<CameraMetadata> &inMeta, std::shared_ptr<CameraMetadata> &outMeta)
461 {
462 if (keys.size() == 0) {
463 CAMERA_LOGE("invalid size.");
464 return false;
465 }
466 common_metadata_header_t *data = inMeta->get();
467 if (data == nullptr) {
468 CAMERA_LOGE("data is null");
469 return false;
470 }
471 return DealUpdateNewTagData(keys, data, outMeta);
472 }
473
DealUpdateNewTagData(const std::vector<int32_t> & keys,common_metadata_header_t * data,std::shared_ptr<CameraMetadata> & outMeta)474 bool MetadataController::DealUpdateNewTagData(
475 const std::vector<int32_t> &keys, common_metadata_header_t *data, std::shared_ptr<CameraMetadata> &outMeta)
476 {
477 bool result = false;
478 for (auto it = keys.cbegin(); it != keys.cend(); it++) {
479 camera_metadata_item_t entry;
480 int ret = FindCameraMetadataItem(data, *it, &entry);
481 if (ret != 0) {
482 CAMERA_LOGE("get [%{public}d] error", *it);
483 return false;
484 }
485
486 result = outMeta->addEntry(*it, static_cast<void *>(entry.data.u8), entry.count);
487 if (!result) {
488 CAMERA_LOGE("update key [%{public}d] error", *it);
489 return false;
490 }
491 }
492 return result;
493 }
494
DealMessage()495 void MetadataController::DealMessage()
496 {
497 while (true) {
498 std::unique_lock<std::mutex> lock(queueLock_);
499 if (!isRunning_.load()) {
500 break;
501 }
502 if (queue_.empty()) {
503 cv_.wait(lock, [this] {
504 return isRunning_.load() == false || !queue_.empty();
505 });
506 }
507 if (!isRunning_.load()) {
508 break;
509 }
510 std::shared_ptr<CameraMetadata> meta = queue_.front();
511 for (auto nodeCallback : nodeFunc_) {
512 nodeCallback(meta);
513 }
514 queue_.pop();
515 }
516 CAMERA_LOGI("thread closed");
517 }
518
SetDeviceDefaultMetadata(std::shared_ptr<CameraMetadata> & meta)519 void MetadataController::SetDeviceDefaultMetadata(std::shared_ptr<CameraMetadata> &meta)
520 {
521 if (isInit_) {
522 CAMERA_LOGE("already set device default meta data.");
523 return;
524 }
525 isInit_ = true;
526 if (metaDataConfig_ != nullptr) {
527 metaDataConfig_.reset();
528 }
529 metaDataConfig_ = std::make_shared<MetadataConfig>();
530 metaDataConfig_->GetDeviceDefaultMetadata(meta);
531 FilterUpdateKeys(DEVICE_STREAM_ID, meta);
532 metaDataConfig_->UpdateSettingsConfig(DEVICE_STREAM_ID, true, updateMetaDataKeys_[DEVICE_STREAM_ID], meta);
533 }
534
Start()535 void MetadataController::Start()
536 {
537 if (!isInit_) {
538 CAMERA_LOGE("already start.");
539 return;
540 }
541 peerFrame_ = true;
542 updateSettingFunc_ = nullptr;
543
544 abilityMetaData_.clear();
545
546 if (isRunning_.load()) {
547 isRunning_.store(false);
548 }
549 cv_.notify_all();
550 StopThread();
551
552 isRunning_.store(true);
553
554 std::queue<std::shared_ptr<CameraMetadata>> empty;
555 swap(empty, queue_);
556
557 nodeFunc_.clear();
558 firstNotifyNodes_.clear();
559 updateMetaDataKeys_.clear();
560 changeDataKeys_.clear();
561
562 if (notifyChangedMetadata_ == nullptr) {
563 notifyChangedMetadata_ = new (std::nothrow) std::thread([this] { this->DealMessage(); });
564 if (notifyChangedMetadata_ == nullptr) {
565 CAMERA_LOGE("notifyChangedMetadata_ create failed\n");
566 return;
567 }
568 }
569 }
570
Stop()571 void MetadataController::Stop()
572 {
573 if (!isInit_) {
574 CAMERA_LOGE("invalid stop.");
575 return;
576 }
577 isInit_ = false;
578
579 {
580 std::unique_lock<std::mutex> lock(queueLock_);
581 isRunning_.store(false);
582 cv_.notify_all();
583 }
584
585 StopThread();
586 ClearNodeCallback();
587 }
588
StopThread()589 void MetadataController::StopThread()
590 {
591 if (notifyChangedMetadata_ != nullptr) {
592 notifyChangedMetadata_->join();
593 delete notifyChangedMetadata_;
594 notifyChangedMetadata_ = nullptr;
595 }
596 }
597
NotifyMetaData(int32_t streamId)598 void MetadataController::NotifyMetaData(int32_t streamId)
599 {
600 std::unique_lock<std::mutex> lock(dataConfigLock_);
601 if (updateSettingFunc_ == nullptr) {
602 CAMERA_LOGE("%{public}s updateSettingFunc_ is null and streamId=%{public}d", __FUNCTION__, streamId);
603 return;
604 }
605
606 std::shared_ptr<CameraMetadata> metaTemp = nullptr;
607 bool result = metaDataConfig_->GetMetadata(streamId, metaTemp);
608 if (!result) {
609 CAMERA_LOGE("%{public}s GetMetaData failed and streamId=%{public}d", __FUNCTION__, streamId);
610 return;
611 }
612
613 std::shared_ptr<CameraMetadata> metaData = {};
614 if (streamId == DEVICE_STREAM_ID) {
615 metaData = std::make_shared<CameraMetadata>(ENTRY_CAPACITY, DATA_CAPACITY);
616 UpdateNewTagData(abilityMetaData_, metaTemp, metaData);
617 metaTemp = std::move(metaData);
618 }
619
620 if (peerFrame_) {
621 updateSettingFunc_(metaTemp);
622 return;
623 }
624 if (changeDataKeys_.count(streamId) == 0) {
625 CAMERA_LOGE("%{public}s invalid streamId and streamId=%{public}d", __FUNCTION__, streamId);
626 return;
627 }
628 updateSettingFunc_(metaTemp);
629 changeDataKeys_.erase(streamId);
630 }
631 } // namespace Camera
632 } // namespace OHOS
633