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