How to enable TRACE_EVENT in WebRTC codes
来源:互联网 发布:软件功能点估算 编辑:程序博客网 时间:2024/05/17 20:47
WebRTC源码中有这样的代码片段:
bool WebRtcVideoChannel2::SetRtpSendParameters( uint32_t ssrc, const webrtc::RtpParameters& parameters) { TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetRtpSendParameters"); rtc::CritScope stream_lock(&stream_crit_); auto it = send_streams_.find(ssrc); if (it == send_streams_.end()) { LOG(LS_ERROR) << "Attempting to set RTP send parameters for stream " << "with ssrc " << ssrc << " which doesn't exist."; return false; } // TODO(deadbeef): Handle setting parameters with a list of codecs in a // different order (which should change the send codec). webrtc::RtpParameters current_parameters = GetRtpSendParameters(ssrc); if (current_parameters.codecs != parameters.codecs) { LOG(LS_ERROR) << "Using SetParameters to change the set of codecs " << "is not currently supported."; return false; } return it->second->SetRtpParameters(parameters);}
这里面的 TRACE_EVENT0 会 trace 一些事件,对通过日志调试有一些帮助。类似的还有 TRACE_EVENT1 等。但是这些宏默认不输出日志,需要客户代码为 WebRTC 配置下面两个函数指针才能生效:
typedef const unsigned char* (*GetCategoryEnabledPtr)(const char* name);typedef void (*AddTraceEventPtr)(char phase, const unsigned char* category_enabled, const char* name, unsigned long long id, int num_args, const char** arg_names, const unsigned char* arg_types, const unsigned long long* arg_values, unsigned char flags);
调用下面的函数可以完成配置:
void SetupEventTracer( GetCategoryEnabledPtr get_category_enabled_ptr, AddTraceEventPtr add_trace_event_ptr);
上述函数及前面函数指针类型,都在 webrtc/base/event_tracer.h 头文件中。
GetCategoryEnabledPtr 返回一个 const unsigned char* ,指示特定名字的事件是否被使能。下面是一个简单的实现:
static const unsigned char* _GetCategoryEnabled(const char* name){ return reinterpret_cast<const unsigned char*>("\1");}
AddTraceEventPtr 用来响应 trace event 操作,下面是一个参考实现:
static void _AddTraceEvent(char phase, const unsigned char* category_enabled, const char* name, unsigned long long id, int num_args, const char** arg_names, const unsigned char* arg_types, const unsigned long long* arg_values, unsigned char flags){ if(category_enabled[0] == 0) return; // disabled fprintf(stderr, "trace_event : %s ", name); for(int i = 0; i < num_args; ++i) { switch(arg_types[i]) { case TRACE_VALUE_TYPE_STRING: if(strcmp("src_file_and_line", arg_names[i]) == 0 || strcmp("src_func", arg_names[i]) == 0) { fprintf(stderr, "%s ", (const char*)arg_values[i]); }else{ fprintf(stderr, "%s - %s ", arg_names[i], (const char*)arg_values[i]); } break; case TRACE_VALUE_TYPE_UINT: fprintf(stderr, "%s %u ", arg_names[i], (unsigned int)arg_values[i]); break; case TRACE_VALUE_TYPE_INT: case TRACE_VALUE_TYPE_BOOL: fprintf(stderr, "%s %d ", arg_names[i], (int)arg_values[i]); break; case TRACE_VALUE_TYPE_DOUBLE: fprintf(stderr, "%s %.4f ", arg_names[i], (double)arg_values[i]); break; } } fprintf(stderr, "\n");}
我根据事件名字和类型(类似TRACE_VALUE_TYPE_INT宏在webrtc/base/trace_event.h中定义)输出了一些信息,结果类似下面这样:
trace_event : MessageQueue::Dispatch ../../webrtc/pc/channel.cc:701 SendPacket trace_event : BaseChannel::OnMessage trace_event : BaseChannel::SendPacket trace_event : BaseChannel::SendPacket trace_event : BaseChannel::OnMessage trace_event : MessageQueue::Dispatch trace_event : MessageQueue::Dispatch ../../webrtc/p2p/base/p2ptransportchannel.cc:1550 OnCheckAndPing trace_event : MessageQueue::Dispatch trace_event : JB::RecycleFramesUntilKeyFrame trace_event : MessageQueue::Dispatch ../../webrtc/p2p/base/p2ptransportchannel.cc:1550 OnCheckAndPing trace_event : MessageQueue::Dispatch trace_event : JB::RecycleFramesUntilKeyFrame trace_event : MessageQueue::Dispatch ../../webrtc/pc/channel.cc:701 SendPacket trace_event : BaseChannel::OnMessage
要把我们实现的函数配置给 WebRTC ,需要在调用任何其它 WebRTC 函数之前进行,比如在 main 函数一开始,类似下面这样:
webrtc::SetupEventTracer(_GetCategoryEnabled, _AddTraceEvent);
相关阅读:
- WebRTC学习资料大全
- Ubuntu 14.04下编译WebRTC
- WebRTC源码中turnserver的使用方法
- 打开 WebRTC 的日志(native api)
- 让WebRTC支持H264编解码
- WebRTC编译系统之gn和ninja
- WebRTC编译系统之gn files
0 0
- How to enable TRACE_EVENT in WebRTC codes
- 【skill】How to add codes in csdn ?
- how to enable debug in eclipse + weblogic
- How To Enable Apache Modules in Ubuntu
- How to enable directory listing in tomcat
- How to enable IP Forwarding in Linux
- how to enable debug in configure?
- How to Enable IP Forwarding in Linux
- How to enable cURL in PHP / XAMPP
- How-to: enable fair scheduler in hadoop
- How to enable guest posting in phpBB3
- How to enable IOMMU in Fedora
- How to Deal with Messy Codes in Essbase
- how to enable or disable registry editing in xp
- How to enable Synchronize Class View in VS2005
- 11g How To Enable Archive Logging In RAC Environment
- How to enable Hibernate in Windows Server 2012
- How-to: Enable User Authentication and Authorization in Apache HBase
- 友盟统计使用及添加测试设备(设备ID及Mac地址识别)
- TMS320C6678
- 负载均衡的方式
- 字符集与编码一之charset and encoding
- java加密算法之AES小记
- How to enable TRACE_EVENT in WebRTC codes
- EventBus: Could not dispatch event: class com.********.LoginEvent to subscribing class
- C#动态调用WebService方法之WS代理
- jQuery 事件
- 一洽客服平台的技术生产力
- Webstorm支持.vue文件
- windows下端口映射(端口转发)
- ARM MMU工作原理剖析 以S3C24XX举例
- Android--合并两个APP的具体做法(掌握)