• 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 "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