// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "utils.h" #include #include #include #include #include #include #ifdef RKMEDIA_SUPPORT_MINILOG #include "minilogger/log.h" #endif enum { LOG_LEVEL_INFO, LOG_LEVEL_DBG, }; enum { LOG_METHOD_MINILOG, LOG_METHOD_PRINT }; static int rkmedia_log_method = LOG_METHOD_PRINT; static int rkmedia_log_level = LOG_LEVEL_INFO; _API void LOG_INIT() { char* ptr = NULL; rkmedia_log_method = LOG_METHOD_PRINT; #ifdef RKMEDIA_SUPPORT_MINILOG ptr = getenv("RKMEDIA_LOG_METHOD"); if (ptr && strstr(ptr, "MINILOG")) { fprintf(stderr, "##RKMEDIA Method: MINILOG\n"); __minilog_log_init("RKMEDIA", NULL, false, false, "RKMEDIA", "0.1"); rkmedia_log_method = LOG_METHOD_MINILOG; } else { fprintf(stderr, "##RKMEDIA Method: PRINT\n"); rkmedia_log_method = LOG_METHOD_PRINT; } #endif //#ifdef RKMEDIA_SUPPORT_MINILOG ptr = getenv("RKMEDIA_LOG_LEVEL"); if (ptr && strstr(ptr, "DBG")) { fprintf(stderr, "##RKMEDIA Log level: DBG\n"); rkmedia_log_level = LOG_LEVEL_DBG; } else { fprintf(stderr, "##RKMEDIA Log level: INFO\n"); rkmedia_log_level = LOG_LEVEL_INFO; } } static void LogPrintf(const char* prefix, const char* fmt, va_list vl) { char line[1024]; if (rkmedia_log_level >= LOG_LEVEL_DBG) { #ifdef RKMEDIA_SUPPORT_MINILOG if (rkmedia_log_method == LOG_METHOD_PRINT) { #endif fprintf(stderr, "%s", (char*)prefix); vsnprintf(line, sizeof(line), fmt, vl); fprintf(stderr, "%s", line); #ifdef RKMEDIA_SUPPORT_MINILOG } else { // minilog_debug("%s", (char *)prefix); vsnprintf(line, sizeof(line), fmt, vl); minilog_debug("%s%s", (char*)prefix, line); } #endif } } void LOGD(const char* format, ...) { va_list vl; va_start(vl, format); LogPrintf("Debug - ", format, vl); va_end(vl); } void LOG(const char* format, ...) { do { va_list vl; va_start(vl, format); char line[1024]; vsnprintf(line, sizeof(line), format, vl); #ifdef RKMEDIA_SUPPORT_MINILOG if (rkmedia_log_method == LOG_METHOD_PRINT) #endif fprintf(stderr, "%s", line); #ifdef RKMEDIA_SUPPORT_MINILOG else { minilog_info("%s", line); } #endif va_end(vl); } while (0); } namespace easymedia { bool parse_media_param_map(const char* param, std::map& map) { if (!param) { return false; } std::string token; std::istringstream tokenStream(param); while (std::getline(tokenStream, token)) { std::string key, value; std::istringstream subTokenStream(token); if (std::getline(subTokenStream, key, '=')) { std::getline(subTokenStream, value); } map[key] = value; } return true; } bool parse_media_param_list(const char* param, std::list& list, const char delim) { if (!param) { return false; } std::string token; std::istringstream tokenStream(param); while (std::getline(tokenStream, token, delim)) { list.push_back(token); } return true; } int parse_media_param_match(const char* param, std::map& map, std::list>& list) { if (!easymedia::parse_media_param_map(param, map)) { return 0; } int match_num = 0; for (auto& key : list) { const std::string& req_key = key.first; for (auto& entry : map) { const std::string& entry_key = entry.first; if (req_key == entry_key) { key.second = entry.second; match_num++; break; } } } return match_num; } bool has_intersection(const char* str, const char* expect, std::list* expect_list) { std::list request; // LOG("request: %s; expect: %s\n", str, expect); if (!expect || (strlen(expect) == 0)) { return true; } if (!parse_media_param_list(str, request, ',')) { return false; } if (expect_list->empty() && !parse_media_param_list(expect, *expect_list)) { return false; } for (auto& req : request) { if (std::find(expect_list->begin(), expect_list->end(), req) != expect_list->end()) { return true; } } return false; } std::string get_media_value_by_key(const char* param, const char* key) { std::map param_map; if (!parse_media_param_map(param, param_map)) { return std::string(); } return param_map[key]; } bool string_start_withs(std::string const& fullString, std::string const& starting) { if (fullString.length() >= starting.length()) { return (0 == fullString.find(starting)); } else { return false; } } bool string_end_withs(std::string const& fullString, std::string const& ending) { if (fullString.length() >= ending.length()) { return (0 == fullString.compare(fullString.length() - ending.length(), ending.length(), ending)); } else { return false; } } #ifndef NDEBUG #include #include bool DumpToFile(std::string path, const char* ptr, size_t len) { int fd = open(path.c_str(), O_CREAT | O_WRONLY | O_FSYNC); if (fd < 0) { LOG("Fail to open %s\n", path.c_str()); return false; } LOGD("dump to %s, size %d\n", path.c_str(), (int)len); write(fd, ptr, len); close(fd); return true; } #endif // #ifndef NDEBUG } // namespace easymedia