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