1 /*
2 * Copyright (c) 2023-2023 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_output_impl.h"
17 #include "camera_log.h"
18 #include "camera_util.h"
19
20 using namespace std;
21 using namespace OHOS;
22 using namespace OHOS::CameraStandard;
23
24 class InnerMetadataOutputCallback : public MetadataStateCallback {
25 public:
InnerMetadataOutputCallback(Camera_MetadataOutput * metadataOutput,MetadataOutput_Callbacks * callback)26 InnerMetadataOutputCallback(Camera_MetadataOutput* metadataOutput, MetadataOutput_Callbacks* callback)
27 : metadataOutput_(metadataOutput), callback_(*callback) {}
28 ~InnerMetadataOutputCallback() = default;
29
OnError(const int32_t errorCode) const30 void OnError(const int32_t errorCode) const override
31 {
32 MEDIA_DEBUG_LOG("OnError is called!, errorCode: %{public}d", errorCode);
33 if (metadataOutput_ != nullptr && callback_.onError != nullptr) {
34 callback_.onError(metadataOutput_, FrameworkToNdkCameraError(errorCode));
35 }
36 }
37
38 private:
39 Camera_MetadataOutput* metadataOutput_;
40 MetadataOutput_Callbacks callback_;
41 };
42
43 // need fix
44 class InnerMetadataObjectCallback : public MetadataObjectCallback {
45 public:
InnerMetadataObjectCallback(Camera_MetadataOutput * metadataOutput,MetadataOutput_Callbacks * callback)46 InnerMetadataObjectCallback(Camera_MetadataOutput* metadataOutput, MetadataOutput_Callbacks* callback)
47 : metadataOutput_(metadataOutput), callback_(*callback) {}
48 ~InnerMetadataObjectCallback() = default;
49
OnMetadataObjectsAvailable(std::vector<sptr<MetadataObject>> metaObjects) const50 void OnMetadataObjectsAvailable(std::vector<sptr<MetadataObject>> metaObjects) const override
51 {
52 if (metaObjects.empty()) {
53 MEDIA_ERR_LOG("OnMetadataObjectsAvailable: metaObjects is empty");
54 }
55 size_t size = metaObjects.size();
56 if (size <= 0) {
57 MEDIA_ERR_LOG("Invalid metadata objects size.");
58 }
59 Camera_MetadataObject* object = new Camera_MetadataObject[size];
60 Camera_Rect boundingBox;
61 if (metadataOutput_ != nullptr && callback_.onMetadataObjectAvailable != nullptr) {
62 for (size_t index = 0; index < size; index++) {
63 if (MetadataObjectType::FACE == metaObjects[index]->GetType()) {
64 object[index].type = Camera_MetadataObjectType::FACE_DETECTION;
65 }
66 object[index].timestamp = metaObjects[index]->GetTimestamp();
67 boundingBox.topLeftX = metaObjects[index]->GetBoundingBox().topLeftX;
68 boundingBox.topLeftY = metaObjects[index]->GetBoundingBox().topLeftY;
69 boundingBox.width = metaObjects[index]->GetBoundingBox().width;
70 boundingBox.height = metaObjects[index]->GetBoundingBox().height;
71 object[index].boundingBox = &boundingBox;
72 }
73 callback_.onMetadataObjectAvailable(metadataOutput_, object, size);
74 } else {
75 delete[] object;
76 }
77 }
78
79 private:
80 Camera_MetadataOutput* metadataOutput_;
81 MetadataOutput_Callbacks callback_;
82 };
83
Camera_MetadataOutput(sptr<MetadataOutput> & innerMetadataOutput)84 Camera_MetadataOutput::Camera_MetadataOutput(sptr<MetadataOutput> &innerMetadataOutput)
85 : innerMetadataOutput_(innerMetadataOutput)
86 {
87 MEDIA_DEBUG_LOG("Camera_MetadataOutput Constructor is called");
88 }
89
~Camera_MetadataOutput()90 Camera_MetadataOutput::~Camera_MetadataOutput()
91 {
92 MEDIA_DEBUG_LOG("~Camera_MetadataOutput is called");
93 if (innerMetadataOutput_) {
94 innerMetadataOutput_ = nullptr;
95 }
96 }
97
RegisterCallback(MetadataOutput_Callbacks * callback)98 Camera_ErrorCode Camera_MetadataOutput::RegisterCallback(MetadataOutput_Callbacks* callback)
99 {
100 shared_ptr<InnerMetadataOutputCallback> innerMetadataOutputCallback =
101 make_shared<InnerMetadataOutputCallback>(this, callback);
102 innerMetadataOutput_->SetCallback(innerMetadataOutputCallback);
103
104 shared_ptr<InnerMetadataObjectCallback> innerMetadataObjectCallback =
105 make_shared<InnerMetadataObjectCallback>(this, callback);
106 innerMetadataOutput_->SetCallback(innerMetadataObjectCallback);
107
108 return CAMERA_OK;
109 }
110
UnregisterCallback(MetadataOutput_Callbacks * callback)111 Camera_ErrorCode Camera_MetadataOutput::UnregisterCallback(MetadataOutput_Callbacks* callback)
112 {
113 shared_ptr<InnerMetadataOutputCallback> innerMetadataOutputCallback = nullptr;
114 innerMetadataOutput_->SetCallback(innerMetadataOutputCallback);
115 shared_ptr<InnerMetadataObjectCallback> innerMetadataObjectCallback = nullptr;
116 innerMetadataOutput_->SetCallback(innerMetadataObjectCallback);
117 return CAMERA_OK;
118 }
119
Start()120 Camera_ErrorCode Camera_MetadataOutput::Start()
121 {
122 int32_t ret = innerMetadataOutput_->Start();
123 return FrameworkToNdkCameraError(ret);
124 }
125
Stop()126 Camera_ErrorCode Camera_MetadataOutput::Stop()
127 {
128 int32_t ret = innerMetadataOutput_->Stop();
129 return FrameworkToNdkCameraError(ret);
130 }
131
Release()132 Camera_ErrorCode Camera_MetadataOutput::Release()
133 {
134 int32_t ret = innerMetadataOutput_->Release();
135 return FrameworkToNdkCameraError(ret);
136 }
137
GetInnerMetadataOutput()138 sptr<MetadataOutput> Camera_MetadataOutput::GetInnerMetadataOutput()
139 {
140 return innerMetadataOutput_;
141 }