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_proc_session/deferred_video_proc_session.h"
17 #include "camera_log.h"
18 #include "camera_util.h"
19 #include "iservice_registry.h"
20 #include "system_ability_definition.h"
21
22 namespace OHOS {
23 namespace CameraStandard {
24
OnProcessVideoDone(const std::string & videoId,const sptr<IPCFileDescriptor> & ipcFileDescriptor)25 int32_t DeferredVideoProcessingSessionCallback::OnProcessVideoDone(const std::string& videoId,
26 const sptr<IPCFileDescriptor>& ipcFileDescriptor)
27 {
28 MEDIA_INFO_LOG("DeferredVideoProcessingSessionCallback::OnProcessVideoDone() is called!");
29 if (deferredVideoProcSession_ != nullptr && deferredVideoProcSession_->GetCallback() != nullptr) {
30 deferredVideoProcSession_->GetCallback()->OnProcessVideoDone(videoId, ipcFileDescriptor);
31 } else {
32 MEDIA_INFO_LOG("DeferredVideoProcessingSessionCallback::OnProcessVideoDone not set!, Discarding callback");
33 }
34 return ERR_OK;
35 }
36
OnError(const std::string & videoId,int32_t errorCode)37 int32_t DeferredVideoProcessingSessionCallback::OnError(const std::string& videoId,
38 int32_t errorCode)
39 {
40 MEDIA_INFO_LOG("DeferredVideoProcessingSessionCallback::OnError() is called, errorCode: %{public}d", errorCode);
41 if (deferredVideoProcSession_ != nullptr && deferredVideoProcSession_->GetCallback() != nullptr) {
42 deferredVideoProcSession_->GetCallback()->OnError(videoId, DpsErrorCode(errorCode));
43 } else {
44 MEDIA_INFO_LOG("DeferredVideoProcessingSessionCallback::OnError not set!, Discarding callback");
45 }
46 return ERR_OK;
47 }
48
OnStateChanged(int32_t status)49 int32_t DeferredVideoProcessingSessionCallback::OnStateChanged(int32_t status)
50 {
51 MEDIA_INFO_LOG("DeferredVideoProcessingSessionCallback::OnStateChanged() is called, status:%{public}d", status);
52 if (deferredVideoProcSession_ != nullptr && deferredVideoProcSession_->GetCallback() != nullptr) {
53 deferredVideoProcSession_->GetCallback()->OnStateChanged(DpsStatusCode(status));
54 } else {
55 MEDIA_INFO_LOG("DeferredVideoProcessingSessionCallback::OnStateChanged not set!, Discarding callback");
56 }
57 return ERR_OK;
58 }
59
DeferredVideoProcSession(int userId,std::shared_ptr<IDeferredVideoProcSessionCallback> callback)60 DeferredVideoProcSession::DeferredVideoProcSession(int userId,
61 std::shared_ptr<IDeferredVideoProcSessionCallback> callback)
62 {
63 MEDIA_INFO_LOG("enter.");
64 userId_ = userId;
65 callback_ = callback;
66 }
67
~DeferredVideoProcSession()68 DeferredVideoProcSession::~DeferredVideoProcSession()
69 {
70 MEDIA_INFO_LOG("DeferredVideoProcSession::DeferredVideoProcSession Destructor!");
71 CHECK_RETURN(remoteSession_ == nullptr || remoteSession_->AsObject() == nullptr);
72 (void)remoteSession_->AsObject()->RemoveDeathRecipient(deathRecipient_);
73 remoteSession_ = nullptr;
74 }
75
BeginSynchronize()76 void DeferredVideoProcSession::BeginSynchronize()
77 {
78 if (remoteSession_ == nullptr) {
79 MEDIA_ERR_LOG("DeferredVideoProcSession::BeginSynchronize failed due to binder died.");
80 } else {
81 MEDIA_INFO_LOG("DeferredVideoProcSession:BeginSynchronize() enter.");
82 auto ret = remoteSession_->BeginSynchronize();
83 CHECK_PRINT_ELOG(ret != ERR_OK, "EndSynchronize failed errorCode: %{public}d", ret);
84 }
85 }
86
EndSynchronize()87 void DeferredVideoProcSession::EndSynchronize()
88 {
89 if (remoteSession_ == nullptr) {
90 MEDIA_ERR_LOG("DeferredVideoProcSession::EndSynchronize failed due to binder died.");
91 } else {
92 MEDIA_INFO_LOG("DeferredVideoProcSession::EndSynchronize() enter.");
93 auto ret = remoteSession_->EndSynchronize();
94 CHECK_PRINT_ELOG(ret != ERR_OK, "EndSynchronize failed errorCode: %{public}d", ret);
95 }
96 }
97
AddVideo(const std::string & videoId,const sptr<IPCFileDescriptor> srcFd,const sptr<IPCFileDescriptor> dstFd)98 void DeferredVideoProcSession::AddVideo(const std::string& videoId, const sptr<IPCFileDescriptor> srcFd,
99 const sptr<IPCFileDescriptor> dstFd)
100 {
101 if (remoteSession_ == nullptr) {
102 MEDIA_ERR_LOG("DeferredVideoProcSession::AddVideo failed due to binder died.");
103 } else {
104 MEDIA_INFO_LOG("DeferredVideoProcSession::AddVideo() enter.");
105 auto ret = remoteSession_->AddVideo(videoId, srcFd, dstFd);
106 CHECK_PRINT_ELOG(ret != ERR_OK, "AddVideo failed errorCode: %{public}d", ret);
107 }
108 }
109
RemoveVideo(const std::string & videoId,const bool restorable)110 void DeferredVideoProcSession::RemoveVideo(const std::string& videoId, const bool restorable)
111 {
112 if (remoteSession_ == nullptr) {
113 MEDIA_ERR_LOG("DeferredVideoProcSession::RemoveVideo failed due to binder died.");
114 } else {
115 MEDIA_INFO_LOG("DeferredVideoProcSession RemoveVideo() enter.");
116 auto ret = remoteSession_->RemoveVideo(videoId, restorable);
117 CHECK_PRINT_ELOG(ret != ERR_OK, "RemoveVideo failed errorCode: %{public}d", ret);
118 }
119 }
120
RestoreVideo(const std::string & videoId)121 void DeferredVideoProcSession::RestoreVideo(const std::string& videoId)
122 {
123 if (remoteSession_ == nullptr) {
124 MEDIA_ERR_LOG("DeferredVideoProcSession::RestoreVideo failed due to binder died.");
125 } else {
126 MEDIA_INFO_LOG("DeferredVideoProcSession RestoreVideo() enter.");
127 auto ret = remoteSession_->RestoreVideo(videoId);
128 CHECK_PRINT_ELOG(ret != ERR_OK, "RestoreVideo failed errorCode: %{public}d", ret);
129 }
130 }
131
SetDeferredVideoSession(sptr<DeferredProcessing::IDeferredVideoProcessingSession> & session)132 int32_t DeferredVideoProcSession::SetDeferredVideoSession(
133 sptr<DeferredProcessing::IDeferredVideoProcessingSession>& session)
134 {
135 remoteSession_ = session;
136 sptr<IRemoteObject> object = remoteSession_->AsObject();
137 pid_t pid = 0;
138 deathRecipient_ = new(std::nothrow) CameraDeathRecipient(pid);
139 CHECK_RETURN_RET_ELOG(deathRecipient_ == nullptr, CAMERA_ALLOC_ERROR, "failed to new CameraDeathRecipient.");
140
141 deathRecipient_->SetNotifyCb(std::bind(&DeferredVideoProcSession::CameraServerDied, this, std::placeholders::_1));
142 bool result = object->AddDeathRecipient(deathRecipient_);
143 CHECK_RETURN_RET_ELOG(!result, -1, "failed to add deathRecipient");
144 return ERR_OK;
145 }
146
CameraServerDied(pid_t pid)147 void DeferredVideoProcSession::CameraServerDied(pid_t pid)
148 {
149 MEDIA_ERR_LOG("camera server has died, pid:%{public}d!", pid);
150 if (remoteSession_ != nullptr) {
151 (void)remoteSession_->AsObject()->RemoveDeathRecipient(deathRecipient_);
152 remoteSession_ = nullptr;
153 }
154 deathRecipient_ = nullptr;
155 ReconnectDeferredProcessingSession();
156 CHECK_RETURN(callback_ == nullptr);
157 MEDIA_INFO_LOG("DeferredVideoProcSession Reconnect session successful, send sync requestion.");
158 callback_->OnError("", DpsErrorCode::ERROR_SESSION_SYNC_NEEDED);
159 }
160
ReconnectDeferredProcessingSession()161 void DeferredVideoProcSession::ReconnectDeferredProcessingSession()
162 {
163 MEDIA_INFO_LOG("DeferredVideoProcSession::ReconnectDeferredProcessingSession, enter.");
164 ConnectDeferredProcessingSession();
165 CHECK_RETURN(remoteSession_ != nullptr);
166 MEDIA_INFO_LOG("Reconnecting deferred processing session failed.");
167 ReconnectDeferredProcessingSession();
168 }
169
ConnectDeferredProcessingSession()170 void DeferredVideoProcSession::ConnectDeferredProcessingSession()
171 {
172 MEDIA_INFO_LOG("DeferredVideoProcSession::ConnectDeferredProcessingSession, enter.");
173 CHECK_RETURN_ELOG(remoteSession_ != nullptr, "remoteSession_ is not null");
174 sptr<IRemoteObject> object = nullptr;
175 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
176 CHECK_RETURN_ELOG(samgr == nullptr, "Failed to get System ability manager");
177 object = samgr->GetSystemAbility(CAMERA_SERVICE_ID);
178 CHECK_RETURN_ELOG(object == nullptr, "object is null");
179 serviceProxy_ = iface_cast<ICameraService>(object);
180 CHECK_RETURN_ELOG(serviceProxy_ == nullptr, "serviceProxy_ is null");
181 sptr<DeferredProcessing::IDeferredVideoProcessingSession> session = nullptr;
182 sptr<DeferredProcessing::IDeferredVideoProcessingSessionCallback> remoteCallback = nullptr;
183 sptr<DeferredVideoProcSession> deferredVideoProcSession = nullptr;
184 deferredVideoProcSession = new(std::nothrow) DeferredVideoProcSession(userId_, callback_);
185 CHECK_RETURN(deferredVideoProcSession == nullptr);
186 remoteCallback = new(std::nothrow) DeferredVideoProcessingSessionCallback(deferredVideoProcSession);
187 CHECK_RETURN(remoteCallback == nullptr);
188 serviceProxy_->CreateDeferredVideoProcessingSession(userId_, remoteCallback, session);
189 CHECK_EXECUTE(session, SetDeferredVideoSession(session));
190 }
191
GetCallback()192 std::shared_ptr<IDeferredVideoProcSessionCallback> DeferredVideoProcSession::GetCallback()
193 {
194 return callback_;
195 }
196
197 } // namespace CameraStandard
198 } // namespace OHOS