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 #ifndef OHOS_CAMERA_DEFERRED_VIDEO_PROCESSOR_H
17 #define OHOS_CAMERA_DEFERRED_VIDEO_PROCESSOR_H
18 
19 #include <refbase.h>
20 #include <iostream>
21 #include <mutex>
22 
23 #include "camera_death_recipient.h"
24 #include "ideferred_video_processing_session.h"
25 #include "ideferred_video_processing_session_callback.h"
26 #include "deferred_video_processing_session_callback_stub.h"
27 #include "hcamera_service_proxy.h"
28 #include "ipc_file_descriptor.h"
29 #include "deferred_type.h"
30 
31 namespace OHOS {
32 namespace CameraStandard {
33 class IDeferredVideoProcSessionCallback : public RefBase {
34 public:
35     IDeferredVideoProcSessionCallback() = default;
36     virtual ~IDeferredVideoProcSessionCallback() = default;
37     virtual void OnProcessVideoDone(const std::string& videoId, const sptr<IPCFileDescriptor> ipcFd) = 0;
38     virtual void OnError(const std::string& videoId, const DpsErrorCode errorCode) = 0;
39     virtual void OnStateChanged(const DpsStatusCode status) = 0;
40 };
41 
42 class DeferredVideoProcSession : public RefBase {
43 public:
44     DeferredVideoProcSession(int userId, std::shared_ptr<IDeferredVideoProcSessionCallback> callback);
45     virtual ~DeferredVideoProcSession();
46     void BeginSynchronize();
47     void EndSynchronize();
48     void AddVideo(const std::string& videoId, const sptr<IPCFileDescriptor> srcFd,
49         const sptr<IPCFileDescriptor> dstFd);
50     void RemoveVideo(const std::string& videoId, const bool restorable = false);
51     void RestoreVideo(const std::string& videoId);
52     std::shared_ptr<IDeferredVideoProcSessionCallback> GetCallback();
53 private:
54     friend class CameraManager;
55     int32_t SetDeferredVideoSession(sptr<DeferredProcessing::IDeferredVideoProcessingSession>& session);
56     void CameraServerDied(pid_t pid);
57     void ReconnectDeferredProcessingSession();
58     void ConnectDeferredProcessingSession();
59     int userId_;
60     std::shared_ptr<IDeferredVideoProcSessionCallback> callback_;
61     sptr<DeferredProcessing::IDeferredVideoProcessingSession> remoteSession_;
62     sptr<CameraDeathRecipient> deathRecipient_ = nullptr;
63     sptr<ICameraService> serviceProxy_;
64 };
65 
66 class DeferredVideoProcessingSessionCallback : public DeferredProcessing::DeferredVideoProcessingSessionCallbackStub {
67 public:
DeferredVideoProcessingSessionCallback()68     DeferredVideoProcessingSessionCallback() : deferredVideoProcSession_(nullptr) {
69     }
70 
DeferredVideoProcessingSessionCallback(sptr<DeferredVideoProcSession> deferredVideoProcSession)71     explicit DeferredVideoProcessingSessionCallback(sptr<DeferredVideoProcSession> deferredVideoProcSession)
72         : deferredVideoProcSession_(deferredVideoProcSession)
73     {
74     }
75 
~DeferredVideoProcessingSessionCallback()76     ~DeferredVideoProcessingSessionCallback()
77     {
78         deferredVideoProcSession_ = nullptr;
79     }
80 
81     ErrCode OnProcessVideoDone(const std::string& videoId, const sptr<IPCFileDescriptor>& ipcFileDescriptor) override;
82     ErrCode OnError(const std::string& videoId, int32_t errorCode) override;
83     ErrCode OnStateChanged(int32_t status) override;
84 
85 private:
86     sptr<DeferredVideoProcSession> deferredVideoProcSession_;
87 };
88 
89 } // namespace CameraStandard
90 } // namespace OHOS
91 #endif // OHOS_CAMERA_DEFERRED_VIDEO_PROCESSOR_H