• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }