1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef IMAGE_CODEC_LOG_H 17 #define IMAGE_CODEC_LOG_H 18 19 #include <cinttypes> 20 #include <chrono> 21 #include "log_tags.h" 22 #include "hilog/log.h" 23 #include "hitrace_meter.h" 24 25 #undef LOG_DOMAIN 26 #define LOG_DOMAIN LOG_TAG_DOMAIN_ID_IMAGE 27 28 #undef LOG_TAG 29 #define LOG_TAG "HEIF_HW_DECODER" 30 31 #ifdef __FILE_NAME__ 32 #define FILENAME __FILE_NAME__ 33 #else 34 #define FILENAME __FILE__ 35 #endif 36 37 #define LOG_FMT "[%{public}s][%{public}s %{public}d] " 38 #define LOGE(x, ...) \ 39 HILOG_ERROR(LOG_CORE, LOG_FMT x, FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__) 40 #define LOGW(x, ...) \ 41 HILOG_WARN(LOG_CORE, LOG_FMT x, FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__) 42 #define LOGI(x, ...) \ 43 HILOG_INFO(LOG_CORE, LOG_FMT x, FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__) 44 #define LOGD(x, ...) \ 45 HILOG_DEBUG(LOG_CORE, LOG_FMT x, FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__) 46 47 // for ImageCodecBuffer 48 #define HLOG_FMT "%{public}s[%{public}s][%{public}s %{public}d] " 49 #define HLOGE(x, ...) HILOG_ERROR(LOG_CORE, HLOG_FMT x, compUniqueStr_.c_str(), \ 50 currState_->GetName().c_str(), __FUNCTION__, __LINE__, ##__VA_ARGS__) 51 #define HLOGW(x, ...) HILOG_WARN(LOG_CORE, HLOG_FMT x, compUniqueStr_.c_str(), \ 52 currState_->GetName().c_str(), __FUNCTION__, __LINE__, ##__VA_ARGS__) 53 #define HLOGI(x, ...) HILOG_INFO(LOG_CORE, HLOG_FMT x, compUniqueStr_.c_str(), \ 54 currState_->GetName().c_str(), __FUNCTION__, __LINE__, ##__VA_ARGS__) 55 #define HLOGD(x, ...) \ 56 do { \ 57 if (debugMode_) { \ 58 HILOG_DEBUG(LOG_CORE, HLOG_FMT x, compUniqueStr_.c_str(), \ 59 currState_->GetName().c_str(), __FUNCTION__, __LINE__, ##__VA_ARGS__); \ 60 } \ 61 } while (0) 62 63 // for ImageCodecBuffer inner state 64 #define SLOGE(x, ...) HILOG_ERROR(LOG_CORE, HLOG_FMT x, \ 65 codec_->compUniqueStr_.c_str(), stateName_.c_str(), __FUNCTION__, __LINE__, ##__VA_ARGS__) 66 #define SLOGW(x, ...) HILOG_WARN(LOG_CORE, HLOG_FMT x, \ 67 codec_->compUniqueStr_.c_str(), stateName_.c_str(), __FUNCTION__, __LINE__, ##__VA_ARGS__) 68 #define SLOGI(x, ...) HILOG_INFO(LOG_CORE, HLOG_FMT x, \ 69 codec_->compUniqueStr_.c_str(), stateName_.c_str(), __FUNCTION__, __LINE__, ##__VA_ARGS__) 70 #define SLOGD(x, ...) \ 71 do { \ 72 if (codec_->debugMode_) { \ 73 HILOG_DEBUG(LOG_CORE, HLOG_FMT x, \ 74 codec_->compUniqueStr_.c_str(), stateName_.c_str(), __FUNCTION__, __LINE__, ##__VA_ARGS__); \ 75 } \ 76 } while (0) 77 78 #define IF_TRUE_RETURN_VAL(cond, val) \ 79 do { \ 80 if (cond) { \ 81 return val; \ 82 } \ 83 } while (0) 84 #define IF_TRUE_RETURN_VAL_WITH_MSG(cond, val, msg, ...) \ 85 do { \ 86 if (cond) { \ 87 LOGE(msg, ##__VA_ARGS__); \ 88 return val; \ 89 } \ 90 } while (0) 91 #define IF_TRUE_RETURN_VOID(cond) \ 92 do { \ 93 if (cond) { \ 94 return; \ 95 } \ 96 } while (0) 97 #define IF_TRUE_RETURN_VOID_WITH_MSG(cond, msg, ...) \ 98 do { \ 99 if (cond) { \ 100 LOGE(msg, ##__VA_ARGS__); \ 101 return; \ 102 } \ 103 } while (0) 104 105 #ifdef H_SYSTRACE_TAG 106 #undef H_SYSTRACE_TAG 107 #endif 108 #define H_SYSTRACE_TAG HITRACE_TAG_ZMEDIA 109 110 class HeifPerfTracker { 111 public: HeifPerfTracker(std::string desc)112 explicit HeifPerfTracker(std::string desc) : desc_(desc) 113 { 114 startTimeInUs_ = GetCurrentTimeInUs(); 115 StartTrace(H_SYSTRACE_TAG, desc); 116 } ~HeifPerfTracker()117 ~HeifPerfTracker() 118 { 119 FinishTrace(H_SYSTRACE_TAG); 120 static constexpr float MILLISEC_TO_MICROSEC = 1000.0f; 121 int64_t timeSpanInUs = GetCurrentTimeInUs() - startTimeInUs_; 122 LOGD("%{public}s cost: %{public}.2f ms", 123 desc_.c_str(), static_cast<float>(timeSpanInUs / MILLISEC_TO_MICROSEC)); 124 } 125 private: GetCurrentTimeInUs()126 int64_t GetCurrentTimeInUs() 127 { 128 auto now = std::chrono::steady_clock::now(); 129 return std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()).count(); 130 } 131 132 int64_t startTimeInUs_; 133 std::string desc_; 134 }; 135 136 #endif // IMAGE_CODEC_LOG_H