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