1 /*
2  * Copyright (C) 2023 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 #ifndef AVCODEC_LOG_H
16 #define AVCODEC_LOG_H
17 
18 #include <hilog/log.h>
19 #include <cinttypes>
20 
21 namespace OHOS {
22 namespace MediaAVCodec {
23 #undef  LOG_DOMAIN_FRAMEWORK
24 #define LOG_DOMAIN_FRAMEWORK     0xD002B30
25 #undef  LOG_DOMAIN_AUDIO
26 #define LOG_DOMAIN_AUDIO         0xD002B31
27 #undef  LOG_DOMAIN_HCODEC
28 #define LOG_DOMAIN_HCODEC        0xD002B32
29 #undef  LOG_DOMAIN_TEST
30 #define LOG_DOMAIN_TEST          0xD002B36
31 #undef  LOG_DOMAIN_DEMUXER
32 #define LOG_DOMAIN_DEMUXER       0xD002B3A
33 #undef  LOG_DOMAIN_MUXER
34 #define LOG_DOMAIN_MUXER         0xD002B3B
35 
36 #ifndef AVCODEC_LOG_USE_NO_DICT_LOG
37 #define AVCODEC_LOG(level, fmt, args...)                                    \
38     do {                                                                    \
39         (void)HILOG_IMPL(LABEL.type, level, LABEL.domain, LABEL.tag, "{%{public}s():%{public}d} " \
40             fmt, __FUNCTION__, __LINE__, ##args);                           \
41     } while (0)
42 
43 #define AVCODEC_LOGF(fmt, ...) AVCODEC_LOG(LOG_FATAL, fmt, ##__VA_ARGS__)
44 #define AVCODEC_LOGE(fmt, ...) AVCODEC_LOG(LOG_ERROR, fmt, ##__VA_ARGS__)
45 #define AVCODEC_LOGW(fmt, ...) AVCODEC_LOG(LOG_WARN,  fmt, ##__VA_ARGS__)
46 #define AVCODEC_LOGI(fmt, ...) AVCODEC_LOG(LOG_INFO,  fmt, ##__VA_ARGS__)
47 #define AVCODEC_LOGD(fmt, ...) AVCODEC_LOG(LOG_DEBUG, fmt, ##__VA_ARGS__)
48 #else
49 #define AVCODEC_LOG(func, fmt, args...)                                     \
50     do {                                                                    \
51         (void)func(LABEL, "{%{public}s():%{public}d} " fmt, __FUNCTION__, __LINE__, ##args);   \
52     } while (0)
53 
54 #define AVCODEC_LOGF(fmt, ...) AVCODEC_LOG(::OHOS::HiviewDFX::HiLog::Fatal, fmt, ##__VA_ARGS__)
55 #define AVCODEC_LOGE(fmt, ...) AVCODEC_LOG(::OHOS::HiviewDFX::HiLog::Error, fmt, ##__VA_ARGS__)
56 #define AVCODEC_LOGW(fmt, ...) AVCODEC_LOG(::OHOS::HiviewDFX::HiLog::Warn,  fmt, ##__VA_ARGS__)
57 #define AVCODEC_LOGI(fmt, ...) AVCODEC_LOG(::OHOS::HiviewDFX::HiLog::Info,  fmt, ##__VA_ARGS__)
58 #define AVCODEC_LOGD(fmt, ...) AVCODEC_LOG(::OHOS::HiviewDFX::HiLog::Debug, fmt, ##__VA_ARGS__)
59 #endif
60 
61 #define AVCODEC_LOG_LIMIT(logger, frequency, fmt, ...)                      \
62     do {                                                                    \
63         static uint32_t currentTimes = 0;                                   \
64         if (currentTimes++ % ((uint32_t)(frequency)) != 0) {                \
65             break;                                                          \
66         }                                                                   \
67         logger("[R: %{public}u] " fmt, currentTimes, ##__VA_ARGS__);        \
68     } while (0)
69 
70 #define AVCODEC_LOGE_LIMIT(frequency, fmt, ...) AVCODEC_LOG_LIMIT(AVCODEC_LOGE, frequency, fmt, ##__VA_ARGS__)
71 #define AVCODEC_LOGW_LIMIT(frequency, fmt, ...) AVCODEC_LOG_LIMIT(AVCODEC_LOGW, frequency, fmt, ##__VA_ARGS__)
72 #define AVCODEC_LOGI_LIMIT(frequency, fmt, ...) AVCODEC_LOG_LIMIT(AVCODEC_LOGI, frequency, fmt, ##__VA_ARGS__)
73 #define AVCODEC_LOGD_LIMIT(frequency, fmt, ...) AVCODEC_LOG_LIMIT(AVCODEC_LOGD, frequency, fmt, ##__VA_ARGS__)
74 
75 #define CHECK_AND_RETURN_RET_LOG(cond, ret, fmt, ...)                       \
76     do {                                                                    \
77         if (!(cond)) {                                                      \
78             AVCODEC_LOGE(fmt, ##__VA_ARGS__);                               \
79             return ret;                                                     \
80         }                                                                   \
81     } while (0)
82 
83 #define CHECK_AND_RETURN_RET_LOGW(cond, ret, fmt, ...)                      \
84     do {                                                                    \
85         if (!(cond)) {                                                      \
86             AVCODEC_LOGW(fmt, ##__VA_ARGS__);                               \
87             return ret;                                                     \
88         }                                                                   \
89     } while (0)
90 
91 #define CHECK_AND_RETURN_RET_LOG_LIMIT(cond, ret, frequency, fmt, ...)      \
92     do {                                                                    \
93         if (!(cond)) {                                                      \
94             AVCODEC_LOGE_LIMIT(frequency, fmt, ##__VA_ARGS__);              \
95             return ret;                                                     \
96         }                                                                   \
97     } while (0)
98 
99 #define EXPECT_AND_LOGW(cond, fmt, ...)                                     \
100     do {                                                                    \
101         if ((cond)) {                                                       \
102             AVCODEC_LOGW(fmt, ##__VA_ARGS__);                               \
103         }                                                                   \
104     } while (0)
105 
106 #define EXPECT_AND_LOGI(cond, fmt, ...)                                     \
107     do {                                                                    \
108         if ((cond)) {                                                       \
109             AVCODEC_LOGI(fmt, ##__VA_ARGS__);                               \
110         }                                                                   \
111     } while (0)
112 
113 #define EXPECT_AND_LOGD(cond, fmt, ...)                                     \
114     do {                                                                    \
115         if ((cond)) {                                                       \
116             AVCODEC_LOGD(fmt, ##__VA_ARGS__);                               \
117         }                                                                   \
118     } while (0)
119 
120 #define EXPECT_AND_LOGE(cond, fmt, ...)                                     \
121     do {                                                                    \
122         if ((cond)) {                                                       \
123             AVCODEC_LOGE(fmt, ##__VA_ARGS__);                               \
124         }                                                                   \
125     } while (0)
126 
127 #define CHECK_AND_RETURN_LOG(cond, fmt, ...)                                \
128     do {                                                                    \
129         if (!(cond)) {                                                      \
130             AVCODEC_LOGE(fmt, ##__VA_ARGS__);                               \
131             return;                                                         \
132         }                                                                   \
133     } while (0)
134 
135 #define CHECK_AND_RETURN_LOG_LIMIT(cond, frequency, fmt, ...)               \
136     do {                                                                    \
137         if (!(cond)) {                                                      \
138             AVCODEC_LOGE_LIMIT(frequency, fmt, ##__VA_ARGS__);              \
139             return;                                                         \
140         }                                                                   \
141     } while (0)
142 
143 #define CHECK_AND_BREAK_LOG(cond, fmt, ...)                                 \
144     if (1) {                                                                \
145         if (!(cond)) {                                                      \
146             AVCODEC_LOGW(fmt, ##__VA_ARGS__);                               \
147             break;                                                          \
148         }                                                                   \
149     } else void (0)
150 
151 #define CHECK_AND_CONTINUE_LOG(cond, fmt, ...)                              \
152     if (1) {                                                                \
153         if (!(cond)) {                                                      \
154             AVCODEC_LOGW(fmt, ##__VA_ARGS__);                               \
155             continue;                                                       \
156         }                                                                   \
157     } else void (0)
158 
159 #define POINTER_MASK 0x00FFFFFF
160 #define FAKE_POINTER(addr) (POINTER_MASK & reinterpret_cast<uintptr_t>(addr))
161 } // namespace MediaAVCodec
162 } // namespace OHOS
163 #endif // AVCODEC_LOG_H
164