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