1 /*
2 * Copyright (c) 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 <algorithm>
17 #include <iterator>
18 #include "stream_operator_service.h"
19 #include "stream_operator_service_callback.h"
20 #include "camera_service_type_converter.h"
21 #include "camera_hal_hisysevent.h"
22
23 namespace OHOS::Camera {
24
StreamOperatorService(OHOS::sptr<IStreamOperatorVdi> streamOperatorVdi)25 StreamOperatorService::StreamOperatorService(OHOS::sptr<IStreamOperatorVdi> streamOperatorVdi)
26 : streamOperatorVdi_(streamOperatorVdi)
27 {
28 CAMERA_LOGD("ctor, instance");
29 }
30
~StreamOperatorService()31 StreamOperatorService::~StreamOperatorService()
32 {
33 CAMERA_LOGD("dtor, instance");
34 }
35
IsStreamsSupported(OperationMode mode,const std::vector<uint8_t> & modeSetting,const std::vector<StreamInfo> & infos,StreamSupportType & type)36 int32_t StreamOperatorService::IsStreamsSupported(OperationMode mode, const std::vector<uint8_t> &modeSetting,
37 const std::vector<StreamInfo> &infos, StreamSupportType &type)
38 {
39 CHECK_IF_PTR_NULL_RETURN_VALUE(streamOperatorVdi_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
40 std::vector<VdiStreamInfo> vdiInfos;
41 for (auto info : infos) {
42 VdiStreamInfo vdiInfo;
43 ConvertStreamInfoHdiToVdi(info, vdiInfo);
44 vdiInfos.push_back(vdiInfo);
45 }
46 VdiStreamSupportType vdiType = static_cast<VdiStreamSupportType>(type);
47 int32_t ret = streamOperatorVdi_->IsStreamsSupported(static_cast<VdiOperationMode>(mode),
48 modeSetting, vdiInfos, vdiType);
49 type = static_cast<StreamSupportType>(vdiType);
50 return ret;
51 }
52
CreateStreams(const std::vector<StreamInfo> & streamInfos)53 int32_t StreamOperatorService::CreateStreams(const std::vector<StreamInfo> &streamInfos)
54 {
55 CHECK_IF_PTR_NULL_RETURN_VALUE(streamOperatorVdi_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
56 std::vector<VdiStreamInfo> vdiStreamInfos;
57 for (auto info : streamInfos) {
58 VdiStreamInfo vdiInfo;
59 ConvertStreamInfoHdiToVdi(info, vdiInfo);
60 vdiStreamInfos.push_back(vdiInfo);
61 }
62 return streamOperatorVdi_->CreateStreams(vdiStreamInfos);
63 }
64
ReleaseStreams(const std::vector<int32_t> & streamIds)65 int32_t StreamOperatorService::ReleaseStreams(const std::vector<int32_t> &streamIds)
66 {
67 CHECK_IF_PTR_NULL_RETURN_VALUE(streamOperatorVdi_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
68 return streamOperatorVdi_->ReleaseStreams(streamIds);
69 }
70
CommitStreams(OperationMode mode,const std::vector<uint8_t> & modeSetting)71 int32_t StreamOperatorService::CommitStreams(OperationMode mode, const std::vector<uint8_t> &modeSetting)
72 {
73 CHECK_IF_PTR_NULL_RETURN_VALUE(streamOperatorVdi_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
74 return streamOperatorVdi_->CommitStreams(static_cast<VdiOperationMode>(mode), modeSetting);
75 }
76
GetStreamAttributes(std::vector<StreamAttribute> & attributes)77 int32_t StreamOperatorService::GetStreamAttributes(std::vector<StreamAttribute> &attributes)
78 {
79 CHECK_IF_PTR_NULL_RETURN_VALUE(streamOperatorVdi_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
80 std::vector<VdiStreamAttribute> vdiAttributes;
81 for (auto attribute : attributes) {
82 VdiStreamAttribute vdiAttribute;
83 ConvertStreamAttributeHdiToVdi(attribute, vdiAttribute);
84 vdiAttributes.push_back(vdiAttribute);
85 }
86 int32_t ret = streamOperatorVdi_->GetStreamAttributes(vdiAttributes);
87 std::vector<StreamAttribute>().swap(attributes);
88 for (auto attribute : vdiAttributes) {
89 StreamAttribute hdiAttribute;
90 ConvertStreamAttributeVdiToHdi(attribute, hdiAttribute);
91 attributes.push_back(hdiAttribute);
92 }
93 return ret;
94 }
95
AttachBufferQueue(int32_t streamId,const sptr<BufferProducerSequenceable> & bufferProducer)96 int32_t StreamOperatorService::AttachBufferQueue(int32_t streamId,
97 const sptr<BufferProducerSequenceable> &bufferProducer)
98 {
99 CHECK_IF_PTR_NULL_RETURN_VALUE(streamOperatorVdi_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
100 return streamOperatorVdi_->AttachBufferQueue(streamId, bufferProducer);
101 }
102
DetachBufferQueue(int32_t streamId)103 int32_t StreamOperatorService::DetachBufferQueue(int32_t streamId)
104 {
105 CHECK_IF_PTR_NULL_RETURN_VALUE(streamOperatorVdi_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
106 return streamOperatorVdi_->DetachBufferQueue(streamId);
107 }
108
Capture(int32_t captureId,const CaptureInfo & info,bool isStreaming)109 int32_t StreamOperatorService::Capture(int32_t captureId, const CaptureInfo &info, bool isStreaming)
110 {
111 CAMERAHALPERFSYSEVENT(TIME_FOR_CAPTURE);
112 CHECK_IF_PTR_NULL_RETURN_VALUE(streamOperatorVdi_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
113 VdiCaptureInfo vdiInfo;
114 ConvertCaptureInfoHdiToVdi(info, vdiInfo);
115 return streamOperatorVdi_->Capture(captureId, vdiInfo, isStreaming);
116 }
117
CancelCapture(int32_t captureId)118 int32_t StreamOperatorService::CancelCapture(int32_t captureId)
119 {
120 CHECK_IF_PTR_NULL_RETURN_VALUE(streamOperatorVdi_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
121 return streamOperatorVdi_->CancelCapture(captureId);
122 }
123
ChangeToOfflineStream(const std::vector<int32_t> & streamIds,const sptr<IStreamOperatorCallback> & callbackObj,sptr<IOfflineStreamOperator> & offlineOperator)124 int32_t StreamOperatorService::ChangeToOfflineStream(const std::vector<int32_t> &streamIds,
125 const sptr<IStreamOperatorCallback> &callbackObj, sptr<IOfflineStreamOperator> &offlineOperator)
126 {
127 OHOS::sptr<IOfflineStreamOperatorVdi> offlineOperatorVdi = nullptr;
128 CHECK_IF_PTR_NULL_RETURN_VALUE(streamOperatorVdi_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
129 OHOS::sptr<IStreamOperatorVdiCallback> vdiCallbackObj = new StreamOperatorServiceCallback(callbackObj);
130 if (vdiCallbackObj == nullptr) {
131 CAMERA_LOGE("Change to offline stream error, vdiCallbackObj is nullptr");
132 return OHOS::HDI::Camera::V1_0::INSUFFICIENT_RESOURCES;
133 }
134 int32_t ret = streamOperatorVdi_->ChangeToOfflineStream(streamIds, vdiCallbackObj, offlineOperatorVdi);
135 if (ret != OHOS::HDI::Camera::V1_0::NO_ERROR) {
136 CAMERA_LOGE("Change to offline stream error, ret=%{public}d", ret);
137 return ret;
138 }
139 if (offlineOperatorVdi == nullptr) {
140 CAMERA_LOGE("Change to offline stream error, offlineOperatorVdi is nullptr");
141 return OHOS::HDI::Camera::V1_0::INSUFFICIENT_RESOURCES;
142 }
143 offlineOperator = new OfflineStreamOperatorService(offlineOperatorVdi);
144 if (offlineOperator == nullptr) {
145 CAMERA_LOGE("Change to offline stream error, offlineOperator is nullptr");
146 return OHOS::HDI::Camera::V1_0::INSUFFICIENT_RESOURCES;
147 }
148
149 return OHOS::HDI::Camera::V1_0::NO_ERROR;
150 }
151 } // end namespace OHOS::Camera
152