1 /*
2 * Copyright (c) 2021-2025 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_operator.h"
17
18 #include <algorithm>
19 #include <atomic>
20 #include <cerrno>
21 #include <cinttypes>
22 #include <cstddef>
23 #include <cstdint>
24 #include <functional>
25 #include <memory>
26 #include <mutex>
27 #include <new>
28 #include <sched.h>
29 #include <string>
30 #include <map>
31 #include <sync_fence.h>
32 #include <utility>
33 #include <vector>
34
35 #include "blocking_queue.h"
36 #include "bundle_mgr_interface.h"
37 #include "camera_dynamic_loader.h"
38 #include "camera_info_dumper.h"
39 #include "camera_log.h"
40 #include "camera_report_uitls.h"
41 #include "camera_server_photo_proxy.h"
42 #include "camera_timer.h"
43 #include "camera_util.h"
44 #include "datetime_ex.h"
45 #include "deferred_processing_service.h"
46 #include "display/composer/v1_1/display_composer_type.h"
47 #include "display_manager.h"
48 #include "errors.h"
49 #include "fixed_size_list.h"
50 #include "hcamera_device_manager.h"
51 #include "hcamera_restore_param.h"
52 #include "hstream_capture.h"
53 #include "hstream_common.h"
54 #include "hstream_depth_data.h"
55 #include "hstream_metadata.h"
56 #include "hstream_repeat.h"
57 #include "icamera_util.h"
58 #include "icapture_session.h"
59 #include "iconsumer_surface.h"
60 #include "image_type.h"
61 #include "ipc_skeleton.h"
62 #include "iservice_registry.h"
63 #include "istream_common.h"
64 #include "media_library/photo_asset_interface.h"
65 #include "media_library/photo_asset_proxy.h"
66 #include "metadata_utils.h"
67 #include "moving_photo_proxy.h"
68 #include "parameters.h"
69 #include "picture_interface.h"
70 #include "refbase.h"
71 #include "smooth_zoom.h"
72 #include "surface.h"
73 #include "surface_buffer.h"
74 #include "system_ability_definition.h"
75 #include "v1_0/types.h"
76 #include "camera_report_dfx_uitls.h"
77 #include "hstream_operator_manager.h"
78 #include "res_type.h"
79 #include "res_sched_client.h"
80 #include "camera_device_ability_items.h"
81 #include "session/capture_scene_const.h"
82 #include "moving_photo_interface.h"
83 #ifdef HOOK_CAMERA_OPERATOR
84 #include "camera_rotate_plugin.h"
85 #endif
86
87 using namespace OHOS::AAFwk;
88 namespace OHOS {
89 namespace CameraStandard {
90 using namespace OHOS::HDI::Display::Composer::V1_1;
91 namespace {
92 #ifdef CAMERA_USE_SENSOR
93 constexpr int32_t POSTURE_INTERVAL = 100000000; //100ms
94 constexpr int VALID_INCLINATION_ANGLE_THRESHOLD_COEFFICIENT = 3;
95 constexpr int32_t ROTATION_45_DEGREES = 45;
96 constexpr int32_t ROTATION_90_DEGREES = 90;
97 constexpr int32_t ROTATION_360_DEGREES = 360;
98 #endif
99 static GravityData gravityData = {0.0, 0.0, 0.0};
100 static int32_t sensorRotation = 0;
101 } // namespace
102
103 constexpr int32_t IMAGE_SHOT_TYPE = 0;
104 constexpr int32_t MOVING_PHOTO_SHOT_TYPE = 2;
105 constexpr int32_t BURST_SHOT_TYPE = 3;
106 static bool g_isNeedFilterMetadata = false;
107
NewInstance(const uint32_t callerToken,int32_t opMode)108 sptr<HStreamOperator> HStreamOperator::NewInstance(const uint32_t callerToken, int32_t opMode)
109 {
110 sptr<HStreamOperator> hStreamOperator = new HStreamOperator();
111 CHECK_RETURN_RET(hStreamOperator->Initialize(callerToken, opMode) == CAMERA_OK, hStreamOperator);
112 return nullptr;
113 }
114
Initialize(const uint32_t callerToken,int32_t opMode)115 int32_t HStreamOperator::Initialize(const uint32_t callerToken, int32_t opMode)
116 {
117 pid_ = IPCSkeleton::GetCallingPid();
118 uid_ = static_cast<uint32_t>(IPCSkeleton::GetCallingUid());
119 callerToken_ = callerToken;
120 opMode_ = opMode;
121 MEDIA_INFO_LOG(
122 "HStreamOperator::opMode_= %{public}d", opMode_);
123 InitDefaultColortSpace(static_cast<SceneMode>(opMode));
124 return CAMERA_OK;
125 }
126
InitDefaultColortSpace(SceneMode opMode)127 void HStreamOperator::InitDefaultColortSpace(SceneMode opMode)
128 {
129 static const std::unordered_map<SceneMode, ColorSpace> colorSpaceMap = {
130 {SceneMode::NORMAL, ColorSpace::SRGB},
131 {SceneMode::CAPTURE, ColorSpace::SRGB},
132 {SceneMode::VIDEO, ColorSpace::BT709_LIMIT},
133 {SceneMode::PORTRAIT, ColorSpace::DISPLAY_P3},
134 {SceneMode::NIGHT, ColorSpace::DISPLAY_P3},
135 {SceneMode::PROFESSIONAL, ColorSpace::DISPLAY_P3},
136 {SceneMode::SLOW_MOTION, ColorSpace::BT709_LIMIT},
137 {SceneMode::SCAN, ColorSpace::BT709_LIMIT},
138 {SceneMode::CAPTURE_MACRO, ColorSpace::DISPLAY_P3},
139 {SceneMode::VIDEO_MACRO, ColorSpace::BT709_LIMIT},
140 {SceneMode::PROFESSIONAL_PHOTO, ColorSpace::DISPLAY_P3},
141 {SceneMode::PROFESSIONAL_VIDEO, ColorSpace::BT709_LIMIT},
142 {SceneMode::HIGH_FRAME_RATE, ColorSpace::BT709_LIMIT},
143 {SceneMode::HIGH_RES_PHOTO, ColorSpace::DISPLAY_P3},
144 {SceneMode::SECURE, ColorSpace::SRGB},
145 {SceneMode::QUICK_SHOT_PHOTO, ColorSpace::DISPLAY_P3},
146 {SceneMode::LIGHT_PAINTING, ColorSpace::DISPLAY_P3},
147 {SceneMode::PANORAMA_PHOTO, ColorSpace::DISPLAY_P3},
148 {SceneMode::TIMELAPSE_PHOTO, ColorSpace::BT709_LIMIT},
149 {SceneMode::APERTURE_VIDEO, ColorSpace::BT709_LIMIT},
150 {SceneMode::FLUORESCENCE_PHOTO, ColorSpace::DISPLAY_P3},
151 };
152 auto it = colorSpaceMap.find(opMode);
153 currColorSpace_ = it != colorSpaceMap.end() ? it->second : ColorSpace::SRGB;
154 MEDIA_DEBUG_LOG("HStreamOperator::InitDefaultColortSpace colorSpace:%{public}d", currColorSpace_);
155 }
156
HStreamOperator()157 HStreamOperator::HStreamOperator()
158 {
159 pid_ = 0;
160 uid_ = 0;
161 callerToken_ = 0;
162 opMode_ = 0;
163 }
164
HStreamOperator(const uint32_t callingTokenId,int32_t opMode)165 HStreamOperator::HStreamOperator(const uint32_t callingTokenId, int32_t opMode)
166 {
167 Initialize(callingTokenId, opMode);
168 ResetHdiStreamId();
169 }
170
~HStreamOperator()171 HStreamOperator::~HStreamOperator()
172 {
173 CAMERA_SYNC_TRACE;
174 {
175 std::lock_guard<std::mutex> lock(motionPhotoStatusLock_);
176 curMotionPhotoStatus_.clear();
177 }
178 Release();
179 }
180
GetCurrentStreamInfos(std::vector<StreamInfo_V1_1> & streamInfos)181 int32_t HStreamOperator::GetCurrentStreamInfos(std::vector<StreamInfo_V1_1>& streamInfos)
182 {
183 auto streams = streamContainer_.GetAllStreams();
184 for (auto& stream : streams) {
185 if (stream) { // LCOV_EXCL_LINE
186 StreamInfo_V1_1 curStreamInfo;
187 stream->SetStreamInfo(curStreamInfo);
188 CHECK_EXECUTE(stream->GetStreamType() != StreamType::METADATA, streamInfos.push_back(curStreamInfo));
189 }
190 }
191 return CAMERA_OK;
192 }
193
AddOutputStream(sptr<HStreamCommon> stream)194 int32_t HStreamOperator::AddOutputStream(sptr<HStreamCommon> stream)
195 {
196 CAMERA_SYNC_TRACE;
197 CHECK_RETURN_RET_ELOG(stream == nullptr, CAMERA_INVALID_ARG,
198 "HStreamOperator::AddOutputStream stream is null");
199 MEDIA_INFO_LOG("HStreamOperator::AddOutputStream streamId:%{public}d streamType:%{public}d",
200 stream->GetFwkStreamId(), stream->GetStreamType());
201 CHECK_RETURN_RET_ELOG(
202 stream->GetFwkStreamId() == STREAM_ID_UNSET && stream->GetStreamType() != StreamType::METADATA,
203 CAMERA_INVALID_ARG, "HStreamOperator::AddOutputStream stream is released!");
204 bool isAddSuccess = streamContainer_.AddStream(stream);
205 CHECK_RETURN_RET_ELOG(!isAddSuccess, CAMERA_INVALID_SESSION_CFG,
206 "HStreamOperator::AddOutputStream add stream fail");
207 if (stream->GetStreamType() == StreamType::CAPTURE) {
208 auto captureStream = CastStream<HStreamCapture>(stream);
209 captureStream->SetMode(opMode_);
210 }
211 MEDIA_INFO_LOG("HCaptureSession::AddOutputStream stream colorSpace:%{public}d", currColorSpace_);
212 stream->SetColorSpace(currColorSpace_);
213 return CAMERA_OK;
214 }
215
StartMovingPhotoStream(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)216 void HStreamOperator::StartMovingPhotoStream(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings)
217 {
218 int32_t errorCode = 0;
219 auto repeatStreams = streamContainer_.GetStreams(StreamType::REPEAT);
220 bool isPreviewStarted = std::any_of(repeatStreams.begin(), repeatStreams.end(), [](auto& stream) {
221 auto curStreamRepeat = CastStream<HStreamRepeat>(stream);
222 auto repeatType = curStreamRepeat->GetRepeatStreamType();
223 CHECK_RETURN_RET(repeatType != RepeatStreamType::PREVIEW, false);
224 return curStreamRepeat->GetPreparedCaptureId() != CAPTURE_ID_UNSET && curStreamRepeat->producer_ != nullptr;
225 });
226 CHECK_RETURN_ELOG(!isPreviewStarted, "EnableMovingPhoto, preview is not streaming");
227 auto itLivePhotoStream = std::find_if(repeatStreams.begin(), repeatStreams.end(), [](auto& stream) {
228 auto curStreamRepeat = CastStream<HStreamRepeat>(stream);
229 auto repeatType = curStreamRepeat->GetRepeatStreamType();
230 return repeatType == RepeatStreamType::LIVEPHOTO;
231 });
232 CHECK_RETURN_ELOG(
233 itLivePhotoStream == repeatStreams.end(), "EnableMovingPhoto, not found LIVEPHOTO repeat stream");
234 auto livePhotoStream = CastStream<HStreamRepeat>(*itLivePhotoStream);
235 if (isSetMotionPhoto_) {
236 errorCode = livePhotoStream->Start(settings);
237 #ifdef MOVING_PHOTO_ADD_AUDIO
238 std::lock_guard<std::mutex> lock(movingPhotoStatusLock_);
239 audioCapturerSessionProxy_ && audioCapturerSessionProxy_->StartAudioCapture();
240 #endif
241 } else {
242 errorCode = livePhotoStream->Stop();
243 StopMovingPhoto();
244 }
245
246 MEDIA_INFO_LOG("HStreamOperator::StartMovingPhotoStream result:%{public}d", errorCode);
247 }
248
RegisterDisplayListener(sptr<HStreamRepeat> repeat)249 void HStreamOperator::RegisterDisplayListener(sptr<HStreamRepeat> repeat)
250 {
251 if (displayListener_ == nullptr) {
252 displayListener_ = new DisplayRotationListener();
253 OHOS::Rosen::DisplayManager::GetInstance().RegisterDisplayListener(displayListener_);
254 }
255 displayListener_->AddHstreamRepeatForListener(repeat);
256 }
257
UnRegisterDisplayListener(sptr<HStreamRepeat> repeatStream)258 void HStreamOperator::UnRegisterDisplayListener(sptr<HStreamRepeat> repeatStream)
259 {
260 CHECK_EXECUTE(displayListener_, displayListener_->RemoveHstreamRepeatForListener(repeatStream));
261 }
262
SetPreviewRotation(const std::string & deviceClass)263 int32_t HStreamOperator::SetPreviewRotation(const std::string &deviceClass)
264 {
265 enableStreamRotate_ = true;
266 deviceClass_ = deviceClass;
267 return CAMERA_OK;
268 }
269
AddOutput(StreamType streamType,sptr<IStreamCommon> stream)270 int32_t HStreamOperator::AddOutput(StreamType streamType, sptr<IStreamCommon> stream)
271 {
272 int32_t errorCode = CAMERA_INVALID_ARG;
273 if (stream == nullptr) {
274 MEDIA_ERR_LOG("HStreamOperator::AddOutput stream is null");
275 CameraReportUtils::ReportCameraError(
276 "HStreamOperator::AddOutput", errorCode, false, CameraReportUtils::GetCallerInfo());
277 return errorCode;
278 }
279 // Temp hack to fix the library linking issue
280 sptr<IConsumerSurface> captureSurface = IConsumerSurface::Create();
281 if (streamType == StreamType::CAPTURE) {
282 HStreamCapture* captureSteam = static_cast<HStreamCapture*>(stream.GetRefPtr());
283 errorCode = AddOutputStream(captureSteam);
284 captureSteam->SetStreamOperator(this);
285 } else if (streamType == StreamType::REPEAT) {
286 HStreamRepeat* repeatSteam = static_cast<HStreamRepeat*>(stream.GetRefPtr());
287 if (enableStreamRotate_ && repeatSteam != nullptr &&
288 repeatSteam->GetRepeatStreamType() == RepeatStreamType::PREVIEW) {
289 RegisterDisplayListener(repeatSteam);
290 repeatSteam->SetPreviewRotation(deviceClass_);
291 }
292 errorCode = AddOutputStream(repeatSteam);
293 } else if (streamType == StreamType::METADATA) {
294 errorCode = AddOutputStream(static_cast<HStreamMetadata*>(stream.GetRefPtr()));
295 } else if (streamType == StreamType::DEPTH) {
296 errorCode = AddOutputStream(static_cast<HStreamDepthData*>(stream.GetRefPtr()));
297 }
298 MEDIA_INFO_LOG("HStreamOperator::AddOutput with with %{public}d, rc = %{public}d", streamType, errorCode);
299 return errorCode;
300 }
301
RemoveOutput(StreamType streamType,sptr<IStreamCommon> stream)302 int32_t HStreamOperator::RemoveOutput(StreamType streamType, sptr<IStreamCommon> stream)
303 {
304 int32_t errorCode = CAMERA_INVALID_ARG;
305 if (stream == nullptr) {
306 MEDIA_ERR_LOG("HStreamOperator::RemoveOutput stream is null");
307 CameraReportUtils::ReportCameraError(
308 "HStreamOperator::RemoveOutput", errorCode, false, CameraReportUtils::GetCallerInfo());
309 return errorCode;
310 }
311 if (streamType == StreamType::CAPTURE) {
312 errorCode = RemoveOutputStream(static_cast<HStreamCapture*>(stream.GetRefPtr()));
313 } else if (streamType == StreamType::REPEAT) {
314 HStreamRepeat* repeatSteam = static_cast<HStreamRepeat*>(stream.GetRefPtr());
315 if (enableStreamRotate_ && repeatSteam != nullptr &&
316 repeatSteam->GetRepeatStreamType() == RepeatStreamType::PREVIEW) {
317 UnRegisterDisplayListener(repeatSteam);
318 }
319 errorCode = RemoveOutputStream(repeatSteam);
320 } else if (streamType == StreamType::METADATA) {
321 errorCode = RemoveOutputStream(static_cast<HStreamMetadata*>(stream.GetRefPtr()));
322 }
323 return errorCode;
324 }
325
RemoveOutputStream(sptr<HStreamCommon> stream)326 int32_t HStreamOperator::RemoveOutputStream(sptr<HStreamCommon> stream)
327 {
328 CAMERA_SYNC_TRACE;
329 CHECK_RETURN_RET_ELOG(stream == nullptr, CAMERA_INVALID_ARG,
330 "HStreamOperator::RemoveOutputStream stream is null");
331 MEDIA_INFO_LOG("HStreamOperator::RemoveOutputStream,streamType:%{public}d, streamId:%{public}d",
332 stream->GetStreamType(), stream->GetFwkStreamId());
333 bool isRemoveSuccess = streamContainer_.RemoveStream(stream);
334 CHECK_RETURN_RET_ELOG(!isRemoveSuccess, CAMERA_INVALID_SESSION_CFG,
335 "HStreamOperator::RemoveOutputStream Invalid output");
336 if (stream->GetStreamType() != StreamType::CAPTURE) {
337 return CAMERA_OK;
338 }
339 HStreamCapture* captureSteam = static_cast<HStreamCapture*>(stream.GetRefPtr());
340 if (captureSteam != nullptr && captureSteam->IsHasEnableOfflinePhoto()) {
341 bool isAddSuccess = streamContainerOffline_.AddStream(stream);
342 MEDIA_INFO_LOG("HStreamOperator::RemoveOutputStream,streamsize:%{public}zu",
343 streamContainerOffline_.Size());
344 if (streamContainerOffline_.Size() > 0) {
345 auto allStream = streamContainerOffline_.GetAllStreams();
346 for (auto& streamTemp : allStream) {
347 MEDIA_INFO_LOG("HStreamOperator::RemoveOutputStream fkwstreamid is %{public}d hdistreamid"
348 "is %{public}d", streamTemp->GetFwkStreamId(), streamTemp->GetHdiStreamId());
349 }
350 }
351 captureSteam->SwitchToOffline();
352 CHECK_RETURN_RET_ELOG(!isAddSuccess, CAMERA_INVALID_SESSION_CFG,
353 "HStreamOperator::AddOutputStream add stream fail");
354 }
355 return CAMERA_OK;
356 }
357
GetAllStreams()358 std::list<sptr<HStreamCommon>> HStreamOperator::GetAllStreams()
359 {
360 return streamContainer_.GetAllStreams();
361 }
362
GetStreamsSize()363 int32_t HStreamOperator::GetStreamsSize()
364 {
365 return streamContainer_.Size();
366 }
367
GetStreamOperator()368 void HStreamOperator::GetStreamOperator()
369 {
370 if (cameraDevice_ == nullptr) {
371 MEDIA_INFO_LOG("HStreamOperator::GetStreamOperator cameraDevice_ is nullptr");
372 return;
373 }
374 std::lock_guard<std::mutex> lock(streamOperatorLock_);
375 CHECK_RETURN(streamOperator_ != nullptr);
376 cameraDevice_->GetStreamOperator(this, streamOperator_);
377 }
378
IsOfflineCapture()379 bool HStreamOperator::IsOfflineCapture()
380 {
381 std::list<sptr<HStreamCommon>> allStream = streamContainer_.GetAllStreams();
382 std::list<sptr<HStreamCommon>> allOfflineStreams = streamContainerOffline_.GetAllStreams();
383 allStream.insert(allStream.end(), allOfflineStreams.begin(), allOfflineStreams.end());
384 return std::any_of(allStream.begin(), allStream.end(), [](auto& stream) {
385 CHECK_RETURN_RET(stream->GetStreamType() != StreamType::CAPTURE, false);
386 return static_cast<HStreamCapture*>(stream.GetRefPtr())->IsHasSwitchToOffline();
387 });
388 }
389
GetDeviceAbilityByMeta(uint32_t item,camera_metadata_item_t * metadataItem)390 bool HStreamOperator::GetDeviceAbilityByMeta(uint32_t item, camera_metadata_item_t* metadataItem)
391 {
392 CHECK_RETURN_RET_ELOG(cameraDevice_ == nullptr, false, "cameraDevice is nullptr.");
393 auto ability = cameraDevice_->GetDeviceAbility();
394 CHECK_RETURN_RET(ability == nullptr, false);
395 int ret = OHOS::Camera::FindCameraMetadataItem(ability->get(), item, metadataItem);
396 CHECK_RETURN_RET_ELOG(ret != CAM_META_SUCCESS, false, "get ability failed.");
397 return true;
398 }
399
LinkInputAndOutputs(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings,int32_t opMode)400 int32_t HStreamOperator::LinkInputAndOutputs(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings,
401 int32_t opMode)
402 {
403 int32_t rc;
404 std::vector<StreamInfo_V1_1> allStreamInfos;
405 auto allStream = streamContainer_.GetAllStreams();
406 for (auto& stream : allStream) {
407 SetBasicInfo(stream);
408 rc = stream->LinkInput(streamOperator_, settings);
409 CHECK_RETURN_RET_ELOG(rc != CAMERA_OK, rc, "HStreamOperator::LinkInputAndOutputs IsValidMode false");
410 if (stream->GetHdiStreamId() == STREAM_ID_UNSET) {
411 stream->SetHdiStreamId(GenerateHdiStreamId());
412 }
413 MEDIA_INFO_LOG(
414 "HStreamOperator::LinkInputAndOutputs streamType:%{public}d, streamId:%{public}d ,hdiStreamId:%{public}d",
415 stream->GetStreamType(), stream->GetFwkStreamId(), stream->GetHdiStreamId());
416 StreamInfo_V1_1 curStreamInfo;
417 HStreamRepeat* repeatStream = nullptr;
418 if (stream->GetStreamType() == StreamType::REPEAT) {
419 repeatStream = static_cast<HStreamRepeat*>(stream.GetRefPtr());
420 CHECK_EXECUTE(opMode == static_cast<SceneMode>(opMode), repeatStream->SetCurrentMode(opMode));
421 }
422 stream->SetStreamInfo(curStreamInfo);
423 CHECK_EXECUTE(stream->GetStreamType() != StreamType::METADATA,
424 allStreamInfos.push_back(curStreamInfo));
425 }
426
427 rc = CreateAndCommitStreams(allStreamInfos, settings, opMode);
428 MEDIA_INFO_LOG("HStreamOperator::LinkInputAndOutputs execute success");
429 return rc;
430 }
431
SetBasicInfo(sptr<HStreamCommon> stream)432 void HStreamOperator::SetBasicInfo(sptr<HStreamCommon> stream)
433 {
434 #ifdef HOOK_CAMERA_OPERATOR
435 if (cameraDevice_ == nullptr) {
436 MEDIA_DEBUG_LOG("HStreamOperator::SetBasicInfo() cameraDevice is null");
437 return;
438 }
439 std::map<int32_t, std::string> basicParam;
440 basicParam[PLUGIN_BUNDLE_NAME] = cameraDevice_->GetClientName();
441 basicParam[PLUGIN_CAMERA_ID] = cameraDevice_->GetCameraId();
442 basicParam[PLUGIN_CAMERA_CONNECTION_TYPE] = to_string(cameraDevice_->GetCameraConnectType());
443 basicParam[PLUGIN_CAMERA_POSITION] = to_string(cameraDevice_->GetCameraPosition());
444 basicParam[PLUGIN_SENSOR_ORIENTATION] = to_string(cameraDevice_->GetSensorOrientation());
445 MEDIA_INFO_LOG("HStreamOperator::SetBasicInfo cameraDevice_ is %{public}s ",
446 basicParam[PLUGIN_CAMERA_ID].c_str());
447 stream->SetBasicInfo(basicParam);
448 #endif
449 }
450
UnlinkInputAndOutputs()451 int32_t HStreamOperator::UnlinkInputAndOutputs()
452 {
453 CAMERA_SYNC_TRACE;
454 int32_t rc = CAMERA_UNKNOWN_ERROR;
455 std::vector<int32_t> fwkStreamIds;
456 std::vector<int32_t> hdiStreamIds;
457 auto allStream = streamContainer_.GetAllStreams();
458 for (auto& stream : allStream) {
459 fwkStreamIds.emplace_back(stream->GetFwkStreamId());
460 hdiStreamIds.emplace_back(stream->GetHdiStreamId());
461 stream->UnlinkInput();
462 }
463 MEDIA_INFO_LOG("HStreamOperator::UnlinkInputAndOutputs() streamIds size() = %{public}zu, streamIds:%{public}s, "
464 "hdiStreamIds:%{public}s",
465 fwkStreamIds.size(), Container2String(fwkStreamIds.begin(), fwkStreamIds.end()).c_str(),
466 Container2String(hdiStreamIds.begin(), hdiStreamIds.end()).c_str());
467 ReleaseStreams(hdiStreamIds);
468 std::vector<StreamInfo_V1_1> emptyStreams;
469 UpdateStreams(emptyStreams);
470 ResetHdiStreamId();
471 return rc;
472 }
473
ExpandSketchRepeatStream()474 void HStreamOperator::ExpandSketchRepeatStream()
475 {
476 MEDIA_DEBUG_LOG("Enter HStreamOperator::ExpandSketchRepeatStream()");
477 std::set<sptr<HStreamCommon>> sketchStreams;
478 auto repeatStreams = streamContainer_.GetStreams(StreamType::REPEAT);
479 std::for_each(repeatStreams.begin(), repeatStreams.end(), [&](auto& stream) {
480 CHECK_RETURN(!stream);
481 auto streamRepeat = CastStream<HStreamRepeat>(stream);
482 // skip SKETCH stream
483 CHECK_RETURN(streamRepeat->GetRepeatStreamType() == RepeatStreamType::SKETCH);
484 sptr<HStreamRepeat> sketchStream = streamRepeat->GetSketchStream();
485 CHECK_RETURN(!sketchStream);
486 sketchStreams.insert(sketchStream);
487 });
488
489 MEDIA_DEBUG_LOG("HStreamOperator::ExpandSketchRepeatStream() sketch size is:%{public}zu", sketchStreams.size());
490 for (auto& stream : sketchStreams) {
491 AddOutputStream(stream);
492 }
493 MEDIA_DEBUG_LOG("Exit HStreamOperator::ExpandSketchRepeatStream()");
494 }
495
ExpandMovingPhotoRepeatStream()496 void HStreamOperator::ExpandMovingPhotoRepeatStream()
497 {
498 CAMERA_SYNC_TRACE;
499 MEDIA_DEBUG_LOG("ExpandMovingPhotoRepeatStream enter");
500 auto repeatStreams = streamContainer_.GetStreams(StreamType::REPEAT);
501 for (auto& stream : repeatStreams) {
502 CHECK_CONTINUE_WLOG(stream == nullptr, "stream is nullptr");
503 auto streamRepeat = CastStream<HStreamRepeat>(stream);
504 if (streamRepeat && streamRepeat->GetRepeatStreamType() == RepeatStreamType::PREVIEW) {
505 std::lock_guard<std::mutex> lock(movingPhotoStatusLock_);
506 auto movingPhotoSurfaceWrapper =
507 MovingPhotoSurfaceWrapper::CreateMovingPhotoSurfaceWrapper(streamRepeat->width_, streamRepeat->height_);
508 if (movingPhotoSurfaceWrapper == nullptr) {
509 MEDIA_ERR_LOG("HStreamOperator::ExpandMovingPhotoRepeatStream CreateMovingPhotoSurfaceWrapper fail.");
510 continue;
511 }
512 auto producer = movingPhotoSurfaceWrapper->GetProducer();
513 metaSurface_ = Surface::CreateSurfaceAsConsumer("movingPhotoMeta");
514 auto metaCache = make_shared<FixedSizeList<pair<int64_t, sptr<SurfaceBuffer>>>>(8);
515 CHECK_CONTINUE_WLOG(producer == nullptr, "get producer fail.");
516 livephotoListener_ = new (std::nothrow) MovingPhotoListener(movingPhotoSurfaceWrapper,
517 metaSurface_, metaCache, preCacheFrameCount_, postCacheFrameCount_);
518 CHECK_CONTINUE_WLOG(livephotoListener_ == nullptr, "failed to new livephotoListener_!");
519 movingPhotoSurfaceWrapper->SetSurfaceBufferListener(livephotoListener_);
520 livephotoMetaListener_ = new(std::nothrow) MovingPhotoMetaListener(metaSurface_, metaCache);
521 CHECK_CONTINUE_WLOG(livephotoMetaListener_ == nullptr, "failed to new livephotoMetaListener_!");
522 metaSurface_->RegisterConsumerListener((sptr<IBufferConsumerListener> &)livephotoMetaListener_);
523 CreateMovingPhotoStreamRepeat(streamRepeat->format_, streamRepeat->width_, streamRepeat->height_, producer);
524 std::lock_guard<std::mutex> streamLock(livePhotoStreamLock_);
525 AddOutputStream(livePhotoStreamRepeat_);
526 if (!audioCapturerSessionProxy_) {
527 audioCapturerSessionProxy_ = AudioCapturerSessionProxy::CreateAudioCapturerSessionProxy();
528 CHECK_EXECUTE(audioCapturerSessionProxy_, audioCapturerSessionProxy_->CreateAudioSession());
529 }
530 if (!avcodecTaskManagerProxy_&& audioCapturerSessionProxy_) {
531 avcodecTaskManagerProxy_ = AvcodecTaskManagerProxy::CreateAvcodecTaskManagerProxy();
532 CHECK_CONTINUE_WLOG(avcodecTaskManagerProxy_ == nullptr, "Create AvcodecTaskManagerProxy failed.");
533 shared_ptr<Size> size = std::make_shared<Size>();
534 size->width = streamRepeat->width_;
535 size->height = streamRepeat->height_;
536 avcodecTaskManagerProxy_->CreateAvcodecTaskManager(movingPhotoSurfaceWrapper->videoSurface_, size,
537 audioCapturerSessionProxy_, VideoCodecType::VIDEO_ENCODE_TYPE_HEVC, currColorSpace_);
538 HStreamOperatorManager::GetInstance()->AddTaskManager(streamOperatorId_, avcodecTaskManagerProxy_);
539 avcodecTaskManagerProxy_->SetVideoBufferDuration(preCacheFrameCount_, postCacheFrameCount_);
540 }
541 if (!movingPhotoVideoCacheProxy_ && avcodecTaskManagerProxy_) {
542 movingPhotoVideoCacheProxy_ = MovingPhotoVideoCacheProxy::CreateMovingPhotoVideoCacheProxy();
543 CHECK_EXECUTE(movingPhotoVideoCacheProxy_, movingPhotoVideoCacheProxy_->CreateMovingPhotoVideoCache(
544 avcodecTaskManagerProxy_));
545 }
546 break;
547 }
548 }
549 MEDIA_DEBUG_LOG("ExpandMovingPhotoRepeatStream Exit");
550 }
551
CreateMovingPhotoStreamRepeat(int32_t format,int32_t width,int32_t height,sptr<OHOS::IBufferProducer> producer)552 int32_t HStreamOperator::CreateMovingPhotoStreamRepeat(
553 int32_t format, int32_t width, int32_t height, sptr<OHOS::IBufferProducer> producer)
554 {
555 CAMERA_SYNC_TRACE;
556 std::lock_guard<std::mutex> lock(livePhotoStreamLock_);
557 CHECK_RETURN_RET_ELOG(
558 width <= 0 || height <= 0, CAMERA_INVALID_ARG, "HCameraService::CreateLivePhotoStreamRepeat args is illegal");
559 CHECK_EXECUTE(livePhotoStreamRepeat_ != nullptr, livePhotoStreamRepeat_->Release());
560 auto streamRepeat = new (std::nothrow) HStreamRepeat(producer, format, width, height, RepeatStreamType::LIVEPHOTO);
561 CHECK_RETURN_RET_ELOG(streamRepeat == nullptr, CAMERA_ALLOC_ERROR, "HStreamRepeat allocation failed");
562 MEDIA_DEBUG_LOG("para is:%{public}dx%{public}d,%{public}d", width, height, format);
563 livePhotoStreamRepeat_ = streamRepeat;
564 CHECK_RETURN_RET_ELOG(metaSurface_ == nullptr, CAMERA_INVALID_STATE, "metaSurface_ is nullptr");
565 streamRepeat->SetMetaProducer(metaSurface_->GetProducer());
566 streamRepeat->SetMirror(isMovingPhotoMirror_);
567 MEDIA_INFO_LOG("HCameraService::CreateLivePhotoStreamRepeat end");
568 return CAMERA_OK;
569 }
570
GetStreamByStreamID(int32_t streamId)571 const sptr<HStreamCommon> HStreamOperator::GetStreamByStreamID(int32_t streamId)
572 {
573 auto stream = streamContainer_.GetStream(streamId) != nullptr ? streamContainer_.GetStream(streamId) :
574 streamContainerOffline_.GetStream(streamId);
575
576 CHECK_PRINT_ELOG(stream == nullptr,
577 "HStreamOperator::GetStreamByStreamID get stream fail, streamId is:%{public}d", streamId);
578 return stream;
579 }
580
GetHdiStreamByStreamID(int32_t streamId)581 const sptr<HStreamCommon> HStreamOperator::GetHdiStreamByStreamID(int32_t streamId)
582 {
583 auto stream = streamContainer_.GetHdiStream(streamId) != nullptr ? streamContainer_.GetHdiStream(streamId) :
584 streamContainerOffline_.GetHdiStream(streamId);
585 if (stream == nullptr) {
586 MEDIA_DEBUG_LOG("HStreamOperator::GetHdiStreamByStreamID get stream fail, streamId is:%{public}d", streamId);
587 }
588 return stream;
589 }
590
ClearSketchRepeatStream()591 void HStreamOperator::ClearSketchRepeatStream()
592 {
593 MEDIA_DEBUG_LOG("Enter HStreamOperator::ClearSketchRepeatStream()");
594
595 // Already added session lock in BeginConfig()
596 auto repeatStreams = streamContainer_.GetStreams(StreamType::REPEAT);
597 std::for_each(repeatStreams.begin(), repeatStreams.end(), [this](auto& repeatStream) {
598 CHECK_RETURN(!repeatStream);
599 auto sketchStream = CastStream<HStreamRepeat>(repeatStream);
600 CHECK_RETURN(sketchStream->GetRepeatStreamType() != RepeatStreamType::SKETCH);
601 MEDIA_DEBUG_LOG(
602 "HStreamOperator::ClearSketchRepeatStream() stream id is:%{public}d", sketchStream->GetFwkStreamId());
603 RemoveOutputStream(repeatStream);
604 });
605 MEDIA_DEBUG_LOG("Exit HStreamOperator::ClearSketchRepeatStream()");
606 }
607
ClearMovingPhotoRepeatStream()608 void HStreamOperator::ClearMovingPhotoRepeatStream()
609 {
610 CAMERA_SYNC_TRACE;
611 MEDIA_DEBUG_LOG("Enter HStreamOperator::ClearMovingPhotoRepeatStream()");
612 // Already added session lock in BeginConfig()
613 auto repeatStreams = streamContainer_.GetStreams(StreamType::REPEAT);
614 std::for_each(repeatStreams.begin(), repeatStreams.end(), [this](auto& repeatStream) {
615 CHECK_RETURN(!repeatStream);
616 auto movingPhotoStream = CastStream<HStreamRepeat>(repeatStream);
617 CHECK_RETURN(movingPhotoStream->GetRepeatStreamType() != RepeatStreamType::LIVEPHOTO);
618 StopMovingPhoto();
619 std::lock_guard<std::mutex> lock(movingPhotoStatusLock_);
620 livephotoListener_ = nullptr;
621 livephotoMetaListener_ = nullptr;
622 CHECK_EXECUTE(movingPhotoVideoCacheProxy_, movingPhotoVideoCacheProxy_ = nullptr);
623 MEDIA_DEBUG_LOG("HStreamOperator::ClearLivePhotoRepeatStream() stream id is:%{public}d",
624 movingPhotoStream->GetFwkStreamId());
625 RemoveOutputStream(repeatStream);
626 });
627 MEDIA_DEBUG_LOG("Exit HStreamOperator::ClearLivePhotoRepeatStream()");
628 }
629
StopMovingPhoto()630 void HStreamOperator::StopMovingPhoto() __attribute__((no_sanitize("cfi")))
631 {
632 CAMERA_SYNC_TRACE;
633 MEDIA_DEBUG_LOG("Enter HStreamOperator::StopMovingPhoto");
634 std::lock_guard<std::mutex> lock(movingPhotoStatusLock_);
635 CHECK_EXECUTE(livephotoListener_, livephotoListener_->StopDrainOut());
636 #ifdef MOVING_PHOTO_ADD_AUDIO
637 auto audioCaptureSessionProxy = sptr<AudioCapturerSessionIntf>(audioCapturerSessionProxy_);
638 std::thread asyncAudioReleaseThread = thread([audioCaptureSessionProxy]() {
639 CHECK_EXECUTE(audioCaptureSessionProxy, audioCaptureSessionProxy->StopAudioCapture());
640 });
641 asyncAudioReleaseThread.detach();
642 #endif
643 }
644
GetActiveColorSpace(ColorSpace & colorSpace)645 int32_t HStreamOperator::GetActiveColorSpace(ColorSpace& colorSpace)
646 {
647 colorSpace = currColorSpace_;
648 return CAMERA_OK;
649 }
650
SetColorSpace(ColorSpace colorSpace,bool isNeedUpdate)651 int32_t HStreamOperator::SetColorSpace(ColorSpace colorSpace, bool isNeedUpdate)
652 {
653 int32_t result = CAMERA_OK;
654 CHECK_RETURN_RET_ELOG(colorSpace == currColorSpace_, result,
655 "HStreamOperator::SetColorSpace() colorSpace no need to update.");
656 currColorSpace_ = colorSpace;
657 MEDIA_INFO_LOG("HStreamOperator::SetColorSpace() old ColorSpace : %{public}d, old ColorSpace : %{public}d",
658 currColorSpace_, colorSpace);
659 result = CheckIfColorSpaceMatchesFormat(colorSpace);
660 if (result != CAMERA_OK) {
661 CHECK_RETURN_RET_ELOG(opMode_ != static_cast<int32_t>(SceneMode::VIDEO) || isNeedUpdate, result,
662 "HStreamOperator::SetColorSpace() Failed, format and colorSpace not match.");
663
664 MEDIA_ERR_LOG("HStreamOperator::SetColorSpace() %{public}d, format and colorSpace: %{public}d not match.",
665 result, colorSpace);
666 currColorSpace_ = ColorSpace::BT709;
667 }
668 SetColorSpaceForStreams();
669 MEDIA_INFO_LOG("HStreamOperator::SetColorSpace() colorSpace: %{public}d, isNeedUpdate: %{public}d",
670 currColorSpace_, isNeedUpdate);
671 return result;
672 }
673
SetColorSpaceForStreams()674 void HStreamOperator::SetColorSpaceForStreams()
675 {
676 auto streams = streamContainer_.GetAllStreams();
677 for (auto& stream : streams) {
678 MEDIA_DEBUG_LOG("HStreamOperator::SetColorSpaceForStreams() streams type %{public}d", stream->GetStreamType());
679 stream->SetColorSpace(currColorSpace_);
680 }
681 }
682
CancelStreamsAndGetStreamInfos(std::vector<StreamInfo_V1_1> & streamInfos)683 void HStreamOperator::CancelStreamsAndGetStreamInfos(std::vector<StreamInfo_V1_1> &streamInfos)
684 {
685 MEDIA_INFO_LOG("HStreamOperator::CancelStreamsAndGetStreamInfos enter.");
686 auto streams = streamContainer_.GetAllStreams();
687 std::for_each(streams.begin(), streams.end(), [this, &streamInfos](auto &stream) {
688 CHECK_RETURN(stream->GetStreamType() == StreamType::METADATA);
689 if (stream->GetStreamType() == StreamType::CAPTURE && isSessionStarted_) {
690 static_cast<HStreamCapture *>(stream.GetRefPtr())->CancelCapture();
691 } else if (stream->GetStreamType() == StreamType::REPEAT && isSessionStarted_) {
692 static_cast<HStreamRepeat *>(stream.GetRefPtr())->Stop();
693 }
694 StreamInfo_V1_1 curStreamInfo;
695 stream->SetStreamInfo(curStreamInfo);
696 streamInfos.push_back(curStreamInfo);
697 });
698 }
699
RestartStreams(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)700 void HStreamOperator::RestartStreams(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings)
701 {
702 MEDIA_INFO_LOG("HStreamOperator::RestartStreams() enter.");
703 auto repStreams = streamContainer_.GetStreams(StreamType::REPEAT);
704 std::for_each(repStreams.begin(), repStreams.end(), [&settings](auto &stream) {
705 auto repStream = CastStream<HStreamRepeat>(stream);
706 CHECK_RETURN(repStream->GetRepeatStreamType() != RepeatStreamType::PREVIEW);
707 repStream->Start(settings);
708 });
709 }
710
UpdateStreamInfos(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings)711 int32_t HStreamOperator::UpdateStreamInfos(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings)
712 {
713 std::vector<StreamInfo_V1_1> streamInfos;
714 CancelStreamsAndGetStreamInfos(streamInfos);
715 int errorCode = UpdateStreams(streamInfos);
716 if (errorCode == CAMERA_OK) {
717 RestartStreams(settings);
718 } else {
719 MEDIA_DEBUG_LOG("HStreamOperator::UpdateStreamInfos err %{public}d", errorCode);
720 }
721 return errorCode;
722 }
723
CheckIfColorSpaceMatchesFormat(ColorSpace colorSpace)724 int32_t HStreamOperator::CheckIfColorSpaceMatchesFormat(ColorSpace colorSpace)
725 {
726 if (!(colorSpace == ColorSpace::BT2020_HLG || colorSpace == ColorSpace::BT2020_PQ ||
727 colorSpace == ColorSpace::BT2020_HLG_LIMIT || colorSpace == ColorSpace::BT2020_PQ_LIMIT)) {
728 return CAMERA_OK;
729 }
730 MEDIA_DEBUG_LOG("HStreamOperator::CheckIfColorSpaceMatchesFormat start");
731 // 选择BT2020,需要匹配10bit的format;若不匹配,返回error
732 auto capStreams = streamContainer_.GetStreams(StreamType::CAPTURE);
733 for (auto& capStream : capStreams) {
734 CHECK_RETURN_RET_ELOG(
735 !(capStream->format_ == OHOS_CAMERA_FORMAT_JPEG || capStream->format_ == OHOS_CAMERA_FORMAT_YCRCB_420_SP ||
736 capStream->format_ == OHOS_CAMERA_FORMAT_HEIC),
737 CAMERA_OPERATION_NOT_ALLOWED, "HStreamOperator::CheckFormat, streamType:%{public}d format not match",
738 capStream->GetStreamType());
739 }
740
741 auto repStreams = streamContainer_.GetStreams(StreamType::REPEAT);
742 for (auto& repStream : repStreams) {
743 CHECK_RETURN_RET_ELOG(!(repStream->format_ == OHOS_CAMERA_FORMAT_YCBCR_P010 ||
744 repStream->format_ == OHOS_CAMERA_FORMAT_YCRCB_P010),
745 CAMERA_OPERATION_NOT_ALLOWED, "HStreamOperator::CheckFormat, streamType:%{public}d format not match",
746 repStream->GetStreamType());
747 }
748
749 MEDIA_DEBUG_LOG("HStreamOperator::CheckIfColorSpaceMatchesFormat end");
750 return CAMERA_OK;
751 }
752
GetMovingPhotoBufferDuration()753 int32_t HStreamOperator::GetMovingPhotoBufferDuration()
754 {
755 uint32_t preBufferDuration = 0;
756 uint32_t postBufferDuration = 0;
757 constexpr int32_t MILLSEC_MULTIPLE = 1000;
758 camera_metadata_item_t item;
759 bool ret = GetDeviceAbilityByMeta(OHOS_MOVING_PHOTO_BUFFER_DURATION, &item);
760 CHECK_RETURN_RET_ELOG(!ret, 0, "HStreamOperator::GetMovingPhotoBufferDuration get buffer duration failed");
761 preBufferDuration = item.data.ui32[0];
762 postBufferDuration = item.data.ui32[1];
763 preCacheFrameCount_ = preBufferDuration == 0
764 ? preCacheFrameCount_
765 : static_cast<uint32_t>(float(preBufferDuration) / MILLSEC_MULTIPLE * VIDEO_FRAME_RATE);
766 postCacheFrameCount_ = preBufferDuration == 0
767 ? postCacheFrameCount_
768 : static_cast<uint32_t>(float(postBufferDuration) / MILLSEC_MULTIPLE * VIDEO_FRAME_RATE);
769 MEDIA_INFO_LOG(
770 "HStreamOperator::GetMovingPhotoBufferDuration preBufferDuration : %{public}u, "
771 "postBufferDuration : %{public}u, preCacheFrameCount_ : %{public}u, postCacheFrameCount_ : %{public}u",
772 preBufferDuration, postBufferDuration, preCacheFrameCount_, postCacheFrameCount_);
773 return CAMERA_OK;
774 }
775
776
GetMovingPhotoStartAndEndTime()777 void HStreamOperator::GetMovingPhotoStartAndEndTime()
778 {
779 CHECK_RETURN_ELOG(cameraDevice_ == nullptr, "HCaptureSession::GetMovingPhotoStartAndEndTime device is null");
780 cameraDevice_->SetMovingPhotoStartTimeCallback([this](int32_t captureId, int64_t startTimeStamp) {
781 MEDIA_INFO_LOG("SetMovingPhotoStartTimeCallback function enter");
782 std::lock_guard<mutex> statusLock(this->movingPhotoStatusLock_);
783 CHECK_RETURN_ELOG(this->avcodecTaskManagerProxy_ == nullptr, "avcodecTaskManagerProxy_ is nullptr.");
784 this->avcodecTaskManagerProxy_->TaskManagerInsertStartTime(captureId, startTimeStamp);
785 });
786
787 cameraDevice_->SetMovingPhotoEndTimeCallback([this](int32_t captureId, int64_t endTimeStamp) {
788 std::lock_guard<mutex> statusLock(this->movingPhotoStatusLock_);
789 CHECK_RETURN_ELOG(this->avcodecTaskManagerProxy_ == nullptr, "avcodecTaskManagerProxy_ is nullptr.");
790 this->avcodecTaskManagerProxy_->TaskManagerInsertEndTime(captureId, endTimeStamp);
791 });
792 }
793
EnableMovingPhoto(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings,bool isEnable,int32_t sensorOritation)794 int32_t HStreamOperator::EnableMovingPhoto(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings,
795 bool isEnable, int32_t sensorOritation)
796 {
797 MEDIA_INFO_LOG("HStreamOperator::EnableMovingPhoto is %{public}d", isEnable);
798 isSetMotionPhoto_ = isEnable;
799 deviceSensorOritation_ = sensorOritation;
800 StartMovingPhotoStream(settings);
801 CHECK_EXECUTE(cameraDevice_ != nullptr, cameraDevice_->EnableMovingPhoto(isEnable));
802 GetMovingPhotoBufferDuration();
803 GetMovingPhotoStartAndEndTime();
804 return CAMERA_OK;
805 }
806
StartMovingPhoto(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings,sptr<HStreamRepeat> & curStreamRepeat)807 void HStreamOperator::StartMovingPhoto(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings,
808 sptr<HStreamRepeat>& curStreamRepeat)
809 {
810 auto thisPtr = wptr<HStreamOperator>(this);
811 curStreamRepeat->SetMovingPhotoStartCallback([thisPtr, settings]() {
812 auto sessionPtr = thisPtr.promote();
813 CHECK_RETURN(!sessionPtr);
814 MEDIA_INFO_LOG("StartMovingPhotoStream when addDeferedSurface");
815 sessionPtr->StartMovingPhotoStream(settings);
816 });
817 }
818
StartPreviewStream(const std::shared_ptr<OHOS::Camera::CameraMetadata> & settings,camera_position_enum_t cameraPosition)819 int32_t HStreamOperator::StartPreviewStream(const std::shared_ptr<OHOS::Camera::CameraMetadata>& settings,
820 camera_position_enum_t cameraPosition)
821 {
822 int32_t errorCode = CAMERA_OK;
823 auto repeatStreams = streamContainer_.GetStreams(StreamType::REPEAT);
824 bool hasDerferedPreview = false;
825 // start preview
826 for (auto& item : repeatStreams) {
827 auto curStreamRepeat = CastStream<HStreamRepeat>(item);
828 auto repeatType = curStreamRepeat->GetRepeatStreamType();
829 if (repeatType != RepeatStreamType::PREVIEW) {
830 continue;
831 }
832 if (curStreamRepeat->GetPreparedCaptureId() != CAPTURE_ID_UNSET) {
833 continue;
834 }
835 curStreamRepeat->SetUsedAsPosition(cameraPosition);
836 errorCode = curStreamRepeat->Start(settings);
837 hasDerferedPreview = curStreamRepeat->producer_ == nullptr;
838 if (isSetMotionPhoto_ && hasDerferedPreview) {
839 StartMovingPhoto(settings, curStreamRepeat);
840 }
841 if (errorCode != CAMERA_OK) {
842 MEDIA_ERR_LOG("HStreamOperator::Start(), Failed to start preview, rc: %{public}d", errorCode);
843 break;
844 }
845 }
846 // start movingPhoto
847 for (auto& item : repeatStreams) {
848 auto curStreamRepeat = CastStream<HStreamRepeat>(item);
849 auto repeatType = curStreamRepeat->GetRepeatStreamType();
850 if (repeatType != RepeatStreamType::LIVEPHOTO) {
851 continue;
852 }
853 int32_t movingPhotoErrorCode = CAMERA_OK;
854 if (isSetMotionPhoto_ && !hasDerferedPreview) {
855 movingPhotoErrorCode = curStreamRepeat->Start(settings);
856 #ifdef MOVING_PHOTO_ADD_AUDIO
857 std::lock_guard<std::mutex> lock(movingPhotoStatusLock_);
858 audioCapturerSessionProxy_ && audioCapturerSessionProxy_->StartAudioCapture();
859 #endif
860 }
861 if (movingPhotoErrorCode != CAMERA_OK) {
862 MEDIA_ERR_LOG("Failed to start movingPhoto, rc: %{public}d", movingPhotoErrorCode);
863 break;
864 }
865 }
866 #ifdef CAMERA_USE_SENSOR
867 RegisterSensorCallback();
868 #endif
869 return errorCode;
870 }
871
UpdateSettingForFocusTrackingMech(bool isEnableMech)872 int32_t HStreamOperator::UpdateSettingForFocusTrackingMech(bool isEnableMech)
873 {
874 MEDIA_INFO_LOG("%{public}s is called!", __FUNCTION__);
875 std::lock_guard<std::mutex> mechLock(mechCallbackLock_);
876 CHECK_RETURN_RET(!streamOperator_, CAMERA_INVALID_STATE);
877 uint32_t majorVer = 0;
878 uint32_t minorVer = 0;
879 streamOperator_->GetVersion(majorVer, minorVer);
880 CHECK_RETURN_RET_DLOG(GetVersionId(majorVer, minorVer) < HDI_VERSION_ID_1_3, CAMERA_OK,
881 "UpdateSettingForFocusTrackingMech version: %{public}d.%{public}d", majorVer, minorVer);
882 sptr<OHOS::HDI::Camera::V1_3::IStreamOperator> streamOperatorV1_3 =
883 OHOS::HDI::Camera::V1_3::IStreamOperator::CastFrom(streamOperator_);
884 CHECK_RETURN_RET(!streamOperatorV1_3, CAMERA_UNKNOWN_ERROR);
885 const int32_t DEFAULT_ITEMS = 1;
886 const int32_t DEFAULT_DATA_LENGTH = 10;
887 std::shared_ptr<OHOS::Camera::CameraMetadata> metadata4Types =
888 std::make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
889 bool needAddMetadataType = true;
890 auto allStream = streamContainer_.GetAllStreams();
891 for (auto& stream : allStream) {
892 if (stream->GetStreamType() != StreamType::METADATA) {
893 continue;
894 }
895 auto streamMetadata = CastStream<HStreamMetadata>(stream);
896 auto types = streamMetadata->GetMetadataObjectTypes();
897 if (std::find(types.begin(), types.end(), static_cast<int32_t>(MetadataObjectType::FACE)) != types.end()) {
898 needAddMetadataType = false;
899 break;
900 }
901 }
902 g_isNeedFilterMetadata = needAddMetadataType;
903 std::vector<uint8_t> typeTagToHal;
904 typeTagToHal.emplace_back(static_cast<int32_t>(MetadataObjectType::BASE_TRACKING_REGION));
905 if (needAddMetadataType) {
906 typeTagToHal.emplace_back(static_cast<int32_t>(MetadataObjectType::FACE));
907 }
908 uint32_t count = typeTagToHal.size();
909 uint8_t* typesToEnable = typeTagToHal.data();
910 bool status = metadata4Types->addEntry(OHOS_CONTROL_STATISTICS_DETECT_SETTING, typesToEnable, count);
911 CHECK_RETURN_RET_ELOG(!status, CAMERA_UNKNOWN_ERROR, "set_camera_metadata failed!");
912 std::vector<uint8_t> settings;
913 OHOS::Camera::MetadataUtils::ConvertMetadataToVec(metadata4Types, settings);
914 if (isEnableMech) {
915 MEDIA_INFO_LOG("%{public}s EnableResult start!", __FUNCTION__);
916 streamOperatorV1_3->EnableResult(-1, settings);
917 } else {
918 MEDIA_INFO_LOG("%{public}s DisableResult start!", __FUNCTION__);
919 streamOperatorV1_3->DisableResult(-1, settings);
920 }
921 return CAMERA_OK;
922 }
923
Stop()924 int32_t HStreamOperator::Stop()
925 {
926 CAMERA_SYNC_TRACE;
927 int32_t errorCode = CAMERA_OK;
928 MEDIA_INFO_LOG("HStreamOperator::Stop prepare execute");
929 auto allStreams = streamContainer_.GetAllStreams();
930 for (auto& item : allStreams) {
931 if (item->GetStreamType() == StreamType::REPEAT) {
932 auto repeatStream = CastStream<HStreamRepeat>(item);
933 if (repeatStream->GetRepeatStreamType() == RepeatStreamType::PREVIEW) {
934 errorCode = repeatStream->Stop();
935 } else if (repeatStream->GetRepeatStreamType() == RepeatStreamType::LIVEPHOTO) {
936 repeatStream->Stop();
937 StopMovingPhoto();
938 } else {
939 repeatStream->Stop();
940 }
941 } else if (item->GetStreamType() == StreamType::METADATA) {
942 CastStream<HStreamMetadata>(item)->Stop();
943 } else if (item->GetStreamType() == StreamType::CAPTURE) {
944 CastStream<HStreamCapture>(item)->CancelCapture();
945 } else if (item->GetStreamType() == StreamType::DEPTH) {
946 CastStream<HStreamDepthData>(item)->Stop();
947 } else {
948 MEDIA_ERR_LOG("HStreamOperator::Stop(), get unknow stream, streamType: %{public}d, streamId:%{public}d",
949 item->GetStreamType(), item->GetFwkStreamId());
950 }
951 CHECK_PRINT_ELOG(errorCode != CAMERA_OK,
952 "HStreamOperator::Stop(), Failed to stop stream, rc: %{public}d, streamId:%{public}d", errorCode,
953 item->GetFwkStreamId());
954 }
955 MEDIA_INFO_LOG("HStreamOperator::Stop execute success");
956 return errorCode;
957 }
958
ReleaseStreams()959 void HStreamOperator::ReleaseStreams()
960 {
961 CAMERA_SYNC_TRACE;
962 std::vector<int32_t> fwkStreamIds;
963 std::vector<int32_t> hdiStreamIds;
964 auto allStream = streamContainer_.GetAllStreams();
965 for (auto &stream : allStream) {
966 if (stream->GetStreamType() == StreamType::CAPTURE &&
967 CastStream<HStreamCapture>(stream)->IsHasSwitchToOffline()) {
968 continue;
969 }
970 auto fwkStreamId = stream->GetFwkStreamId();
971 if (fwkStreamId != STREAM_ID_UNSET) {
972 fwkStreamIds.emplace_back(fwkStreamId);
973 }
974 auto hdiStreamId = stream->GetHdiStreamId();
975 if (hdiStreamId != STREAM_ID_UNSET) {
976 hdiStreamIds.emplace_back(hdiStreamId);
977 }
978 stream->ReleaseStream(true);
979 streamContainer_.RemoveStream(stream);
980 }
981 MEDIA_INFO_LOG("HStreamOperator::ReleaseStreams() streamIds size() = %{public}zu, fwkStreamIds:%{public}s, "
982 "hdiStreamIds:%{public}s,",
983 fwkStreamIds.size(), Container2String(fwkStreamIds.begin(), fwkStreamIds.end()).c_str(),
984 Container2String(hdiStreamIds.begin(), hdiStreamIds.end()).c_str());
985 CHECK_RETURN(hdiStreamIds.empty());
986 ReleaseStreams(hdiStreamIds);
987 }
988
GetOfflineOutptSize()989 int32_t HStreamOperator::GetOfflineOutptSize()
990 {
991 std::list<sptr<HStreamCommon>> captureStreams = streamContainer_.GetStreams(StreamType::CAPTURE);
992 std::list<sptr<HStreamCommon>> captureStreamsOffline = streamContainerOffline_.GetStreams(StreamType::CAPTURE);
993 captureStreams.insert(captureStreams.end(), captureStreamsOffline.begin(), captureStreamsOffline.end());
994 return std::count_if(captureStreams.begin(), captureStreams.end(), [](auto& stream) {
995 return CastStream<HStreamCapture>(stream)->IsHasEnableOfflinePhoto();
996 });
997 }
998
GetAllOutptSize()999 int32_t HStreamOperator::GetAllOutptSize()
1000 {
1001 int32_t outputCount = static_cast<int32_t>(streamContainer_.Size());
1002 return outputCount;
1003 }
1004
ReleaseStreams(std::vector<int32_t> & releaseStreamIds)1005 int32_t HStreamOperator::ReleaseStreams(std::vector<int32_t>& releaseStreamIds)
1006 {
1007 CAMERA_SYNC_TRACE;
1008 auto streamOperator = GetHDIStreamOperator();
1009 CHECK_RETURN_RET(streamOperator == nullptr || releaseStreamIds.empty(), CAMERA_OK);
1010 MEDIA_INFO_LOG("HStreamOperator::ReleaseStreams %{public}s",
1011 Container2String(releaseStreamIds.begin(), releaseStreamIds.end()).c_str());
1012 int32_t rc = streamOperator->ReleaseStreams(releaseStreamIds);
1013 if (rc != HDI::Camera::V1_0::NO_ERROR) {
1014 MEDIA_ERR_LOG("HCameraDevice::ClearStreamOperator ReleaseStreams fail, error Code:%{public}d", rc);
1015 CameraReportUtils::ReportCameraError(
1016 "HCameraDevice::ReleaseStreams", rc, true, CameraReportUtils::GetCallerInfo());
1017 }
1018 return CAMERA_OK;
1019 }
1020
Release()1021 int32_t HStreamOperator::Release()
1022 {
1023 CAMERA_SYNC_TRACE;
1024 int32_t errorCode = CAMERA_OK;
1025 {
1026 std::lock_guard<std::mutex> lock(releaseOperatorLock_);
1027 if (displayListener_) {
1028 OHOS::Rosen::DisplayManager::GetInstance().UnregisterDisplayListener(displayListener_);
1029 displayListener_ = nullptr;
1030 }
1031 auto streamOperator = GetHDIStreamOperator();
1032 if (streamOperator != nullptr) {
1033 ResetHDIStreamOperator();
1034 MEDIA_INFO_LOG("HStreamOperator::Release ResetHDIStreamOperator");
1035 }
1036 HStreamOperatorManager::GetInstance()->RemoveStreamOperator(streamOperatorId_);
1037 }
1038 std::lock_guard<std::mutex> lock(movingPhotoStatusLock_);
1039 CHECK_EXECUTE(livephotoListener_, livephotoListener_ = nullptr);
1040 CHECK_EXECUTE(movingPhotoVideoCacheProxy_, movingPhotoVideoCacheProxy_ = nullptr);
1041 CHECK_EXECUTE(avcodecTaskManagerProxy_, avcodecTaskManagerProxy_ = nullptr);
1042 HStreamOperatorManager::GetInstance()->RemoveTaskManager(streamOperatorId_);
1043 #ifdef CAMERA_USE_SENSOR
1044 UnRegisterSensorCallback();
1045 #endif
1046 MEDIA_INFO_LOG("HStreamOperator::Release execute success");
1047 return errorCode;
1048 }
1049
CreateAndCommitStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1> & streamInfos,const std::shared_ptr<OHOS::Camera::CameraMetadata> & deviceSettings,int32_t operationMode)1050 int32_t HStreamOperator::CreateAndCommitStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1>& streamInfos,
1051 const std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceSettings, int32_t operationMode)
1052 {
1053 int retCode = CreateStreams(streamInfos);
1054 CHECK_RETURN_RET(retCode != CAMERA_OK, retCode);
1055 return CommitStreams(deviceSettings, operationMode);
1056 }
1057
CommitStreams(const std::shared_ptr<OHOS::Camera::CameraMetadata> & deviceSettings,int32_t operationMode)1058 int32_t HStreamOperator::CommitStreams(
1059 const std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceSettings, int32_t operationMode)
1060 {
1061 CamRetCode hdiRc = HDI::Camera::V1_0::NO_ERROR;
1062 uint32_t major;
1063 uint32_t minor;
1064 sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> streamOperator;
1065 sptr<OHOS::HDI::Camera::V1_1::IStreamOperator> streamOperatorV1_1;
1066 std::lock_guard<std::mutex> lock(opMutex_);
1067 streamOperator = GetHDIStreamOperator();
1068 CHECK_RETURN_RET_ELOG(streamOperator == nullptr, CAMERA_UNKNOWN_ERROR,
1069 "HStreamOperator::CommitStreams GetStreamOperator is null!");
1070 // get higher streamOperator version
1071 streamOperator->GetVersion(major, minor);
1072 MEDIA_INFO_LOG(
1073 "HStreamOperator::CommitStreams streamOperator GetVersion major:%{public}d, minor:%{public}d", major, minor);
1074 if (GetVersionId(major, minor) >= HDI_VERSION_ID_1_1) {
1075 MEDIA_DEBUG_LOG("HStreamOperator::CommitStreams IStreamOperator cast to V1_1");
1076 streamOperatorV1_1 = OHOS::HDI::Camera::V1_1::IStreamOperator::CastFrom(streamOperator);
1077 if (streamOperatorV1_1 == nullptr) {
1078 MEDIA_ERR_LOG("HStreamOperator::CommitStreams IStreamOperator cast to V1_1 error");
1079 streamOperatorV1_1 = static_cast<OHOS::HDI::Camera::V1_1::IStreamOperator*>(streamOperator.GetRefPtr());
1080 }
1081 }
1082
1083 std::vector<uint8_t> setting;
1084 OHOS::Camera::MetadataUtils::ConvertMetadataToVec(deviceSettings, setting);
1085 MEDIA_INFO_LOG("HStreamOperator::CommitStreams, commit mode %{public}d", operationMode);
1086 if (streamOperatorV1_1 != nullptr) {
1087 MEDIA_DEBUG_LOG("HStreamOperator::CommitStreams IStreamOperator V1_1");
1088 hdiRc = (CamRetCode)(streamOperatorV1_1->CommitStreams_V1_1(
1089 static_cast<OHOS::HDI::Camera::V1_1::OperationMode_V1_1>(operationMode), setting));
1090 } else {
1091 MEDIA_DEBUG_LOG("HStreamOperator::CommitStreams IStreamOperator V1_0");
1092 OperationMode opMode = OperationMode::NORMAL;
1093 hdiRc = (CamRetCode)(streamOperator->CommitStreams(opMode, setting));
1094 }
1095 if (hdiRc != HDI::Camera::V1_0::NO_ERROR) {
1096 MEDIA_ERR_LOG("HStreamOperator::CommitStreams failed with error Code:%d", hdiRc);
1097 CameraReportUtils::ReportCameraError(
1098 "HStreamOperator::CommitStreams", hdiRc, true, CameraReportUtils::GetCallerInfo());
1099 }
1100 MEDIA_DEBUG_LOG("HStreamOperator::CommitStreams end");
1101 return HdiToServiceError(hdiRc);
1102 }
1103
EnableMovingPhotoMirror(bool isMirror,bool isConfig)1104 int32_t HStreamOperator::EnableMovingPhotoMirror(bool isMirror, bool isConfig)
1105 {
1106 if (!isConfig) {
1107 isMovingPhotoMirror_ = isMirror;
1108 return CAMERA_OK;
1109 }
1110 if (!isSetMotionPhoto_ || isMirror == isMovingPhotoMirror_) {
1111 return CAMERA_OK;
1112 }
1113 auto repeatStreams = streamContainer_.GetStreams(StreamType::REPEAT);
1114 for (auto& stream : repeatStreams) {
1115 if (stream == nullptr) {
1116 continue;
1117 }
1118 auto streamRepeat = CastStream<HStreamRepeat>(stream);
1119 if (streamRepeat->GetRepeatStreamType() == RepeatStreamType::LIVEPHOTO) {
1120 MEDIA_INFO_LOG("restart movingphoto stream.");
1121 if (streamRepeat->SetMirrorForLivePhoto(isMirror, opMode_)) {
1122 isMovingPhotoMirror_ = isMirror;
1123 // set clear cache flag
1124 std::lock_guard<std::mutex> lock(movingPhotoStatusLock_);
1125 CHECK_RETURN_RET_ELOG(livephotoListener_ == nullptr, CAMERA_OK, "livephotoListener_ is null");
1126 livephotoListener_->SetClearFlag();
1127 }
1128 break;
1129 }
1130 }
1131 return CAMERA_OK;
1132 }
1133
GetOutputStatus(int32_t & status)1134 void HStreamOperator::GetOutputStatus(int32_t &status)
1135 {
1136 auto repeatStreams = streamContainer_.GetStreams(StreamType::REPEAT);
1137 for (auto& stream : repeatStreams) {
1138 if (stream == nullptr) {
1139 continue;
1140 }
1141 auto streamRepeat = CastStream<HStreamRepeat>(stream);
1142 if (streamRepeat->GetRepeatStreamType() == RepeatStreamType::VIDEO) {
1143 if (streamRepeat->GetPreparedCaptureId() != CAPTURE_ID_UNSET) {
1144 const int32_t videoStartStatus = 2;
1145 status = videoStartStatus;
1146 }
1147 }
1148 }
1149 }
1150
1151
1152 #ifdef CAMERA_USE_SENSOR
RegisterSensorCallback()1153 void HStreamOperator::RegisterSensorCallback()
1154 {
1155 std::lock_guard<std::mutex> lock(sensorLock_);
1156 if (isRegisterSensorSuccess_) {
1157 MEDIA_INFO_LOG("HCaptureSession::RegisterSensorCallback isRegisterSensorSuccess return");
1158 return;
1159 }
1160 MEDIA_INFO_LOG("HCaptureSession::RegisterSensorCallback start");
1161 user.callback = GravityDataCallbackImpl;
1162 int32_t subscribeRet = SubscribeSensor(SENSOR_TYPE_ID_GRAVITY, &user);
1163 MEDIA_INFO_LOG("RegisterSensorCallback, subscribeRet: %{public}d", subscribeRet);
1164 int32_t setBatchRet = SetBatch(SENSOR_TYPE_ID_GRAVITY, &user, POSTURE_INTERVAL, 0);
1165 MEDIA_INFO_LOG("RegisterSensorCallback, setBatchRet: %{public}d", setBatchRet);
1166 int32_t activateRet = ActivateSensor(SENSOR_TYPE_ID_GRAVITY, &user);
1167 MEDIA_INFO_LOG("RegisterSensorCallback, activateRet: %{public}d", activateRet);
1168 if (subscribeRet != CAMERA_OK || setBatchRet != CAMERA_OK || activateRet != CAMERA_OK) {
1169 isRegisterSensorSuccess_ = false;
1170 MEDIA_INFO_LOG("RegisterSensorCallback failed.");
1171 } else {
1172 isRegisterSensorSuccess_ = true;
1173 }
1174 }
1175
UnRegisterSensorCallback()1176 void HStreamOperator::UnRegisterSensorCallback()
1177 {
1178 std::lock_guard<std::mutex> lock(sensorLock_);
1179 int32_t deactivateRet = DeactivateSensor(SENSOR_TYPE_ID_GRAVITY, &user);
1180 int32_t unsubscribeRet = UnsubscribeSensor(SENSOR_TYPE_ID_GRAVITY, &user);
1181 if (deactivateRet == CAMERA_OK && unsubscribeRet == CAMERA_OK) {
1182 MEDIA_INFO_LOG("HCameraService.UnRegisterSensorCallback success.");
1183 isRegisterSensorSuccess_ = false;
1184 } else {
1185 MEDIA_INFO_LOG("HCameraService.UnRegisterSensorCallback failed.");
1186 }
1187 }
1188
GravityDataCallbackImpl(SensorEvent * event)1189 void HStreamOperator::GravityDataCallbackImpl(SensorEvent* event)
1190 {
1191 MEDIA_DEBUG_LOG("GravityDataCallbackImpl prepare execute");
1192 CHECK_RETURN_ELOG(event == nullptr, "SensorEvent is nullptr.");
1193 CHECK_RETURN_ELOG(event[0].data == nullptr, "SensorEvent[0].data is nullptr.");
1194 CHECK_RETURN_ELOG(event->sensorTypeId != SENSOR_TYPE_ID_GRAVITY, "SensorCallback error type.");
1195 // this data will be delete when callback execute finish
1196 GravityData* nowGravityData = reinterpret_cast<GravityData*>(event->data);
1197 gravityData = { nowGravityData->x, nowGravityData->y, nowGravityData->z };
1198 sensorRotation = CalcSensorRotation(CalcRotationDegree(gravityData));
1199 }
1200
CalcSensorRotation(int32_t sensorDegree)1201 int32_t HStreamOperator::CalcSensorRotation(int32_t sensorDegree)
1202 {
1203 // Use ROTATION_0 when degree range is [0, 30]∪[330, 359]
1204 if (sensorDegree >= 0 && (sensorDegree <= 30 || sensorDegree >= 330)) {
1205 return STREAM_ROTATE_0;
1206 } else if (sensorDegree >= 60 && sensorDegree <= 120) { // Use ROTATION_90 when degree range is [60, 120]
1207 return STREAM_ROTATE_90;
1208 } else if (sensorDegree >= 150 && sensorDegree <= 210) { // Use ROTATION_180 when degree range is [150, 210]
1209 return STREAM_ROTATE_180;
1210 } else if (sensorDegree >= 240 && sensorDegree <= 300) { // Use ROTATION_270 when degree range is [240, 300]
1211 return STREAM_ROTATE_270;
1212 } else {
1213 return sensorRotation;
1214 }
1215 }
1216
CalcRotationDegree(GravityData data)1217 int32_t HStreamOperator::CalcRotationDegree(GravityData data)
1218 {
1219 float x = data.x;
1220 float y = data.y;
1221 float z = data.z;
1222 int degree = -1;
1223 if ((x * x + y * y) * VALID_INCLINATION_ANGLE_THRESHOLD_COEFFICIENT < z * z) {
1224 return degree;
1225 }
1226 // arccotx = pi / 2 - arctanx, 90 is used to calculate acot(in degree); degree = rad / pi * 180
1227 degree = 90 - static_cast<int>(round(atan2(y, -x) / M_PI * 180));
1228 // Normalize the degree to the range of 0~360
1229 return degree >= 0 ? degree % 360 : degree % 360 + 360;
1230 }
1231 #endif
1232
SetSensorRotation(int32_t rotationValue,int32_t sensorOrientation,int32_t cameraPosition)1233 void HStreamOperator::SetSensorRotation(int32_t rotationValue, int32_t sensorOrientation, int32_t cameraPosition)
1234 {
1235 MEDIA_INFO_LOG("SetSensorRotation rotationValue : %{public}d, sensorOrientation : %{public}d",
1236 rotationValue, sensorOrientation);
1237 // 获取当前重力传感器角度
1238 if (cameraPosition == OHOS_CAMERA_POSITION_BACK) {
1239 sensorRotation_ = rotationValue - sensorOrientation;
1240 } else if (cameraPosition == OHOS_CAMERA_POSITION_FRONT) {
1241 sensorRotation_ = sensorOrientation - rotationValue;
1242 }
1243 }
1244
StartMovingPhotoEncode(int32_t rotation,uint64_t timestamp,int32_t format,int32_t captureId)1245 void HStreamOperator::StartMovingPhotoEncode(int32_t rotation, uint64_t timestamp, int32_t format, int32_t captureId)
1246 {
1247 CHECK_RETURN(!isSetMotionPhoto_);
1248 {
1249 std::lock_guard<std::mutex> lock(motionPhotoStatusLock_);
1250 curMotionPhotoStatus_[captureId] = isSetMotionPhoto_;
1251 MEDIA_DEBUG_LOG("HStreamOperator::StartMovingPhotoEncode cptureId : %{public}d, isSetMotionPhto : %{public}d",
1252 captureId, isSetMotionPhoto_);
1253 }
1254 int32_t addMirrorRotation = 0;
1255 MEDIA_INFO_LOG("sensorRotation is : %{public}d", sensorRotation_);
1256 if ((sensorRotation_ == STREAM_ROTATE_0 || sensorRotation_ == STREAM_ROTATE_180) && isMovingPhotoMirror_) {
1257 addMirrorRotation = STREAM_ROTATE_180;
1258 }
1259 int32_t realRotation = rotation + addMirrorRotation;
1260 realRotation = realRotation % ROTATION_360;
1261 StartRecord(timestamp, realRotation, captureId);
1262 }
1263
UpdateOrientationBaseGravity(int32_t rotationValue,int32_t sensorOrientation,int32_t cameraPosition,int32_t & rotation)1264 void HStreamOperator::UpdateOrientationBaseGravity(int32_t rotationValue, int32_t sensorOrientation,
1265 int32_t cameraPosition, int32_t& rotation)
1266 {
1267 CHECK_RETURN_ELOG(cameraDevice_ == nullptr, "cameraDevice is nullptr.");
1268 CameraRotateStrategyInfo strategyInfo;
1269 CHECK_RETURN_ELOG(!(cameraDevice_->GetSigleStrategyInfo(strategyInfo)), "Update roteta angle not supported");
1270 OHOS::Rosen::FoldStatus foldstatus = OHOS::Rosen::DisplayManager::GetInstance().GetFoldStatus();
1271 OHOS::Rosen::FoldDisplayMode displayMode = OHOS::Rosen::DisplayManager::GetInstance().GetFoldDisplayMode();
1272 bool isValidDisplayStatus = (foldstatus == OHOS::Rosen::FoldStatus::FOLD_STATE_EXPAND_WITH_SECOND_EXPAND) &&
1273 (displayMode == OHOS::Rosen::FoldDisplayMode::GLOBAL_FULL);
1274 CHECK_RETURN(!isValidDisplayStatus);
1275 int32_t imageRotation = (sensorRotation + ROTATION_45_DEGREES) / ROTATION_90_DEGREES * ROTATION_90_DEGREES;
1276 if (cameraPosition == OHOS_CAMERA_POSITION_BACK) {
1277 rotation = (imageRotation + sensorOrientation) % ROTATION_360_DEGREES;
1278 } else if (cameraPosition == OHOS_CAMERA_POSITION_FRONT) {
1279 rotation = (sensorOrientation - imageRotation + ROTATION_360_DEGREES) % ROTATION_360_DEGREES;
1280 }
1281 MEDIA_INFO_LOG("UpdateOrientationBaseGravity sensorRotation is : %{public}d, rotation is %{public}d,",
1282 sensorRotation, rotation);
1283 }
1284
CreateDisplayName(const std::string & suffix)1285 std::string HStreamOperator::CreateDisplayName(const std::string& suffix)
1286 {
1287 struct tm currentTime;
1288 std::string formattedTime = "";
1289 if (GetSystemCurrentTime(¤tTime)) { // LCOV_EXCL_LINE
1290 std::stringstream ss;
1291 ss << prefix << std::setw(yearWidth) << std::setfill(placeholder) << currentTime.tm_year + startYear
1292 << std::setw(otherWidth) << std::setfill(placeholder) << (currentTime.tm_mon + 1)
1293 << std::setw(otherWidth) << std::setfill(placeholder) << currentTime.tm_mday
1294 << connector << std::setw(otherWidth) << std::setfill(placeholder) << currentTime.tm_hour
1295 << std::setw(otherWidth) << std::setfill(placeholder) << currentTime.tm_min
1296 << std::setw(otherWidth) << std::setfill(placeholder) << currentTime.tm_sec;
1297 formattedTime = ss.str();
1298 } else {
1299 MEDIA_ERR_LOG("Failed to get current time.");
1300 }
1301 if (lastDisplayName_ == formattedTime) { // LCOV_EXCL_LINE
1302 saveIndex++;
1303 formattedTime = formattedTime + connector + std::to_string(saveIndex);
1304 MEDIA_INFO_LOG("CreateDisplayName is %{private}s", formattedTime.c_str());
1305 return formattedTime;
1306 }
1307 lastDisplayName_ = formattedTime;
1308 saveIndex = 0;
1309 MEDIA_INFO_LOG("CreateDisplayName is %{private}s", formattedTime.c_str());
1310 return formattedTime;
1311 }
1312
CreateBurstDisplayName(int32_t imageSeqId,int32_t seqId)1313 std::string HStreamOperator::CreateBurstDisplayName(int32_t imageSeqId, int32_t seqId)
1314 {
1315 struct tm currentTime;
1316 std::string formattedTime = "";
1317 std::stringstream ss;
1318 // a group of burst capture use the same prefix
1319 if (imageSeqId == 1) { // LCOV_EXCL_LINE
1320 CHECK_RETURN_RET_ELOG(!GetSystemCurrentTime(¤tTime), formattedTime, "Failed to get current time.");
1321 ss << prefix << std::setw(yearWidth) << std::setfill(placeholder) << currentTime.tm_year + startYear
1322 << std::setw(otherWidth) << std::setfill(placeholder) << (currentTime.tm_mon + 1) << std::setw(otherWidth)
1323 << std::setfill(placeholder) << currentTime.tm_mday << connector << std::setw(otherWidth)
1324 << std::setfill(placeholder) << currentTime.tm_hour << std::setw(otherWidth) << std::setfill(placeholder)
1325 << currentTime.tm_min << std::setw(otherWidth) << std::setfill(placeholder) << currentTime.tm_sec
1326 << connector << burstTag;
1327 lastBurstPrefix_ = ss.str();
1328 ss << std::setw(burstWidth) << std::setfill(placeholder) << seqId;
1329 } else {
1330 ss << lastBurstPrefix_ << std::setw(burstWidth) << std::setfill(placeholder) << seqId;
1331 }
1332 MEDIA_DEBUG_LOG("burst prefix is %{private}s", lastBurstPrefix_.c_str());
1333
1334 if (seqId == 1) { // LCOV_EXCL_LINE
1335 ss << coverTag;
1336 }
1337 formattedTime = ss.str();
1338 MEDIA_INFO_LOG("CreateBurstDisplayName is %{private}s", formattedTime.c_str());
1339 return formattedTime;
1340 }
1341
SetCameraPhotoProxyInfo(sptr<CameraServerPhotoProxy> cameraPhotoProxy,int32_t & cameraShotType,bool & isBursting,std::string & burstKey)1342 void HStreamOperator::SetCameraPhotoProxyInfo(sptr<CameraServerPhotoProxy> cameraPhotoProxy, int32_t &cameraShotType,
1343 bool &isBursting, std::string &burstKey)
1344 {
1345 cameraPhotoProxy->SetShootingMode(opMode_);
1346 int32_t captureId = cameraPhotoProxy->GetCaptureId();
1347 std::string imageId = cameraPhotoProxy->GetPhotoId();
1348 isBursting = false;
1349 bool isCoverPhoto = false;
1350 int32_t invalidBurstSeqId = -1;
1351 std::list<sptr<HStreamCommon>> captureStreams = streamContainer_.GetStreams(StreamType::CAPTURE);
1352 std::list<sptr<HStreamCommon>> captureStreamsOffline = streamContainerOffline_.GetStreams(StreamType::CAPTURE);
1353 captureStreams.insert(captureStreams.end(), captureStreamsOffline.begin(), captureStreamsOffline.end());
1354 for (auto& stream : captureStreams) {
1355 CHECK_CONTINUE_WLOG(stream == nullptr, "stream is null");
1356 MEDIA_INFO_LOG("CreateMediaLibrary get captureStream");
1357 auto streamCapture = CastStream<HStreamCapture>(stream);
1358 isBursting = streamCapture->IsBurstCapture(captureId);
1359 if (isBursting) {
1360 burstKey = streamCapture->GetBurstKey(captureId);
1361 streamCapture->SetBurstImages(captureId, imageId);
1362 isCoverPhoto = streamCapture->IsBurstCover(captureId);
1363 int32_t burstSeqId = cameraPhotoProxy->GetBurstSeqId();
1364 int32_t imageSeqId = streamCapture->GetCurBurstSeq(captureId);
1365 int32_t displaySeqId = (burstSeqId != invalidBurstSeqId) ? burstSeqId : imageSeqId;
1366 cameraPhotoProxy->SetDisplayName(CreateBurstDisplayName(imageSeqId, displaySeqId));
1367 streamCapture->CheckResetBurstKey(captureId);
1368 MEDIA_INFO_LOG("isBursting burstKey:%{public}s isCoverPhoto:%{public}d", burstKey.c_str(), isCoverPhoto);
1369 cameraShotType = BURST_SHOT_TYPE;
1370 cameraPhotoProxy->SetBurstInfo(burstKey, isCoverPhoto);
1371 break;
1372 }
1373 MEDIA_INFO_LOG("CreateMediaLibrary not Bursting");
1374 }
1375 }
1376
ConfigPayload(uint32_t pid,uint32_t tid,const char * bundleName,int32_t qosLevel,std::unordered_map<std::string,std::string> & mapPayload)1377 void HStreamOperator::ConfigPayload(uint32_t pid, uint32_t tid, const char *bundleName, int32_t qosLevel,
1378 std::unordered_map<std::string, std::string> &mapPayload)
1379 {
1380 std::string strBundleName = bundleName;
1381 std::string strPid = std::to_string(pid);
1382 std::string strTid = std::to_string(tid);
1383 std::string strQos = std::to_string(qosLevel);
1384 mapPayload["pid"] = strPid;
1385 mapPayload[strTid] = strQos;
1386 mapPayload["bundleName"] = strBundleName;
1387 MEDIA_INFO_LOG("mapPayload pid: %{public}s. tid: %{public}s. Qos: %{public}s",
1388 strPid.c_str(), strTid.c_str(), strQos.c_str());
1389 }
1390
CreateMediaLibrary(const sptr<CameraServerPhotoProxy> & cameraPhotoProxy,std::string & uri,int32_t & cameraShotType,std::string & burstKey,int64_t timestamp)1391 int32_t HStreamOperator::CreateMediaLibrary(const sptr<CameraServerPhotoProxy>& cameraPhotoProxy, std::string& uri,
1392 int32_t& cameraShotType, std::string& burstKey, int64_t timestamp)
1393 {
1394 MEDIA_INFO_LOG("CreateMediaLibrary E");
1395 CAMERA_SYNC_TRACE;
1396 int32_t captureId = cameraPhotoProxy->GetCaptureId();
1397 bool isSetMotionPhoto = false;
1398 {
1399 std::lock_guard<std::mutex> lock(motionPhotoStatusLock_);
1400 isSetMotionPhoto = curMotionPhotoStatus_.find(captureId) != curMotionPhotoStatus_.end()
1401 && curMotionPhotoStatus_[captureId];
1402 curMotionPhotoStatus_.erase(captureId);
1403 }
1404 MEDIA_DEBUG_LOG("HStreamOperator::CreateMediaLibrary current captureId: %{public}d, isSetMotionPhoto: %{public}d",
1405 captureId, isSetMotionPhoto);
1406 cameraShotType = isSetMotionPhoto ? MOVING_PHOTO_SHOT_TYPE : IMAGE_SHOT_TYPE;
1407 cameraPhotoProxy->SetDisplayName(CreateDisplayName(suffixJpeg));
1408 bool isBursting = false;
1409 CameraReportDfxUtils::GetInstance()->SetPrepareProxyEndInfo(captureId);
1410 CameraReportDfxUtils::GetInstance()->SetAddProxyStartInfo(captureId);
1411 SetCameraPhotoProxyInfo(cameraPhotoProxy, cameraShotType, isBursting, burstKey);
1412 std::shared_ptr<PhotoAssetProxy> photoAssetProxy =
1413 PhotoAssetProxy::GetPhotoAssetProxy(cameraShotType, uid_, callerToken_);
1414 CHECK_RETURN_RET_ELOG(
1415 photoAssetProxy == nullptr, CAMERA_ALLOC_ERROR, "HStreamOperator::CreateMediaLibrary get photoAssetProxy fail");
1416 photoAssetProxy->AddPhotoProxy((sptr<PhotoProxy>&)cameraPhotoProxy);
1417 uri = photoAssetProxy->GetPhotoAssetUri();
1418 if (!isBursting && isSetMotionPhoto && avcodecTaskManagerProxy_) {
1419 MEDIA_INFO_LOG("taskManager setVideoFd start");
1420 avcodecTaskManagerProxy_->SetVideoFd(timestamp, photoAssetProxy, captureId);
1421 } else {
1422 photoAssetProxy.reset();
1423 }
1424 CameraReportDfxUtils::GetInstance()->SetAddProxyEndInfo(captureId);
1425 MEDIA_INFO_LOG("CreateMediaLibrary X");
1426 return CAMERA_OK;
1427 }
1428
RotatePicture(std::weak_ptr<PictureIntf> picture)1429 void RotatePicture(std::weak_ptr<PictureIntf> picture)
1430 {
1431 CAMERA_SYNC_TRACE;
1432 auto ptr = picture.lock();
1433 CHECK_RETURN(!ptr);
1434 ptr->RotatePicture();
1435 }
1436
IsIpsRotateSupported()1437 bool HStreamOperator::IsIpsRotateSupported()
1438 {
1439 bool ipsRotateSupported = false;
1440 camera_metadata_item_t item;
1441 bool ret = GetDeviceAbilityByMeta(OHOS_ABILITY_ROTATION_IN_IPS_SUPPORTED, &item);
1442 if (ret && item.count > 0) {
1443 ipsRotateSupported = static_cast<bool>(item.data.u8[0]);
1444 }
1445 MEDIA_INFO_LOG("HstreamOperator IsIpsRotateSupported %{public}d", ipsRotateSupported);
1446 return ipsRotateSupported;
1447 }
1448
ProcessPhotoProxy(int32_t captureId,std::shared_ptr<PictureIntf> picturePtr,bool isBursting,sptr<CameraServerPhotoProxy> cameraPhotoProxy,std::string & uri)1449 std::shared_ptr<PhotoAssetIntf> HStreamOperator::ProcessPhotoProxy(int32_t captureId,
1450 std::shared_ptr<PictureIntf> picturePtr, bool isBursting, sptr<CameraServerPhotoProxy> cameraPhotoProxy,
1451 std::string& uri)
1452 {
1453 MEDIA_INFO_LOG("enter ProcessPhotoProxy");
1454 CAMERA_SYNC_TRACE;
1455 CHECK_RETURN_RET_ELOG(picturePtr == nullptr, nullptr, "picturePtr is null");
1456 sptr<HStreamCapture> captureStream = nullptr;
1457 std::list<sptr<HStreamCommon>> captureStreams = streamContainer_.GetStreams(StreamType::CAPTURE);
1458 std::list<sptr<HStreamCommon>> captureStreamsOffline = streamContainerOffline_.GetStreams(StreamType::CAPTURE);
1459 captureStreams.insert(captureStreams.end(), captureStreamsOffline.begin(), captureStreamsOffline.end());
1460 for (auto& stream : captureStreams) {
1461 captureStream = CastStream<HStreamCapture>(stream);
1462 if (captureStream != nullptr) {
1463 break;
1464 }
1465 }
1466 CHECK_RETURN_RET_ELOG(captureStream == nullptr, nullptr, "stream is null");
1467 std::shared_ptr<PhotoAssetIntf> photoAssetProxy = nullptr;
1468 std::thread taskThread;
1469 if (isBursting) {
1470 int32_t cameraShotType = 3;
1471 photoAssetProxy = PhotoAssetProxy::GetPhotoAssetProxy(
1472 cameraShotType, IPCSkeleton::GetCallingUid(), callerToken_);
1473 } else {
1474 photoAssetProxy = captureStream->GetPhotoAssetInstance(captureId);
1475 }
1476 CHECK_RETURN_RET_ELOG(photoAssetProxy == nullptr, nullptr, "photoAssetProxy is null");
1477 if (!isBursting && picturePtr) {
1478 MEDIA_DEBUG_LOG("CreateMediaLibrary RotatePicture E");
1479 if (!IsIpsRotateSupported()) {
1480 taskThread = std::thread(RotatePicture, picturePtr);
1481 }
1482 }
1483 bool isProfessionalPhoto = (opMode_ == static_cast<int32_t>(HDI::Camera::V1_3::OperationMode::PROFESSIONAL_PHOTO));
1484 if (isBursting || captureStream->GetAddPhotoProxyEnabled() == false || isProfessionalPhoto) {
1485 MEDIA_INFO_LOG("CreateMediaLibrary AddPhotoProxy E");
1486 string pictureId = cameraPhotoProxy->GetTitle() + "." + cameraPhotoProxy->GetExtension();
1487 CameraReportDfxUtils::GetInstance()->SetPictureId(captureId, pictureId);
1488 photoAssetProxy->AddPhotoProxy((sptr<PhotoProxy>&)cameraPhotoProxy);
1489 MEDIA_INFO_LOG("CreateMediaLibrary AddPhotoProxy X");
1490 }
1491 uri = photoAssetProxy->GetPhotoAssetUri();
1492 if (!isBursting && taskThread.joinable()) {
1493 taskThread.join();
1494 MEDIA_DEBUG_LOG("CreateMediaLibrary RotatePicture X");
1495 }
1496 MEDIA_INFO_LOG("CreateMediaLibrary NotifyLowQualityImage E");
1497 DeferredProcessing::DeferredProcessingService::GetInstance().NotifyLowQualityImage(
1498 photoAssetProxy->GetUserId(), uri, picturePtr);
1499 MEDIA_INFO_LOG("CreateMediaLibrary NotifyLowQualityImage X");
1500 return photoAssetProxy;
1501 }
1502
CreateMediaLibrary(std::shared_ptr<PictureIntf> picture,const sptr<CameraServerPhotoProxy> & photoProxy,std::string & uri,int32_t & cameraShotType,std::string & burstKey,int64_t timestamp)1503 int32_t HStreamOperator::CreateMediaLibrary(
1504 std::shared_ptr<PictureIntf> picture, const sptr<CameraServerPhotoProxy> &photoProxy, std::string &uri,
1505 int32_t &cameraShotType, std::string &burstKey, int64_t timestamp)
1506 {
1507 MEDIA_INFO_LOG("CreateMediaLibrary with picture E");
1508 CAMERA_SYNC_TRACE;
1509 int32_t captureId = photoProxy->GetCaptureId();
1510 bool isSetMotionPhoto = false;
1511 {
1512 std::lock_guard<std::mutex> lock(motionPhotoStatusLock_);
1513 isSetMotionPhoto = curMotionPhotoStatus_.find(captureId) != curMotionPhotoStatus_.end()
1514 && curMotionPhotoStatus_[captureId];
1515 curMotionPhotoStatus_.erase(captureId);
1516 }
1517 MEDIA_DEBUG_LOG("HStreamOperator::CreateMediaLibrary current captureId: %{public}d, isSetMotionPhoto: %{public}d",
1518 captureId, isSetMotionPhoto);
1519 cameraShotType = isSetMotionPhoto ? MOVING_PHOTO_SHOT_TYPE : IMAGE_SHOT_TYPE;
1520 PhotoFormat photoFormat = photoProxy->GetFormat();
1521 std::string formatSuffix = photoFormat == PhotoFormat::HEIF ? suffixHeif : suffixJpeg;
1522 photoProxy->SetDisplayName(CreateDisplayName(formatSuffix));
1523 bool isBursting = false;
1524 CameraReportDfxUtils::GetInstance()->SetPrepareProxyEndInfo(captureId);
1525 CameraReportDfxUtils::GetInstance()->SetAddProxyStartInfo(captureId);
1526 SetCameraPhotoProxyInfo(photoProxy, cameraShotType, isBursting, burstKey);
1527 std::shared_ptr<PhotoAssetIntf> photoAssetProxy =
1528 ProcessPhotoProxy(captureId, picture, isBursting, photoProxy, uri);
1529 CHECK_RETURN_RET_ELOG(photoAssetProxy == nullptr, CAMERA_INVALID_ARG, "photoAssetProxy is null");
1530 if (!isBursting && isSetMotionPhoto && avcodecTaskManagerProxy_) {
1531 MEDIA_INFO_LOG("CreateMediaLibrary captureId :%{public}d", captureId);
1532 avcodecTaskManagerProxy_->SetVideoFd(timestamp, photoAssetProxy, captureId);
1533 } else {
1534 photoAssetProxy.reset();
1535 }
1536 CameraReportDfxUtils::GetInstance()->SetAddProxyEndInfo(captureId);
1537 MEDIA_INFO_LOG("CreateMediaLibrary with picture X");
1538 return CAMERA_OK;
1539 }
1540
OnCaptureStarted(int32_t captureId,const std::vector<int32_t> & streamIds)1541 int32_t HStreamOperator::OnCaptureStarted(int32_t captureId, const std::vector<int32_t>& streamIds)
1542 {
1543 MEDIA_INFO_LOG("HStreamOperator::OnCaptureStarted captureId:%{public}d, streamIds:%{public}s", captureId,
1544 Container2String(streamIds.begin(), streamIds.end()).c_str());
1545 std::lock_guard<std::mutex> lock(cbMutex_);
1546 for (auto& streamId : streamIds) {
1547 sptr<HStreamCommon> curStream = GetHdiStreamByStreamID(streamId);
1548 if (curStream == nullptr) {
1549 MEDIA_ERR_LOG("HStreamOperator::OnCaptureStarted StreamId: %{public}d not found", streamId);
1550 return CAMERA_INVALID_ARG;
1551 } else if (curStream->GetStreamType() == StreamType::REPEAT) {
1552 CastStream<HStreamRepeat>(curStream)->OnFrameStarted();
1553 CameraReportUtils::GetInstance().SetStreamInfo(streamContainer_.GetAllStreams());
1554 CameraReportUtils::GetInstance().SetOpenCamPerfEndInfo();
1555 CameraReportUtils::GetInstance().SetModeChangePerfEndInfo();
1556 CameraReportUtils::GetInstance().SetSwitchCamPerfEndInfo();
1557 CameraDynamicLoader::LoadDynamiclibAsync(MEDIA_LIB_SO); // cache dynamiclib
1558 } else if (curStream->GetStreamType() == StreamType::CAPTURE) {
1559 CastStream<HStreamCapture>(curStream)->OnCaptureStarted(captureId);
1560 }
1561 }
1562 return CAMERA_OK;
1563 }
1564
StartRecord(uint64_t timestamp,int32_t rotation,int32_t captureId)1565 void HStreamOperator::StartRecord(uint64_t timestamp, int32_t rotation, int32_t captureId)
1566 {
1567 CHECK_RETURN(!isSetMotionPhoto_);
1568 CHECK_RETURN(!(isSetMotionPhoto_ && avcodecTaskManagerProxy_));
1569 auto thisPtr = wptr<HStreamOperator>(this);
1570 avcodecTaskManagerProxy_->SubmitTask([thisPtr, timestamp, rotation, captureId]() {
1571 auto operatorPtr = thisPtr.promote();
1572 CHECK_RETURN(!operatorPtr);
1573 operatorPtr->StartOnceRecord(timestamp, rotation, captureId);
1574 });
1575 }
1576
SessionDrainImageCallback(std::vector<sptr<FrameRecord>> & frameCacheList,wptr<MovingPhotoListener> listener,wptr<MovingPhotoVideoCacheIntf> movingPhotoVideoCacheIntf,uint64_t timestamp,int32_t rotation,int32_t captureId)1577 SessionDrainImageCallback::SessionDrainImageCallback(std::vector<sptr<FrameRecord>>& frameCacheList,
1578 wptr<MovingPhotoListener> listener,
1579 wptr<MovingPhotoVideoCacheIntf> movingPhotoVideoCacheIntf,
1580 uint64_t timestamp,
1581 int32_t rotation,
1582 int32_t captureId)
1583 : frameCacheList_(frameCacheList),
1584 listener_(listener),
1585 movingPhotoVideoCacheIntf_(movingPhotoVideoCacheIntf),
1586 timestamp_(timestamp),
1587 rotation_(rotation),
1588 captureId_(captureId)
1589 {
1590 }
1591
~SessionDrainImageCallback()1592 SessionDrainImageCallback::~SessionDrainImageCallback()
1593 {
1594 MEDIA_INFO_LOG("~SessionDrainImageCallback enter");
1595 timestamp_ = 0;
1596 rotation_ = 0;
1597 captureId_ = 0;
1598 }
1599
OnDrainImage(sptr<FrameRecord> frame)1600 void SessionDrainImageCallback::OnDrainImage(sptr<FrameRecord> frame)
1601 {
1602 MEDIA_INFO_LOG("OnDrainImage enter");
1603 {
1604 std::lock_guard<std::mutex> lock(mutex_);
1605 frameCacheList_.push_back(frame);
1606 }
1607 CHECK_RETURN_ELOG(movingPhotoVideoCacheIntf_ == nullptr, "movingPhotoVideoCacheIntf_ is null");
1608 auto movingPhotoVideoCacheIntf = movingPhotoVideoCacheIntf_.promote();
1609 if (movingPhotoVideoCacheIntf) {
1610 movingPhotoVideoCacheIntf->OnDrainFrameRecord(frame);
1611 }
1612 }
1613
OnDrainImageFinish(bool isFinished)1614 void SessionDrainImageCallback::OnDrainImageFinish(bool isFinished)
1615 {
1616 MEDIA_INFO_LOG("OnDrainImageFinish enter");
1617 CHECK_RETURN_ELOG(movingPhotoVideoCacheIntf_ == nullptr, "movingPhotoVideoCacheIntf_ is null");
1618 auto movingPhotoVideoCacheIntf = movingPhotoVideoCacheIntf_.promote();
1619 if (movingPhotoVideoCacheIntf) {
1620 std::lock_guard<std::mutex> lock(mutex_);
1621 movingPhotoVideoCacheIntf->GetFrameCachedResult(frameCacheList_, timestamp_, rotation_, captureId_);
1622 }
1623 auto listener = listener_.promote();
1624 CHECK_EXECUTE(listener && isFinished, listener->RemoveDrainImageManager(this));
1625 }
1626
StartOnceRecord(uint64_t timestamp,int32_t rotation,int32_t captureId)1627 void HStreamOperator::StartOnceRecord(uint64_t timestamp, int32_t rotation, int32_t captureId)
1628 {
1629 MEDIA_INFO_LOG("StartOnceRecord enter");
1630 // frameCacheList only used by now thread
1631 std::lock_guard<std::mutex> lock(movingPhotoStatusLock_);
1632 CHECK_RETURN_ELOG(!livephotoListener_, "HCaptureSession::StartOnceRecord livephotoListener_ is null");
1633 std::vector<sptr<FrameRecord>> frameCacheList;
1634 sptr<SessionDrainImageCallback> imageCallback = new SessionDrainImageCallback(frameCacheList,
1635 livephotoListener_, movingPhotoVideoCacheProxy_, timestamp, rotation, captureId);
1636 livephotoListener_->ClearCache(timestamp);
1637 livephotoListener_->DrainOutImage(imageCallback);
1638 MEDIA_INFO_LOG("StartOnceRecord end");
1639 }
1640
CreateStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1> & streamInfos)1641 int32_t HStreamOperator::CreateStreams(std::vector<HDI::Camera::V1_1::StreamInfo_V1_1>& streamInfos)
1642 {
1643 CamRetCode hdiRc = HDI::Camera::V1_0::NO_ERROR;
1644 CHECK_RETURN_RET_ELOG(streamInfos.empty(), CAMERA_OK, "HStreamOperator::CreateStreams streamInfos is empty!");
1645 std::lock_guard<std::mutex> lock(opMutex_);
1646 sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> streamOperator = GetHDIStreamOperator();
1647 CHECK_RETURN_RET_ELOG(streamOperator == nullptr, CAMERA_UNKNOWN_ERROR,
1648 "HStreamOperator::CreateStreams GetStreamOperator is null!");
1649 // get higher streamOperator version
1650 auto streamOperatorV1_1 = GetStreamOperatorV1_1(streamOperator);
1651 if (streamOperatorV1_1 != nullptr) {
1652 MEDIA_INFO_LOG("HStreamOperator::CreateStreams streamOperator V1_1");
1653 for (auto streamInfo : streamInfos) {
1654 if (streamInfo.extendedStreamInfos.size() > 0) {
1655 MEDIA_INFO_LOG("HCameraDevice::CreateStreams streamId:%{public}d width:%{public}d height:%{public}d"
1656 "format:%{public}d dataspace:%{public}d", streamInfo.v1_0.streamId_, streamInfo.v1_0.width_,
1657 streamInfo.v1_0.height_, streamInfo.v1_0.format_, streamInfo.v1_0.dataspace_);
1658 MEDIA_INFO_LOG("HStreamOperator::CreateStreams streamOperator V1_1 type %{public}d",
1659 streamInfo.extendedStreamInfos[0].type);
1660 }
1661 }
1662 hdiRc = (CamRetCode)(streamOperatorV1_1->CreateStreams_V1_1(streamInfos));
1663 } else {
1664 MEDIA_INFO_LOG("HStreamOperator::CreateStreams streamOperator V1_0");
1665 std::vector<StreamInfo> streamInfos_V1_0;
1666 for (auto streamInfo : streamInfos) {
1667 streamInfos_V1_0.emplace_back(streamInfo.v1_0);
1668 }
1669 hdiRc = (CamRetCode)(streamOperator->CreateStreams(streamInfos_V1_0));
1670 }
1671 if (hdiRc != HDI::Camera::V1_0::NO_ERROR) {
1672 MEDIA_ERR_LOG("HStreamOperator::CreateStreams(), Failed to commit %{public}d", hdiRc);
1673 CameraReportUtils::ReportCameraError("HStreamOperator::CreateStreams",
1674 hdiRc, true, CameraReportUtils::GetCallerInfo());
1675 std::vector<int32_t> streamIds;
1676 for (auto& streamInfo : streamInfos) {
1677 streamIds.emplace_back(streamInfo.v1_0.streamId_);
1678 }
1679 CHECK_PRINT_ELOG(!streamIds.empty() &&
1680 streamOperator->ReleaseStreams(streamIds) != HDI::Camera::V1_0::NO_ERROR,
1681 "HStreamOperator::CreateStreams(), Failed to release streams");
1682 }
1683 for (auto& info : streamInfos) {
1684 MEDIA_INFO_LOG("HStreamOperator::CreateStreams stream id is:%{public}d", info.v1_0.streamId_);
1685 }
1686 return HdiToServiceError(hdiRc);
1687 }
1688
GetStreamOperatorV1_1(sptr<OHOS::HDI::Camera::V1_0::IStreamOperator> & streamOperator)1689 sptr<OHOS::HDI::Camera::V1_1::IStreamOperator> HStreamOperator::GetStreamOperatorV1_1(
1690 sptr<OHOS::HDI::Camera::V1_0::IStreamOperator>& streamOperator)
1691 {
1692 uint32_t major;
1693 uint32_t minor;
1694 streamOperator->GetVersion(major, minor);
1695 MEDIA_INFO_LOG("streamOperator GetVersion major:%{public}d, minor:%{public}d", major, minor);
1696
1697 if (GetVersionId(major, minor) >= HDI_VERSION_ID_1_1) {
1698 auto streamOperatorV1_1 = OHOS::HDI::Camera::V1_1::IStreamOperator::CastFrom(streamOperator);
1699 if (streamOperatorV1_1 == nullptr) {
1700 MEDIA_ERR_LOG("HStreamOperator::CreateStreams IStreamOperator cast to V1_1 error");
1701 streamOperatorV1_1 = static_cast<OHOS::HDI::Camera::V1_1::IStreamOperator*>(streamOperator.GetRefPtr());
1702 }
1703 return streamOperatorV1_1;
1704 }
1705 return nullptr;
1706 }
1707
UpdateStreams(std::vector<StreamInfo_V1_1> & streamInfos)1708 int32_t HStreamOperator::UpdateStreams(std::vector<StreamInfo_V1_1>& streamInfos)
1709 {
1710 sptr<OHOS::HDI::Camera::V1_2::IStreamOperator> streamOperatorV1_2;
1711 auto streamOperator = GetHDIStreamOperator();
1712 CHECK_RETURN_RET_ELOG(streamOperator == nullptr, CAMERA_UNKNOWN_ERROR,
1713 "HStreamOperator::UpdateStreams GetStreamOperator is null!");
1714 uint32_t major;
1715 uint32_t minor;
1716 streamOperator->GetVersion(major, minor);
1717 MEDIA_INFO_LOG("UpdateStreams::UpdateStreams GetVersion major:%{public}d, minor:%{public}d", major, minor);
1718 if (GetVersionId(major, minor) >= HDI_VERSION_ID_1_2) {
1719 streamOperatorV1_2 = OHOS::HDI::Camera::V1_2::IStreamOperator::CastFrom(streamOperator);
1720 if (streamOperatorV1_2 == nullptr) {
1721 MEDIA_ERR_LOG("HStreamOperator::UpdateStreams IStreamOperator cast to V1_2 error");
1722 streamOperatorV1_2 = static_cast<OHOS::HDI::Camera::V1_2::IStreamOperator*>(streamOperator.GetRefPtr());
1723 }
1724 }
1725 CamRetCode hdiRc = HDI::Camera::V1_0::CamRetCode::NO_ERROR;
1726 if (streamOperatorV1_2 != nullptr) {
1727 MEDIA_DEBUG_LOG("HStreamOperator::UpdateStreams streamOperator V1_2");
1728 hdiRc = (CamRetCode)(streamOperatorV1_2->UpdateStreams(streamInfos));
1729 } else {
1730 MEDIA_DEBUG_LOG("HStreamOperator::UpdateStreams failed, streamOperator V1_2 is null.");
1731 return CAMERA_UNKNOWN_ERROR;
1732 }
1733 return HdiToServiceError(hdiRc);
1734 }
1735
OnCaptureStarted_V1_2(int32_t captureId,const std::vector<OHOS::HDI::Camera::V1_2::CaptureStartedInfo> & infos)1736 int32_t HStreamOperator::OnCaptureStarted_V1_2(
1737 int32_t captureId, const std::vector<OHOS::HDI::Camera::V1_2::CaptureStartedInfo>& infos)
1738 {
1739 MEDIA_INFO_LOG("HStreamOperator::OnCaptureStarted_V1_2 captureId:%{public}d", captureId);
1740 std::lock_guard<std::mutex> lock(cbMutex_);
1741 for (auto& captureInfo : infos) {
1742 sptr<HStreamCommon> curStream = GetHdiStreamByStreamID(captureInfo.streamId_);
1743 if (curStream == nullptr) {
1744 MEDIA_ERR_LOG("HStreamOperator::OnCaptureStarted_V1_2 StreamId: %{public}d not found."
1745 " exposureTime: %{public}u",
1746 captureInfo.streamId_, captureInfo.exposureTime_);
1747 return CAMERA_INVALID_ARG;
1748 } else if (curStream->GetStreamType() == StreamType::CAPTURE) {
1749 MEDIA_DEBUG_LOG("HStreamOperator::OnCaptureStarted_V1_2 StreamId: %{public}d."
1750 " exposureTime: %{public}u",
1751 captureInfo.streamId_, captureInfo.exposureTime_);
1752 CastStream<HStreamCapture>(curStream)->OnCaptureStarted(captureId, captureInfo.exposureTime_);
1753 }
1754 }
1755 return CAMERA_OK;
1756 }
1757
OnCaptureEnded(int32_t captureId,const std::vector<CaptureEndedInfo> & infos)1758 int32_t HStreamOperator::OnCaptureEnded(int32_t captureId, const std::vector<CaptureEndedInfo>& infos)
1759 {
1760 MEDIA_INFO_LOG("HStreamOperator::OnCaptureEnded");
1761 std::lock_guard<std::mutex> lock(cbMutex_);
1762 for (auto& captureInfo : infos) {
1763 sptr<HStreamCommon> curStream = GetHdiStreamByStreamID(captureInfo.streamId_);
1764 if (curStream == nullptr) {
1765 MEDIA_ERR_LOG("HStreamOperator::OnCaptureEnded StreamId: %{public}d not found."
1766 " Framecount: %{public}d",
1767 captureInfo.streamId_, captureInfo.frameCount_);
1768 return CAMERA_INVALID_ARG;
1769 } else if (curStream->GetStreamType() == StreamType::REPEAT) {
1770 CastStream<HStreamRepeat>(curStream)->OnFrameEnded(captureInfo.frameCount_);
1771 } else if (curStream->GetStreamType() == StreamType::CAPTURE) {
1772 CastStream<HStreamCapture>(curStream)->OnCaptureEnded(captureId, captureInfo.frameCount_);
1773 }
1774 }
1775 return CAMERA_OK;
1776 }
1777
OnCaptureEndedExt(int32_t captureId,const std::vector<OHOS::HDI::Camera::V1_3::CaptureEndedInfoExt> & infos)1778 int32_t HStreamOperator::OnCaptureEndedExt(int32_t captureId,
1779 const std::vector<OHOS::HDI::Camera::V1_3::CaptureEndedInfoExt>& infos)
1780 {
1781 MEDIA_INFO_LOG("HStreamOperator::OnCaptureEndedExt captureId:%{public}d", captureId);
1782 std::lock_guard<std::mutex> lock(cbMutex_);
1783 for (auto& captureInfo : infos) {
1784 sptr<HStreamCommon> curStream = GetHdiStreamByStreamID(captureInfo.streamId_);
1785 if (curStream == nullptr) {
1786 MEDIA_ERR_LOG("HStreamOperator::OnCaptureEndedExt StreamId: %{public}d not found."
1787 " Framecount: %{public}d",
1788 captureInfo.streamId_, captureInfo.frameCount_);
1789 return CAMERA_INVALID_ARG;
1790 } else if (curStream->GetStreamType() == StreamType::REPEAT) {
1791 CastStream<HStreamRepeat>(curStream)->OnFrameEnded(captureInfo.frameCount_);
1792 CaptureEndedInfoExt extInfo;
1793 extInfo.streamId = captureInfo.streamId_;
1794 extInfo.frameCount = captureInfo.frameCount_;
1795 extInfo.isDeferredVideoEnhancementAvailable = captureInfo.isDeferredVideoEnhancementAvailable_;
1796 extInfo.videoId = captureInfo.videoId_;
1797 MEDIA_INFO_LOG("HStreamOperator::OnCaptureEndedExt captureId:%{public}d videoId:%{public}s "
1798 "isDeferredVideo:%{public}d",
1799 captureId, extInfo.videoId.c_str(), extInfo.isDeferredVideoEnhancementAvailable);
1800 CastStream<HStreamRepeat>(curStream)->OnDeferredVideoEnhancementInfo(extInfo);
1801 }
1802 }
1803 return CAMERA_OK;
1804 }
1805
OnCaptureError(int32_t captureId,const std::vector<CaptureErrorInfo> & infos)1806 int32_t HStreamOperator::OnCaptureError(int32_t captureId, const std::vector<CaptureErrorInfo>& infos)
1807 {
1808 MEDIA_DEBUG_LOG("HStreamOperator::OnCaptureError");
1809 std::lock_guard<std::mutex> lock(cbMutex_);
1810 for (auto& errInfo : infos) {
1811 sptr<HStreamCommon> curStream = GetHdiStreamByStreamID(errInfo.streamId_);
1812 if (curStream == nullptr) {
1813 MEDIA_ERR_LOG("HStreamOperator::OnCaptureError StreamId: %{public}d not found."
1814 " Error: %{public}d",
1815 errInfo.streamId_, errInfo.error_);
1816 return CAMERA_INVALID_ARG;
1817 } else if (curStream->GetStreamType() == StreamType::REPEAT) {
1818 CastStream<HStreamRepeat>(curStream)->OnFrameError(errInfo.error_);
1819 } else if (curStream->GetStreamType() == StreamType::CAPTURE) {
1820 auto captureStream = CastStream<HStreamCapture>(curStream);
1821 captureStream->rotationMap_.Erase(captureId);
1822 captureStream->OnCaptureError(captureId, errInfo.error_);
1823 }
1824 }
1825 return CAMERA_OK;
1826 }
1827
OnFrameShutter(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)1828 int32_t HStreamOperator::OnFrameShutter(
1829 int32_t captureId, const std::vector<int32_t>& streamIds, uint64_t timestamp)
1830 {
1831 MEDIA_INFO_LOG("HStreamOperator::OnFrameShutter ts is:%{public}" PRIu64, timestamp);
1832 std::lock_guard<std::mutex> lock(cbMutex_);
1833 for (auto& streamId : streamIds) {
1834 sptr<HStreamCommon> curStream = GetHdiStreamByStreamID(streamId);
1835 if ((curStream != nullptr) && (curStream->GetStreamType() == StreamType::CAPTURE)) {
1836 auto captureStream = CastStream<HStreamCapture>(curStream);
1837 int32_t rotation = 0;
1838 captureStream->rotationMap_.Find(captureId, rotation);
1839 StartMovingPhotoEncode(rotation, timestamp, captureStream->format_, captureId);
1840 captureStream->OnFrameShutter(captureId, timestamp);
1841 } else {
1842 MEDIA_ERR_LOG("HStreamOperator::OnFrameShutter StreamId: %{public}d not found", streamId);
1843 return CAMERA_INVALID_ARG;
1844 }
1845 }
1846 return CAMERA_OK;
1847 }
1848
OnFrameShutterEnd(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)1849 int32_t HStreamOperator::OnFrameShutterEnd(
1850 int32_t captureId, const std::vector<int32_t>& streamIds, uint64_t timestamp)
1851 {
1852 MEDIA_INFO_LOG("HStreamOperator::OnFrameShutterEnd ts is:%{public}" PRIu64, timestamp);
1853 std::lock_guard<std::mutex> lock(cbMutex_);
1854 for (auto& streamId : streamIds) {
1855 sptr<HStreamCommon> curStream = GetHdiStreamByStreamID(streamId);
1856 if ((curStream != nullptr) && (curStream->GetStreamType() == StreamType::CAPTURE)) {
1857 auto captureStream = CastStream<HStreamCapture>(curStream);
1858 captureStream->rotationMap_.Erase(captureId);
1859 captureStream->OnFrameShutterEnd(captureId, timestamp);
1860 mlastCaptureId = captureId;
1861 } else {
1862 MEDIA_ERR_LOG("HStreamOperator::OnFrameShutterEnd StreamId: %{public}d not found", streamId);
1863 return CAMERA_INVALID_ARG;
1864 }
1865 }
1866 return CAMERA_OK;
1867 }
1868
OnCaptureReady(int32_t captureId,const std::vector<int32_t> & streamIds,uint64_t timestamp)1869 int32_t HStreamOperator::OnCaptureReady(
1870 int32_t captureId, const std::vector<int32_t>& streamIds, uint64_t timestamp)
1871 {
1872 MEDIA_DEBUG_LOG("HStreamOperator::OnCaptureReady");
1873 std::lock_guard<std::mutex> lock(cbMutex_);
1874 for (auto& streamId : streamIds) {
1875 sptr<HStreamCommon> curStream = GetHdiStreamByStreamID(streamId);
1876 if ((curStream != nullptr) && (curStream->GetStreamType() == StreamType::CAPTURE)) {
1877 CastStream<HStreamCapture>(curStream)->OnCaptureReady(captureId, timestamp);
1878 } else {
1879 MEDIA_ERR_LOG("HStreamOperator::OnCaptureReady StreamId: %{public}d not found", streamId);
1880 return CAMERA_INVALID_ARG;
1881 }
1882 }
1883 return CAMERA_OK;
1884 }
1885
OnResult(int32_t streamId,const std::vector<uint8_t> & result)1886 int32_t HStreamOperator::OnResult(int32_t streamId, const std::vector<uint8_t>& result)
1887 {
1888 MEDIA_DEBUG_LOG("HStreamOperator::OnResult");
1889 CHECK_RETURN_RET(result.size() == 0, CAMERA_OK);
1890 std::shared_ptr<OHOS::Camera::CameraMetadata> cameraResult = nullptr;
1891 OHOS::Camera::MetadataUtils::ConvertVecToMetadata(result, cameraResult);
1892 {
1893 std::lock_guard<std::mutex> mechLock(mechCallbackLock_);
1894 CHECK_EXECUTE(mechCallback_ != nullptr && cameraResult!= nullptr, mechCallback_(streamId, cameraResult));
1895 if (g_isNeedFilterMetadata) {
1896 CHECK_RETURN_RET_ELOG(cameraResult == nullptr, CAMERA_INVALID_ARG,
1897 "HStreamOperator::OnResult cameraResult is null");
1898 OHOS::Camera::DeleteCameraMetadataItem(cameraResult->get(), OHOS_STATISTICS_DETECT_HUMAN_FACE_INFOS);
1899 }
1900 }
1901
1902 sptr<HStreamCommon> curStream;
1903 const int32_t metaStreamId = -1;
1904 if (streamId == metaStreamId) {
1905 curStream = GetStreamByStreamID(streamId);
1906 } else {
1907 curStream = GetHdiStreamByStreamID(streamId);
1908 }
1909 if ((curStream != nullptr) && (curStream->GetStreamType() == StreamType::METADATA)) {
1910 CastStream<HStreamMetadata>(curStream)->OnMetaResult(streamId, cameraResult);
1911 } else {
1912 MEDIA_ERR_LOG("HStreamOperator::OnResult StreamId: %{public}d is null or not Not adapted", streamId);
1913 return CAMERA_INVALID_ARG;
1914 }
1915 return CAMERA_OK;
1916 }
1917
GetFrameRateRange()1918 std::vector<int32_t> HStreamOperator::GetFrameRateRange()
1919 {
1920 auto repeatStreams = streamContainer_.GetStreams(StreamType::REPEAT);
1921 for (auto& item : repeatStreams) {
1922 auto curStreamRepeat = CastStream<HStreamRepeat>(item);
1923 auto repeatType = curStreamRepeat->GetRepeatStreamType();
1924 CHECK_RETURN_RET(repeatType == RepeatStreamType::PREVIEW, curStreamRepeat->GetFrameRateRange());
1925 }
1926 return {};
1927 }
1928
AddStream(sptr<HStreamCommon> stream)1929 bool StreamContainer::AddStream(sptr<HStreamCommon> stream)
1930 {
1931 std::lock_guard<std::mutex> lock(streamsLock_);
1932 auto& list = streams_[stream->GetStreamType()];
1933 auto it = std::find_if(list.begin(), list.end(), [stream](auto item) { return item == stream; });
1934 if (it == list.end()) {
1935 list.emplace_back(stream);
1936 return true;
1937 }
1938 return false;
1939 }
1940
RemoveStream(sptr<HStreamCommon> stream)1941 bool StreamContainer::RemoveStream(sptr<HStreamCommon> stream)
1942 {
1943 std::lock_guard<std::mutex> lock(streamsLock_);
1944 auto& list = streams_[stream->GetStreamType()];
1945 auto it = std::find_if(list.begin(), list.end(), [stream](auto item) { return item == stream; });
1946 CHECK_RETURN_RET(it == list.end(), false);
1947 list.erase(it);
1948 return true;
1949 }
1950
GetStream(int32_t streamId)1951 sptr<HStreamCommon> StreamContainer::GetStream(int32_t streamId)
1952 {
1953 std::lock_guard<std::mutex> lock(streamsLock_);
1954 for (auto& pair : streams_) {
1955 for (auto& stream : pair.second) {
1956 if (!stream) {
1957 MEDIA_WARNING_LOG("stream is nullptr!, skip");
1958 continue;
1959 }
1960 CHECK_RETURN_RET(stream->GetFwkStreamId() == streamId, stream);
1961 }
1962 }
1963 return nullptr;
1964 }
1965
GetHdiStream(int32_t streamId)1966 sptr<HStreamCommon> StreamContainer::GetHdiStream(int32_t streamId)
1967 {
1968 std::lock_guard<std::mutex> lock(streamsLock_);
1969 for (auto& pair : streams_) {
1970 for (auto& stream : pair.second) {
1971 CHECK_RETURN_RET(stream->GetHdiStreamId() == streamId, stream);
1972 }
1973 }
1974 return nullptr;
1975 }
1976
Clear()1977 void StreamContainer::Clear()
1978 {
1979 std::lock_guard<std::mutex> lock(streamsLock_);
1980 streams_.clear();
1981 }
1982
Size()1983 size_t StreamContainer::Size()
1984 {
1985 std::lock_guard<std::mutex> lock(streamsLock_);
1986 size_t totalSize = 0;
1987 for (auto& pair : streams_) {
1988 totalSize += pair.second.size();
1989 }
1990 return totalSize;
1991 }
1992
GetStreams(const StreamType streamType)1993 std::list<sptr<HStreamCommon>> StreamContainer::GetStreams(const StreamType streamType)
1994 {
1995 std::lock_guard<std::mutex> lock(streamsLock_);
1996 std::list<sptr<HStreamCommon>> totalOrderedStreams;
1997 for (auto& stream : streams_[streamType]) {
1998 if (!stream) {
1999 MEDIA_WARNING_LOG("stream is nullptr!, skip");
2000 continue;
2001 }
2002 auto insertPos = std::find_if(totalOrderedStreams.begin(), totalOrderedStreams.end(),
2003 [&stream](auto& it) { return stream->GetFwkStreamId() <= it->GetFwkStreamId(); });
2004 totalOrderedStreams.emplace(insertPos, stream);
2005 }
2006 return totalOrderedStreams;
2007 }
2008
GetAllStreams()2009 std::list<sptr<HStreamCommon>> StreamContainer::GetAllStreams()
2010 {
2011 std::lock_guard<std::mutex> lock(streamsLock_);
2012 std::list<sptr<HStreamCommon>> totalOrderedStreams;
2013 for (auto& pair : streams_) {
2014 for (auto& stream : pair.second) {
2015 auto insertPos = std::find_if(totalOrderedStreams.begin(), totalOrderedStreams.end(),
2016 [&stream](auto& it) { return stream->GetFwkStreamId() <= it->GetFwkStreamId(); });
2017 totalOrderedStreams.emplace(insertPos, stream);
2018 }
2019 }
2020 return totalOrderedStreams;
2021 }
2022
MovingPhotoListener(sptr<MovingPhotoSurfaceWrapper> surfaceWrapper,wptr<Surface> metaSurface,shared_ptr<FixedSizeList<MetaElementType>> metaCache,uint32_t preCacheFrameCount,uint32_t postCacheFrameCount)2023 MovingPhotoListener::MovingPhotoListener(sptr<MovingPhotoSurfaceWrapper> surfaceWrapper, wptr<Surface> metaSurface,
2024 shared_ptr<FixedSizeList<MetaElementType>> metaCache, uint32_t preCacheFrameCount, uint32_t postCacheFrameCount)
2025 : movingPhotoSurfaceWrapper_(surfaceWrapper),
2026 metaSurface_(metaSurface),
2027 metaCache_(metaCache),
2028 recorderBufferQueue_("videoBuffer", preCacheFrameCount),
2029 postCacheFrameCount_(postCacheFrameCount)
2030 {
2031 shutterTime_ = 0;
2032 }
2033
~MovingPhotoListener()2034 MovingPhotoListener::~MovingPhotoListener()
2035 {
2036 recorderBufferQueue_.SetActive(false);
2037 if (metaCache_) {
2038 metaCache_->clear();
2039 }
2040 recorderBufferQueue_.Clear();
2041 MEDIA_ERR_LOG("HStreamRepeat::LivePhotoListener ~ end");
2042 }
2043
RemoveDrainImageManager(sptr<SessionDrainImageCallback> callback)2044 void MovingPhotoListener::RemoveDrainImageManager(sptr<SessionDrainImageCallback> callback)
2045 {
2046 callbackMap_.Erase(callback);
2047 MEDIA_INFO_LOG("RemoveDrainImageManager drainImageManagerVec_ Start %d", callbackMap_.Size());
2048 }
2049
ClearCache(uint64_t timestamp)2050 void MovingPhotoListener::ClearCache(uint64_t timestamp)
2051 {
2052 CHECK_RETURN(!isNeededClear_.load());
2053 MEDIA_INFO_LOG("ClearCache enter");
2054 shutterTime_ = static_cast<int64_t>(timestamp);
2055 while (!recorderBufferQueue_.Empty()) {
2056 sptr<FrameRecord> popFrame = recorderBufferQueue_.Front();
2057 MEDIA_DEBUG_LOG("surface_ release surface buffer %{public}llu, timestamp %{public}llu",
2058 (long long unsigned)popFrame->GetTimeStamp(), (long long unsigned)timestamp);
2059 if (popFrame->GetTimeStamp() > shutterTime_) {
2060 isNeededClear_ = false;
2061 MEDIA_INFO_LOG("ClearCache end");
2062 return;
2063 }
2064 recorderBufferQueue_.Pop();
2065 popFrame->ReleaseSurfaceBuffer(movingPhotoSurfaceWrapper_);
2066 auto metaSurface = metaSurface_.promote();
2067 CHECK_EXECUTE(metaSurface != nullptr, popFrame->ReleaseMetaBuffer(metaSurface, true));
2068 }
2069 }
2070
SetClearFlag()2071 void MovingPhotoListener::SetClearFlag()
2072 {
2073 MEDIA_INFO_LOG("need clear cache!");
2074 isNeededClear_ = true;
2075 }
2076
StopDrainOut()2077 void MovingPhotoListener::StopDrainOut()
2078 {
2079 MEDIA_INFO_LOG("StopDrainOut drainImageManagerVec_ Start %d", callbackMap_.Size());
2080 callbackMap_.Iterate([](const sptr<SessionDrainImageCallback> callback, sptr<DrainImageManager> manager) {
2081 manager->DrainFinish(false);
2082 });
2083 callbackMap_.Clear();
2084 }
2085
OnBufferArrival(sptr<SurfaceBuffer> buffer,int64_t timestamp,GraphicTransformType transform)2086 void MovingPhotoListener::OnBufferArrival(sptr<SurfaceBuffer> buffer, int64_t timestamp, GraphicTransformType transform)
2087 {
2088 MEDIA_DEBUG_LOG("OnBufferArrival timestamp %{public}llu", (long long unsigned)timestamp);
2089 if (recorderBufferQueue_.Full()) {
2090 MEDIA_DEBUG_LOG("surface_ release surface buffer");
2091 sptr<FrameRecord> popFrame = recorderBufferQueue_.Pop();
2092 popFrame->ReleaseSurfaceBuffer(movingPhotoSurfaceWrapper_);
2093 sptr<Surface> metaSurface = metaSurface_.promote();
2094 if (metaSurface) {
2095 popFrame->ReleaseMetaBuffer(metaSurface, true);
2096 }
2097 MEDIA_DEBUG_LOG("surface_ release surface buffer: %{public}s, refCount: %{public}d",
2098 popFrame->GetFrameId().c_str(), popFrame->GetSptrRefCount());
2099 }
2100 MEDIA_DEBUG_LOG("surface_ push buffer %{public}d x %{public}d, stride is %{public}d",
2101 buffer->GetSurfaceBufferWidth(), buffer->GetSurfaceBufferHeight(), buffer->GetStride());
2102 sptr<FrameRecord> frameRecord = new (std::nothrow) FrameRecord(buffer, timestamp, transform);
2103 CHECK_RETURN_ELOG(frameRecord == nullptr, "MovingPhotoListener::OnBufferAvailable create FrameRecord fail!");
2104 if (isNeededClear_ && isNeededPop_) {
2105 if (timestamp < shutterTime_) {
2106 frameRecord->ReleaseSurfaceBuffer(movingPhotoSurfaceWrapper_);
2107 MEDIA_INFO_LOG("Drop this frame in cache");
2108 return;
2109 } else {
2110 isNeededClear_ = false;
2111 isNeededPop_ = false;
2112 MEDIA_INFO_LOG("ClearCache end");
2113 }
2114 }
2115 recorderBufferQueue_.Push(frameRecord);
2116 auto metaPair =
2117 metaCache_->find_if([timestamp](const MetaElementType &value) { return value.first == timestamp; });
2118 if (metaPair.has_value()) {
2119 MEDIA_DEBUG_LOG("frame has meta");
2120 frameRecord->SetMetaBuffer(metaPair.value().second);
2121 }
2122 vector<sptr<SessionDrainImageCallback>> callbacks;
2123 callbackMap_.Iterate(
2124 [frameRecord, &callbacks](const sptr<SessionDrainImageCallback> callback, sptr<DrainImageManager> manager) {
2125 callbacks.push_back(callback);
2126 });
2127 for (sptr<SessionDrainImageCallback> drainImageCallback : callbacks) {
2128 sptr<DrainImageManager> drainImageManager;
2129 if (callbackMap_.Find(drainImageCallback, drainImageManager)) {
2130 std::lock_guard<std::mutex> lock(drainImageManager->drainImageLock_);
2131 drainImageManager->DrainImage(frameRecord);
2132 }
2133 }
2134 }
2135
DrainOutImage(sptr<SessionDrainImageCallback> drainImageCallback)2136 void MovingPhotoListener::DrainOutImage(sptr<SessionDrainImageCallback> drainImageCallback)
2137 {
2138 sptr<DrainImageManager> drainImageManager =
2139 new DrainImageManager(drainImageCallback, recorderBufferQueue_.Size() + postCacheFrameCount_);
2140 {
2141 MEDIA_INFO_LOG("DrainOutImage enter %{public}zu", recorderBufferQueue_.Size());
2142 callbackMap_.Insert(drainImageCallback, drainImageManager);
2143 }
2144 // Convert recorderBufferQueue_ to a vector
2145 std::vector<sptr<FrameRecord>> frameList = recorderBufferQueue_.GetAllElements();
2146 CHECK_EXECUTE(!frameList.empty(), frameList.back()->SetCoverFrame());
2147 std::lock_guard<std::mutex> lock(drainImageManager->drainImageLock_);
2148 for (const auto& frame : frameList) {
2149 MEDIA_DEBUG_LOG("DrainOutImage enter DrainImage");
2150 drainImageManager->DrainImage(frame);
2151 }
2152 }
2153
OnBufferAvailable()2154 void MovingPhotoMetaListener::OnBufferAvailable()
2155 {
2156 sptr<Surface> metaSurface = surface_.promote();
2157 CHECK_RETURN_ELOG(!metaSurface, "streamRepeat surface is null");
2158 MEDIA_DEBUG_LOG("metaSurface_ OnBufferAvailable %{public}u", metaSurface->GetQueueSize());
2159 int64_t timestamp;
2160 OHOS::Rect damage;
2161 sptr<SurfaceBuffer> buffer;
2162 sptr<SyncFence> syncFence = SyncFence::INVALID_FENCE;
2163 SurfaceError surfaceRet = metaSurface->AcquireBuffer(buffer, syncFence, timestamp, damage);
2164 CHECK_RETURN_ELOG(surfaceRet != SURFACE_ERROR_OK, "Failed to acquire meta surface buffer");
2165 surfaceRet = metaSurface->DetachBufferFromQueue(buffer);
2166 CHECK_RETURN_ELOG(surfaceRet != SURFACE_ERROR_OK, "Failed to detach meta buffer. %{public}d", surfaceRet);
2167 metaCache_->add({timestamp, buffer});
2168 }
2169
MovingPhotoMetaListener(wptr<Surface> surface,shared_ptr<FixedSizeList<MetaElementType>> metaCache)2170 MovingPhotoMetaListener::MovingPhotoMetaListener(wptr<Surface> surface,
2171 shared_ptr<FixedSizeList<MetaElementType>> metaCache)
2172 : surface_(surface), metaCache_(metaCache)
2173 {
2174 }
2175
~MovingPhotoMetaListener()2176 MovingPhotoMetaListener::~MovingPhotoMetaListener()
2177 {
2178 MEDIA_ERR_LOG("HStreamRepeat::MovingPhotoMetaListener ~ end");
2179 }
2180
OnChange(OHOS::Rosen::DisplayId displayId)2181 void HStreamOperator::DisplayRotationListener::OnChange(OHOS::Rosen::DisplayId displayId)
2182 {
2183 sptr<Rosen::Display> display = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
2184 if (display == nullptr) { // LCOV_EXCL_LINE
2185 MEDIA_INFO_LOG("Get display info failed, display:%{public}" PRIu64 "", displayId);
2186 display = Rosen::DisplayManager::GetInstance().GetDisplayById(0);
2187 CHECK_RETURN_ELOG(display == nullptr, "Get display info failed, display is nullptr");
2188 }
2189 {
2190 Rosen::Rotation currentRotation = display->GetRotation();
2191 std::lock_guard<std::mutex> lock(mStreamManagerLock_);
2192 for (auto& repeatStream : repeatStreamList_) {
2193 CHECK_EXECUTE(repeatStream, repeatStream->SetStreamTransform(static_cast<int>(currentRotation)));
2194 }
2195 }
2196 }
2197
AddHstreamRepeatForListener(sptr<HStreamRepeat> repeatStream)2198 void HStreamOperator::DisplayRotationListener::AddHstreamRepeatForListener(sptr<HStreamRepeat> repeatStream)
2199 {
2200 std::lock_guard<std::mutex> lock(mStreamManagerLock_);
2201 CHECK_RETURN(!repeatStream);
2202 repeatStreamList_.push_back(repeatStream);
2203 }
2204
RemoveHstreamRepeatForListener(sptr<HStreamRepeat> repeatStream)2205 void HStreamOperator::DisplayRotationListener::RemoveHstreamRepeatForListener(sptr<HStreamRepeat> repeatStream)
2206 {
2207 std::lock_guard<std::mutex> lock(mStreamManagerLock_);
2208 CHECK_RETURN(!repeatStream);
2209 repeatStreamList_.erase(
2210 std::remove(repeatStreamList_.begin(), repeatStreamList_.end(), repeatStream), repeatStreamList_.end());
2211 }
2212
SetMechCallback(std::function<void (int32_t,const std::shared_ptr<OHOS::Camera::CameraMetadata> &)> callback)2213 void HStreamOperator::SetMechCallback(std::function<void(int32_t,
2214 const std::shared_ptr<OHOS::Camera::CameraMetadata>&)> callback)
2215 {
2216 std::lock_guard<std::mutex> lock(mechCallbackLock_);
2217 mechCallback_ = callback;
2218 }
2219 } // namespace CameraStandard
2220 } // namespace OHOS
2221