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