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