1 /*
2  * Copyright (c) 2021-2024 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 DISTRIBUTED_CAMERA_STREAM_OPERATOR_H
17 #define DISTRIBUTED_CAMERA_STREAM_OPERATOR_H
18 
19 #include <map>
20 #include <set>
21 #include <vector>
22 
23 #include "constants.h"
24 #include "dcamera.h"
25 #include "dcamera_stream.h"
26 #include "dmetadata_processor.h"
27 
28 #include "cJSON.h"
29 #include "v1_0/istream_operator.h"
30 #include "v1_1/istream_operator.h"
31 #include "v1_2/istream_operator.h"
32 #include "v1_3/istream_operator.h"
33 #include "v1_0/types.h"
34 #include "v1_1/types.h"
35 
36 namespace OHOS {
37 namespace DistributedHardware {
38 using namespace std;
39 using namespace OHOS::HDI::Camera::V1_0;
40 using HDI::Camera::V1_1::OperationMode_V1_1;
41 using HDI::Camera::V1_1::StreamInfo_V1_1;
42 class DCameraProvider;
43 class DStreamOperator : public HDI::Camera::V1_3::IStreamOperator {
44 public:
45     explicit DStreamOperator(std::shared_ptr<DMetadataProcessor> &dMetadataProcessor);
46     DStreamOperator() = default;
47     ~DStreamOperator() override = default;
48     DStreamOperator(const DStreamOperator &other) = delete;
49     DStreamOperator(DStreamOperator &&other) = delete;
50     DStreamOperator& operator=(const DStreamOperator &other) = delete;
51     DStreamOperator& operator=(DStreamOperator &&other) = delete;
52 
53 public:
54     int32_t UpdateStreams(const std::vector<StreamInfo_V1_1> &streamInfos) override;
55     int32_t ConfirmCapture(int32_t cId) override;
56 
57     int32_t IsStreamsSupported_V1_1(OperationMode_V1_1 mode, const std::vector<uint8_t> &modeSetting,
58         const std::vector<StreamInfo_V1_1> &infos, StreamSupportType &type) override;
59     int32_t CreateStreams_V1_1(const std::vector<StreamInfo_V1_1> &streamInfos) override;
60     int32_t CommitStreams_V1_1(OperationMode_V1_1 mode, const std::vector<uint8_t> &modeSetting) override;
61 
62     int32_t IsStreamsSupported(OperationMode mode, const std::vector<uint8_t> &modeSetting,
63         const std::vector<StreamInfo> &infos, StreamSupportType &type) override;
64     int32_t CreateStreams(const std::vector<StreamInfo> &streamInfos) override;
65     int32_t ReleaseStreams(const std::vector<int32_t> &streamIds) override;
66     int32_t CommitStreams(OperationMode mode, const std::vector<uint8_t> &modeSetting) override;
67     int32_t GetStreamAttributes(std::vector<StreamAttribute> &attributes) override;
68     int32_t AttachBufferQueue(int32_t streamId, const sptr<BufferProducerSequenceable> &bufferProducer) override;
69     int32_t DetachBufferQueue(int32_t streamId) override;
70     int32_t Capture(int32_t captureId, const CaptureInfo &info, bool isStreaming) override;
71     int32_t CancelCapture(int32_t captureId) override;
72     int32_t ChangeToOfflineStream(const std::vector<int32_t> &streamIds,
73         const sptr<IStreamOperatorCallback> &callbackObj, sptr<IOfflineStreamOperator> &offlineOperator) override;
74     int32_t EnableResult(int32_t streamId, const std::vector<uint8_t> &results) override;
75     int32_t DisableResult(int32_t streamId, const std::vector<uint8_t> &results) override;
76 
77     DCamRetCode InitOutputConfigurations(const DHBase &dhBase, const std::string &sinkAbilityInfo,
78         const std::string &sourceCodecInfo);
79     std::vector<DCEncodeType> ParseEncoderTypes(cJSON* rootValue);
80     DCamRetCode ParsePhotoFormats(cJSON* rootValue);
81     DCamRetCode ParsePreviewFormats(cJSON* rootValue);
82     DCamRetCode ParseVideoFormats(cJSON* rootValue);
83     DCamRetCode AcquireBuffer(int streamId, DCameraBuffer &buffer);
84     DCamRetCode ShutterBuffer(int streamId, const DCameraBuffer &buffer);
85     DCamRetCode SetCallBack(OHOS::sptr<IStreamOperatorCallback> const &callback);
86     DCamRetCode SetDeviceCallback(function<void(ErrorType, int)> &errorCbk,
87         function<void(uint64_t, std::shared_ptr<OHOS::Camera::CameraMetadata>)> &resultCbk);
88     void Release();
89     std::vector<int> GetStreamIds();
90     DCamRetCode SetOutputVal(const DHBase &dhBase, const std::string &sinkAbilityInfo,
91         const std::string &sourceCodecInfo);
92 
93 private:
94     bool IsCapturing();
95     void SetCapturing(bool isCapturing);
96     DCamRetCode NegotiateSuitableCaptureInfo(const CaptureInfo& srcCaptureInfo, bool isStreaming);
97     void ChooseSuitableFormat(std::vector<std::shared_ptr<DCStreamInfo>> &streamInfo,
98         std::shared_ptr<DCCaptureInfo> &captureInfo);
99     void ChooseSuitableResolution(std::vector<std::shared_ptr<DCStreamInfo>> &streamInfo,
100         std::shared_ptr<DCCaptureInfo> &captureInfo);
101     void ChooseSuitableDataSpace(std::vector<std::shared_ptr<DCStreamInfo>> &streamInfo,
102         std::shared_ptr<DCCaptureInfo> &captureInfo);
103     void ChooseSuitableEncodeType(std::vector<std::shared_ptr<DCStreamInfo>> &streamInfo,
104         std::shared_ptr<DCCaptureInfo> &captureInfo);
105     void ChooseSuitableStreamId(std::shared_ptr<DCCaptureInfo> &captureInfo);
106     void ConvertStreamInfo(const StreamInfo &srcInfo, std::shared_ptr<DCStreamInfo> &dstInfo);
107     DCEncodeType ConvertDCEncodeType(std::string &srcEncodeType);
108     std::shared_ptr<DCCaptureInfo> BuildSuitableCaptureInfo(const CaptureInfo& srcCaptureInfo,
109         std::vector<std::shared_ptr<DCStreamInfo>> &srcStreamInfo);
110     void SnapShotStreamOnCaptureEnded(int32_t captureId, int streamId);
111     bool HasContinuousCaptureInfo(int captureId);
112     int32_t ExtractStreamInfo(std::vector<DCStreamInfo>& dCameraStreams);
113     void ExtractCaptureInfo(std::vector<DCCaptureInfo> &captureInfos);
114     void ExtractCameraAttr(cJSON* rootValue, std::vector<int>& formats, const std::string rootNode);
115     void GetCameraAttr(cJSON* rootValue, std::string formatStr, const std::string rootNode, int format);
116     cJSON* GetFormatObj(const std::string rootNode, cJSON* rootValue, std::string& formatStr);
117     DCamRetCode GetInputCaptureInfo(const CaptureInfo& srcCaptureInfo, bool isStreaming,
118         std::shared_ptr<DCCaptureInfo>& inputCaptureInfo);
119     void AppendCaptureInfo(std::shared_ptr<DCCaptureInfo> &appendCaptureInfo, bool isStreaming,
120         std::shared_ptr<DCCaptureInfo> &inputCaptureInfo, const CaptureInfo& srcCaptureInfo);
121     int32_t HalStreamCommit(const DCStreamInfo &streamInfo);
122 
123     std::shared_ptr<DCameraStream> FindHalStreamById(int32_t streamId);
124     void InsertHalStream(int32_t streamId, std::shared_ptr<DCameraStream>& dcStream);
125     void EraseHalStream(int32_t streamId);
126 
127     std::shared_ptr<CaptureInfo> FindCaptureInfoById(int32_t captureId);
128     void InsertCaptureInfo(int captureId, std::shared_ptr<CaptureInfo>& captureInfo);
129     void EraseCaptureInfo(int32_t captureId);
130     int32_t FindCaptureIdByStreamId(int32_t streamId);
131 
132     std::shared_ptr<DCStreamInfo> FindDCStreamById(int32_t streamId);
133     void InsertDCStream(int32_t streamId, std::shared_ptr<DCStreamInfo>& dcStreamInfo);
134     void EraseDCStream(int32_t streamId);
135     void ExtractNotCaptureStream(bool isStreaming, std::vector<std::shared_ptr<DCStreamInfo>>& appendStreamInfo);
136 
137     bool FindEnableShutter(int32_t streamId);
138     void InsertEnableShutter(int32_t streamId, bool enableShutterCallback);
139     void EraseEnableShutter(int32_t streamId);
140 
141     int32_t FindStreamCaptureBufferNum(const pair<int, int>& streamPair);
142     void AddStreamCaptureBufferNum(const pair<int, int>& streamPair);
143     void EraseStreamCaptureBufferNum(const pair<int, int>& streamPair);
144 
145     bool IsStreamInfosInvalid(const std::vector<StreamInfo> &infos);
146     bool IsCaptureInfoInvalid(const CaptureInfo &info);
147 
148     int32_t DoCapture(int32_t captureId, const CaptureInfo &info, bool isStreaming);
149     void InsertNotifyCaptureMap(int32_t captureId);
150     void EraseNotifyCaptureMap(int32_t captureId);
151     bool CheckInputInfo();
152 
153 private:
154     constexpr static uint32_t JSON_ARRAY_MAX_SIZE = 1000;
155     std::shared_ptr<DMetadataProcessor> dMetadataProcessor_;
156     OHOS::sptr<IStreamOperatorCallback> dcStreamOperatorCallback_;
157     function<void(ErrorType, int)> errorCallback_;
158 
159     DHBase dhBase_;
160     std::string sinkAbilityInfo_;
161     std::string sourceCodecInfo_;
162     std::vector<DCEncodeType> dcSupportedCodecType_;
163     std::vector<DCEncodeType> sourceEncodeTypes_;
164 
165     std::map<DCSceneType, std::vector<int>> dcSupportedFormatMap_;
166     std::map<int, std::vector<DCResolution>> dcSupportedPhotoResolutionMap_;
167     std::map<int, std::vector<DCResolution>> dcSupportedPreviewResolutionMap_;
168     std::map<int, std::vector<DCResolution>> dcSupportedVideoResolutionMap_;
169 
170     std::map<int, std::shared_ptr<DCameraStream>> halStreamMap_;
171     std::map<int, std::shared_ptr<DCStreamInfo>> dcStreamInfoMap_;
172     std::map<int, std::shared_ptr<CaptureInfo>> halCaptureInfoMap_;
173     std::vector<std::shared_ptr<DCCaptureInfo>> cachedDCaptureInfoList_;
174     std::map<int, bool> enableShutterCbkMap_;
175     std::map<pair<int, int>, int> acceptedBufferNum_;
176 
177     std::mutex streamAttrLock_;
178     std::mutex halStreamLock_;
179     bool isCapturing_ = false;
180     std::mutex isCapturingLock_;
181     OperationMode_V1_1 currentOperMode_ = OperationMode_V1_1::NORMAL;
182     std::shared_ptr<OHOS::Camera::CameraMetadata> latestStreamSetting_;
183     std::map<int, bool> notifyCaptureStartedMap_;
184 };
185 } // namespace DistributedHardware
186 } // namespace OHOS
187 #endif // DISTRIBUTED_CAMERA_STREAM_OPERATOR_H
188