• 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_PRINT_ELOG(metaObjects.empty(), "OnMetadataObjectsAvailable: metaObjects is empty");
53         size_t size = metaObjects.size();
54         CHECK_PRINT_ELOG(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     CHECK_RETURN(!innerMetadataOutput_);
90     innerMetadataOutput_ = nullptr;
91 }
92 
RegisterCallback(MetadataOutput_Callbacks * callback)93 Camera_ErrorCode Camera_MetadataOutput::RegisterCallback(MetadataOutput_Callbacks* callback)
94 {
95     shared_ptr<InnerMetadataOutputCallback> innerMetadataOutputCallback =
96                 make_shared<InnerMetadataOutputCallback>(this, callback);
97     innerMetadataOutput_->SetCallback(innerMetadataOutputCallback);
98 
99     shared_ptr<InnerMetadataObjectCallback> innerMetadataObjectCallback =
100                 make_shared<InnerMetadataObjectCallback>(this, callback);
101     innerMetadataOutput_->SetCallback(innerMetadataObjectCallback);
102 
103     return CAMERA_OK;
104 }
105 
UnregisterCallback(MetadataOutput_Callbacks * callback)106 Camera_ErrorCode Camera_MetadataOutput::UnregisterCallback(MetadataOutput_Callbacks* callback)
107 {
108     shared_ptr<InnerMetadataOutputCallback> innerMetadataOutputCallback = nullptr;
109     innerMetadataOutput_->SetCallback(innerMetadataOutputCallback);
110     shared_ptr<InnerMetadataObjectCallback> innerMetadataObjectCallback = nullptr;
111     innerMetadataOutput_->SetCallback(innerMetadataObjectCallback);
112     return CAMERA_OK;
113 }
114 
Start()115 Camera_ErrorCode Camera_MetadataOutput::Start()
116 {
117     int32_t ret = innerMetadataOutput_->Start();
118     return FrameworkToNdkCameraError(ret);
119 }
120 
Stop()121 Camera_ErrorCode Camera_MetadataOutput::Stop()
122 {
123     int32_t ret = innerMetadataOutput_->Stop();
124     return FrameworkToNdkCameraError(ret);
125 }
126 
Release()127 Camera_ErrorCode Camera_MetadataOutput::Release()
128 {
129     int32_t ret = innerMetadataOutput_->Release();
130     return FrameworkToNdkCameraError(ret);
131 }
132 
GetInnerMetadataOutput()133 sptr<MetadataOutput> Camera_MetadataOutput::GetInnerMetadataOutput()
134 {
135     return innerMetadataOutput_;
136 }