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