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 "deferred_photo_processing_session.h"
17
18 #include "dp_log.h"
19 #include "basic_definitions.h"
20 #include "dps_event_report.h"
21 #include "steady_clock.h"
22
23 namespace OHOS {
24 namespace CameraStandard {
25 namespace DeferredProcessing {
DeferredPhotoProcessingSession(const int32_t userId,std::shared_ptr<DeferredPhotoProcessor> processor,TaskManager * taskManager,sptr<IDeferredPhotoProcessingSessionCallback> callback)26 DeferredPhotoProcessingSession::DeferredPhotoProcessingSession(const int32_t userId,
27 std::shared_ptr<DeferredPhotoProcessor> processor, TaskManager* taskManager,
28 sptr<IDeferredPhotoProcessingSessionCallback> callback)
29 : userId_(userId),
30 inSync_(false),
31 processor_(processor),
32 taskManager_(taskManager),
33 callback_(callback),
34 imageIds_()
35 {
36 DP_DEBUG_LOG("DeferredPhotoProcessingSession enter.");
37 (void)(userId_);
38 }
39
~DeferredPhotoProcessingSession()40 DeferredPhotoProcessingSession::~DeferredPhotoProcessingSession()
41 {
42 DP_DEBUG_LOG("~DeferredPhotoProcessingSession enter.");
43 processor_ = nullptr;
44 taskManager_ = nullptr;
45 }
46
BeginSynchronize()47 int32_t DeferredPhotoProcessingSession::BeginSynchronize()
48 {
49 DP_INFO_LOG("BeginSynchronize enter.");
50 inSync_ = true;
51 const std::string imageId = "default";
52 ReportEvent(imageId, DeferredProcessingServiceInterfaceCode::DPS_BEGIN_SYNCHRONIZE);
53 return 0;
54 }
55
EndSynchronize()56 int32_t DeferredPhotoProcessingSession::EndSynchronize()
57 {
58 DP_INFO_LOG("EndSynchronize enter.");
59
60 inSync_ = false;
61 std::vector<std::string> pendingImages;
62 bool isSuccess = processor_->GetPendingImages(pendingImages);
63 if (!isSuccess) {
64 for (auto it = imageIds_.begin(); it != imageIds_.end();) {
65 AddImage(it->first, it->second->metadata_, it->second->discardable_);
66 it = imageIds_.erase(it);
67 }
68 const std::string imageId = "default";
69 ReportEvent(imageId, DeferredProcessingServiceInterfaceCode::DPS_END_SYNCHRONIZE);
70 return 0;
71 }
72 std::set<std::string> hdiImageIds(pendingImages.begin(), pendingImages.end());
73 for (auto it = imageIds_.begin(); it != imageIds_.end();) {
74 if (hdiImageIds.count(it->first) != 0) {
75 hdiImageIds.erase(it->first);
76 AddImage(it->first, it->second->metadata_, it->second->discardable_);
77 it = imageIds_.erase(it);
78 } else {
79 ++it;
80 }
81 }
82 for (auto& imageId : hdiImageIds) {
83 RemoveImage(imageId, false);
84 }
85 for (auto it = imageIds_.begin(); it != imageIds_.end();) {
86 callback_->OnError(it->first, ErrorCode::ERROR_IMAGE_PROC_INVALID_PHOTO_ID);
87 ++it;
88 }
89 imageIds_.clear();
90 hdiImageIds.clear();
91 const std::string imageId = "default";
92 ReportEvent(imageId, DeferredProcessingServiceInterfaceCode::DPS_END_SYNCHRONIZE);
93 return 0;
94 }
95
AddImage(const std::string & imageId,DpsMetadata & metadata,bool discardable)96 int32_t DeferredPhotoProcessingSession::AddImage(const std::string& imageId, DpsMetadata& metadata, bool discardable)
97 {
98 if (inSync_) {
99 DP_INFO_LOG("AddImage error, inSync!");
100 imageIds_[imageId] = std::make_shared<PhotoInfo>(discardable, metadata);
101 } else {
102 DP_INFO_LOG("AddImage enter.");
103 taskManager_->SubmitTask([this, imageId, discardable, metadata]() {
104 processor_->AddImage(imageId, discardable, const_cast<DpsMetadata&>(metadata));
105 });
106 }
107
108 ReportEvent(imageId, DeferredProcessingServiceInterfaceCode::DPS_ADD_IMAGE);
109 return 0;
110 }
111
RemoveImage(const std::string & imageId,bool restorable)112 int32_t DeferredPhotoProcessingSession::RemoveImage(const std::string& imageId, bool restorable)
113 {
114 if (inSync_) {
115 DP_INFO_LOG("RemoveImage error, inSync!");
116 } else {
117 DP_INFO_LOG("RemoveImage enter.");
118 taskManager_->SubmitTask([this, imageId, restorable]() {
119 processor_->RemoveImage(imageId, restorable);
120 });
121 }
122
123 ReportEvent(imageId, DeferredProcessingServiceInterfaceCode::DPS_REMOVE_IMAGE);
124 return 0;
125 }
126
RestoreImage(const std::string & imageId)127 int32_t DeferredPhotoProcessingSession::RestoreImage(const std::string& imageId)
128 {
129 if (inSync_) {
130 DP_INFO_LOG("RestoreImage error, inSync!");
131 } else {
132 DP_INFO_LOG("RestoreImage enter.");
133 taskManager_->SubmitTask([this, imageId]() {
134 processor_->RestoreImage(imageId);
135 });
136 }
137
138 ReportEvent(imageId, DeferredProcessingServiceInterfaceCode::DPS_RESTORE_IMAGE);
139 return 0;
140 }
141
ProcessImage(const std::string & appName,const std::string imageId)142 int32_t DeferredPhotoProcessingSession::ProcessImage(const std::string& appName, const std::string imageId)
143 {
144 if (inSync_) {
145 DP_INFO_LOG("ProcessImage error, inSync!");
146 } else {
147 DP_INFO_LOG("ProcessImage enter.");
148 taskManager_->SubmitTask([this, appName, imageId]() {
149 processor_->ProcessImage(appName, imageId);
150 });
151 }
152
153 ReportEvent(imageId, DeferredProcessingServiceInterfaceCode::DPS_PROCESS_IMAGE);
154 return 0;
155 }
156
CancelProcessImage(const std::string & imageId)157 int32_t DeferredPhotoProcessingSession::CancelProcessImage(const std::string& imageId)
158 {
159 if (inSync_) {
160 DP_INFO_LOG("CancelProcessImage error, inSync!");
161 } else {
162 DP_INFO_LOG("CancelProcessImage enter.");
163 taskManager_->SubmitTask([this, imageId]() {
164 processor_->CancelProcessImage(imageId);
165 });
166 }
167
168 ReportEvent(imageId, DeferredProcessingServiceInterfaceCode::DPS_CANCEL_PROCESS_IMAGE);
169 return 0;
170 }
171
ReportEvent(const std::string & imageId,int32_t event)172 void DeferredPhotoProcessingSession::ReportEvent(const std::string& imageId, int32_t event)
173 {
174 DPSEventInfo dpsEventInfo;
175 dpsEventInfo.operatorStage = static_cast<uint32_t>(event);
176 dpsEventInfo.imageId = imageId;
177 dpsEventInfo.userId = userId_;
178 uint64_t beginTime = SteadyClock::GetTimestampMilli();
179 switch (static_cast<int32_t>(event)) {
180 case static_cast<int32_t>(DeferredProcessingServiceInterfaceCode::DPS_BEGIN_SYNCHRONIZE): {
181 dpsEventInfo.synchronizeTimeBeginTime = beginTime;
182 DPSEventReport::GetInstance().ReportOperateImage(imageId, userId_, dpsEventInfo);
183 break;
184 }
185 case static_cast<int32_t>(DeferredProcessingServiceInterfaceCode::DPS_END_SYNCHRONIZE): {
186 dpsEventInfo.synchronizeTimeEndTime = beginTime;
187 DPSEventReport::GetInstance().ReportOperateImage(imageId, userId_, dpsEventInfo);
188 break;
189 }
190 case static_cast<int32_t>(DeferredProcessingServiceInterfaceCode::DPS_ADD_IMAGE): {
191 dpsEventInfo.dispatchTimeBeginTime = beginTime;
192 break;
193 }
194 case static_cast<int32_t>(DeferredProcessingServiceInterfaceCode::DPS_REMOVE_IMAGE): {
195 dpsEventInfo.removeTimeBeginTime = beginTime;
196 break;
197 }
198 case static_cast<int32_t>(DeferredProcessingServiceInterfaceCode::DPS_RESTORE_IMAGE): {
199 dpsEventInfo.restoreTimeBeginTime = beginTime;
200 break;
201 }
202 case static_cast<int32_t>(DeferredProcessingServiceInterfaceCode::DPS_PROCESS_IMAGE): {
203 dpsEventInfo.processTimeBeginTime = beginTime;
204 break;
205 }
206 }
207
208 if (event == DeferredProcessingServiceInterfaceCode::DPS_BEGIN_SYNCHRONIZE) {
209 return;
210 } else if (event == DeferredProcessingServiceInterfaceCode::DPS_END_SYNCHRONIZE) {
211 DPSEventReport::GetInstance().ReportImageProcessResult(imageId, userId_);
212 } else {
213 DPSEventReport::GetInstance().SetEventInfo(dpsEventInfo);
214 }
215 }
216 } // namespace DeferredProcessing
217 } // namespace CameraStandard
218 } // namespace OHOS