1/* 2 * Copyright (c) 2022-2024 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 "constants.h" 17#include "dcamera_low_latency.h" 18#include "device_type.h" 19#include "distributed_camera_errno.h" 20#include "distributed_hardware_log.h" 21#include "ipublisher_listener.h" 22#include "cJSON.h" 23 24namespace OHOS { 25namespace DistributedHardware { 26IMPLEMENT_SINGLE_INSTANCE(DCameraLowLatency); 27 28int32_t DCameraLowLatency::EnableLowLatency() 29{ 30 DHLOGD("Enable low latency start."); 31 if (refCount_ > REF_INITIAL) { 32 refCount_++; 33 DHLOGD("No need to enable low latency, refCount just plus one and now is: %{public}d.", refCount_.load()); 34 return DCAMERA_OK; 35 } 36 std::shared_ptr<DistributedHardwareFwkKit> dHFwkKit = GetDHFwkKit(); 37 if (dHFwkKit == nullptr) { 38 DHLOGE("Get dHFwkKit is null when enable low latency."); 39 return DCAMERA_BAD_VALUE; 40 } 41 cJSON *rootValue = cJSON_CreateObject(); 42 if (rootValue == nullptr) { 43 return DCAMERA_BAD_VALUE; 44 } 45 cJSON_AddItemToObject(rootValue, DH_TYPE.c_str(), cJSON_CreateNumber(static_cast<uint32_t>(DHType::CAMERA))); 46 cJSON_AddItemToObject(rootValue, LOW_LATENCY_ENABLE.c_str(), cJSON_CreateBool(true)); 47 char *jsonstr = cJSON_Print(rootValue); 48 if (jsonstr == nullptr) { 49 cJSON_Delete(rootValue); 50 return DCAMERA_BAD_VALUE; 51 } 52 dHFwkKit->PublishMessage(DHTopic::TOPIC_LOW_LATENCY, std::string(jsonstr)); 53 refCount_++; 54 DHLOGD("Enable low latency success and now refCount is: %d", refCount_.load()); 55 cJSON_Delete(rootValue); 56 cJSON_free(jsonstr); 57 return DCAMERA_OK; 58} 59 60int32_t DCameraLowLatency::DisableLowLatency() 61{ 62 DHLOGD("Disable low latency start."); 63 if (refCount_ == REF_INITIAL) { 64 DHLOGD("No need to disable low latency, refCount is zero."); 65 return DCAMERA_OK; 66 } 67 if (refCount_ > REF_NORMAL) { 68 refCount_--; 69 DHLOGD("No need to disable low latency, refCount just minus one and now is: %{public}d.", refCount_.load()); 70 return DCAMERA_OK; 71 } 72 std::shared_ptr<DistributedHardwareFwkKit> dHFwkKit = GetDHFwkKit(); 73 if (dHFwkKit == nullptr) { 74 DHLOGE("Get dHFwkKit is null when disable low latency."); 75 return DCAMERA_BAD_VALUE; 76 } 77 cJSON *rootValue = cJSON_CreateObject(); 78 if (rootValue == nullptr) { 79 return DCAMERA_BAD_VALUE; 80 } 81 cJSON_AddItemToObject(rootValue, DH_TYPE.c_str(), cJSON_CreateNumber(static_cast<uint32_t>(DHType::CAMERA))); 82 cJSON_AddItemToObject(rootValue, LOW_LATENCY_ENABLE.c_str(), cJSON_CreateBool(false)); 83 char *jsonstr = cJSON_Print(rootValue); 84 if (jsonstr == nullptr) { 85 cJSON_Delete(rootValue); 86 return DCAMERA_BAD_VALUE; 87 } 88 dHFwkKit->PublishMessage(DHTopic::TOPIC_LOW_LATENCY, std::string(jsonstr)); 89 refCount_--; 90 DHLOGD("Disable low latency success."); 91 cJSON_Delete(rootValue); 92 cJSON_free(jsonstr); 93 return DCAMERA_OK; 94} 95 96std::shared_ptr<DistributedHardwareFwkKit> DCameraLowLatency::GetDHFwkKit() 97{ 98 if (dHFwkKit_ == nullptr) { 99 std::lock_guard<std::mutex> lock(dHFwkKitMutex_); 100 if (dHFwkKit_ == nullptr) { 101 dHFwkKit_ = std::make_shared<DistributedHardwareFwkKit>(); 102 } 103 } 104 return dHFwkKit_; 105} 106} // namespace DistributedHardware 107} // namespace OHOS