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