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 16 #ifndef AVCODEC_TRACE_H 17 #define AVCODEC_TRACE_H 18 19 #include <string> 20 #include "hitrace_meter.h" 21 #include "nocopyable.h" 22 23 namespace OHOS { 24 namespace MediaAVCodec { 25 #define AVCODEC_SYNC_CUSTOM_TRACE(level, fmt, ...) AVCodecTrace trace(level, fmt, ##__VA_ARGS__) 26 #define AVCODEC_SYNC_TRACE AVCODEC_SYNC_CUSTOM_TRACE(HITRACE_LEVEL_INFO, "%s", __FUNCTION__) 27 28 #define AVCODEC_SYNC_CUSTOM_TRACE_WITH_TAG(level, customArgs, fmt, ...) \ 29 AVCodecTrace trace(level, customArgs, "%s" fmt, tag_.load(), ##__VA_ARGS__) 30 #define AVCODEC_FUNC_TRACE_WITH_TAG \ 31 AVCODEC_SYNC_CUSTOM_TRACE_WITH_TAG(HITRACE_LEVEL_INFO, "", "%s", __FUNCTION__) 32 #define AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT \ 33 AVCODEC_SYNC_CUSTOM_TRACE_WITH_TAG(HITRACE_LEVEL_INFO, "", "%s:C", __FUNCTION__) 34 #define AVCODEC_FUNC_TRACE_WITH_TAG_SERVER \ 35 AVCODEC_SYNC_CUSTOM_TRACE_WITH_TAG(HITRACE_LEVEL_INFO, "", "%s:S", __FUNCTION__) 36 37 class AVCodecTrace : public NoCopyable { 38 public: level_(level)39 AVCodecTrace(const std::string& funcName, HiTraceOutputLevel level = HITRACE_LEVEL_INFO) : level_(level) 40 { 41 StartTraceEx(level, HITRACE_TAG_ZMEDIA, funcName.c_str()); 42 } 43 static void TraceBegin(const std::string& funcName, int32_t taskId, HiTraceOutputLevel level = HITRACE_LEVEL_INFO) 44 { 45 StartAsyncTraceEx(level, HITRACE_TAG_ZMEDIA, funcName.c_str(), taskId, ""); 46 } 47 static void TraceEnd(const std::string& funcName, int32_t taskId, HiTraceOutputLevel level = HITRACE_LEVEL_INFO) 48 { 49 FinishAsyncTraceEx(level, HITRACE_TAG_ZMEDIA, funcName.c_str(), taskId); 50 } 51 static void CounterTrace(const std::string& varName, int32_t val, HiTraceOutputLevel level = HITRACE_LEVEL_INFO) 52 { 53 CountTraceEx(level, HITRACE_TAG_ZMEDIA, varName.c_str(), val); 54 } 55 56 template <typename... Args> AVCodecTrace(HiTraceOutputLevel level,const char * customArg,const char * fmt,Args &&...args)57 AVCodecTrace(HiTraceOutputLevel level, const char *customArg, const char *fmt, Args&&... args) : level_(level) 58 { 59 StartTraceArgsEx(level, HITRACE_TAG_ZMEDIA, customArg, fmt, args...); 60 } 61 template <typename... Args> TraceBegin(HiTraceOutputLevel level,const char * customArg,int32_t taskId,const char * fmt,Args &&...args)62 static void TraceBegin(HiTraceOutputLevel level, const char *customArg, int32_t taskId, 63 const char *fmt, Args&&... args) 64 { 65 StartAsyncTraceArgsEx(level, HITRACE_TAG_ZMEDIA, taskId, "", customArg, fmt, args...); 66 } 67 template <typename... Args> TraceEnd(HiTraceOutputLevel level,int32_t taskId,const char * fmt,Args &&...args)68 static void TraceEnd(HiTraceOutputLevel level, int32_t taskId, const char *fmt, Args&&... args) 69 { 70 FinishAsyncTraceArgsEx(level, HITRACE_TAG_ZMEDIA, taskId, fmt, args...); 71 } 72 ~AVCodecTrace()73 ~AVCodecTrace() 74 { 75 FinishTraceEx(level_, HITRACE_TAG_ZMEDIA); 76 } 77 78 private: 79 HiTraceOutputLevel level_ = HITRACE_LEVEL_INFO; 80 }; 81 82 #ifdef MEDIA_TRACE_DEBUG_ENABLE 83 #define MEDIA_TRACE_DEBUG(name) MediaAVCodec::AVCodecTrace trace(name) 84 #define MEDIA_TRACE_DEBUG_POSTFIX(name, postfix) MediaAVCodec::AVCodecTrace trace##postfix(name) 85 #else 86 #define MEDIA_TRACE_DEBUG(name) ((void)0) 87 #define MEDIA_TRACE_DEBUG_POSTFIX(name, postfix) ((void)0) 88 #endif 89 } // namespace MediaAVCodec 90 } // namespace OHOS 91 #endif // AVCODEC_TRACE_H