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