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