1da853ecaSopenharmony_ci/*
2da853ecaSopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd.
3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License.
5da853ecaSopenharmony_ci * You may obtain a copy of the License at
6da853ecaSopenharmony_ci *
7da853ecaSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8da853ecaSopenharmony_ci *
9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and
13da853ecaSopenharmony_ci * limitations under the License.
14da853ecaSopenharmony_ci */
15da853ecaSopenharmony_ci#ifndef AVCODEC_LOG_H
16da853ecaSopenharmony_ci#define AVCODEC_LOG_H
17da853ecaSopenharmony_ci
18da853ecaSopenharmony_ci#include <hilog/log.h>
19da853ecaSopenharmony_ci#include <cinttypes>
20da853ecaSopenharmony_ci
21da853ecaSopenharmony_cinamespace OHOS {
22da853ecaSopenharmony_cinamespace MediaAVCodec {
23da853ecaSopenharmony_ci#undef  LOG_DOMAIN_FRAMEWORK
24da853ecaSopenharmony_ci#define LOG_DOMAIN_FRAMEWORK     0xD002B30
25da853ecaSopenharmony_ci#undef  LOG_DOMAIN_AUDIO
26da853ecaSopenharmony_ci#define LOG_DOMAIN_AUDIO         0xD002B31
27da853ecaSopenharmony_ci#undef  LOG_DOMAIN_HCODEC
28da853ecaSopenharmony_ci#define LOG_DOMAIN_HCODEC        0xD002B32
29da853ecaSopenharmony_ci#undef  LOG_DOMAIN_TEST
30da853ecaSopenharmony_ci#define LOG_DOMAIN_TEST          0xD002B36
31da853ecaSopenharmony_ci#undef  LOG_DOMAIN_DEMUXER
32da853ecaSopenharmony_ci#define LOG_DOMAIN_DEMUXER       0xD002B3A
33da853ecaSopenharmony_ci#undef  LOG_DOMAIN_MUXER
34da853ecaSopenharmony_ci#define LOG_DOMAIN_MUXER         0xD002B3B
35da853ecaSopenharmony_ci
36da853ecaSopenharmony_ci#ifndef AVCODEC_LOG_USE_NO_DICT_LOG
37da853ecaSopenharmony_ci#define AVCODEC_LOG(level, fmt, args...)                                    \
38da853ecaSopenharmony_ci    do {                                                                    \
39da853ecaSopenharmony_ci        (void)HILOG_IMPL(LABEL.type, level, LABEL.domain, LABEL.tag, "{%{public}s():%{public}d} " \
40da853ecaSopenharmony_ci            fmt, __FUNCTION__, __LINE__, ##args);                           \
41da853ecaSopenharmony_ci    } while (0)
42da853ecaSopenharmony_ci
43da853ecaSopenharmony_ci#define AVCODEC_LOGF(fmt, ...) AVCODEC_LOG(LOG_FATAL, fmt, ##__VA_ARGS__)
44da853ecaSopenharmony_ci#define AVCODEC_LOGE(fmt, ...) AVCODEC_LOG(LOG_ERROR, fmt, ##__VA_ARGS__)
45da853ecaSopenharmony_ci#define AVCODEC_LOGW(fmt, ...) AVCODEC_LOG(LOG_WARN,  fmt, ##__VA_ARGS__)
46da853ecaSopenharmony_ci#define AVCODEC_LOGI(fmt, ...) AVCODEC_LOG(LOG_INFO,  fmt, ##__VA_ARGS__)
47da853ecaSopenharmony_ci#define AVCODEC_LOGD(fmt, ...) AVCODEC_LOG(LOG_DEBUG, fmt, ##__VA_ARGS__)
48da853ecaSopenharmony_ci#else
49da853ecaSopenharmony_ci#define AVCODEC_LOG(func, fmt, args...)                                     \
50da853ecaSopenharmony_ci    do {                                                                    \
51da853ecaSopenharmony_ci        (void)func(LABEL, "{%{public}s():%{public}d} " fmt, __FUNCTION__, __LINE__, ##args);   \
52da853ecaSopenharmony_ci    } while (0)
53da853ecaSopenharmony_ci
54da853ecaSopenharmony_ci#define AVCODEC_LOGF(fmt, ...) AVCODEC_LOG(::OHOS::HiviewDFX::HiLog::Fatal, fmt, ##__VA_ARGS__)
55da853ecaSopenharmony_ci#define AVCODEC_LOGE(fmt, ...) AVCODEC_LOG(::OHOS::HiviewDFX::HiLog::Error, fmt, ##__VA_ARGS__)
56da853ecaSopenharmony_ci#define AVCODEC_LOGW(fmt, ...) AVCODEC_LOG(::OHOS::HiviewDFX::HiLog::Warn,  fmt, ##__VA_ARGS__)
57da853ecaSopenharmony_ci#define AVCODEC_LOGI(fmt, ...) AVCODEC_LOG(::OHOS::HiviewDFX::HiLog::Info,  fmt, ##__VA_ARGS__)
58da853ecaSopenharmony_ci#define AVCODEC_LOGD(fmt, ...) AVCODEC_LOG(::OHOS::HiviewDFX::HiLog::Debug, fmt, ##__VA_ARGS__)
59da853ecaSopenharmony_ci#endif
60da853ecaSopenharmony_ci
61da853ecaSopenharmony_ci#define AVCODEC_LOG_LIMIT(logger, frequency, fmt, ...)                      \
62da853ecaSopenharmony_ci    do {                                                                    \
63da853ecaSopenharmony_ci        static uint32_t currentTimes = 0;                                   \
64da853ecaSopenharmony_ci        if (currentTimes++ % ((uint32_t)(frequency)) != 0) {                \
65da853ecaSopenharmony_ci            break;                                                          \
66da853ecaSopenharmony_ci        }                                                                   \
67da853ecaSopenharmony_ci        logger("[R: %{public}u] " fmt, currentTimes, ##__VA_ARGS__);        \
68da853ecaSopenharmony_ci    } while (0)
69da853ecaSopenharmony_ci
70da853ecaSopenharmony_ci#define AVCODEC_LOGE_LIMIT(frequency, fmt, ...) AVCODEC_LOG_LIMIT(AVCODEC_LOGE, frequency, fmt, ##__VA_ARGS__)
71da853ecaSopenharmony_ci#define AVCODEC_LOGW_LIMIT(frequency, fmt, ...) AVCODEC_LOG_LIMIT(AVCODEC_LOGW, frequency, fmt, ##__VA_ARGS__)
72da853ecaSopenharmony_ci#define AVCODEC_LOGI_LIMIT(frequency, fmt, ...) AVCODEC_LOG_LIMIT(AVCODEC_LOGI, frequency, fmt, ##__VA_ARGS__)
73da853ecaSopenharmony_ci#define AVCODEC_LOGD_LIMIT(frequency, fmt, ...) AVCODEC_LOG_LIMIT(AVCODEC_LOGD, frequency, fmt, ##__VA_ARGS__)
74da853ecaSopenharmony_ci
75da853ecaSopenharmony_ci#define CHECK_AND_RETURN_RET_LOG(cond, ret, fmt, ...)                       \
76da853ecaSopenharmony_ci    do {                                                                    \
77da853ecaSopenharmony_ci        if (!(cond)) {                                                      \
78da853ecaSopenharmony_ci            AVCODEC_LOGE(fmt, ##__VA_ARGS__);                               \
79da853ecaSopenharmony_ci            return ret;                                                     \
80da853ecaSopenharmony_ci        }                                                                   \
81da853ecaSopenharmony_ci    } while (0)
82da853ecaSopenharmony_ci
83da853ecaSopenharmony_ci#define CHECK_AND_RETURN_RET_LOGW(cond, ret, fmt, ...)                      \
84da853ecaSopenharmony_ci    do {                                                                    \
85da853ecaSopenharmony_ci        if (!(cond)) {                                                      \
86da853ecaSopenharmony_ci            AVCODEC_LOGW(fmt, ##__VA_ARGS__);                               \
87da853ecaSopenharmony_ci            return ret;                                                     \
88da853ecaSopenharmony_ci        }                                                                   \
89da853ecaSopenharmony_ci    } while (0)
90da853ecaSopenharmony_ci
91da853ecaSopenharmony_ci#define CHECK_AND_RETURN_RET_LOG_LIMIT(cond, ret, frequency, fmt, ...)      \
92da853ecaSopenharmony_ci    do {                                                                    \
93da853ecaSopenharmony_ci        if (!(cond)) {                                                      \
94da853ecaSopenharmony_ci            AVCODEC_LOGE_LIMIT(frequency, fmt, ##__VA_ARGS__);              \
95da853ecaSopenharmony_ci            return ret;                                                     \
96da853ecaSopenharmony_ci        }                                                                   \
97da853ecaSopenharmony_ci    } while (0)
98da853ecaSopenharmony_ci
99da853ecaSopenharmony_ci#define EXPECT_AND_LOGW(cond, fmt, ...)                                     \
100da853ecaSopenharmony_ci    do {                                                                    \
101da853ecaSopenharmony_ci        if ((cond)) {                                                       \
102da853ecaSopenharmony_ci            AVCODEC_LOGW(fmt, ##__VA_ARGS__);                               \
103da853ecaSopenharmony_ci        }                                                                   \
104da853ecaSopenharmony_ci    } while (0)
105da853ecaSopenharmony_ci
106da853ecaSopenharmony_ci#define EXPECT_AND_LOGI(cond, fmt, ...)                                     \
107da853ecaSopenharmony_ci    do {                                                                    \
108da853ecaSopenharmony_ci        if ((cond)) {                                                       \
109da853ecaSopenharmony_ci            AVCODEC_LOGI(fmt, ##__VA_ARGS__);                               \
110da853ecaSopenharmony_ci        }                                                                   \
111da853ecaSopenharmony_ci    } while (0)
112da853ecaSopenharmony_ci
113da853ecaSopenharmony_ci#define EXPECT_AND_LOGD(cond, fmt, ...)                                     \
114da853ecaSopenharmony_ci    do {                                                                    \
115da853ecaSopenharmony_ci        if ((cond)) {                                                       \
116da853ecaSopenharmony_ci            AVCODEC_LOGD(fmt, ##__VA_ARGS__);                               \
117da853ecaSopenharmony_ci        }                                                                   \
118da853ecaSopenharmony_ci    } while (0)
119da853ecaSopenharmony_ci
120da853ecaSopenharmony_ci#define EXPECT_AND_LOGE(cond, fmt, ...)                                     \
121da853ecaSopenharmony_ci    do {                                                                    \
122da853ecaSopenharmony_ci        if ((cond)) {                                                       \
123da853ecaSopenharmony_ci            AVCODEC_LOGE(fmt, ##__VA_ARGS__);                               \
124da853ecaSopenharmony_ci        }                                                                   \
125da853ecaSopenharmony_ci    } while (0)
126da853ecaSopenharmony_ci
127da853ecaSopenharmony_ci#define CHECK_AND_RETURN_LOG(cond, fmt, ...)                                \
128da853ecaSopenharmony_ci    do {                                                                    \
129da853ecaSopenharmony_ci        if (!(cond)) {                                                      \
130da853ecaSopenharmony_ci            AVCODEC_LOGE(fmt, ##__VA_ARGS__);                               \
131da853ecaSopenharmony_ci            return;                                                         \
132da853ecaSopenharmony_ci        }                                                                   \
133da853ecaSopenharmony_ci    } while (0)
134da853ecaSopenharmony_ci
135da853ecaSopenharmony_ci#define CHECK_AND_RETURN_LOG_LIMIT(cond, frequency, fmt, ...)               \
136da853ecaSopenharmony_ci    do {                                                                    \
137da853ecaSopenharmony_ci        if (!(cond)) {                                                      \
138da853ecaSopenharmony_ci            AVCODEC_LOGE_LIMIT(frequency, fmt, ##__VA_ARGS__);              \
139da853ecaSopenharmony_ci            return;                                                         \
140da853ecaSopenharmony_ci        }                                                                   \
141da853ecaSopenharmony_ci    } while (0)
142da853ecaSopenharmony_ci
143da853ecaSopenharmony_ci#define CHECK_AND_BREAK_LOG(cond, fmt, ...)                                 \
144da853ecaSopenharmony_ci    if (1) {                                                                \
145da853ecaSopenharmony_ci        if (!(cond)) {                                                      \
146da853ecaSopenharmony_ci            AVCODEC_LOGW(fmt, ##__VA_ARGS__);                               \
147da853ecaSopenharmony_ci            break;                                                          \
148da853ecaSopenharmony_ci        }                                                                   \
149da853ecaSopenharmony_ci    } else void (0)
150da853ecaSopenharmony_ci
151da853ecaSopenharmony_ci#define CHECK_AND_CONTINUE_LOG(cond, fmt, ...)                              \
152da853ecaSopenharmony_ci    if (1) {                                                                \
153da853ecaSopenharmony_ci        if (!(cond)) {                                                      \
154da853ecaSopenharmony_ci            AVCODEC_LOGW(fmt, ##__VA_ARGS__);                               \
155da853ecaSopenharmony_ci            continue;                                                       \
156da853ecaSopenharmony_ci        }                                                                   \
157da853ecaSopenharmony_ci    } else void (0)
158da853ecaSopenharmony_ci
159da853ecaSopenharmony_ci#define POINTER_MASK 0x00FFFFFF
160da853ecaSopenharmony_ci#define FAKE_POINTER(addr) (POINTER_MASK & reinterpret_cast<uintptr_t>(addr))
161da853ecaSopenharmony_ci} // namespace MediaAVCodec
162da853ecaSopenharmony_ci} // namespace OHOS
163da853ecaSopenharmony_ci#endif // AVCODEC_LOG_H