• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "session/portrait_session.h"
17 #include "camera_log.h"
18 #include "camera_util.h"
19 #include "metadata_common_utils.h"
20 
21 namespace OHOS {
22 namespace CameraStandard {
23 
24 const std::unordered_map<PortraitEffect, camera_portrait_effect_type_t> PortraitSession::fwToMetaPortraitEffect_ = {
25     {OFF_EFFECT, OHOS_CAMERA_PORTRAIT_EFFECT_OFF},
26     {CIRCLES, OHOS_CAMERA_PORTRAIT_CIRCLES},
27     {HEART, OHOS_CAMERA_PORTRAIT_HEART},
28     {ROTATED, OHOS_CAMERA_PORTRAIT_ROTATED},
29     {STUDIO, OHOS_CAMERA_PORTRAIT_STUDIO},
30     {THEATER, OHOS_CAMERA_PORTRAIT_THEATER},
31 };
32 
~PortraitSession()33 PortraitSession::~PortraitSession()
34 {
35 }
36 
GetSupportedPortraitEffects()37 std::vector<PortraitEffect> PortraitSession::GetSupportedPortraitEffects()
38 {
39     std::vector<PortraitEffect> supportedPortraitEffects = {};
40     CHECK_RETURN_RET_ELOG(!(IsSessionCommited() || IsSessionConfiged()), supportedPortraitEffects,
41         "PortraitSession::GetSupportedPortraitEffects Session is not Commited");
42     auto inputDevice = GetInputDevice();
43     CHECK_RETURN_RET_ELOG(!inputDevice, supportedPortraitEffects,
44         "PortraitSession::GetSupportedPortraitEffects camera device is null");
45     auto inputDeviceInfo = inputDevice->GetCameraDeviceInfo();
46     CHECK_RETURN_RET_ELOG(!inputDeviceInfo, supportedPortraitEffects,
47         "PortraitSession::GetSupportedPortraitEffects camera deviceInfo is null");
48     int ret = VerifyAbility(static_cast<uint32_t>(OHOS_ABILITY_SCENE_PORTRAIT_EFFECT_TYPES));
49     CHECK_RETURN_RET_ELOG(ret != CAMERA_OK, supportedPortraitEffects,
50         "PortraitSession::GetSupportedPortraitEffects abilityId is NULL");
51     // LCOV_EXCL_START
52     std::shared_ptr<Camera::CameraMetadata> metadata = inputDeviceInfo->GetCachedMetadata();
53     CHECK_RETURN_RET(metadata == nullptr, supportedPortraitEffects);
54     camera_metadata_item_t item;
55     ret = Camera::FindCameraMetadataItem(metadata->get(), OHOS_ABILITY_SCENE_PORTRAIT_EFFECT_TYPES, &item);
56     CHECK_RETURN_RET(ret != CAM_META_SUCCESS || item.count == 0, supportedPortraitEffects);
57     for (uint32_t i = 0; i < item.count; i++) {
58         auto itr = g_metaToFwPortraitEffect_.find(static_cast<camera_portrait_effect_type_t>(item.data.u8[i]));
59         CHECK_EXECUTE(itr != g_metaToFwPortraitEffect_.end(), supportedPortraitEffects.emplace_back(itr->second));
60     }
61     return supportedPortraitEffects;
62     // LCOV_EXCL_STOP
63 }
64 
GetPortraitEffect()65 PortraitEffect PortraitSession::GetPortraitEffect()
66 {
67     CHECK_RETURN_RET_ELOG(!(IsSessionCommited() || IsSessionConfiged()), PortraitEffect::OFF_EFFECT,
68         "CaptureSession::GetPortraitEffect Session is not Commited");
69     auto inputDevice = GetInputDevice();
70     CHECK_RETURN_RET_ELOG(!inputDevice, PortraitEffect::OFF_EFFECT,
71         "CaptureSession::GetPortraitEffect camera device is null");
72     auto inputDeviceInfo = inputDevice->GetCameraDeviceInfo();
73     CHECK_RETURN_RET_ELOG(!inputDeviceInfo, PortraitEffect::OFF_EFFECT,
74         "CaptureSession::GetPortraitEffect camera deviceInfo is null");
75     std::shared_ptr<Camera::CameraMetadata> metadata = inputDeviceInfo->GetCachedMetadata();
76     CHECK_RETURN_RET(metadata == nullptr, PortraitEffect::OFF_EFFECT);
77     camera_metadata_item_t item;
78     int ret = Camera::FindCameraMetadataItem(metadata->get(), OHOS_CONTROL_PORTRAIT_EFFECT_TYPE, &item);
79     CHECK_RETURN_RET_ELOG(ret != CAM_META_SUCCESS || item.count == 0, PortraitEffect::OFF_EFFECT,
80         "CaptureSession::GetPortraitEffect Failed with return code %{public}d", ret);
81     // LCOV_EXCL_START
82     auto itr = g_metaToFwPortraitEffect_.find(static_cast<camera_portrait_effect_type_t>(item.data.u8[0]));
83     CHECK_RETURN_RET(itr != g_metaToFwPortraitEffect_.end(), itr->second);
84     return PortraitEffect::OFF_EFFECT;
85     // LCOV_EXCL_STOP
86 }
87 
SetPortraitEffect(PortraitEffect portraitEffect)88 void PortraitSession::SetPortraitEffect(PortraitEffect portraitEffect)
89 {
90     // LCOV_EXCL_START
91     CAMERA_SYNC_TRACE;
92     CHECK_RETURN_ELOG(!(IsSessionCommited() || IsSessionConfiged()),
93         "CaptureSession::SetPortraitEffect Session is not Commited");
94     CHECK_RETURN_ELOG(changedMetadata_ == nullptr,
95         "CaptureSession::SetPortraitEffect changedMetadata_ is NULL");
96 
97     std::vector<PortraitEffect> portraitEffects= GetSupportedPortraitEffects();
98     auto itr = std::find(portraitEffects.begin(), portraitEffects.end(), portraitEffect);
99     CHECK_RETURN_ELOG(itr == portraitEffects.end(),
100         "CaptureSession::SetPortraitEffect::GetSupportedPortraitEffects abilityId is NULL");
101     uint8_t effect = 0;
102     auto itr2 = fwToMetaPortraitEffect_.find(portraitEffect);
103     if (itr2 != fwToMetaPortraitEffect_.end()) {
104         effect = static_cast<uint8_t>(itr2->second);
105     }
106     MEDIA_DEBUG_LOG("CaptureSession::SetPortraitEffect: %{public}d", portraitEffect);
107     bool status = AddOrUpdateMetadata(changedMetadata_, OHOS_CONTROL_PORTRAIT_EFFECT_TYPE, &effect, 1);
108     CHECK_PRINT_ELOG(!status, "CaptureSession::SetPortraitEffect Failed to set effect");
109     return;
110     // LCOV_EXCL_STOP
111 }
CanAddOutput(sptr<CaptureOutput> & output)112 bool PortraitSession::CanAddOutput(sptr<CaptureOutput> &output)
113 {
114     CAMERA_SYNC_TRACE;
115     MEDIA_DEBUG_LOG("Enter Into PortraitSession::CanAddOutput");
116     CHECK_RETURN_RET_ELOG(!IsSessionConfiged() || output == nullptr, false,
117         "PortraitSession::CanAddOutput operation is Not allowed!");
118     return output->GetOutputType() != CAPTURE_OUTPUT_TYPE_VIDEO && CaptureSession::CanAddOutput(output);
119 }
120 } // CameraStandard
121 } // OHOS
122