• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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