// sherpa-onnx/csrc/utils.cc // // Copyright 2025 Xiaomi Corporation #include "sherpa-onnx/csrc/rknn/utils.h" #include #include #include #include #include "sherpa-onnx/csrc/macros.h" #include "sherpa-onnx/csrc/text-utils.h" namespace sherpa_onnx { void ConvertNCHWtoNHWC(const float *src, int32_t n, int32_t channel, int32_t height, int32_t width, float *dst) { for (int32_t i = 0; i < n; ++i) { for (int32_t h = 0; h < height; ++h) { for (int32_t w = 0; w < width; ++w) { for (int32_t c = 0; c < channel; ++c) { // dst[h, w, c] = src[c, h, w] dst[i * height * width * channel + h * width * channel + w * channel + c] = src[i * height * width * channel + c * height * width + h * width + w]; } } } } } std::string ToString(const rknn_tensor_attr &attr) { std::ostringstream os; os << "{"; os << attr.index; os << ", name: " << attr.name; os << ", shape: ("; std::string sep; for (int32_t i = 0; i < static_cast(attr.n_dims); ++i) { os << sep << attr.dims[i]; sep = ","; } os << ")"; os << ", n_elems: " << attr.n_elems; os << ", size: " << attr.size; os << ", fmt: " << get_format_string(attr.fmt); os << ", type: " << get_type_string(attr.type); os << ", pass_through: " << (attr.pass_through ? "true" : "false"); os << "}"; return os.str(); } std::unordered_map Parse( const rknn_custom_string &custom_string) { std::unordered_map ans; std::vector fields; SplitStringToVector(custom_string.string, ";", false, &fields); std::vector tmp; for (const auto &f : fields) { SplitStringToVector(f, "=", false, &tmp); if (tmp.size() != 2) { SHERPA_ONNX_LOGE("Invalid custom string %s for %s", custom_string.string, f.c_str()); SHERPA_ONNX_EXIT(-1); } ans[std::move(tmp[0])] = std::move(tmp[1]); } return ans; } } // namespace sherpa_onnx