1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "codec_log_wrapper.h"
17094332d3Sopenharmony_ci#include "codec_dfx_service.h"
18094332d3Sopenharmony_ci#include "malloc.h"
19094332d3Sopenharmony_cinamespace OHOS {
20094332d3Sopenharmony_cinamespace HDI {
21094332d3Sopenharmony_cinamespace Codec {
22094332d3Sopenharmony_cinamespace V3_0 {
23094332d3Sopenharmony_ci#define ARGV_FLAG 1
24094332d3Sopenharmony_ci#define INPUT_PORT_INDEX 0
25094332d3Sopenharmony_ci#define OUTPUT_PORT_INDEX 1
26094332d3Sopenharmony_ciCodecDfxService CodecDfxService::dfxInstance_;
27094332d3Sopenharmony_ciHdfSBuf *CodecDfxService::reply_;
28094332d3Sopenharmony_ci
29094332d3Sopenharmony_ciint32_t CodecDfxService::GetCodecComponentListInfo(struct HdfSBuf *reply)
30094332d3Sopenharmony_ci{
31094332d3Sopenharmony_ci    CodecStateType state;
32094332d3Sopenharmony_ci    uint32_t inputBuffCount = 0;
33094332d3Sopenharmony_ci    uint32_t outputBuffCount = 0;
34094332d3Sopenharmony_ci    std::shared_ptr<OHOS::Codec::Omx::ComponentNode> dumpNode = nullptr;
35094332d3Sopenharmony_ci    std::map<uint32_t, sptr<ICodecComponent>> dumpMap = {};
36094332d3Sopenharmony_ci
37094332d3Sopenharmony_ci    GetInstance().managerService_->GetManagerMap(dumpMap);
38094332d3Sopenharmony_ci    if (dumpMap.empty()) {
39094332d3Sopenharmony_ci        CODEC_LOGE("get manager map failed!");
40094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
41094332d3Sopenharmony_ci    }
42094332d3Sopenharmony_ci    for (auto it : dumpMap) {
43094332d3Sopenharmony_ci        std::string dump = "compName = ";
44094332d3Sopenharmony_ci        CodecComponentService *componentService = reinterpret_cast<CodecComponentService *>(it.second.GetRefPtr());
45094332d3Sopenharmony_ci        dump.append(componentService->GetComponentCompName())
46094332d3Sopenharmony_ci            .append(", compId = ")
47094332d3Sopenharmony_ci            .append(std::to_string(it.first))
48094332d3Sopenharmony_ci            .append(", state = ");
49094332d3Sopenharmony_ci        componentService->GetComponentNode(dumpNode);
50094332d3Sopenharmony_ci        if (dumpNode == nullptr) {
51094332d3Sopenharmony_ci            CODEC_LOGE("get dumpNode failed!");
52094332d3Sopenharmony_ci            return HDF_ERR_INVALID_PARAM;
53094332d3Sopenharmony_ci        }
54094332d3Sopenharmony_ci        dumpNode->GetState(state);
55094332d3Sopenharmony_ci        dump.append(std::to_string(state));
56094332d3Sopenharmony_ci        dumpNode->GetBuffCount(inputBuffCount, outputBuffCount);
57094332d3Sopenharmony_ci        dump.append(", inputPortIndex = ")
58094332d3Sopenharmony_ci            .append(std::to_string(INPUT_PORT_INDEX))
59094332d3Sopenharmony_ci            .append(", inputBuffCount = ")
60094332d3Sopenharmony_ci            .append(std::to_string(inputBuffCount))
61094332d3Sopenharmony_ci            .append(", outputPortIndex = ")
62094332d3Sopenharmony_ci            .append(std::to_string(OUTPUT_PORT_INDEX))
63094332d3Sopenharmony_ci            .append(", outputBuffCount = ")
64094332d3Sopenharmony_ci            .append(std::to_string(outputBuffCount))
65094332d3Sopenharmony_ci            .append("\n");
66094332d3Sopenharmony_ci        if (!HdfSbufWriteString(reply, dump.c_str())) {
67094332d3Sopenharmony_ci            CODEC_LOGE("dump write Fail!");
68094332d3Sopenharmony_ci            return HDF_ERR_INVALID_PARAM;
69094332d3Sopenharmony_ci        }
70094332d3Sopenharmony_ci        if (!HdfSbufWriteString(reply, "------------------------------------------------------------------------ \n")) {
71094332d3Sopenharmony_ci            CODEC_LOGE("Split symbol write Fail!");
72094332d3Sopenharmony_ci            return HDF_ERR_INVALID_PARAM;
73094332d3Sopenharmony_ci        }
74094332d3Sopenharmony_ci        inputBuffCount = 0;
75094332d3Sopenharmony_ci        outputBuffCount = 0;
76094332d3Sopenharmony_ci        componentService = nullptr;
77094332d3Sopenharmony_ci    }
78094332d3Sopenharmony_ci    return HDF_SUCCESS;
79094332d3Sopenharmony_ci}
80094332d3Sopenharmony_ci
81094332d3Sopenharmony_civoid CodecDfxService::SetComponentManager(sptr<CodecComponentManagerService> manager)
82094332d3Sopenharmony_ci{
83094332d3Sopenharmony_ci    managerService_ = manager;
84094332d3Sopenharmony_ci}
85094332d3Sopenharmony_ci
86094332d3Sopenharmony_ciCodecDfxService& CodecDfxService::GetInstance()
87094332d3Sopenharmony_ci{
88094332d3Sopenharmony_ci    return dfxInstance_;
89094332d3Sopenharmony_ci}
90094332d3Sopenharmony_ci
91094332d3Sopenharmony_ciHdfSBuf* CodecDfxService::GetReply()
92094332d3Sopenharmony_ci{
93094332d3Sopenharmony_ci    return reply_;
94094332d3Sopenharmony_ci}
95094332d3Sopenharmony_ci
96094332d3Sopenharmony_cistatic void WriteMemoryInfo(void *fp, const char *memInfo)
97094332d3Sopenharmony_ci{
98094332d3Sopenharmony_ci    if (memInfo == nullptr) {
99094332d3Sopenharmony_ci        return;
100094332d3Sopenharmony_ci    }
101094332d3Sopenharmony_ci    if (!HdfSbufWriteString(CodecDfxService::GetReply(), memInfo)) {
102094332d3Sopenharmony_ci        CODEC_LOGE("write memory info error!");
103094332d3Sopenharmony_ci    }
104094332d3Sopenharmony_ci}
105094332d3Sopenharmony_ci
106094332d3Sopenharmony_civoid CodecDfxService::GetCodecMemoryInfo()
107094332d3Sopenharmony_ci{
108094332d3Sopenharmony_ci    malloc_stats_print(WriteMemoryInfo, nullptr, nullptr);
109094332d3Sopenharmony_ci}
110094332d3Sopenharmony_ci
111094332d3Sopenharmony_ciint32_t CodecDfxService::DevCodecHostDump(struct HdfSBuf *data, struct HdfSBuf *reply)
112094332d3Sopenharmony_ci{
113094332d3Sopenharmony_ci    uint32_t argv = 0;
114094332d3Sopenharmony_ci    reply_ = reply;
115094332d3Sopenharmony_ci    (void)HdfSbufReadUint32(data, &argv);
116094332d3Sopenharmony_ci    if (argv != ARGV_FLAG) {
117094332d3Sopenharmony_ci        if (!HdfSbufWriteString(reply, "please enter -h for help! \n")) {
118094332d3Sopenharmony_ci            CODEC_LOGE("help write Fail!");
119094332d3Sopenharmony_ci            return HDF_ERR_INVALID_PARAM;
120094332d3Sopenharmony_ci        }
121094332d3Sopenharmony_ci        return HDF_SUCCESS;
122094332d3Sopenharmony_ci    }
123094332d3Sopenharmony_ci
124094332d3Sopenharmony_ci    const char *para = HdfSbufReadString(data);
125094332d3Sopenharmony_ci    if (para == nullptr) {
126094332d3Sopenharmony_ci        CODEC_LOGE("read string data failed");
127094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
128094332d3Sopenharmony_ci    }
129094332d3Sopenharmony_ci    if (strcmp(para, "-h") == EOK) {
130094332d3Sopenharmony_ci        if (!HdfSbufWriteString(reply, "-h: codec dump help! \n")) {
131094332d3Sopenharmony_ci            CODEC_LOGE("-h write Fail!");
132094332d3Sopenharmony_ci            return HDF_ERR_INVALID_PARAM;
133094332d3Sopenharmony_ci        }
134094332d3Sopenharmony_ci        if (!HdfSbufWriteString(reply, "-l: dump codec components info list! \n")) {
135094332d3Sopenharmony_ci            CODEC_LOGE("-l write Fail!");
136094332d3Sopenharmony_ci            return HDF_ERR_INVALID_PARAM;
137094332d3Sopenharmony_ci        }
138094332d3Sopenharmony_ci        return HDF_SUCCESS;
139094332d3Sopenharmony_ci    } else if (strcmp(para, "-l") == EOK) {
140094332d3Sopenharmony_ci        GetInstance().GetCodecComponentListInfo(reply);
141094332d3Sopenharmony_ci    } else if (strcmp(para, "-m") == EOK) {
142094332d3Sopenharmony_ci        GetInstance().GetCodecMemoryInfo();
143094332d3Sopenharmony_ci    } else {
144094332d3Sopenharmony_ci        HdfSbufWriteString(reply, "unknow param, please enter -h for help! \n");
145094332d3Sopenharmony_ci    }
146094332d3Sopenharmony_ci    return HDF_SUCCESS;
147094332d3Sopenharmony_ci}
148094332d3Sopenharmony_ci}  // namespace V3_0
149094332d3Sopenharmony_ci}  // namespace Codec
150094332d3Sopenharmony_ci}  // namespace HDI
151094332d3Sopenharmony_ci}  // namespace OHOS
152