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 }