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 CHECK_ERROR_PRINT_LOG(metaObjects.empty(), "OnMetadataObjectsAvailable: metaObjects is empty");
53 size_t size = metaObjects.size();
54 CHECK_ERROR_PRINT_LOG(size <= 0, "Invalid metadata objects size.");
55 Camera_MetadataObject* object = new Camera_MetadataObject[size];
56 Camera_Rect boundingBox;
57 if (metadataOutput_ != nullptr && callback_.onMetadataObjectAvailable != nullptr) {
58 for (size_t index = 0; index < size; index++) {
59 if (MetadataObjectType::FACE == metaObjects[index]->GetType()) {
60 object[index].type = Camera_MetadataObjectType::FACE_DETECTION;
61 }
62 object[index].timestamp = metaObjects[index]->GetTimestamp();
63 boundingBox.topLeftX = metaObjects[index]->GetBoundingBox().topLeftX;
64 boundingBox.topLeftY = metaObjects[index]->GetBoundingBox().topLeftY;
65 boundingBox.width = metaObjects[index]->GetBoundingBox().width;
66 boundingBox.height = metaObjects[index]->GetBoundingBox().height;
67 object[index].boundingBox = &boundingBox;
68 }
69 callback_.onMetadataObjectAvailable(metadataOutput_, object, size);
70 } else {
71 delete[] object;
72 }
73 }
74
75 private:
76 Camera_MetadataOutput* metadataOutput_;
77 MetadataOutput_Callbacks callback_;
78 };
79
Camera_MetadataOutput(sptr<MetadataOutput> & innerMetadataOutput)80 Camera_MetadataOutput::Camera_MetadataOutput(sptr<MetadataOutput> &innerMetadataOutput)
81 : innerMetadataOutput_(innerMetadataOutput)
82 {
83 MEDIA_DEBUG_LOG("Camera_MetadataOutput Constructor is called");
84 }
85
~Camera_MetadataOutput()86 Camera_MetadataOutput::~Camera_MetadataOutput()
87 {
88 MEDIA_DEBUG_LOG("~Camera_MetadataOutput is called");
89 if (innerMetadataOutput_) {
90 innerMetadataOutput_ = nullptr;
91 }
92 }
93
RegisterCallback(MetadataOutput_Callbacks * callback)94 Camera_ErrorCode Camera_MetadataOutput::RegisterCallback(MetadataOutput_Callbacks* callback)
95 {
96 shared_ptr<InnerMetadataOutputCallback> innerMetadataOutputCallback =
97 make_shared<InnerMetadataOutputCallback>(this, callback);
98 innerMetadataOutput_->SetCallback(innerMetadataOutputCallback);
99
100 shared_ptr<InnerMetadataObjectCallback> innerMetadataObjectCallback =
101 make_shared<InnerMetadataObjectCallback>(this, callback);
102 innerMetadataOutput_->SetCallback(innerMetadataObjectCallback);
103
104 return CAMERA_OK;
105 }
106
UnregisterCallback(MetadataOutput_Callbacks * callback)107 Camera_ErrorCode Camera_MetadataOutput::UnregisterCallback(MetadataOutput_Callbacks* callback)
108 {
109 shared_ptr<InnerMetadataOutputCallback> innerMetadataOutputCallback = nullptr;
110 innerMetadataOutput_->SetCallback(innerMetadataOutputCallback);
111 shared_ptr<InnerMetadataObjectCallback> innerMetadataObjectCallback = nullptr;
112 innerMetadataOutput_->SetCallback(innerMetadataObjectCallback);
113 return CAMERA_OK;
114 }
115
Start()116 Camera_ErrorCode Camera_MetadataOutput::Start()
117 {
118 int32_t ret = innerMetadataOutput_->Start();
119 return FrameworkToNdkCameraError(ret);
120 }
121
Stop()122 Camera_ErrorCode Camera_MetadataOutput::Stop()
123 {
124 int32_t ret = innerMetadataOutput_->Stop();
125 return FrameworkToNdkCameraError(ret);
126 }
127
Release()128 Camera_ErrorCode Camera_MetadataOutput::Release()
129 {
130 int32_t ret = innerMetadataOutput_->Release();
131 return FrameworkToNdkCameraError(ret);
132 }
133
GetInnerMetadataOutput()134 sptr<MetadataOutput> Camera_MetadataOutput::GetInnerMetadataOutput()
135 {
136 return innerMetadataOutput_;
137 }