• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "hstream_capture.h"
17 #include <cstdint>
18 #include <uuid.h>
19 
20 #include "camera_log.h"
21 #include "camera_service_ipc_interface_code.h"
22 #include "camera_util.h"
23 #include "hstream_common.h"
24 #include "ipc_skeleton.h"
25 #include "metadata_utils.h"
26 #include "camera_report_uitls.h"
27 
28 namespace OHOS {
29 namespace CameraStandard {
30 using namespace OHOS::HDI::Camera::V1_0;
31 static const int32_t CAPTURE_ROTATE_360 = 360;
32 static const std::string BURST_UUID_BEGIN = "";
33 static std::string g_currentBurstUuid = BURST_UUID_BEGIN;
34 
GenerateBurstUuid()35 static std::string GenerateBurstUuid()
36 {
37     MEDIA_INFO_LOG("HStreamCapture::GenerateBurstUuid");
38     uuid_t uuid;
39     char str[37] = {}; // UUIDs are 36 characters plus the null terminator
40     uuid_generate(uuid);
41     uuid_unparse(uuid, str); // Convert the UUID to a string
42     std::string burstUuid(str);
43     g_currentBurstUuid = burstUuid;
44     return burstUuid;
45 }
46 
HStreamCapture(sptr<OHOS::IBufferProducer> producer,int32_t format,int32_t width,int32_t height)47 HStreamCapture::HStreamCapture(sptr<OHOS::IBufferProducer> producer, int32_t format, int32_t width, int32_t height)
48     : HStreamCommon(StreamType::CAPTURE, producer, format, width, height)
49 {
50     MEDIA_INFO_LOG(
51         "HStreamCapture::HStreamCapture construct, format:%{public}d size:%{public}dx%{public}d streamId:%{public}d",
52         format, width, height, GetFwkStreamId());
53     thumbnailSwitch_ = 0;
54     rawDeliverySwitch_ = 0;
55     modeName_ = 0;
56     deferredPhotoSwitch_ = 0;
57     deferredVideoSwitch_ = 0;
58     burstNum_ = 0;
59 }
60 
~HStreamCapture()61 HStreamCapture::~HStreamCapture()
62 {
63     rotationMap_.Clear();
64     MEDIA_INFO_LOG(
65         "HStreamCapture::~HStreamCapture deconstruct, format:%{public}d size:%{public}dx%{public}d streamId:%{public}d",
66         format_, width_, height_, GetFwkStreamId());
67 }
68 
LinkInput(sptr<HDI::Camera::V1_0::IStreamOperator> streamOperator,std::shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility)69 int32_t HStreamCapture::LinkInput(sptr<HDI::Camera::V1_0::IStreamOperator> streamOperator,
70     std::shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility)
71 {
72     MEDIA_INFO_LOG("HStreamCapture::LinkInput streamId:%{public}d", GetFwkStreamId());
73     return HStreamCommon::LinkInput(streamOperator, cameraAbility);
74 }
75 
FullfillPictureExtendStreamInfos(StreamInfo_V1_1 & streamInfo,int32_t format)76 void HStreamCapture::FullfillPictureExtendStreamInfos(StreamInfo_V1_1 &streamInfo, int32_t format)
77 {
78     HDI::Camera::V1_1::ExtendedStreamInfo gainmapExtendedStreamInfo = {
79         .type = static_cast<HDI::Camera::V1_1::ExtendedStreamInfoType>(HDI::Camera::V1_3::EXTENDED_STREAM_INFO_GAINMAP),
80         .width = width_,
81         .height = height_,
82         .format = format,
83         .bufferQueue = gainmapBufferQueue_,
84     };
85     HDI::Camera::V1_1::ExtendedStreamInfo deepExtendedStreamInfo = {
86         .type = static_cast<HDI::Camera::V1_1::ExtendedStreamInfoType>(HDI::Camera::V1_3::EXTENDED_STREAM_INFO_DEPTH),
87         .width = width_,
88         .height = height_,
89         .format = format,
90         .bufferQueue = deepBufferQueue_,
91     };
92     HDI::Camera::V1_1::ExtendedStreamInfo exifExtendedStreamInfo = {
93         .type = static_cast<HDI::Camera::V1_1::ExtendedStreamInfoType>(HDI::Camera::V1_3::EXTENDED_STREAM_INFO_EXIF),
94         .width = width_,
95         .height = height_,
96         .format = format,
97         .bufferQueue = exifBufferQueue_,
98     };
99     HDI::Camera::V1_1::ExtendedStreamInfo debugExtendedStreamInfo = {
100         .type =
101             static_cast<HDI::Camera::V1_1::ExtendedStreamInfoType>(HDI::Camera::V1_3::EXTENDED_STREAM_INFO_MAKER_INFO),
102         .width = width_,
103         .height = height_,
104         .format = format,
105         .bufferQueue = debugBufferQueue_,
106     };
107     std::vector<HDI::Camera::V1_1::ExtendedStreamInfo> extendedStreams = { gainmapExtendedStreamInfo,
108         deepExtendedStreamInfo, exifExtendedStreamInfo, debugExtendedStreamInfo };
109     streamInfo.extendedStreamInfos.insert(streamInfo.extendedStreamInfos.end(),
110         extendedStreams.begin(), extendedStreams.end());
111 }
112 
SetStreamInfo(StreamInfo_V1_1 & streamInfo)113 void HStreamCapture::SetStreamInfo(StreamInfo_V1_1 &streamInfo)
114 {
115     HStreamCommon::SetStreamInfo(streamInfo);
116     streamInfo.v1_0.intent_ = STILL_CAPTURE;
117     if (format_ == OHOS_CAMERA_FORMAT_HEIC) {
118         streamInfo.v1_0.encodeType_ =
119             static_cast<HDI::Camera::V1_0::EncodeType>(HDI::Camera::V1_3::ENCODE_TYPE_HEIC);
120         streamInfo.v1_0.format_ = GRAPHIC_PIXEL_FMT_BLOB;
121     } else if (format_ == OHOS_CAMERA_FORMAT_YCRCB_420_SP) { // NV21
122         streamInfo.v1_0.encodeType_ = ENCODE_TYPE_NULL;
123         if (GetMode() == static_cast<int32_t>(HDI::Camera::V1_3::OperationMode::TIMELAPSE_PHOTO)) {
124             streamInfo.v1_0.format_ = GRAPHIC_PIXEL_FMT_YCRCB_420_SP; // NV21
125         } else {
126             streamInfo.v1_0.format_ = GRAPHIC_PIXEL_FMT_YCBCR_420_SP; // NV12
127             FullfillPictureExtendStreamInfos(streamInfo, GRAPHIC_PIXEL_FMT_YCBCR_420_SP);
128         }
129     } else {
130         streamInfo.v1_0.encodeType_ = ENCODE_TYPE_JPEG;
131     }
132     if (rawDeliverySwitch_) {
133         MEDIA_INFO_LOG("HStreamCapture::SetStreamInfo Set DNG info, streamId:%{public}d", GetFwkStreamId());
134         HDI::Camera::V1_1::ExtendedStreamInfo extendedStreamInfo = {
135             .type =
136                 static_cast<HDI::Camera::V1_1::ExtendedStreamInfoType>(HDI::Camera::V1_3::EXTENDED_STREAM_INFO_RAW),
137             .width = width_,
138             .height = height_,
139             .format = streamInfo.v1_0.format_,
140             .dataspace = 0,
141             .bufferQueue = rawBufferQueue_,
142         };
143         streamInfo.extendedStreamInfos.push_back(extendedStreamInfo);
144     }
145     if (thumbnailSwitch_) {
146         HDI::Camera::V1_1::ExtendedStreamInfo extendedStreamInfo = {
147             .type = HDI::Camera::V1_1::EXTENDED_STREAM_INFO_QUICK_THUMBNAIL,
148             .width = 0,
149             .height = 0,
150             .format = 0,
151             .dataspace = 0,
152             .bufferQueue = thumbnailBufferQueue_,
153         };
154         streamInfo.extendedStreamInfos.push_back(extendedStreamInfo);
155     }
156 }
157 
SetThumbnail(bool isEnabled,const sptr<OHOS::IBufferProducer> & producer)158 int32_t HStreamCapture::SetThumbnail(bool isEnabled, const sptr<OHOS::IBufferProducer> &producer)
159 {
160     if (isEnabled && producer != nullptr) {
161         thumbnailSwitch_ = 1;
162         thumbnailBufferQueue_ = new BufferProducerSequenceable(producer);
163     } else {
164         thumbnailSwitch_ = 0;
165         thumbnailBufferQueue_ = nullptr;
166     }
167     return CAMERA_OK;
168 }
169 
EnableRawDelivery(bool enabled)170 int32_t HStreamCapture::EnableRawDelivery(bool enabled)
171 {
172     if (enabled) {
173         rawDeliverySwitch_ = 1;
174     } else {
175         rawDeliverySwitch_ = 0;
176     }
177     return CAMERA_OK;
178 }
179 
SetBufferProducerInfo(const std::string bufName,const sptr<OHOS::IBufferProducer> & producer)180 int32_t HStreamCapture::SetBufferProducerInfo(const std::string bufName, const sptr<OHOS::IBufferProducer> &producer)
181 {
182     std::string resStr = "";
183     if (bufName == "rawImage") {
184         if (producer != nullptr) {
185             rawBufferQueue_ = new BufferProducerSequenceable(producer);
186         } else {
187             rawBufferQueue_ = nullptr;
188             resStr += bufName + ",";
189         }
190     }
191     if (bufName == "gainmapImage") {
192         if (producer != nullptr) {
193             gainmapBufferQueue_ = new BufferProducerSequenceable(producer);
194         } else {
195             gainmapBufferQueue_ = nullptr;
196             resStr += bufName + ",";
197         }
198     }
199     if (bufName == "deepImage") {
200         if (producer != nullptr) {
201             deepBufferQueue_ = new BufferProducerSequenceable(producer);
202         } else {
203             deepBufferQueue_ = nullptr;
204             resStr += bufName + ",";
205         }
206     }
207     if (bufName == "exifImage") {
208         if (producer != nullptr) {
209             exifBufferQueue_ = new BufferProducerSequenceable(producer);
210         } else {
211             exifBufferQueue_ = nullptr;
212             resStr += bufName + ",";
213         }
214     }
215     if (bufName == "debugImage") {
216         if (producer != nullptr) {
217             debugBufferQueue_ = new BufferProducerSequenceable(producer);
218         } else {
219             debugBufferQueue_ = nullptr;
220             resStr += bufName + ",";
221         }
222     }
223     MEDIA_INFO_LOG("HStreamCapture::SetBufferProducerInfo bufferQueue whether is nullptr: %{public}s", resStr.c_str());
224     return CAMERA_OK;
225 }
226 
DeferImageDeliveryFor(int32_t type)227 int32_t HStreamCapture::DeferImageDeliveryFor(int32_t type)
228 {
229     MEDIA_INFO_LOG("HStreamCapture::DeferImageDeliveryFor type: %{public}d", type);
230     if (type == OHOS::HDI::Camera::V1_2::STILL_IMAGE) {
231         MEDIA_INFO_LOG("HStreamCapture STILL_IMAGE");
232         deferredPhotoSwitch_ = 1;
233     } else if (type == OHOS::HDI::Camera::V1_2::MOVING_IMAGE) {
234         MEDIA_INFO_LOG("HStreamCapture MOVING_IMAGE");
235         deferredVideoSwitch_ = 1;
236     } else {
237         MEDIA_INFO_LOG("HStreamCapture NONE");
238         deferredPhotoSwitch_ = 0;
239         deferredVideoSwitch_ = 0;
240     }
241     return CAMERA_OK;
242 }
243 
PrepareBurst(int32_t captureId)244 int32_t HStreamCapture::PrepareBurst(int32_t captureId)
245 {
246     MEDIA_INFO_LOG("HStreamCapture::PrepareBurst captureId:%{public}d", captureId);
247     isBursting_ = true;
248     std::lock_guard<std::mutex> lock(burstLock_);
249     curBurstKey_ = GenerateBurstUuid();
250     burstkeyMap_.emplace(captureId, curBurstKey_);
251     std::vector<std::string> imageList = {};
252     burstImagesMap_.emplace(captureId, imageList);
253     burstNumMap_.emplace(captureId, 0);
254     burstNum_ = 0;
255     return CAMERA_OK;
256 }
257 
ResetBurst()258 void HStreamCapture::ResetBurst()
259 {
260     MEDIA_INFO_LOG("HStreamCapture::ResetBurst");
261     curBurstKey_ = BURST_UUID_UNSET;
262     isBursting_ = false;
263 }
264 
ResetBurstKey(int32_t captureId)265 void HStreamCapture::ResetBurstKey(int32_t captureId)
266 {
267     if (burstkeyMap_.erase(captureId) > 0 &&
268         burstImagesMap_.erase(captureId) > 0 &&
269         burstNumMap_.erase(captureId) > 0) {
270         MEDIA_INFO_LOG("HStreamCapture::ResetBurstKey captureId:%{public}d", captureId);
271     } else {
272         MEDIA_DEBUG_LOG("HStreamCapture::ResetBurstKey captureId not found");
273     }
274 }
275 
GetBurstKey(int32_t captureId) const276 std::string HStreamCapture::GetBurstKey(int32_t captureId) const
277 {
278     MEDIA_DEBUG_LOG("HStreamCapture::GetBurstKey captureId:%{public}d", captureId);
279     std::string burstKey = BURST_UUID_UNSET;
280     std::lock_guard<std::mutex> lock(burstLock_);
281     auto iter = burstkeyMap_.find(captureId);
282     if (iter != burstkeyMap_.end()) {
283         burstKey = iter->second;
284         MEDIA_DEBUG_LOG("HStreamCapture::GetBurstKey %{public}s", burstKey.c_str());
285     } else {
286         MEDIA_DEBUG_LOG("HStreamCapture::GetBurstKey not found");
287     }
288     return burstKey;
289 }
290 
IsBurstCapture(int32_t captureId) const291 bool HStreamCapture::IsBurstCapture(int32_t captureId) const
292 {
293     MEDIA_DEBUG_LOG("HStreamCapture::captureId:%{public}d", captureId);
294     auto iter = burstkeyMap_.find(captureId);
295     return iter != burstkeyMap_.end();
296 }
297 
IsBurstCover(int32_t captureId) const298 bool HStreamCapture::IsBurstCover(int32_t captureId) const
299 {
300     MEDIA_DEBUG_LOG("HStreamCapture::IsBurstCover for captureId: %d", captureId);
301     std::lock_guard<std::mutex> lock(burstLock_);
302     auto iter = burstImagesMap_.find(captureId);
303     return (iter != burstImagesMap_.end()) ? (iter->second.size() == 1) : false;
304 }
305 
GetCurBurstSeq(int32_t captureId) const306 int32_t HStreamCapture::GetCurBurstSeq(int32_t captureId) const
307 {
308     MEDIA_DEBUG_LOG("HStreamCapture::GetCurBurstSeq for captureId: %d", captureId);
309     std::lock_guard<std::mutex> lock(burstLock_);
310     auto iter = burstImagesMap_.find(captureId);
311     if (iter != burstImagesMap_.end()) {
312         return iter->second.size();
313     }
314     return -1;
315 }
316 
SetBurstImages(int32_t captureId,std::string imageId)317 void HStreamCapture::SetBurstImages(int32_t captureId, std::string imageId)
318 {
319     MEDIA_DEBUG_LOG("HStreamCapture::SetBurstImages captureId:%{public}d imageId:%{public}s",
320         captureId, imageId.c_str());
321     std::lock_guard<std::mutex> lock(burstLock_);
322     auto iter = burstImagesMap_.find(captureId);
323     if (iter != burstImagesMap_.end()) {
324         iter->second.emplace_back(imageId);
325         MEDIA_DEBUG_LOG("HStreamCapture::SetBurstImages success");
326     } else {
327         MEDIA_ERR_LOG("HStreamCapture::SetBurstImages error");
328     }
329 }
330 
CheckResetBurstKey(int32_t captureId)331 void HStreamCapture::CheckResetBurstKey(int32_t captureId)
332 {
333     MEDIA_DEBUG_LOG("HStreamCapture::CheckResetBurstKey captureId:%{public}d", captureId);
334     std::lock_guard<std::mutex> lock(burstLock_);
335     auto numIter = burstNumMap_.find(captureId);
336     auto imageIter = burstImagesMap_.find(captureId);
337     if (numIter != burstNumMap_.end() && imageIter != burstImagesMap_.end()) {
338         int32_t burstSum = numIter->second;
339         size_t curBurstSum = imageIter->second.size();
340         MEDIA_DEBUG_LOG("CheckResetBurstKey: burstSum=%d, curBurstSum=%zu", burstSum, curBurstSum);
341         if (static_cast<size_t>(burstSum) == curBurstSum) {
342             ResetBurstKey(captureId);
343         }
344     } else {
345         MEDIA_DEBUG_LOG("CheckResetBurstKey: captureId %d not found in one or both maps", captureId);
346     }
347 }
348 
349 
CheckBurstCapture(const std::shared_ptr<OHOS::Camera::CameraMetadata> & captureSettings,const int32_t & preparedCaptureId)350 int32_t HStreamCapture::CheckBurstCapture(const std::shared_ptr<OHOS::Camera::CameraMetadata>& captureSettings,
351                                           const int32_t &preparedCaptureId)
352 {
353     MEDIA_INFO_LOG("CheckBurstCapture start!");
354     camera_metadata_item_t item;
355     if (captureSettings == nullptr) {
356         MEDIA_ERR_LOG("captureSettings is nullptr");
357         return CAMERA_INVALID_STATE;
358     }
359     int32_t result = OHOS::Camera::FindCameraMetadataItem(captureSettings->get(), OHOS_CONTROL_BURST_CAPTURE, &item);
360     if (result == CAM_META_SUCCESS && item.count > 0) {
361         CameraBurstCaptureEnum burstState = static_cast<CameraBurstCaptureEnum>(item.data.u8[0]);
362         MEDIA_INFO_LOG("CheckBurstCapture get burstState:%{public}d", item.data.u8[0]);
363         if (burstState) {
364             std::string burstUuid = GetBurstKey(preparedCaptureId);
365             if (burstUuid != BURST_UUID_UNSET || isBursting_) {
366                 MEDIA_ERR_LOG("CheckBurstCapture faild!");
367                 return CAMERA_INVALID_STATE;
368             }
369             PrepareBurst(preparedCaptureId);
370             MEDIA_INFO_LOG("CheckBurstCapture ready!");
371         }
372     }
373     return CAM_META_SUCCESS;
374 }
375 
Capture(const std::shared_ptr<OHOS::Camera::CameraMetadata> & captureSettings)376 int32_t HStreamCapture::Capture(const std::shared_ptr<OHOS::Camera::CameraMetadata>& captureSettings)
377 {
378     CAMERA_SYNC_TRACE;
379     MEDIA_INFO_LOG("HStreamCapture::Capture Entry, streamId:%{public}d", GetFwkStreamId());
380     auto streamOperator = GetStreamOperator();
381     CHECK_AND_RETURN_RET(streamOperator != nullptr, CAMERA_INVALID_STATE);
382     CHECK_ERROR_RETURN_RET_LOG(isCaptureReady_ == false, CAMERA_OPERATION_NOT_ALLOWED,
383         "HStreamCapture::Capture failed due to capture not ready");
384     auto preparedCaptureId = GetPreparedCaptureId();
385     CHECK_ERROR_RETURN_RET_LOG(preparedCaptureId != CAPTURE_ID_UNSET, CAMERA_INVALID_STATE,
386         "HStreamCapture::Capture, Already started with captureID: %{public}d", preparedCaptureId);
387     int32_t ret = PrepareCaptureId();
388     preparedCaptureId = GetPreparedCaptureId();
389     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK || preparedCaptureId == CAPTURE_ID_UNSET, ret,
390         "HStreamCapture::Capture Failed to allocate a captureId");
391     ret = CheckBurstCapture(captureSettings, preparedCaptureId);
392     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "HStreamCapture::Capture Failed with burst state error");
393 
394     CaptureInfo captureInfoPhoto;
395     captureInfoPhoto.streamIds_ = { GetHdiStreamId() };
396     ProcessCaptureInfoPhoto(captureInfoPhoto, captureSettings, preparedCaptureId);
397     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
398     const std::string permissionName = "ohos.permission.CAMERA";
399     AddCameraPermissionUsedRecord(callingTokenId, permissionName);
400 
401     // report capture performance dfx
402     std::shared_ptr<OHOS::Camera::CameraMetadata> captureMetadataSetting_ = nullptr;
403     OHOS::Camera::MetadataUtils::ConvertVecToMetadata(captureInfoPhoto.captureSetting_, captureMetadataSetting_);
404     DfxCaptureInfo captureInfo;
405     captureInfo.captureId = preparedCaptureId;
406     captureInfo.caller = CameraReportUtils::GetCallerInfo();
407     CameraReportUtils::GetInstance().SetCapturePerfStartInfo(captureInfo);
408     MEDIA_INFO_LOG("HStreamCapture::Capture Starting photo capture with capture ID: %{public}d", preparedCaptureId);
409     HStreamCommon::PrintCaptureDebugLog(captureMetadataSetting_);
410     CamRetCode rc = (CamRetCode)(streamOperator->Capture(preparedCaptureId, captureInfoPhoto, isBursting_));
411     if (rc != HDI::Camera::V1_0::NO_ERROR) {
412         ResetCaptureId();
413         captureIdForConfirmCapture_ = CAPTURE_ID_UNSET;
414         MEDIA_ERR_LOG("HStreamCapture::Capture failed with error Code: %{public}d", rc);
415         CameraReportUtils::ReportCameraError(
416             "HStreamCapture::Capture", rc, true, CameraReportUtils::GetCallerInfo());
417         ret = HdiToServiceError(rc);
418     }
419     camera_metadata_item_t item;
420     camera_position_enum_t cameraPosition = OHOS_CAMERA_POSITION_FRONT;
421     {
422         std::lock_guard<std::mutex> lock(cameraAbilityLock_);
423         if (cameraAbility_ == nullptr) {
424             MEDIA_ERR_LOG("HStreamCapture::cameraAbility_ is null");
425             return CAMERA_INVALID_STATE;
426         }
427         int32_t result = OHOS::Camera::FindCameraMetadataItem(cameraAbility_->get(), OHOS_ABILITY_CAMERA_POSITION,
428                                                               &item);
429         if (result == CAM_META_SUCCESS && item.count > 0) {
430             cameraPosition = static_cast<camera_position_enum_t>(item.data.u8[0]);
431         }
432     }
433 
434     int32_t NightMode = 4;
435     if (GetMode() == NightMode && cameraPosition == OHOS_CAMERA_POSITION_BACK) {
436         return ret;
437     }
438     ResetCaptureId();
439 
440     uint32_t major;
441     uint32_t minor;
442     streamOperator->GetVersion(major, minor);
443     MEDIA_INFO_LOG("streamOperator GetVersion major:%{public}d, minor:%{public}d", major, minor);
444     // intercept when streamOperatorCallback support onCaptureReady
445     if (major >= HDI_VERSION_1 && minor >= HDI_VERSION_2 && !isBursting_) {
446         MEDIA_INFO_LOG("HStreamCapture::Capture set capture not ready");
447         isCaptureReady_ = false;
448     }
449     return ret;
450 }
451 
ProcessCaptureInfoPhoto(CaptureInfo & captureInfoPhoto,const std::shared_ptr<OHOS::Camera::CameraMetadata> & captureSettings,int32_t captureId)452 void HStreamCapture::ProcessCaptureInfoPhoto(CaptureInfo& captureInfoPhoto,
453     const std::shared_ptr<OHOS::Camera::CameraMetadata>& captureSettings, int32_t captureId)
454 {
455     if (!OHOS::Camera::GetCameraMetadataItemCount(captureSettings->get())) {
456         std::lock_guard<std::mutex> lock(cameraAbilityLock_);
457         OHOS::Camera::MetadataUtils::ConvertMetadataToVec(cameraAbility_, captureInfoPhoto.captureSetting_);
458     } else {
459         OHOS::Camera::MetadataUtils::ConvertMetadataToVec(captureSettings, captureInfoPhoto.captureSetting_);
460     }
461     captureInfoPhoto.enableShutterCallback_ = true;
462     std::shared_ptr<OHOS::Camera::CameraMetadata> captureMetadataSetting_ = nullptr;
463     OHOS::Camera::MetadataUtils::ConvertVecToMetadata(captureInfoPhoto.captureSetting_, captureMetadataSetting_);
464     if (captureMetadataSetting_ != nullptr) {
465         // convert rotation with application set rotation
466         SetRotation(captureMetadataSetting_, captureId);
467 
468         // update settings
469         std::vector<uint8_t> finalSetting;
470         OHOS::Camera::MetadataUtils::ConvertMetadataToVec(captureMetadataSetting_, finalSetting);
471         captureInfoPhoto.captureSetting_ = finalSetting;
472     }
473 }
474 
SetRotation(const std::shared_ptr<OHOS::Camera::CameraMetadata> & captureMetadataSetting_,int32_t captureId)475 void HStreamCapture::SetRotation(const std::shared_ptr<OHOS::Camera::CameraMetadata> &captureMetadataSetting_,
476     int32_t captureId)
477 {
478     // set orientation for capture
479     // sensor orientation, counter-clockwise rotation
480     int32_t sensorOrientation = 0;
481     int result;
482     camera_metadata_item_t item;
483     {
484         std::lock_guard<std::mutex> lock(cameraAbilityLock_);
485         if (cameraAbility_ == nullptr) {
486             return;
487         }
488         result = OHOS::Camera::FindCameraMetadataItem(cameraAbility_->get(), OHOS_SENSOR_ORIENTATION, &item);
489         if (result == CAM_META_SUCCESS && item.count > 0) {
490             sensorOrientation = item.data.i32[0];
491         }
492         MEDIA_INFO_LOG("set rotation sensor orientation %{public}d", sensorOrientation);
493 
494         camera_position_enum_t cameraPosition = OHOS_CAMERA_POSITION_BACK;
495         result = OHOS::Camera::FindCameraMetadataItem(cameraAbility_->get(), OHOS_ABILITY_CAMERA_POSITION, &item);
496         if (result == CAM_META_SUCCESS && item.count > 0) {
497             cameraPosition = static_cast<camera_position_enum_t>(item.data.u8[0]);
498         }
499         MEDIA_INFO_LOG("set rotation camera position %{public}d", cameraPosition);
500     }
501 
502     // rotation from application
503     int32_t rotationValue = 0;
504     result = OHOS::Camera::FindCameraMetadataItem(captureMetadataSetting_->get(), OHOS_JPEG_ORIENTATION, &item);
505     if (result == CAM_META_SUCCESS && item.count > 0) {
506         rotationValue = item.data.i32[0];
507     }
508     MEDIA_INFO_LOG("set rotation app rotationValue %{public}d", rotationValue);
509     rotationMap_.EnsureInsert(captureId, rotationValue);
510     // real rotation
511     int32_t rotation = sensorOrientation + rotationValue;
512     if (rotation >= CAPTURE_ROTATE_360) {
513         rotation = rotation - CAPTURE_ROTATE_360;
514     }
515     {
516         uint8_t connectType = 0;
517         std::lock_guard<std::mutex> lock(cameraAbilityLock_);
518         if (cameraAbility_ == nullptr) {
519             return;
520         }
521         int ret = OHOS::Camera::FindCameraMetadataItem(
522             cameraAbility_->get(), OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &item);
523         if (ret == CAM_META_SUCCESS && item.count > 0) {
524             connectType = item.data.u8[0];
525         }
526         if (connectType == OHOS_CAMERA_CONNECTION_TYPE_REMOTE) {
527             rotation = rotationValue;
528         }
529         MEDIA_INFO_LOG("set rotation camera real rotation %{public}d", rotation);
530     }
531 
532     bool status = false;
533     if (result == CAM_META_ITEM_NOT_FOUND) {
534         status = captureMetadataSetting_->addEntry(OHOS_JPEG_ORIENTATION, &rotation, 1);
535     } else if (result == CAM_META_SUCCESS) {
536         status = captureMetadataSetting_->updateEntry(OHOS_JPEG_ORIENTATION, &rotation, 1);
537     }
538     result = OHOS::Camera::FindCameraMetadataItem(captureMetadataSetting_->get(), OHOS_JPEG_ORIENTATION, &item);
539     if (result != CAM_META_SUCCESS) {
540         MEDIA_ERR_LOG("set rotation Failed to find OHOS_JPEG_ORIENTATION tag");
541     }
542     CHECK_ERROR_PRINT_LOG(!status, "set rotation Failed to set Rotation");
543 }
544 
CancelCapture()545 int32_t HStreamCapture::CancelCapture()
546 {
547     CAMERA_SYNC_TRACE;
548     // Cancel capture is dummy till continuous/burst mode is supported
549     StopStream();
550     return CAMERA_OK;
551 }
552 
SetMode(int32_t modeName)553 void HStreamCapture::SetMode(int32_t modeName)
554 {
555     modeName_ = modeName;
556     MEDIA_INFO_LOG("HStreamCapture SetMode modeName = %{public}d", modeName);
557 }
558 
GetMode()559 int32_t HStreamCapture::GetMode()
560 {
561     MEDIA_INFO_LOG("HStreamCapture GetMode modeName = %{public}d", modeName_);
562     return modeName_;
563 }
564 
ConfirmCapture()565 int32_t HStreamCapture::ConfirmCapture()
566 {
567     CAMERA_SYNC_TRACE;
568     auto streamOperator = GetStreamOperator();
569     CHECK_ERROR_RETURN_RET(streamOperator == nullptr, CAMERA_INVALID_STATE);
570     int32_t ret = 0;
571 
572     // end burst capture
573     if (isBursting_) {
574         MEDIA_INFO_LOG("HStreamCapture::ConfirmCapture when burst capture");
575         std::vector<uint8_t> settingVector;
576         std::shared_ptr<OHOS::Camera::CameraMetadata> burstCaptureSettings = nullptr;
577         OHOS::Camera::MetadataUtils::ConvertMetadataToVec(cameraAbility_, settingVector);
578         OHOS::Camera::MetadataUtils::ConvertVecToMetadata(settingVector, burstCaptureSettings);
579         EndBurstCapture(burstCaptureSettings);
580         ret = Capture(burstCaptureSettings);
581         if (ret != CAMERA_OK) {
582             MEDIA_ERR_LOG("HStreamCapture::ConfirmCapture end burst faild!");
583         }
584         return ret;
585     }
586 
587     auto preparedCaptureId = captureIdForConfirmCapture_;
588     MEDIA_INFO_LOG("HStreamCapture::ConfirmCapture with capture ID: %{public}d", preparedCaptureId);
589     sptr<HDI::Camera::V1_2::IStreamOperator> streamOperatorV1_2 =
590         OHOS::HDI::Camera::V1_2::IStreamOperator::CastFrom(streamOperator);
591     CHECK_ERROR_RETURN_RET_LOG(streamOperatorV1_2 == nullptr, CAMERA_UNKNOWN_ERROR,
592         "HStreamCapture::ConfirmCapture streamOperatorV1_2 castFrom failed!");
593     OHOS::HDI::Camera::V1_2::CamRetCode rc =
594         (HDI::Camera::V1_2::CamRetCode)(streamOperatorV1_2->ConfirmCapture(preparedCaptureId));
595     if (rc != HDI::Camera::V1_2::NO_ERROR) {
596         MEDIA_ERR_LOG("HStreamCapture::ConfirmCapture failed with error Code: %{public}d", rc);
597         ret = HdiToServiceErrorV1_2(rc);
598     }
599     ResetCaptureId();
600     captureIdForConfirmCapture_ = CAPTURE_ID_UNSET;
601     return ret;
602 }
603 
EndBurstCapture(const std::shared_ptr<OHOS::Camera::CameraMetadata> & captureMetadataSetting)604 void HStreamCapture::EndBurstCapture(const std::shared_ptr<OHOS::Camera::CameraMetadata>& captureMetadataSetting)
605 {
606     CHECK_ERROR_RETURN(captureMetadataSetting == nullptr);
607     MEDIA_INFO_LOG("HStreamCapture::EndBurstCapture");
608     camera_metadata_item_t item;
609     bool status = false;
610     int result = OHOS::Camera::FindCameraMetadataItem(captureMetadataSetting->get(), OHOS_CONTROL_BURST_CAPTURE, &item);
611     uint8_t burstState = 0;
612     if (result == CAM_META_ITEM_NOT_FOUND) {
613         status = captureMetadataSetting->addEntry(OHOS_CONTROL_BURST_CAPTURE, &burstState, 1);
614     } else if (result == CAM_META_SUCCESS) {
615         status = captureMetadataSetting->updateEntry(OHOS_CONTROL_BURST_CAPTURE, &burstState, 1);
616     }
617 
618     if (!status) {
619         MEDIA_ERR_LOG("HStreamCapture::EndBurstCapture Failed");
620     }
621 }
622 
Release()623 int32_t HStreamCapture::Release()
624 {
625     return ReleaseStream(false);
626 }
627 
ReleaseStream(bool isDelay)628 int32_t HStreamCapture::ReleaseStream(bool isDelay)
629 {
630     {
631         std::lock_guard<std::mutex> lock(callbackLock_);
632         streamCaptureCallback_ = nullptr;
633     }
634     return HStreamCommon::ReleaseStream(isDelay);
635 }
636 
SetCallback(sptr<IStreamCaptureCallback> & callback)637 int32_t HStreamCapture::SetCallback(sptr<IStreamCaptureCallback> &callback)
638 {
639     CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG, "HStreamCapture::SetCallback input is null");
640     std::lock_guard<std::mutex> lock(callbackLock_);
641     streamCaptureCallback_ = callback;
642     return CAMERA_OK;
643 }
644 
OnCaptureStarted(int32_t captureId)645 int32_t HStreamCapture::OnCaptureStarted(int32_t captureId)
646 {
647     CAMERA_SYNC_TRACE;
648     std::lock_guard<std::mutex> lock(callbackLock_);
649     if (streamCaptureCallback_ != nullptr) {
650         streamCaptureCallback_->OnCaptureStarted(captureId);
651     }
652     return CAMERA_OK;
653 }
654 
OnCaptureStarted(int32_t captureId,uint32_t exposureTime)655 int32_t HStreamCapture::OnCaptureStarted(int32_t captureId, uint32_t exposureTime)
656 {
657     CAMERA_SYNC_TRACE;
658     std::lock_guard<std::mutex> lock(callbackLock_);
659     if (streamCaptureCallback_ != nullptr) {
660         streamCaptureCallback_->OnCaptureStarted(captureId, exposureTime);
661     }
662     return CAMERA_OK;
663 }
664 
OnCaptureEnded(int32_t captureId,int32_t frameCount)665 int32_t HStreamCapture::OnCaptureEnded(int32_t captureId, int32_t frameCount)
666 {
667     CAMERA_SYNC_TRACE;
668     std::lock_guard<std::mutex> lock(callbackLock_);
669     if (streamCaptureCallback_ != nullptr) {
670         streamCaptureCallback_->OnCaptureEnded(captureId, frameCount);
671     }
672     CameraReportUtils::GetInstance().SetCapturePerfEndInfo(captureId);
673     auto preparedCaptureId = GetPreparedCaptureId();
674     if (preparedCaptureId != CAPTURE_ID_UNSET) {
675         MEDIA_INFO_LOG("HStreamCapture::OnCaptureEnded capturId = %{public}d already used, need release",
676                        preparedCaptureId);
677         ResetCaptureId();
678         captureIdForConfirmCapture_ = CAPTURE_ID_UNSET;
679     }
680     return CAMERA_OK;
681 }
682 
OnCaptureError(int32_t captureId,int32_t errorCode)683 int32_t HStreamCapture::OnCaptureError(int32_t captureId, int32_t errorCode)
684 {
685     std::lock_guard<std::mutex> lock(callbackLock_);
686     if (streamCaptureCallback_ != nullptr) {
687         int32_t captureErrorCode;
688         if (errorCode == BUFFER_LOST) {
689             captureErrorCode = CAMERA_STREAM_BUFFER_LOST;
690         } else {
691             captureErrorCode = CAMERA_UNKNOWN_ERROR;
692         }
693         CAMERA_SYSEVENT_FAULT(CreateMsg("Photo OnCaptureError! captureId:%d & "
694                                         "errorCode:%{public}d", captureId, captureErrorCode));
695         streamCaptureCallback_->OnCaptureError(captureId, captureErrorCode);
696     }
697     auto preparedCaptureId = GetPreparedCaptureId();
698     if (preparedCaptureId != CAPTURE_ID_UNSET) {
699         MEDIA_INFO_LOG("HStreamCapture::OnCaptureError capturId = %{public}d already used, need release",
700                        preparedCaptureId);
701         ResetCaptureId();
702         captureIdForConfirmCapture_ = CAPTURE_ID_UNSET;
703     }
704     return CAMERA_OK;
705 }
706 
OnFrameShutter(int32_t captureId,uint64_t timestamp)707 int32_t HStreamCapture::OnFrameShutter(int32_t captureId, uint64_t timestamp)
708 {
709     CAMERA_SYNC_TRACE;
710     std::lock_guard<std::mutex> lock(callbackLock_);
711     if (streamCaptureCallback_ != nullptr) {
712         streamCaptureCallback_->OnFrameShutter(captureId, timestamp);
713     }
714     return CAMERA_OK;
715 }
716 
OnFrameShutterEnd(int32_t captureId,uint64_t timestamp)717 int32_t HStreamCapture::OnFrameShutterEnd(int32_t captureId, uint64_t timestamp)
718 {
719     CAMERA_SYNC_TRACE;
720     std::lock_guard<std::mutex> lock(callbackLock_);
721     if (streamCaptureCallback_ != nullptr) {
722         streamCaptureCallback_->OnFrameShutterEnd(captureId, timestamp);
723     }
724     if (isBursting_) {
725         burstNum_++;
726         MEDIA_DEBUG_LOG("HStreamCapture::OnFrameShutterEnd burstNum:%{public}d", burstNum_);
727     }
728     return CAMERA_OK;
729 }
730 
731 
OnCaptureReady(int32_t captureId,uint64_t timestamp)732 int32_t HStreamCapture::OnCaptureReady(int32_t captureId, uint64_t timestamp)
733 {
734     CAMERA_SYNC_TRACE;
735     std::lock_guard<std::mutex> lock(callbackLock_);
736     MEDIA_INFO_LOG("HStreamCapture::Capture, notify OnCaptureReady with capture ID: %{public}d", captureId);
737     isCaptureReady_ = true;
738     if (streamCaptureCallback_ != nullptr) {
739         streamCaptureCallback_->OnCaptureReady(captureId, timestamp);
740     }
741     std::lock_guard<std::mutex> burstLock(burstLock_);
742     if (IsBurstCapture(captureId)) {
743         burstNumMap_[captureId] = burstNum_;
744         ResetBurst();
745     }
746     return CAMERA_OK;
747 }
748 
DumpStreamInfo(CameraInfoDumper & infoDumper)749 void HStreamCapture::DumpStreamInfo(CameraInfoDumper& infoDumper)
750 {
751     infoDumper.Title("capture stream");
752     infoDumper.Msg("ThumbnailSwitch:[" + std::to_string(thumbnailSwitch_) + "]");
753     infoDumper.Msg("RawDeliverSwitch:[" + std::to_string(rawDeliverySwitch_) + "]");
754     if (thumbnailBufferQueue_) {
755         infoDumper.Msg(
756             "ThumbnailBuffer producer Id:[" + std::to_string(thumbnailBufferQueue_->producer_->GetUniqueId()) + "]");
757     }
758     HStreamCommon::DumpStreamInfo(infoDumper);
759 }
760 
OperatePermissionCheck(uint32_t interfaceCode)761 int32_t HStreamCapture::OperatePermissionCheck(uint32_t interfaceCode)
762 {
763     switch (static_cast<StreamCaptureInterfaceCode>(interfaceCode)) {
764         case CAMERA_STREAM_CAPTURE_START: {
765             auto callerToken = IPCSkeleton::GetCallingTokenID();
766             if (callerToken_ != callerToken) {
767                 MEDIA_ERR_LOG("HStreamCapture::OperatePermissionCheck fail, callerToken not legal");
768                 return CAMERA_OPERATION_NOT_ALLOWED;
769             }
770             break;
771         }
772         default:
773             break;
774     }
775     return CAMERA_OK;
776 }
777 
IsDeferredPhotoEnabled()778 int32_t HStreamCapture::IsDeferredPhotoEnabled()
779 {
780     MEDIA_INFO_LOG("HStreamCapture IsDeferredPhotoEnabled  deferredPhotoSwitch_: %{public}d", deferredPhotoSwitch_);
781     if (deferredPhotoSwitch_ == 1) {
782         return 1;
783     }
784     MEDIA_INFO_LOG("HStreamCapture IsDeferredPhotoEnabled return 0");
785     return 0;
786 }
787 
IsDeferredVideoEnabled()788 int32_t HStreamCapture::IsDeferredVideoEnabled()
789 {
790     MEDIA_INFO_LOG("HStreamCapture IsDeferredVideoEnabled  deferredVideoSwitch_: %{public}d", deferredVideoSwitch_);
791     if (deferredVideoSwitch_ == 1) {
792         return 1;
793     }
794     return 0;
795 }
796 
GetMovingPhotoVideoCodecType()797 int32_t HStreamCapture::GetMovingPhotoVideoCodecType()
798 {
799     MEDIA_INFO_LOG("HStreamCapture GetMovingPhotoVideoCodecType videoCodecType_: %{public}d", videoCodecType_);
800     return videoCodecType_;
801 }
802 
SetMovingPhotoVideoCodecType(int32_t videoCodecType)803 int32_t HStreamCapture::SetMovingPhotoVideoCodecType(int32_t videoCodecType)
804 {
805     MEDIA_INFO_LOG("HStreamCapture SetMovingPhotoVideoCodecType videoCodecType_: %{public}d", videoCodecType);
806     videoCodecType_ = videoCodecType;
807     return 0;
808 }
809 } // namespace CameraStandard
810 } // namespace OHOS
811