1da853ecaSopenharmony_ci/* 2da853ecaSopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd. 3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License. 5da853ecaSopenharmony_ci * You may obtain a copy of the License at 6da853ecaSopenharmony_ci * 7da853ecaSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8da853ecaSopenharmony_ci * 9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and 13da853ecaSopenharmony_ci * limitations under the License. 14da853ecaSopenharmony_ci */ 15da853ecaSopenharmony_ci 16da853ecaSopenharmony_ci#include "avcodec_dump_utils.h" 17da853ecaSopenharmony_ci#include "avcodec_errors.h" 18da853ecaSopenharmony_ci#include "avcodec_log.h" 19da853ecaSopenharmony_ci 20da853ecaSopenharmony_cinamespace { 21da853ecaSopenharmony_ci constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_FRAMEWORK, "AVCodecDumpUtils"}; 22da853ecaSopenharmony_ci constexpr uint32_t DUMP_LEVEL_4 = 4; 23da853ecaSopenharmony_ci constexpr uint32_t DUMP_LEVEL_3 = 3; 24da853ecaSopenharmony_ci constexpr uint32_t DUMP_LEVEL_2 = 2; 25da853ecaSopenharmony_ci constexpr uint32_t DUMP_SPACE_LENGTH = 4; 26da853ecaSopenharmony_ci constexpr uint32_t DUMP_OFFSET_24 = 24; 27da853ecaSopenharmony_ci constexpr uint32_t DUMP_OFFSET_16 = 16; 28da853ecaSopenharmony_ci constexpr uint32_t DUMP_OFFSET_8 = 8; 29da853ecaSopenharmony_ci} 30da853ecaSopenharmony_ci 31da853ecaSopenharmony_cinamespace OHOS { 32da853ecaSopenharmony_cinamespace MediaAVCodec { 33da853ecaSopenharmony_ciusing namespace Media; 34da853ecaSopenharmony_ciint32_t AVCodecDumpControler::AddInfo(const uint32_t dumpIdx, const std::string &name, const std::string &value) 35da853ecaSopenharmony_ci{ 36da853ecaSopenharmony_ci CHECK_AND_RETURN_RET_LOG((dumpIdx >> DUMP_OFFSET_24) > 0, AVCS_ERR_INVALID_VAL, 37da853ecaSopenharmony_ci "Add dump info failed, get a invalid dump index."); 38da853ecaSopenharmony_ci CHECK_AND_RETURN_RET_LOG(!name.empty(), AVCS_ERR_INVALID_VAL, 39da853ecaSopenharmony_ci "Add dump info failed, get a empty name."); 40da853ecaSopenharmony_ci if (dumpInfoMap_.find(dumpIdx) != dumpInfoMap_.end()) { 41da853ecaSopenharmony_ci AVCODEC_LOGW("Dump info index already exist, index: %{public}d, name: %{public}s.", dumpIdx, name.c_str()); 42da853ecaSopenharmony_ci return AVCS_ERR_OK; 43da853ecaSopenharmony_ci } 44da853ecaSopenharmony_ci 45da853ecaSopenharmony_ci auto level = GetLevel(dumpIdx); 46da853ecaSopenharmony_ci length_[level - 1] = length_[level - 1] > name.length() ? length_[level - 1] : name.length(); 47da853ecaSopenharmony_ci dumpInfoMap_.emplace(dumpIdx, make_pair(name, value)); 48da853ecaSopenharmony_ci return AVCS_ERR_OK; 49da853ecaSopenharmony_ci} 50da853ecaSopenharmony_ci 51da853ecaSopenharmony_ciint32_t AVCodecDumpControler::AddInfoFromFormat(const uint32_t dumpIdx, const Format &format, 52da853ecaSopenharmony_ci const std::string_view &key, const std::string &name) 53da853ecaSopenharmony_ci{ 54da853ecaSopenharmony_ci CHECK_AND_RETURN_RET_LOG(!key.empty(), AVCS_ERR_INVALID_VAL, "Add dump info failed, get a empty key."); 55da853ecaSopenharmony_ci 56da853ecaSopenharmony_ci std::string value; 57da853ecaSopenharmony_ci bool ret = false; 58da853ecaSopenharmony_ci switch (format.GetValueType(key)) { 59da853ecaSopenharmony_ci case FORMAT_TYPE_INT32: { 60da853ecaSopenharmony_ci int32_t valueTemp = 0; 61da853ecaSopenharmony_ci ret = format.GetIntValue(key, valueTemp); 62da853ecaSopenharmony_ci value = std::to_string(valueTemp); 63da853ecaSopenharmony_ci break; 64da853ecaSopenharmony_ci } 65da853ecaSopenharmony_ci case FORMAT_TYPE_INT64: { 66da853ecaSopenharmony_ci int64_t valueTemp = 0; 67da853ecaSopenharmony_ci ret = format.GetLongValue(key, valueTemp); 68da853ecaSopenharmony_ci value = std::to_string(valueTemp); 69da853ecaSopenharmony_ci break; 70da853ecaSopenharmony_ci } 71da853ecaSopenharmony_ci case FORMAT_TYPE_FLOAT: { 72da853ecaSopenharmony_ci float valueTemp = 0; 73da853ecaSopenharmony_ci ret = format.GetFloatValue(key, valueTemp); 74da853ecaSopenharmony_ci value = std::to_string(valueTemp); 75da853ecaSopenharmony_ci break; 76da853ecaSopenharmony_ci } 77da853ecaSopenharmony_ci case FORMAT_TYPE_DOUBLE: { 78da853ecaSopenharmony_ci double valueTemp = 0; 79da853ecaSopenharmony_ci ret = format.GetDoubleValue(key, valueTemp); 80da853ecaSopenharmony_ci value = std::to_string(valueTemp); 81da853ecaSopenharmony_ci break; 82da853ecaSopenharmony_ci } 83da853ecaSopenharmony_ci case FORMAT_TYPE_STRING: { 84da853ecaSopenharmony_ci ret = format.GetStringValue(key, value); 85da853ecaSopenharmony_ci break; 86da853ecaSopenharmony_ci } 87da853ecaSopenharmony_ci case FORMAT_TYPE_ADDR: 88da853ecaSopenharmony_ci break; 89da853ecaSopenharmony_ci default: 90da853ecaSopenharmony_ci AVCODEC_LOGE("Add info from format failed. Key: %{public}s", key.data()); 91da853ecaSopenharmony_ci } 92da853ecaSopenharmony_ci if (ret != true) { 93da853ecaSopenharmony_ci return AVCS_ERR_INVALID_VAL; 94da853ecaSopenharmony_ci } 95da853ecaSopenharmony_ci 96da853ecaSopenharmony_ci this->AddInfo(dumpIdx, name, value); 97da853ecaSopenharmony_ci return AVCS_ERR_OK; 98da853ecaSopenharmony_ci} 99da853ecaSopenharmony_ci 100da853ecaSopenharmony_ciint32_t AVCodecDumpControler::AddInfoFromFormatWithMapping(const uint32_t dumpIdx, 101da853ecaSopenharmony_ci const Format &format, const std::string_view &key, 102da853ecaSopenharmony_ci const std::string &name, 103da853ecaSopenharmony_ci std::map<int32_t, const std::string> mapping) 104da853ecaSopenharmony_ci{ 105da853ecaSopenharmony_ci int32_t val; 106da853ecaSopenharmony_ci if (format.GetIntValue(key, val) == true) { 107da853ecaSopenharmony_ci auto itMappingString = mapping.find(val); 108da853ecaSopenharmony_ci const std::string mappingString = itMappingString != mapping.end() ? itMappingString->second : ""; 109da853ecaSopenharmony_ci AddInfo(dumpIdx, name, mappingString); 110da853ecaSopenharmony_ci } else { 111da853ecaSopenharmony_ci return AVCS_ERR_INVALID_VAL; 112da853ecaSopenharmony_ci } 113da853ecaSopenharmony_ci return AVCS_ERR_OK; 114da853ecaSopenharmony_ci} 115da853ecaSopenharmony_ci 116da853ecaSopenharmony_ciint32_t AVCodecDumpControler::GetDumpString(std::string &dumpString) 117da853ecaSopenharmony_ci{ 118da853ecaSopenharmony_ci for (auto iter : dumpInfoMap_) { 119da853ecaSopenharmony_ci auto level = GetLevel(iter.first); 120da853ecaSopenharmony_ci std::string name = iter.second.first; 121da853ecaSopenharmony_ci std::string value = iter.second.second; 122da853ecaSopenharmony_ci dumpString += std::string((level - 1) * DUMP_SPACE_LENGTH, ' ') 123da853ecaSopenharmony_ci + name + std::string(length_[level - 1] - name.length(), ' '); 124da853ecaSopenharmony_ci if (!value.empty()) { 125da853ecaSopenharmony_ci dumpString += " - " + value; 126da853ecaSopenharmony_ci } 127da853ecaSopenharmony_ci dumpString += std::string("\n"); 128da853ecaSopenharmony_ci } 129da853ecaSopenharmony_ci return AVCS_ERR_OK; 130da853ecaSopenharmony_ci} 131da853ecaSopenharmony_ci 132da853ecaSopenharmony_ciuint32_t AVCodecDumpControler::GetLevel(const uint32_t dumpIdx) 133da853ecaSopenharmony_ci{ 134da853ecaSopenharmony_ci uint32_t level = 1; 135da853ecaSopenharmony_ci if (dumpIdx & UINT8_MAX) { 136da853ecaSopenharmony_ci level = DUMP_LEVEL_4; 137da853ecaSopenharmony_ci } else if ((dumpIdx >> DUMP_OFFSET_8) & UINT8_MAX) { 138da853ecaSopenharmony_ci level = DUMP_LEVEL_3; 139da853ecaSopenharmony_ci } else if ((dumpIdx >> DUMP_OFFSET_16) & UINT8_MAX) { 140da853ecaSopenharmony_ci level = DUMP_LEVEL_2; 141da853ecaSopenharmony_ci } 142da853ecaSopenharmony_ci return level; 143da853ecaSopenharmony_ci} 144da853ecaSopenharmony_ci} // namespace OHOS 145da853ecaSopenharmony_ci} // namespace MediaAVCodec