Remove expensive and unnecessary memory alloc for sending black frames on video
mute.

Remove old crusty is_black_ member var in webrtcvideoengine which was not adding value.

R=henrike@webrtc.org, tpsiaki@google.com

Review URL: https://webrtc-codereview.appspot.com/26229004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@7731 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/media/webrtc/webrtcvideoengine.cc b/talk/media/webrtc/webrtcvideoengine.cc
index 1e8c43b..3bcec4d 100644
--- a/talk/media/webrtc/webrtcvideoengine.cc
+++ b/talk/media/webrtc/webrtcvideoengine.cc
@@ -927,15 +927,20 @@
   void ProcessFrame(const VideoFrame& original_frame, bool mute,
                     VideoFrame** processed_frame) {
     if (!mute) {
-      *processed_frame = original_frame.Copy();
+      *processed_frame = original_frame.Copy();  // Shallow copy.
     } else {
-      WebRtcVideoFrame* black_frame = new WebRtcVideoFrame();
-      black_frame->InitToBlack(static_cast<int>(original_frame.GetWidth()),
-                               static_cast<int>(original_frame.GetHeight()),
-                               1, 1,
-                               original_frame.GetElapsedTime(),
-                               original_frame.GetTimeStamp());
-      *processed_frame = black_frame;
+      // Cache a black frame of the same dimensions as original_frame.
+      if (black_frame_.GetWidth() != original_frame.GetWidth() ||
+          black_frame_.GetHeight() != original_frame.GetHeight()) {
+        black_frame_.InitToBlack(static_cast<int>(original_frame.GetWidth()),
+                                 static_cast<int>(original_frame.GetHeight()),
+                                 1, 1,
+                                 original_frame.GetElapsedTime(),
+                                 original_frame.GetTimeStamp());
+      }
+      *processed_frame = black_frame_.Copy();  // Shallow copy.
+      (*processed_frame)->SetElapsedTime(original_frame.GetElapsedTime());
+      (*processed_frame)->SetTimeStamp(original_frame.GetTimeStamp());
     }
     local_stream_info_.UpdateFrame(*processed_frame);
   }
@@ -979,6 +984,7 @@
 
   VideoFormat adapt_format_;
   AdaptFormatType adapt_format_type_;
+  WebRtcVideoFrame black_frame_;  // Cached frame for mute.
 };
 
 static bool GetCpuOveruseOptions(const VideoOptions& options,
diff --git a/talk/media/webrtc/webrtcvideoframe.cc b/talk/media/webrtc/webrtcvideoframe.cc
index 9986cbe..30d705c 100644
--- a/talk/media/webrtc/webrtcvideoframe.cc
+++ b/talk/media/webrtc/webrtcvideoframe.cc
@@ -106,7 +106,7 @@
 }
 
 WebRtcVideoFrame::WebRtcVideoFrame()
-    : video_buffer_(new RefCountedBuffer()), is_black_(false) {}
+    : video_buffer_(new RefCountedBuffer()) {}
 
 WebRtcVideoFrame::~WebRtcVideoFrame() {}
 
@@ -148,10 +148,7 @@
                                    size_t pixel_height, int64 elapsed_time,
                                    int64 time_stamp) {
   InitToEmptyBuffer(w, h, pixel_width, pixel_height, elapsed_time, time_stamp);
-  if (!is_black_) {
-    return SetToBlack();
-  }
-  return true;
+  return SetToBlack();
 }
 
 void WebRtcVideoFrame::Alias(
@@ -261,7 +258,6 @@
   if (video_buffer_.get() == video_buffer) {
     return;
   }
-  is_black_ = false;
   video_buffer_ = video_buffer;
   frame()->SetWidth(w);
   frame()->SetHeight(h);
diff --git a/talk/media/webrtc/webrtcvideoframe.h b/talk/media/webrtc/webrtcvideoframe.h
index c492ff1..8b1ae60 100644
--- a/talk/media/webrtc/webrtcvideoframe.h
+++ b/talk/media/webrtc/webrtcvideoframe.h
@@ -121,7 +121,6 @@
                          int64 elapsed_time, int64 time_stamp);
 
   rtc::scoped_refptr<RefCountedBuffer> video_buffer_;
-  bool is_black_;
   size_t pixel_width_;
   size_t pixel_height_;
   int64 elapsed_time_;