1 /*
2 * Copyright (c) 2023 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 "pipeline/rs_render_frame_rate_linker_map.h"
17 #include "common/rs_common_def.h"
18 #include "platform/common/rs_log.h"
19 #include "ipc_callbacks/rs_iframe_rate_linker_expected_fps_update_callback.h"
20
21 namespace OHOS {
22 namespace Rosen {
23 namespace {
24 constexpr uint32_t MAX_FRAME_RATE_LINKER_SIZE = 2048;
25 }
RSRenderFrameRateLinkerMap()26 RSRenderFrameRateLinkerMap::RSRenderFrameRateLinkerMap()
27 {
28 }
29
RegisterFrameRateLinker(const std::shared_ptr<RSRenderFrameRateLinker> & linkerPtr)30 bool RSRenderFrameRateLinkerMap::RegisterFrameRateLinker(const std::shared_ptr<RSRenderFrameRateLinker>& linkerPtr)
31 {
32 if (frameRateLinkerMap_.size() >= MAX_FRAME_RATE_LINKER_SIZE) {
33 ROSEN_LOGE("RegisterFrameRateLinker fail, linker max size %{public}" PRIu32 ", please check frame rate.",
34 MAX_FRAME_RATE_LINKER_SIZE);
35 return false;
36 }
37
38 FrameRateLinkerId id = linkerPtr->GetId();
39 if (frameRateLinkerMap_.count(id)) {
40 return false;
41 }
42 frameRateLinkerMap_.emplace(id, linkerPtr);
43 return true;
44 }
45
UnregisterFrameRateLinker(FrameRateLinkerId id)46 void RSRenderFrameRateLinkerMap::UnregisterFrameRateLinker(FrameRateLinkerId id)
47 {
48 ROSEN_LOGI("RSRenderFrameRateLinkerMap::UnregisterFrameRateLinker id: %{public}" PRIu64, id);
49 frameRateLinkerMap_.erase(id);
50 }
51
FilterFrameRateLinkerByPid(pid_t pid)52 void RSRenderFrameRateLinkerMap::FilterFrameRateLinkerByPid(pid_t pid)
53 {
54 ROSEN_LOGD("RSRenderFrameRateLinkerMap::FilterFrameRateLinkerByPid removing all linker belong to pid %{public}llu",
55 (unsigned long long)pid);
56 // remove all nodes belong to given pid (by matching higher 32 bits of node id)
57 EraseIf(frameRateLinkerMap_, [pid](const auto& pair) -> bool {
58 return ExtractPid(pair.first) == pid;
59 });
60 }
61
GetFrameRateLinker(FrameRateLinkerId id)62 std::shared_ptr<RSRenderFrameRateLinker> RSRenderFrameRateLinkerMap::GetFrameRateLinker(FrameRateLinkerId id)
63 {
64 return frameRateLinkerMap_.count(id) ? frameRateLinkerMap_[id] : nullptr;
65 }
66
RegisterFrameRateLinkerExpectedFpsUpdateCallback(pid_t listenerPid,int32_t dstPid,sptr<RSIFrameRateLinkerExpectedFpsUpdateCallback> callback)67 bool RSRenderFrameRateLinkerMap::RegisterFrameRateLinkerExpectedFpsUpdateCallback(pid_t listenerPid,
68 int32_t dstPid, sptr<RSIFrameRateLinkerExpectedFpsUpdateCallback> callback)
69 {
70 bool success = false;
71 for (auto& [id, linker] : frameRateLinkerMap_) {
72 if (ExtractPid(id) == dstPid && linker != nullptr) {
73 linker->RegisterExpectedFpsUpdateCallback(listenerPid, callback);
74 success = true;
75 }
76 }
77
78 if (!success) {
79 ROSEN_LOGE("RegisterFrameRateLinkerExpectedFpsUpdateCallback failed: cannot register callback to any linker by"
80 " dstPid=%{public}d", dstPid);
81 }
82 return success;
83 }
84
UnRegisterExpectedFpsUpdateCallbackByListener(pid_t listenerPid)85 void RSRenderFrameRateLinkerMap::UnRegisterExpectedFpsUpdateCallbackByListener(pid_t listenerPid)
86 {
87 for (auto& [_, linker] : frameRateLinkerMap_) {
88 if (linker != nullptr) {
89 linker->RegisterExpectedFpsUpdateCallback(listenerPid, nullptr);
90 }
91 }
92 }
93
94 } // namespace Rosen
95 } // namespace OHOS
96