diff --git a/talk/media/webrtc/webrtcvideoengine.cc b/talk/media/webrtc/webrtcvideoengine.cc
index a86e610..0e06cfa 100644
--- a/talk/media/webrtc/webrtcvideoengine.cc
+++ b/talk/media/webrtc/webrtcvideoengine.cc
@@ -1066,21 +1066,24 @@
   return true;
 }
 
-WebRtcVideoEngine::WebRtcVideoEngine(WebRtcVoiceEngine* voice_engine) {
+WebRtcVideoEngine::WebRtcVideoEngine(WebRtcVoiceEngine* voice_engine)
+    : voice_engine_(voice_engine), trace_callback_(voice_engine) {
   Construct(new ViEWrapper(), new ViETraceWrapper(), voice_engine,
       new rtc::CpuMonitor(NULL));
 }
 
 WebRtcVideoEngine::WebRtcVideoEngine(WebRtcVoiceEngine* voice_engine,
                                      ViEWrapper* vie_wrapper,
-                                     rtc::CpuMonitor* cpu_monitor) {
+                                     rtc::CpuMonitor* cpu_monitor)
+    : voice_engine_(voice_engine), trace_callback_(voice_engine) {
   Construct(vie_wrapper, new ViETraceWrapper(), voice_engine, cpu_monitor);
 }
 
 WebRtcVideoEngine::WebRtcVideoEngine(WebRtcVoiceEngine* voice_engine,
                                      ViEWrapper* vie_wrapper,
                                      ViETraceWrapper* tracing,
-                                     rtc::CpuMonitor* cpu_monitor) {
+                                     rtc::CpuMonitor* cpu_monitor)
+    : voice_engine_(voice_engine), trace_callback_(voice_engine) {
   Construct(vie_wrapper, tracing, voice_engine, cpu_monitor);
 }
 
@@ -1093,7 +1096,6 @@
   vie_wrapper_.reset(vie_wrapper);
   vie_wrapper_base_initialized_ = false;
   tracing_.reset(tracing);
-  voice_engine_ = voice_engine;
   initialized_ = false;
   SetTraceFilter(SeverityToFilter(kDefaultLogSeverity));
   render_module_.reset(new WebRtcPassthroughRender());
@@ -1103,8 +1105,8 @@
   cpu_monitor_.reset(cpu_monitor);
 
   SetTraceOptions("");
-  if (tracing_->SetTraceCallback(this) != 0) {
-    LOG_RTCERR1(SetTraceCallback, this);
+  if (tracing_->SetTraceCallback(&trace_callback_) != 0) {
+    LOG_RTCERR1(SetTraceCallback, &trace_callback_);
   }
 
   default_video_codec_list_ = DefaultVideoCodecList();
@@ -1548,27 +1550,13 @@
   return true;
 }
 
-// Ignore spammy trace messages, mostly from the stats API when we haven't
-// gotten RTCP info yet from the remote side.
-bool WebRtcVideoEngine::ShouldIgnoreTrace(const std::string& trace) {
-  static const char* const kTracesToIgnore[] = {
-    NULL
-  };
-  for (const char* const* p = kTracesToIgnore; *p; ++p) {
-    if (trace.find(*p) == 0) {
-      return true;
-    }
-  }
-  return false;
-}
-
 int WebRtcVideoEngine::GetNumOfChannels() {
   rtc::CritScope cs(&channels_crit_);
   return static_cast<int>(channels_.size());
 }
 
-void WebRtcVideoEngine::Print(webrtc::TraceLevel level, const char* trace,
-                              int length) {
+void WebRtcVideoEngine::TraceCallbackImpl::Print(
+    webrtc::TraceLevel level, const char* trace, int length) {
   rtc::LoggingSeverity sev = rtc::LS_VERBOSE;
   if (level == webrtc::kTraceError || level == webrtc::kTraceCritical)
     sev = rtc::LS_ERROR;
@@ -1586,8 +1574,7 @@
     LOG_V(sev) << msg;
   } else {
     std::string msg(trace + 71, length - 72);
-    if (!ShouldIgnoreTrace(msg) &&
-        (!voice_engine_ || !voice_engine_->ShouldIgnoreTrace(msg))) {
+    if (!voice_engine_ || !voice_engine_->ShouldIgnoreTrace(msg)) {
       LOG_V(sev) << "webrtc: " << msg;
     }
   }
diff --git a/talk/media/webrtc/webrtcvideoengine.h b/talk/media/webrtc/webrtcvideoengine.h
index 25db0a9..98c444a 100644
--- a/talk/media/webrtc/webrtcvideoengine.h
+++ b/talk/media/webrtc/webrtcvideoengine.h
@@ -94,8 +94,7 @@
 bool IsRembEnabled(const VideoCodec& codec);
 void AddDefaultFeedbackParams(VideoCodec* codec);
 
-class WebRtcVideoEngine : public sigslot::has_slots<>,
-                          public webrtc::TraceCallback {
+class WebRtcVideoEngine : public sigslot::has_slots<> {
  public:
   // Creates the WebRtcVideoEngine with internal VideoCaptureModule.
   explicit WebRtcVideoEngine(WebRtcVoiceEngine* voice_engine);
@@ -174,8 +173,6 @@
   void UnregisterChannel(WebRtcVideoMediaChannel* channel);
   bool ConvertFromCricketVideoCodec(const VideoCodec& in_codec,
                                     webrtc::VideoCodec* out_codec);
-  // Check whether the supplied trace should be ignored.
-  bool ShouldIgnoreTrace(const std::string& trace);
   int GetNumOfChannels();
 
   VideoFormat GetStartCaptureFormat() const { return default_codec_format_; }
@@ -183,6 +180,19 @@
   rtc::CpuMonitor* cpu_monitor() { return cpu_monitor_.get(); }
 
  protected:
+  class TraceCallbackImpl : public webrtc::TraceCallback {
+   public:
+    TraceCallbackImpl(WebRtcVoiceEngine* voice_engine)
+        : voice_engine_(voice_engine) {}
+    ~TraceCallbackImpl() override {}
+
+   private:
+    void Print(webrtc::TraceLevel level, const char* trace,
+               int length) override;
+
+    WebRtcVoiceEngine* const voice_engine_;
+  };
+
   bool initialized() const {
     return initialized_;
   }
@@ -206,16 +216,11 @@
   bool InitVideoEngine();
   bool VerifyApt(const VideoCodec& in, int expected_apt) const;
 
-  // webrtc::TraceCallback implementation.
-  virtual void Print(webrtc::TraceLevel level,
-                     const char* trace,
-                     int length) OVERRIDE;
-
   rtc::Thread* worker_thread_;
   rtc::scoped_ptr<ViEWrapper> vie_wrapper_;
   bool vie_wrapper_base_initialized_;
   rtc::scoped_ptr<ViETraceWrapper> tracing_;
-  WebRtcVoiceEngine* voice_engine_;
+  WebRtcVoiceEngine* const voice_engine_;
   rtc::scoped_ptr<webrtc::VideoRender> render_module_;
   rtc::scoped_ptr<WebRtcVideoEncoderFactory> simulcast_encoder_factory_;
   WebRtcVideoEncoderFactory* encoder_factory_;
@@ -224,6 +229,7 @@
   std::vector<VideoCodec> default_video_codec_list_;
   std::vector<RtpHeaderExtension> rtp_header_extensions_;
   VideoFormat default_codec_format_;
+  TraceCallbackImpl trace_callback_;
 
   bool initialized_;
   rtc::CriticalSection channels_crit_;
