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