• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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(&currentTime)) { // 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(&currentTime), 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