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