• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
UpdateMuteMode(const std::shared_ptr<CameraMetadata> & metadata,bool oldMode)160 static bool UpdateMuteMode(const std::shared_ptr<CameraMetadata>& metadata, bool oldMode)
161 {
162     bool newMode = oldMode;
163     common_metadata_header_t *data = metadata->get();
164     camera_metadata_item_t entry;
165     int ret = FindCameraMetadataItem(data, OHOS_CONTROL_MUTE_MODE, &entry);
166     if (ret == 0) {
167         if (entry.count == 1) {
168             newMode = (entry.data.u8[0] > 0 ? true : false);
169             CAMERA_LOGI("update mute mode, %{public}d -> %{public}d", oldMode, newMode);
170         } else {
171             CAMERA_LOGE("OHOS_CONTROL_MUTE_MODE tag, size error %{public}d", entry.count);
172         }
173     }
174     return newMode;
175 }
176 
IsMute()177 bool MetadataController::IsMute()
178 {
179     return isMute_;
180 }
181 
UpdateSettingsConfig(const std::shared_ptr<CameraMetadata> & meta)182 bool MetadataController::UpdateSettingsConfig(const std::shared_ptr<CameraMetadata> &meta)
183 {
184     bool result = false;
185     isMute_ = UpdateMuteMode(meta, isMute_);
186     int32_t streamId = GetStreamId(meta);
187     if (streamId < 0) {
188         CAMERA_LOGE("streamId is invalid %{public}d", streamId);
189         return false;
190     }
191     result = FilterUpdateKeys(streamId, meta);
192     if (!result) {
193         CAMERA_LOGE("filter update keys fail and streamId = %{public}d", streamId);
194         return false;
195     }
196     return DealMetadata(streamId, meta);
197 }
198 
GetSettingsConfig(std::shared_ptr<CameraMetadata> & meta)199 void MetadataController::GetSettingsConfig(std::shared_ptr<CameraMetadata> &meta)
200 {
201     std::unique_lock<std::mutex> lock(dataConfigLock_);
202     metaDataConfig_->GetMetadata(DEVICE_STREAM_ID, meta);
203 }
204 
GetStreamId(const std::shared_ptr<CameraMetadata> & meta)205 int32_t MetadataController::GetStreamId(const std::shared_ptr<CameraMetadata> &meta)
206 {
207     common_metadata_header_t *data = meta->get();
208     if (data == nullptr) {
209         CAMERA_LOGE("data is nullptr");
210         return RC_ERROR;
211     }
212     camera_metadata_item_t entry;
213     int32_t streamId = -1;
214     int rc = FindCameraMetadataItem(data, OHOS_CAMERA_STREAM_ID, &entry);
215     if (rc == 0) {
216         streamId = *entry.data.i32;
217     }
218     return streamId;
219 }
220 
FilterUpdateKeys(int32_t streamId,const std::shared_ptr<CameraMetadata> & meta)221 bool MetadataController::FilterUpdateKeys(int32_t streamId, const std::shared_ptr<CameraMetadata> &meta)
222 {
223     common_metadata_header_t *data = meta->get();
224     if (data == nullptr) {
225         CAMERA_LOGE("data is nullptr");
226         return false;
227     }
228 
229     std::vector<int32_t> metaKeys;
230     for (auto &metaKey : DATA_BASE) {
231         camera_metadata_item_t entry;
232         int rc = FindCameraMetadataItem(data, metaKey, &entry);
233         if (rc != 0) {
234             continue;
235         }
236         metaKeys.push_back(metaKey);
237     }
238 
239     if (metaKeys.size() == 0) {
240         return false;
241     }
242     std::unique_lock<std::mutex> lock(dataConfigLock_);
243     updateMetaDataKeys_[streamId] = metaKeys;
244     return true;
245 }
246 
DealMetadata(int32_t streamId,const std::shared_ptr<CameraMetadata> & meta)247 bool MetadataController::DealMetadata(int32_t streamId, const std::shared_ptr<CameraMetadata> &meta)
248 {
249     bool result = false;
250     if (firstNotifyNodes_.count(streamId) == 0 && streamId != DEVICE_STREAM_ID) {
251         {
252             std::unique_lock<std::mutex> lock(dataConfigLock_);
253             changeDataKeys_[streamId] = updateMetaDataKeys_[streamId];
254             result = metaDataConfig_->UpdateSettingsConfig(streamId, true, updateMetaDataKeys_[streamId], meta);
255             if (!result) {
256                 CAMERA_LOGE("set metadata config fail and streamId = %{public}d", streamId);
257                 return false;
258             }
259         }
260         firstNotifyNodes_.insert(streamId);
261         {
262             std::unique_lock<std::mutex> lock(queueLock_);
263             queue_.push(meta);
264             cv_.notify_all();
265         }
266         return true;
267     }
268     std::shared_ptr<CameraMetadata> metaTemp = nullptr;
269     {
270         std::unique_lock<std::mutex> lock(dataConfigLock_);
271         if (!metaDataConfig_->GetMetadata(streamId, metaTemp)) {
272             CAMERA_LOGE("get metadata fail and streamId = %{public}d", streamId);
273             return false;
274         }
275     }
276 
277     std::shared_ptr<CameraMetadata> changeMetadata = std::make_shared<CameraMetadata>(ENTRY_CAPACITY, DATA_CAPACITY);
278     result = CompareMetadata(streamId, metaTemp, meta, changeMetadata);
279     if (!result) {
280         CAMERA_LOGE("compare metadata fail and streamId = %{public}d", streamId);
281         return false;
282     }
283     std::unique_lock<std::mutex> lock(queueLock_);
284     queue_.push(changeMetadata);
285 
286     CameraDumper& dumper = CameraDumper::GetInstance();
287     dumper.DumpMetadata("MetadataController", ENABLE_METADATA, changeMetadata);
288 
289     cv_.notify_all();
290     return true;
291 }
292 
CompareMetadata(int32_t streamId,const std::shared_ptr<CameraMetadata> & oldMeta,const std::shared_ptr<CameraMetadata> & newMeta,std::shared_ptr<CameraMetadata> & outMetadata)293 bool MetadataController::CompareMetadata(int32_t streamId, const std::shared_ptr<CameraMetadata> &oldMeta,
294     const std::shared_ptr<CameraMetadata> &newMeta, std::shared_ptr<CameraMetadata> &outMetadata)
295 {
296     std::vector<int32_t> updateKeys;
297     std::vector<int32_t> newKeys;
298     common_metadata_header_t *metadataOld = oldMeta->get();
299     common_metadata_header_t *metadataNew = newMeta->get();
300     if (metadataOld == nullptr || metadataNew == nullptr) {
301         CAMERA_LOGE("get metadata failed.");
302         return false;
303     }
304     bool result = false;
305     for (auto &metaType : updateMetaDataKeys_[streamId]) {
306         camera_metadata_item_t baseEntry;
307         int ret = FindCameraMetadataItem(metadataOld, metaType, &baseEntry);
308         if (ret != 0) {
309             CAMERA_LOGE("metadata base not found tag.[metaType = %{public}d]", metaType);
310             newKeys.push_back(metaType);
311             continue;
312         }
313         camera_metadata_item_t newEntry;
314         ret = FindCameraMetadataItem(metadataNew, metaType, &newEntry);
315         if (ret != 0) {
316             CAMERA_LOGE("metadata result not found tag.[metaType = %{public}d]", metaType);
317             continue;
318         }
319         bool isChange = IsChangeTagData(metaType, baseEntry, newEntry);
320         if (isChange) {
321             updateKeys.push_back(OHOS_CAMERA_STREAM_ID);
322             updateKeys.push_back(metaType);
323             result = UpdateNewTagData(updateKeys, newMeta, outMetadata);
324             if (!result) {
325                 CAMERA_LOGE("compare update change meta failed.");
326                 return false;
327             }
328         }
329     }
330 
331     if (updateKeys.size() == 0 && newKeys.size() == 0) {
332         CAMERA_LOGW("ignore meta data");
333         return false;
334     }
335     std::unique_lock<std::mutex> lock(dataConfigLock_);
336     if (newKeys.size() > 0) {
337         newKeys.push_back(OHOS_CAMERA_STREAM_ID);
338     }
339 
340     if (updateKeys.size() > 0) {
341         updateKeys.push_back(OHOS_CAMERA_STREAM_ID);
342     }
343     return UpdateChangeMetadata(streamId, updateKeys, newKeys, newMeta, outMetadata);
344 }
345 
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)346 bool MetadataController::UpdateChangeMetadata(int32_t streamId, const std::vector<int32_t> &updateKeys,
347     const std::vector<int32_t> &newKeys, const std::shared_ptr<CameraMetadata> &newMeta,
348     std::shared_ptr<CameraMetadata> &outMetadata)
349 {
350     bool result = false;
351     if (updateKeys.size() == 0 && newKeys.size() > 1) {
352         changeDataKeys_[streamId] = newKeys;
353         result = metaDataConfig_->UpdateSettingsConfig(streamId, true, newKeys, newMeta);
354         if (!result) {
355             CAMERA_LOGE("set meta config new keys failed.");
356             return false;
357         }
358         result = UpdateNewTagData(newKeys, newMeta, outMetadata);
359     } else {
360         changeDataKeys_[streamId] = updateKeys;
361         if (newKeys.size() > 1) {
362             result = UpdateNewTagData(newKeys, newMeta, outMetadata);
363             if (!result) {
364                 CAMERA_LOGE("update keys metadata failed.");
365                 return false;
366             }
367             changeDataKeys_[streamId].insert(changeDataKeys_[streamId].end(), newKeys.begin(), newKeys.end());
368             result = metaDataConfig_->UpdateSettingsConfig(streamId, true, newKeys, newMeta);
369             if (!result) {
370                 CAMERA_LOGE("set metadta config keys failed.");
371                 return false;
372             }
373         }
374         result = metaDataConfig_->UpdateSettingsConfig(streamId, false, updateKeys, newMeta);
375     }
376     if (!result) {
377         CAMERA_LOGE("update change metadata failed.");
378         return false;
379     }
380     return true;
381 }
382 
IsChangeTagData(int32_t key,const camera_metadata_item_t & baseEntry,const camera_metadata_item_t & newEntry)383 bool MetadataController::IsChangeTagData(
384     int32_t key, const camera_metadata_item_t &baseEntry, const camera_metadata_item_t &newEntry)
385 {
386     bool result = false;
387     switch (key) {
388         case OHOS_CONTROL_AWB_MODE:       // fallthrough
389         case OHOS_CONTROL_AWB_LOCK:       // fallthrough
390         case OHOS_CONTROL_FOCUS_MODE:     // fallthrough
391         case OHOS_CONTROL_FOCUS_STATE:    // fallthrough
392         case OHOS_CONTROL_EXPOSURE_MODE:  // fallthrough
393         case OHOS_CONTROL_EXPOSURE_STATE: // fallthrough
394         case OHOS_CONTROL_AE_LOCK:        // fallthrough
395         case OHOS_CONTROL_FLASH_MODE:     // fallthrough
396         case OHOS_CONTROL_METER_MODE:     // fallthrough
397         case OHOS_CONTROL_VIDEO_STABILIZATION_MODE: {
398             result = IsChangeU8Metadata(baseEntry, newEntry);
399             break;
400         }
401         case OHOS_CONTROL_AE_EXPOSURE_COMPENSATION: {
402             result = IsChangeI32Metadata(baseEntry, newEntry);
403             break;
404         }
405         case OHOS_SENSOR_EXPOSURE_TIME: {
406             result = IsChangeI64Metadata(baseEntry, newEntry);
407             break;
408         }
409         case OHOS_SENSOR_COLOR_CORRECTION_GAINS: {
410             result = IsChangeFloatMetadata(baseEntry, newEntry);
411             break;
412         }
413         case OHOS_CONTROL_FPS_RANGES: // fallthrough
414         case OHOS_CONTROL_AF_REGIONS: // fallthrough
415         case OHOS_CONTROL_METER_POINT: {
416             result = IsChangeI32ArrayMetadata(baseEntry, newEntry);
417             break;
418         }
419         default: {
420             CAMERA_LOGW("invalid key %{public}d", key);
421             break;
422         }
423     }
424     return result;
425 }
426 
IsChangeU8Metadata(const camera_metadata_item_t & baseEntry,const camera_metadata_item_t & newEntry)427 bool MetadataController::IsChangeU8Metadata(
428     const camera_metadata_item_t &baseEntry, const camera_metadata_item_t &newEntry)
429 {
430     if (*(baseEntry.data.u8) == *(newEntry.data.u8)) {
431         return false;
432     }
433     return true;
434 }
435 
IsChangeI32Metadata(const camera_metadata_item_t & baseEntry,const camera_metadata_item_t & newEntry)436 bool MetadataController::IsChangeI32Metadata(
437     const camera_metadata_item_t &baseEntry, const camera_metadata_item_t &newEntry)
438 {
439     if (*(baseEntry.data.i32) == *(newEntry.data.i32)) {
440         return false;
441     }
442     return true;
443 }
444 
IsChangeI64Metadata(const camera_metadata_item_t & baseEntry,const camera_metadata_item_t & newEntry)445 bool MetadataController::IsChangeI64Metadata(
446     const camera_metadata_item_t &baseEntry, const camera_metadata_item_t &newEntry)
447 {
448     if (*(baseEntry.data.i64) == *(newEntry.data.i64)) {
449         return false;
450     }
451     return true;
452 }
453 
IsChangeFloatMetadata(const camera_metadata_item_t & baseEntry,const camera_metadata_item_t & newEntry)454 bool MetadataController::IsChangeFloatMetadata(
455     const camera_metadata_item_t &baseEntry, const camera_metadata_item_t &newEntry)
456 {
457     std::string baseValue = std::to_string(*(baseEntry.data.f));
458     std::string newValue = std::to_string(*(newEntry.data.f));
459     if (strcmp(baseValue.c_str(), newValue.c_str()) == 0) {
460         return false;
461     }
462     return true;
463 }
464 
IsChangeI32ArrayMetadata(const camera_metadata_item_t & baseEntry,const camera_metadata_item_t & newEntry)465 bool MetadataController::IsChangeI32ArrayMetadata(
466     const camera_metadata_item_t &baseEntry, const camera_metadata_item_t &newEntry)
467 {
468     uint32_t count = newEntry.count;
469     bool isDiff = false;
470     for (uint32_t i = 0; i < count; i++) {
471         if (*(baseEntry.data.i32 + i) != *(newEntry.data.i32 + i)) {
472             isDiff = true;
473             break;
474         }
475     }
476     if (!isDiff) {
477         return false;
478     }
479     return true;
480 }
481 
UpdateNewTagData(const std::vector<int32_t> & keys,const std::shared_ptr<CameraMetadata> & inMeta,std::shared_ptr<CameraMetadata> & outMeta)482 bool MetadataController::UpdateNewTagData(const std::vector<int32_t> &keys,
483     const std::shared_ptr<CameraMetadata> &inMeta, std::shared_ptr<CameraMetadata> &outMeta)
484 {
485     if (keys.size() == 0) {
486         CAMERA_LOGW("invalid size.");
487         return false;
488     }
489     common_metadata_header_t *data = inMeta->get();
490     if (data == nullptr) {
491         CAMERA_LOGE("data is null");
492         return false;
493     }
494     return DealUpdateNewTagData(keys, data, outMeta);
495 }
496 
DealUpdateNewTagData(const std::vector<int32_t> & keys,common_metadata_header_t * data,std::shared_ptr<CameraMetadata> & outMeta)497 bool MetadataController::DealUpdateNewTagData(
498     const std::vector<int32_t> &keys, common_metadata_header_t *data, std::shared_ptr<CameraMetadata> &outMeta)
499 {
500     bool result = false;
501     for (auto it = keys.cbegin(); it != keys.cend(); it++) {
502         camera_metadata_item_t entry;
503         int ret = FindCameraMetadataItem(data, *it, &entry);
504         if (ret != 0) {
505             CAMERA_LOGE("get [%{public}d] error", *it);
506             return false;
507         }
508 
509         result = outMeta->addEntry(*it, static_cast<void *>(entry.data.u8), entry.count);
510         if (!result) {
511             CAMERA_LOGE("update key [%{public}d] error", *it);
512             return false;
513         }
514     }
515     return result;
516 }
517 
DealMessage()518 void MetadataController::DealMessage()
519 {
520     while (true) {
521         std::unique_lock<std::mutex> lock(queueLock_);
522         if (!isRunning_.load()) {
523             break;
524         }
525         if (queue_.empty()) {
526             cv_.wait(lock, [this] {
527                 return isRunning_.load() == false || !queue_.empty();
528             });
529         }
530         if (!isRunning_.load()) {
531             break;
532         }
533         std::shared_ptr<CameraMetadata> meta = queue_.front();
534         for (auto nodeCallback : nodeFunc_) {
535             nodeCallback(meta);
536         }
537         queue_.pop();
538     }
539     CAMERA_LOGI("thread closed");
540 }
541 
SetDeviceDefaultMetadata(std::shared_ptr<CameraMetadata> & meta)542 void MetadataController::SetDeviceDefaultMetadata(std::shared_ptr<CameraMetadata> &meta)
543 {
544     if (isInit_) {
545         CAMERA_LOGE("already set device default meta data.");
546         return;
547     }
548     isInit_ = true;
549     if (metaDataConfig_ != nullptr) {
550         metaDataConfig_.reset();
551     }
552     metaDataConfig_ = std::make_shared<MetadataConfig>();
553     metaDataConfig_->GetDeviceDefaultMetadata(meta);
554     FilterUpdateKeys(DEVICE_STREAM_ID, meta);
555     metaDataConfig_->UpdateSettingsConfig(DEVICE_STREAM_ID, true, updateMetaDataKeys_[DEVICE_STREAM_ID], meta);
556 }
557 
Start()558 void MetadataController::Start()
559 {
560     if (!isInit_) {
561         CAMERA_LOGE("already start.");
562         return;
563     }
564     peerFrame_ = true;
565     updateSettingFunc_ = nullptr;
566 
567     abilityMetaData_.clear();
568 
569     if (isRunning_.load()) {
570         isRunning_.store(false);
571     }
572     cv_.notify_all();
573     StopThread();
574 
575     isRunning_.store(true);
576 
577     std::queue<std::shared_ptr<CameraMetadata>> empty;
578     swap(empty, queue_);
579 
580     nodeFunc_.clear();
581     firstNotifyNodes_.clear();
582     updateMetaDataKeys_.clear();
583     changeDataKeys_.clear();
584 
585     if (notifyChangedMetadata_ == nullptr) {
586         notifyChangedMetadata_ = new (std::nothrow) std::thread([this] { this->DealMessage(); });
587         if (notifyChangedMetadata_ == nullptr) {
588             CAMERA_LOGE("notifyChangedMetadata_ create failed\n");
589             return;
590         }
591     }
592 }
593 
Stop()594 void MetadataController::Stop()
595 {
596     if (!isInit_) {
597         CAMERA_LOGE("invalid stop.");
598         return;
599     }
600     isInit_ = false;
601 
602     {
603         std::unique_lock<std::mutex> lock(queueLock_);
604         isRunning_.store(false);
605         cv_.notify_all();
606     }
607 
608     StopThread();
609     ClearNodeCallback();
610 }
611 
StopThread()612 void MetadataController::StopThread()
613 {
614     if (notifyChangedMetadata_ != nullptr) {
615         notifyChangedMetadata_->join();
616         delete notifyChangedMetadata_;
617         notifyChangedMetadata_ = nullptr;
618     }
619 }
620 
NotifyMetaData(int32_t streamId)621 void MetadataController::NotifyMetaData(int32_t streamId)
622 {
623     std::unique_lock<std::mutex> lock(dataConfigLock_);
624     if (updateSettingFunc_ == nullptr) {
625         CAMERA_LOGE("%{public}s updateSettingFunc_ is null and streamId=%{public}d", __FUNCTION__, streamId);
626         return;
627     }
628 
629     std::shared_ptr<CameraMetadata> metaTemp = nullptr;
630     bool result = metaDataConfig_->GetMetadata(streamId, metaTemp);
631     if (!result) {
632         CAMERA_LOGW("%{public}s GetMetaData failed and streamId=%{public}d", __FUNCTION__, streamId);
633         return;
634     }
635 
636     std::shared_ptr<CameraMetadata> metaData = {};
637     if (streamId == DEVICE_STREAM_ID) {
638         metaData = std::make_shared<CameraMetadata>(ENTRY_CAPACITY, DATA_CAPACITY);
639         UpdateNewTagData(abilityMetaData_, metaTemp, metaData);
640         metaTemp = std::move(metaData);
641     }
642 
643     if (peerFrame_) {
644         updateSettingFunc_(metaTemp);
645         return;
646     }
647     if (changeDataKeys_.count(streamId) == 0) {
648         CAMERA_LOGE("%{public}s invalid streamId and streamId=%{public}d", __FUNCTION__, streamId);
649         return;
650     }
651     updateSettingFunc_(metaTemp);
652     changeDataKeys_.erase(streamId);
653 }
654 } // namespace Camera
655 } // namespace OHOS
656