/* * Copyright (C) 2014-2017 Intel Corporation. * Copyright (c) 2017, Fuzhou Rockchip Electronics Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "CommonUtils" #include "LogHelper.h" #include #include "stdlib.h" #include "Utils.h" #include "LogHelper.h" #include #include NAMESPACE_DECLARATION { void getTokens(const char *s, const char delim, std::vector &tokens) { std::stringstream ss(s); std::string item; for (size_t i = 0; std::getline(ss, item, delim); i++) { tokens.push_back(item); } } // Parse string like "640x480" or "10000,20000" // copy from android CameraParameters.cpp int parsePair(const char *str, int *first, int *second, char delim, char **endptr) { // Find the first integer. char *end; int w = (int)strtol(str, &end, 10); // If a delimiter does not immediately follow, give up. if (*end != delim) { LOGE("Cannot find delimiter (%c) in str=%s", delim, str); return -1; } // Find the second integer, immediately after the delimiter. int h = (int)strtol(end+1, &end, 10); *first = w; *second = h; if (endptr) { *endptr = end; } return 0; } #define FRAC_BITS_CURR_LOC 8 /* Value of 8 is maximum in order to avoid overflow with 16-bit inputs */ #define FRAC_BASE (short)(1) << FRAC_BITS_CURR_LOC /*! * \brief Resize a 2D array with linear interpolation. * * @param[in,out] * in a_src pointer to input array (width-major) * in a_src_w width of the input array * in a_src_h height of the input array * in a_dst pointer to output array (width-major) * in a_dst_w width of the output array * in a_dst_h height of the output array */ template int resize2dArray( const T* a_src, int a_src_w, int a_src_h, T* a_dst, int a_dst_w, int a_dst_h) { int i, j, step_size_w, step_size_h, rounding_term; if (a_src_w < 2 || a_dst_w < 2 || a_src_h < 2 || a_dst_h < 2) { return -1; } nsecs_t startTime = systemTime(); step_size_w = ((a_src_w-1)< 0) ? (curr_loc_h-1)>>FRAC_BITS_CURR_LOC : 0; for (i = 0; i < a_dst_w; ++i) { unsigned int curr_loc_w, curr_loc_lower_w; curr_loc_w = i * step_size_w; curr_loc_lower_w = (curr_loc_w > 0) ? (curr_loc_w-1)>>FRAC_BITS_CURR_LOC : 0; a_dst[a_dst_w*j+i] = (a_src[curr_loc_lower_w + curr_loc_lower_h*a_src_w] * (((curr_loc_lower_w+1)<( const float* a_src, int a_src_w, int a_src_h, float* a_dst, int a_dst_w, int a_dst_h); template int resize2dArray( const int* a_src, int a_src_w, int a_src_h, int* a_dst, int a_dst_w, int a_dst_h); nsecs_t systemTime() { struct timespec t; t.tv_sec = t.tv_nsec = 0; clock_gettime(CLOCK_MONOTONIC, &t); return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec; } } NAMESPACE_DECLARATION_END